This is an automated email from the ASF dual-hosted git repository.

riemer pushed a commit to branch fix-permission-asset-view
in repository https://gitbox.apache.org/repos/asf/streampipes.git

commit 7c28bfa4c8fdd0f7f0690e0dc9de73d2856bed9e
Author: Dominik Riemer <[email protected]>
AuthorDate: Tue Nov 25 11:42:34 2025 +0100

    fix: Align UI permissions for assets and sites
---
 ui/src/app/_guards/page-auth.can-active.guard.ts     | 18 ++++++++++++++++--
 ui/src/app/assets/assets.module.ts                   |  6 ++++++
 .../asset-overview/asset-overview.component.ts       |  2 +-
 .../manage-site/manage-site-dialog.component.ts      |  8 +++-----
 .../sites-configuration.component.html               |  8 ++++++--
 .../sites-configuration.component.ts                 | 20 +++++++++++++-------
 6 files changed, 45 insertions(+), 17 deletions(-)

diff --git a/ui/src/app/_guards/page-auth.can-active.guard.ts 
b/ui/src/app/_guards/page-auth.can-active.guard.ts
index 0f3ebc4468..c39af0abd6 100644
--- a/ui/src/app/_guards/page-auth.can-active.guard.ts
+++ b/ui/src/app/_guards/page-auth.can-active.guard.ts
@@ -16,14 +16,28 @@
  *
  */
 
-import { ActivatedRouteSnapshot } from '@angular/router';
+import {
+    ActivatedRouteSnapshot,
+    CanActivate,
+    CanActivateChild,
+    GuardResult,
+    MaybeAsync,
+    RouterStateSnapshot,
+} from '@angular/router';
 import { AuthService } from '../services/auth.service';
 import { Injectable } from '@angular/core';
 
 @Injectable()
-export class PageAuthGuard {
+export class PageAuthGuard implements CanActivate, CanActivateChild {
     constructor(private authService: AuthService) {}
 
+    canActivate(
+        route: ActivatedRouteSnapshot,
+        state: RouterStateSnapshot,
+    ): MaybeAsync<GuardResult> {
+        return this.canActivateChild(route);
+    }
+
     canActivateChild(activatedRouteSnapshot: ActivatedRouteSnapshot): boolean {
         const privileges: string[] = activatedRouteSnapshot.data.privileges;
 
diff --git a/ui/src/app/assets/assets.module.ts 
b/ui/src/app/assets/assets.module.ts
index 3af98418a0..73d1abf298 100644
--- a/ui/src/app/assets/assets.module.ts
+++ b/ui/src/app/assets/assets.module.ts
@@ -64,6 +64,8 @@ import { ViewAssetLinksComponent } from 
'./components/asset-details/view-asset/v
 import { AssetLinkCardComponent } from 
'./components/asset-details/view-asset/view-asset-links/asset-link-card/asset-link-card.component';
 import { MatMenuItem } from '@angular/material/menu';
 import { TranslatePipe } from '@ngx-translate/core';
+import { UserPrivilege } from '../_enums/user-privilege.enum';
+import { PageAuthGuard } from '../_guards/page-auth.can-active.guard';
 
 @NgModule({
     imports: [
@@ -111,6 +113,10 @@ import { TranslatePipe } from '@ngx-translate/core';
                     {
                         path: 'details/:assetId/edit',
                         component: SpAssetDetailsComponent,
+                        data: {
+                            privileges: [UserPrivilege.PRIVILEGE_WRITE_ASSETS],
+                        },
+                        canActivate: [PageAuthGuard],
                     },
                 ],
             },
diff --git 
a/ui/src/app/assets/components/asset-overview/asset-overview.component.ts 
b/ui/src/app/assets/components/asset-overview/asset-overview.component.ts
index 14ecf88a3c..4851e47e8b 100644
--- a/ui/src/app/assets/components/asset-overview/asset-overview.component.ts
+++ b/ui/src/app/assets/components/asset-overview/asset-overview.component.ts
@@ -118,7 +118,7 @@ export class SpAssetOverviewComponent implements OnInit {
     }
 
     goToDetailsView(asset: SpAssetModel, editMode = false) {
-        const mode = editMode ? 'edit' : 'view';
+        const mode = editMode && this.hasWritePrivilege ? 'edit' : 'view';
         this.router.navigate(['assets', 'details', asset.elementId, mode]);
     }
 
diff --git 
a/ui/src/app/configuration/dialog/manage-site/manage-site-dialog.component.ts 
b/ui/src/app/configuration/dialog/manage-site/manage-site-dialog.component.ts
index 811665b37f..389c9bd5e0 100644
--- 
a/ui/src/app/configuration/dialog/manage-site/manage-site-dialog.component.ts
+++ 
b/ui/src/app/configuration/dialog/manage-site/manage-site-dialog.component.ts
@@ -16,7 +16,7 @@
  *
  */
 
-import { Component, Input, OnInit, ViewChild } from '@angular/core';
+import { Component, inject, Input, OnInit, ViewChild } from '@angular/core';
 import { DialogRef } from '@streampipes/shared-ui';
 import {
     AssetConstants,
@@ -45,10 +45,8 @@ export class ManageSiteDialogComponent implements OnInit {
     clonedSite: AssetSiteDesc;
     createMode = false;
 
-    constructor(
-        private dialogRef: DialogRef<ManageSiteDialogComponent>,
-        private genericStorageService: GenericStorageService,
-    ) {}
+    private dialogRef = inject(DialogRef<ManageSiteDialogComponent>);
+    private genericStorageService = inject(GenericStorageService);
 
     ngOnInit(): void {
         if (this.site !== undefined) {
diff --git 
a/ui/src/app/configuration/sites-configuration/sites-configuration.component.html
 
b/ui/src/app/configuration/sites-configuration/sites-configuration.component.html
index 939208cfb5..7b1d49a1f1 100644
--- 
a/ui/src/app/configuration/sites-configuration/sites-configuration.component.html
+++ 
b/ui/src/app/configuration/sites-configuration/sites-configuration.component.html
@@ -18,8 +18,12 @@
 
 <sp-basic-nav-tabs [spNavigationItems]="tabs" [activeLink]="'sites'">
     <div fxLayout="column" *ngIf="locationConfig">
-        <sp-location-features-configuration [locationConfig]="locationConfig">
-        </sp-location-features-configuration>
+        @if (isAdminUser) {
+            <sp-location-features-configuration
+                [locationConfig]="locationConfig"
+            >
+            </sp-location-features-configuration>
+        }
 
         <sp-site-area-configuration [locationConfig]="locationConfig">
         </sp-site-area-configuration>
diff --git 
a/ui/src/app/configuration/sites-configuration/sites-configuration.component.ts 
b/ui/src/app/configuration/sites-configuration/sites-configuration.component.ts
index 8ea7ee6f16..d3d74977ff 100644
--- 
a/ui/src/app/configuration/sites-configuration/sites-configuration.component.ts
+++ 
b/ui/src/app/configuration/sites-configuration/sites-configuration.component.ts
@@ -16,14 +16,19 @@
  *
  */
 
-import { Component, OnInit } from '@angular/core';
+import { Component, inject, OnInit } from '@angular/core';
 import { SpConfigurationTabsService } from '../configuration-tabs.service';
 import {
     LocationConfig,
     LocationConfigService,
 } from '@streampipes/platform-services';
-import { SpBreadcrumbService, SpNavigationItem } from '@streampipes/shared-ui';
+import {
+    CurrentUserService,
+    SpBreadcrumbService,
+    SpNavigationItem,
+} from '@streampipes/shared-ui';
 import { SpConfigurationRoutes } from '../configuration.routes';
+import { UserRole } from '../../_enums/user-role.enum';
 
 @Component({
     selector: 'sp-sites-configuration',
@@ -34,15 +39,16 @@ export class SitesConfigurationComponent implements OnInit {
     tabs: SpNavigationItem[] = [];
 
     locationConfig: LocationConfig;
+    isAdminUser = false;
 
-    constructor(
-        private locationConfigService: LocationConfigService,
-        private tabService: SpConfigurationTabsService,
-        private breadcrumbService: SpBreadcrumbService,
-    ) {}
+    private currentUserService = inject(CurrentUserService);
+    private locationConfigService = inject(LocationConfigService);
+    private tabService = inject(SpConfigurationTabsService);
+    private breadcrumbService = inject(SpBreadcrumbService);
 
     ngOnInit() {
         this.tabs = this.tabService.getTabs();
+        this.isAdminUser = 
this.currentUserService.hasRole(UserRole.ROLE_ADMIN);
         this.breadcrumbService.updateBreadcrumb([
             SpConfigurationRoutes.BASE,
             { label: this.tabService.getTabTitle('sites') },

Reply via email to