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

riemer pushed a commit to branch 
3227-move-file-management-from-iconbar-to-settings
in repository https://gitbox.apache.org/repos/asf/streampipes.git


The following commit(s) were added to 
refs/heads/3227-move-file-management-from-iconbar-to-settings by this push:
     new 16a2836954 feat(#3227): Move file management to settings
16a2836954 is described below

commit 16a2836954ca1063aced20d143d325a51cdde65e
Author: Dominik Riemer <[email protected]>
AuthorDate: Fri Sep 13 21:56:18 2024 +0200

    feat(#3227): Move file management to settings
---
 .../rest/impl/GenericStorageResource.java          |   2 +-
 ui/deployment/app-routing.module.mst               |   5 +-
 ui/deployment/base-navigation.component.mst        |  34 +++----
 ui/deployment/dev/config.yml                       |   1 -
 ui/deployment/home.service.mst                     |   9 +-
 ui/deployment/modules.yml                          |  44 +++------
 ui/deployment/prebuild.js                          |   1 +
 .../asset-browser/asset-browser.component.html     | 106 +++++++++++----------
 .../asset-browser/asset-browser.component.ts       |  23 +++--
 .../src/lib/services/current-user.service.ts       |  17 ++++
 ui/src/app/_enums/user-privilege.enum.ts           |  26 +++--
 ui/src/app/_guards/page-auth.can-active.guard.ts   |   5 +-
 .../asset-overview/asset-overview.component.html   |   3 +
 .../asset-overview/asset-overview.component.ts     |   8 ++
 .../configuration/configuration-tabs.service.ts    |   6 ++
 ui/src/app/configuration/configuration.module.ts   |  15 +++
 .../file-rename/file-rename-dialog.component.html  |   0
 .../file-rename/file-rename-dialog.component.scss  |   2 -
 .../file-rename/file-rename-dialog.component.ts    |   0
 .../file-upload/file-upload-dialog.component.html  |   0
 .../file-upload/file-upload-dialog.component.scss  |   2 -
 .../file-upload/file-upload-dialog.component.ts    |   0
 .../file-overview/file-overview.component.html     |   0
 .../file-overview/file-overview.component.scss     |   0
 .../file-overview/file-overview.component.ts       |   0
 .../{ => configuration}/files/files.component.html |  48 ++++------
 .../{ => configuration}/files/files.component.scss |   0
 .../{ => configuration}/files/files.component.ts   |  17 +++-
 .../static-file-input.component.ts                 |   4 +-
 .../core/components/iconbar/iconbar.component.html |  42 +-------
 .../core/components/iconbar/iconbar.component.ts   |   4 -
 ui/src/app/files/files.module.ts                   |  12 +--
 ui/src/app/home/models/home.model.ts               |   6 +-
 ui/src/app/pipelines/pipelines.component.html      |   1 +
 ui/src/app/services/auth.service.ts                |  84 ++--------------
 35 files changed, 221 insertions(+), 306 deletions(-)

diff --git 
a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/GenericStorageResource.java
 
b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/GenericStorageResource.java
index 9f74d72056..61bcfd7cb9 100644
--- 
a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/GenericStorageResource.java
+++ 
b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/GenericStorageResource.java
@@ -83,7 +83,7 @@ public class GenericStorageResource extends 
AbstractAuthGuardedRestResource {
       path = "/{appDocName}/find",
       produces = MediaType.APPLICATION_JSON_VALUE,
       consumes = MediaType.APPLICATION_JSON_VALUE)
-  @PreAuthorize(AuthConstants.HAS_WRITE_GENERIC_STORAGE_PRIVILEGE)
+  @PreAuthorize(AuthConstants.HAS_READ_GENERIC_STORAGE_PRIVILEGE)
   public ResponseEntity<List<Map<String, Object>>> 
find(@PathVariable(APP_DOC_NAME) String appDocName,
                                                         @RequestBody 
Map<String, Object> query) {
     try {
diff --git a/ui/deployment/app-routing.module.mst 
b/ui/deployment/app-routing.module.mst
index a09b0076f7..5ee435c816 100644
--- a/ui/deployment/app-routing.module.mst
+++ b/ui/deployment/app-routing.module.mst
@@ -39,6 +39,7 @@ import { RegistrationAllowedCanActivateGuard } from 
'./_guards/registration-allo
 import { RestorePasswordAllowedCanActivateGuard } from 
'./_guards/restore-password-allowed.can-activate.guard';
 import { SetNewPasswordComponent } from 
'./login/components/set-new-password/set-new-password.component';
 import { ActivateAccountComponent } from 
'./login/components/activate-account/activate-account.component';
+import { UserPrivilege } from './_enums/user-privilege.enum';
 
 {{#modulesActive}}
 {{#componentImport}}
@@ -60,10 +61,10 @@ const routes: Routes = [
       { path: '', component: HomeComponent, canActivate: 
[ConfiguredCanActivateGuard] },
       {{#modulesActive}}
       {{#componentImport}}
-      { path: '{{{link}}}', component: {{{component}}}, data: { authPageNames: 
[{{{pageNames}}}]}},
+      { path: '{{{link}}}', component: {{{component}}}, data: { privileges: 
{{{privileges}}}, authPageNames: [{{{pageNames}}}]}},
       {{/componentImport}}
       {{^componentImport}}
-      { path: '{{{link}}}', data: { authPageNames: [{{{pageNames}}}]}, 
loadChildren: () => import('{{{path}}}').then(m => m.{{{moduleName}}})},
+      { path: '{{{link}}}', data: { privileges: {{{privileges}}}, 
authPageNames: [{{{pageNames}}}]}, loadChildren: () => 
import('{{{path}}}').then(m => m.{{{moduleName}}})},
       {{/componentImport}}
       {{/modulesActive}}
 
diff --git a/ui/deployment/base-navigation.component.mst 
b/ui/deployment/base-navigation.component.mst
index 74f30ff3e8..2c82f29916 100644
--- a/ui/deployment/base-navigation.component.mst
+++ b/ui/deployment/base-navigation.component.mst
@@ -22,6 +22,7 @@ import { PageName } from '../../_enums/page-name.enum';
 import { AuthService } from '../../services/auth.service';
 import { CurrentUserService } from '@streampipes/shared-ui';
 import { AppConstants } from '../../services/app.constants';
+import { UserPrivilege } from '../../_enums/user-privilege.enum';
 
 export abstract class BaseNavigationComponent {
 
@@ -36,32 +37,18 @@ export abstract class BaseNavigationComponent {
       title: 'Home',
       icon: 'home',
       pagesNames: [PageName.HOME],
+      privileges: [],
       visible: false
     },
     {{#modulesActive}}
-    {{^admin}}
     {
         link: '{{{link}}}',
         title: '{{{title}}}',
         icon: '{{{icon}}}',
         pageNames: [{{{pageNames}}}],
+        privileges: {{{privileges}}},
         visible: false
     },
-    {{/admin}}
-    {{/modulesActive}}
-  ];
-
-  admin = [
-    {{#modulesActive}}
-    {{#admin}}
-    {
-        link: '{{{link}}}',
-        title: '{{{title}}}',
-        icon: '{{{icon}}}',
-        pageNames: [{{{pageNames}}}],
-        visible: false
-    },
-    {{/admin}}
     {{/modulesActive}}
   ];
 
@@ -77,9 +64,11 @@ export abstract class BaseNavigationComponent {
 
     onInit() {
       this.currentUserService.user$.subscribe(user => {
-        this.menu.forEach(m => m.visible = this.isNavItemVisible(m.pageNames));
-        this.admin.forEach(m => m.visible = 
this.isNavItemVisible(m.pageNames));
-        this.notificationsVisible = 
this.isNavItemVisible([PageName.NOTIFICATIONS]);
+        this.menu.forEach(m => m.visible = 
this.isNavItemVisible(m.privileges));
+        this.notificationsVisible = this.isNavItemVisible([
+        UserPrivilege.PRIVILEGE_READ_PIPELINE,
+        UserPrivilege.PRIVILEGE_WRITE_PIPELINE
+        ]);
       });
       this.activePage = this.router.url.replace('/', '');
       this.activePageName = this.getPageTitle(this.activePage);
@@ -96,9 +85,8 @@ export abstract class BaseNavigationComponent {
     }
 
     getPageTitle(path) {
-      const allMenuItems = this.menu.concat(this.admin);
       let currentTitle = this.appConstants.APP_NAME;
-      allMenuItems.forEach(m => {
+      this.menu.forEach(m => {
         if (m.link === path) {
           currentTitle = m.title;
         }
@@ -120,8 +108,8 @@ export abstract class BaseNavigationComponent {
       this.activePageName = this.getPageTitle(this.activePage);
     }
 
-    public isNavItemVisible(pageNames?: PageName[]): boolean {
-      return this.authService.isAnyAccessGranted(pageNames);
+    public isNavItemVisible(privileges: string[]): boolean {
+      return this.authService.isAnyAccessGranted(privileges);
     }
 
 }
diff --git a/ui/deployment/dev/config.yml b/ui/deployment/dev/config.yml
index 19dd9ae045..de2530292a 100644
--- a/ui/deployment/dev/config.yml
+++ b/ui/deployment/dev/config.yml
@@ -24,5 +24,4 @@ modules:
     - spDashboard
     - spDataExplorer
     - spAssets
-    - spFiles
     - spConfiguration
diff --git a/ui/deployment/home.service.mst b/ui/deployment/home.service.mst
index 9a6a6de7a9..6d79e7631a 100644
--- a/ui/deployment/home.service.mst
+++ b/ui/deployment/home.service.mst
@@ -26,7 +26,7 @@ import {
     DataViewDataExplorerService, PipelineElementService,
     PipelineService
 } from '@streampipes/platform-services';
-import { UserRole } from '../_enums/user-role.enum';
+import { UserPrivilege } from '../_enums/user-privilege.enum';
 
 @Injectable({providedIn: 'root'})
 export class HomeService {
@@ -40,7 +40,7 @@ export class HomeService {
     }
 
     getFilteredServiceLinks() {
-        return this.getServiceLinks().filter(s => 
this.authService.isAnyAccessGranted(s.pageNames));
+        return this.getServiceLinks().filter(s => 
this.authService.isAnyAccessGranted(s.privileges));
     }
 
     getServiceLinks(): ServiceLink[] {
@@ -51,6 +51,7 @@ export class HomeService {
                description: "{{description}}",
                icon: "{{{icon}}}",
                pageNames: [{{{pageNames}}}],
+               privileges: {{{privileges}}},
                link: {
                    newWindow: false,
                    value: "{{{link}}}"
@@ -74,6 +75,10 @@ export class HomeService {
                description: "The notification module lets you view all 
notifications generated by pipelines.",
                icon: "chat",
                pageNames: [PageName.NOTIFICATIONS],
+               privileges: [
+                UserPrivilege.PRIVILEGE_READ_PIPELINE,
+                UserPrivilege.PRIVILEGE_WRITE_PIPELINE
+               ],
                link: {
                    newWindow: false,
                    value: "notifications"
diff --git a/ui/deployment/modules.yml b/ui/deployment/modules.yml
index e9e37891f3..44bf959acf 100644
--- a/ui/deployment/modules.yml
+++ b/ui/deployment/modules.yml
@@ -24,7 +24,7 @@ spAssets:
     title: 'Asset Management'
     description: 'Manage assets which help assigning pipelines, dashboards and 
adapters to real-world objects such as machines and plants.'
     icon: 'precision_manufacturing'
-    admin: true
+    privileges: '[UserPrivilege.PRIVILEGE_READ_ASSETS, 
UserPrivilege.PRIVILEGE_WRITE_ASSETS]'
     pageNames: 'PageName.ASSETS'
     showStatusBox: false
 spConnect:
@@ -38,7 +38,7 @@ spConnect:
     title: 'Connect'
     description: 'StreamPipes Connect lets you easily connect new data sources 
for a variety of data formats and protocols.'
     icon: 'power'
-    admin: False
+    privileges: '[UserPrivilege.PRIVILEGE_READ_ADAPTER, 
UserPrivilege.PRIVILEGE_WRITE_ADAPTER]'
     pageNames: 'PageName.CONNECT'
     showStatusBox: true
     statusBox:
@@ -47,8 +47,8 @@ spConnect:
         title: 'Adapters'
         createTitle: 'New adapter'
         dataFns: '[this.adapterService.getAdapters()]'
-        viewRoles: '[UserRole.ROLE_CONNECT_ADMIN]'
-        createRoles: '[UserRole.ROLE_CONNECT_ADMIN]'
+        viewRoles: '[UserPrivilege.PRIVILEGE_READ_ADAPTER, 
UserPrivilege.PRIVILEGE_WRITE_ADAPTER]'
+        createRoles: '[UserPrivilege.PRIVILEGE_WRITE_ADAPTER]'
 spPipelines:
     componentImport: False
     moduleName: 'PipelinesModule'
@@ -60,8 +60,8 @@ spPipelines:
     title: 'Pipelines'
     description: 'All created pipelines are available in the pipeline view, 
where you can also start and stop pipelines.'
     icon: 'play_arrow'
-    admin: False
     pageNames: 'PageName.PIPELINE_OVERVIEW'
+    privileges: '[UserPrivilege.PRIVILEGE_READ_PIPELINE, 
UserPrivilege.PRIVILEGE_WRITE_PIPELINE]'
     showStatusBox: true
     statusBox:
         link: "['pipelines']"
@@ -69,8 +69,8 @@ spPipelines:
         title: 'Pipelines'
         createTitle: 'New pipeline'
         dataFns: '[this.pipelineService.getPipelines()]'
-        viewRoles: '[UserRole.ROLE_PIPELINE_ADMIN, 
UserRole.ROLE_PIPELINE_USER]'
-        createRoles: '[UserRole.ROLE_PIPELINE_ADMIN]'
+        viewRoles: '[UserPrivilege.PRIVILEGE_READ_PIPELINE, 
UserPrivilege.PRIVILEGE_WRITE_PIPELINE]'
+        createRoles: '[UserPrivilege.PRIVILEGE_WRITE_PIPELINE]'
 spConfiguration:
     componentImport: False
     moduleName: 'ConfigurationModule'
@@ -83,7 +83,7 @@ spConfiguration:
     description: 'In the configuration module, basic StreamPipes settings and 
services can be configured.'
     icon: 'settings'
     pageNames: 'PageName.SETTINGS'
-    admin: True
+    privileges: '[UserPrivilege.PRIVILEGE_WRITE_ASSETS, 
UserPrivilege.PRIVILEGE_WRITE_LABELS, UserPrivilege.PRIVILEGE_READ_FILES, 
UserPrivilege.PRIVILEGE_WRITE_FILES]'
     showStatusBox: false
 spAppOverview:
     componentImport: False
@@ -96,8 +96,8 @@ spAppOverview:
     title: 'Apps'
     description: 'The app overview lets you access additional plugins.'
     icon: 'apps'
-    admin: false
     pageNames: 'PageName.APPS'
+    privileges: '[UserPrivilege.PRIVILEGE_READ_APPS, 
UserPrivilege.PRIVILEGE_WRITE_APPS]'
     showStatusBox: false
 spDashboard:
     componentImport: False
@@ -110,8 +110,8 @@ spDashboard:
     title: 'Dashboard'
     description: 'The live dashboard visualizes data in real-time.'
     icon: 'insert_chart'
-    admin: false
     pageNames: 'PageName.DASHBOARD'
+    privileges: '[UserPrivilege.PRIVILEGE_READ_DASHBOARD, 
UserPrivilege.PRIVILEGE_WRITE_DASHBOARD]'
     showStatusBox: true
     statusBox:
         link: "['dashboard']"
@@ -119,8 +119,8 @@ spDashboard:
         title: 'Dashboards'
         createTitle: 'New dashboard'
         dataFns: '[this.dashboardService.getDashboards()]'
-        viewRoles: '[UserRole.ROLE_DASHBOARD_ADMIN, 
UserRole.ROLE_DASHBOARD_USER]'
-        createRoles: '[UserRole.ROLE_DASHBOARD_ADMIN]'
+        viewRoles: '[UserPrivilege.PRIVILEGE_READ_DASHBOARD, 
UserPrivilege.PRIVILEGE_WRITE_DASHBOARD]'
+        createRoles: '[UserPrivilege.PRIVILEGE_WRITE_DASHBOARD]'
 spDataExplorer:
     componentImport: False
     moduleName: 'DataExplorerModule'
@@ -132,8 +132,8 @@ spDataExplorer:
     title: 'Data Explorer'
     description: 'The data explorer lets you visually inspect historical data 
from your connected sources.'
     icon: 'search'
-    admin: false
     pageNames: 'PageName.DATA_EXPLORER'
+    privileges: '[UserPrivilege.PRIVILEGE_READ_DATA_EXPLORER_VIEW, 
UserPrivilege.PRIVILEGE_WRITE_DATA_EXPLORER_VIEW]'
     showStatusBox: true
     statusBox:
         link: "['dataexplorer']"
@@ -141,19 +141,5 @@ spDataExplorer:
         title: 'Data Views'
         createTitle: 'New data view'
         dataFns: '[this.dataViewService.getDataViews()]'
-        viewRoles: '[UserRole.ROLE_DATA_EXPLORER_ADMIN, 
UserRole.ROLE_DATA_EXPLORER_USER]'
-        createRoles: '[UserRole.ROLE_DATA_EXPLORER_ADMIN]'
-spFiles:
-    componentImport: False
-    moduleName: 'FilesModule'
-    component: 'FilesComponent'
-    componentPath: './files/files.component'
-    path: './files/files.module'
-    link: 'files'
-    url: '/files'
-    title: 'File Management'
-    description: 'The file management module lets you upload and manage files 
that are used by adapters or pipeline elements.'
-    icon: 'folder'
-    admin: true
-    pageNames: 'PageName.FILE_UPLOAD'
-    showStatusBox: false
+        viewRoles: '[UserPrivilege.PRIVILEGE_READ_DATA_EXPLORER_VIEW, 
UserPrivilege.PRIVILEGE_WRITE_DATA_EXPLORER_VIEW]'
+        createRoles: '[UserPrivilege.PRIVILEGE_WRITE_DATA_EXPLORER_VIEW]'
diff --git a/ui/deployment/prebuild.js b/ui/deployment/prebuild.js
index 01c6865a4b..30a7c6772e 100644
--- a/ui/deployment/prebuild.js
+++ b/ui/deployment/prebuild.js
@@ -73,6 +73,7 @@ for (let module of config.modules) {
         path: modules[module]['path'],
         link: modules[module]['link'],
         pageNames: modules[module]['pageNames'],
+        privileges: modules[module]['privileges'],
         url: modules[module]['url'],
         title: modules[module]['title'],
         icon: modules[module]['icon'],
diff --git 
a/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser.component.html
 
b/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser.component.html
index 17baed9a64..b84999e3c6 100644
--- 
a/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser.component.html
+++ 
b/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser.component.html
@@ -17,61 +17,65 @@
   -->
 
 <div fxLayout="row" fxFlex="100">
-    <div [fxFlex]="expanded ? browserWidth : '75px'">
-        <sp-basic-view [showBackLink]="false">
-            <div nav fxLayoutAlign="start center" fxFlex="100">
-                @if (assetBrowserData) {
-                    <sp-asset-browser-toolbar
-                        fxFlex="100"
+    @if (showAssetBrowser) {
+        <div [fxFlex]="expanded ? browserWidth : '75px'">
+            <sp-basic-view [showBackLink]="false">
+                <div nav fxLayoutAlign="start center" fxFlex="100">
+                    @if (assetBrowserData) {
+                        <sp-asset-browser-toolbar
+                            fxFlex="100"
+                            [assetBrowserData]="assetBrowserData"
+                            [expanded]="expanded"
+                            (toggleExpanded)="toggleExpanded($event)"
+                        >
+                        </sp-asset-browser-toolbar>
+                    }
+                </div>
+                @if (assetBrowserData?.assets?.length > 0 && expanded) {
+                    <sp-asset-browser-hierarchy
+                        [allResourcesAlias]="allResourcesAlias"
                         [assetBrowserData]="assetBrowserData"
-                        [expanded]="expanded"
-                        (toggleExpanded)="toggleExpanded($event)"
+                        [assetSelectionMode]="assetSelectionMode"
+                        [resourceCount]="resourceCount"
+                        [filteredAssetLinkType]="filteredAssetLinkType"
+                        (selectedAssetEmitter)="applyAssetFilter($event)"
+                        class="asset-hierarchy"
                     >
-                    </sp-asset-browser-toolbar>
-                }
-            </div>
-            @if (assetBrowserData?.assets?.length > 0 && expanded) {
-                <sp-asset-browser-hierarchy
-                    [allResourcesAlias]="allResourcesAlias"
-                    [assetBrowserData]="assetBrowserData"
-                    [assetSelectionMode]="assetSelectionMode"
-                    [resourceCount]="resourceCount"
-                    [filteredAssetLinkType]="filteredAssetLinkType"
-                    (selectedAssetEmitter)="applyAssetFilter($event)"
-                    class="asset-hierarchy"
-                >
-                </sp-asset-browser-hierarchy>
-            } @else if (assetBrowserData?.assets?.length === 0 && expanded) {
-                <div
-                    fxLayoutAlign="center center"
-                    fxLayout="column"
-                    fxFlex="100"
-                >
-                    <span class="asset-creation-hint"
-                        >No assets found - use assets to better organize
-                        resources!</span
+                    </sp-asset-browser-hierarchy>
+                } @else if (
+                    assetBrowserData?.assets?.length === 0 && expanded
+                ) {
+                    <div
+                        fxLayoutAlign="center center"
+                        fxLayout="column"
+                        fxFlex="100"
                     >
-                    <button
-                        mat-button
-                        color="accent"
-                        class="mt-10"
-                        (click)="navigateToAssetManagement()"
+                        <span class="asset-creation-hint"
+                            >No assets found - use assets to better organize
+                            resources!</span
+                        >
+                        <button
+                            mat-button
+                            color="accent"
+                            class="mt-10"
+                            (click)="navigateToAssetManagement()"
+                        >
+                            Manage assets
+                        </button>
+                    </div>
+                }
+                @if (!expanded) {
+                    <div
+                        *ngIf="!expanded"
+                        class="asset-hierarchy asset-browser-text"
+                        fxLayoutAlign="center center"
                     >
-                        Manage assets
-                    </button>
-                </div>
-            }
-            @if (!expanded) {
-                <div
-                    *ngIf="!expanded"
-                    class="asset-hierarchy asset-browser-text"
-                    fxLayoutAlign="center center"
-                >
-                    Asset Browser
-                </div>
-            }
-        </sp-basic-view>
-    </div>
+                        Asset Browser
+                    </div>
+                }
+            </sp-basic-view>
+        </div>
+    }
     <div fxFlex>
         <ng-content> </ng-content>
     </div>
diff --git 
a/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser.component.ts
 
b/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser.component.ts
index a1a4aa96ba..f9c027d136 100644
--- 
a/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser.component.ts
+++ 
b/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser.component.ts
@@ -29,6 +29,7 @@ import { AssetBrowserData } from './asset-browser.model';
 import { Subscription } from 'rxjs';
 import { SpAsset } from '@streampipes/platform-services';
 import { Router } from '@angular/router';
+import { CurrentUserService } from '../../services/current-user.service';
 
 @Component({
     selector: 'sp-asset-browser',
@@ -68,20 +69,28 @@ export class AssetBrowserComponent implements OnInit, 
OnDestroy {
     expandedSub: Subscription;
 
     expanded = true;
+    showAssetBrowser = false;
 
     constructor(
         private assetBrowserService: SpAssetBrowserService,
         private router: Router,
+        private currentUserService: CurrentUserService,
     ) {}
 
     ngOnInit(): void {
-        this.assetBrowserDataSub =
-            this.assetBrowserService.assetData$.subscribe(assetData => {
-                this.assetBrowserData = assetData;
-            });
-        this.expandedSub = this.assetBrowserService.expanded$.subscribe(
-            expanded => (this.expanded = expanded),
-        );
+        this.showAssetBrowser = this.currentUserService.hasAnyRole([
+            'PRIVILEGE_READ_ASSETS',
+            'PRIVILEGE_WRITE_ASSETS',
+        ]);
+        if (this.showAssetBrowser) {
+            this.assetBrowserDataSub =
+                this.assetBrowserService.assetData$.subscribe(assetData => {
+                    this.assetBrowserData = assetData;
+                });
+            this.expandedSub = this.assetBrowserService.expanded$.subscribe(
+                expanded => (this.expanded = expanded),
+            );
+        }
     }
 
     toggleExpanded(event: boolean): void {
diff --git 
a/ui/projects/streampipes/shared-ui/src/lib/services/current-user.service.ts 
b/ui/projects/streampipes/shared-ui/src/lib/services/current-user.service.ts
index 8bbfa7beb3..2eb4e5b051 100644
--- a/ui/projects/streampipes/shared-ui/src/lib/services/current-user.service.ts
+++ b/ui/projects/streampipes/shared-ui/src/lib/services/current-user.service.ts
@@ -41,4 +41,21 @@ export class CurrentUserService {
     public getCurrentUser(): UserInfo {
         return this.user$.getValue() || this.jwtTokenStorageService.getUser();
     }
+
+    public hasRole(role: string): boolean {
+        const roles = this.getCurrentUser().roles;
+        return roles.includes('ROLE_ADMIN') || roles.includes(role);
+    }
+
+    public hasAnyRole(roles: string[]): boolean {
+        if (Array.isArray(roles)) {
+            return roles.reduce(
+                (aggregator: false, role: string) =>
+                    aggregator || this.hasRole(role),
+                false,
+            );
+        }
+
+        return false;
+    }
 }
diff --git a/ui/src/app/_enums/user-privilege.enum.ts 
b/ui/src/app/_enums/user-privilege.enum.ts
index 53ec9a5f2e..499a954bed 100644
--- a/ui/src/app/_enums/user-privilege.enum.ts
+++ b/ui/src/app/_enums/user-privilege.enum.ts
@@ -19,31 +19,24 @@
 export enum UserPrivilege {
     PRIVILEGE_READ_PIPELINE = 'PRIVILEGE_READ_PIPELINE',
     PRIVILEGE_WRITE_PIPELINE = 'PRIVILEGE_WRITE_PIPELINE',
-    PRIVILEGE_DELETE_PIPELINE = 'PRIVILEGE_DELETE_PIPELINE',
-
-    PRIVILEGE_READ_DATA_EXPLORER_VIEW = 'PRIVILEGE_READ_DATA_EXPLORER_VIEW',
-    PRIVILEGE_WRITE_DATA_EXPLORER_VIEW = 'PRIVILEGE_WRITE_DATA_EXPLORER_VIEW',
-    PRIVILEGE_DELETE_DATA_EXPLORER_VIEW = 
'PRIVILEGE_DELETE_DATA_EXPLORER_VIEW',
-
-    PRIVILEGE_READ_DASHBOARD = 'PRIVILEGE_READ_DASHBOARD',
-    PRIVILEGE_WRITE_DASHBOARD = 'PRIVILEGE_WRITE_DASHBOARD',
-    PRIVILEGE_DELETE_DASHBOARD = 'PRIVILEGE_DELETE_DASHBOARD',
 
     PRIVILEGE_READ_ADAPTER = 'PRIVILEGE_READ_ADAPTER',
     PRIVILEGE_WRITE_ADAPTER = 'PRIVILEGE_WRITE_ADAPTER',
-    PRIVILEGE_DELETE_ADAPTER = 'PRIVILEGE_DELETE_ADAPTER',
 
     PRIVILEGE_READ_PIPELINE_ELEMENT = 'PRIVILEGE_READ_PIPELINE_ELEMENT',
     PRIVILEGE_WRITE_PIPELINE_ELEMENT = 'PRIVILEGE_WRITE_PIPELINE_ELEMENT',
-    PRIVILEGE_DELETE_PIPELINE_ELEMENT = 'PRIVILEGE_DELETE_PIPELINE_ELEMENT',
+
+    PRIVILEGE_READ_DASHBOARD = 'PRIVILEGE_READ_DASHBOARD',
+    PRIVILEGE_WRITE_DASHBOARD = 'PRIVILEGE_WRITE_DASHBOARD',
+
+    PRIVILEGE_READ_DATA_EXPLORER_VIEW = 'PRIVILEGE_READ_DATA_EXPLORER_VIEW',
+    PRIVILEGE_WRITE_DATA_EXPLORER_VIEW = 'PRIVILEGE_WRITE_DATA_EXPLORER_VIEW',
 
     PRIVILEGE_READ_DATA_EXPLORER_WIDGET = 
'PRIVILEGE_READ_DATA_EXPLORER_WIDGET',
     PRIVILEGE_WRITE_DATA_EXPLORER_WIDGET = 
'PRIVILEGE_WRITE_DATA_EXPLORER_WIDGET',
-    PRIVILEGE_DELETE_DATA_EXPLORER_WIDGET = 
'PRIVILEGE_DELETE_DATA_EXPLORER_WIDGET',
 
     PRIVILEGE_READ_DASHBOARD_WIDGET = 'PRIVILEGE_READ_DASHBOARD_WIDGET',
     PRIVILEGE_WRITE_DASHBOARD_WIDGET = 'PRIVILEGE_WRITE_DASHBOARD_WIDGET',
-    PRIVILEGE_DELETE_DASHBOARD_WIDGET = 'PRIVILEGE_DELETE_DASHBOARD_WIDGET',
 
     PRIVILEGE_READ_APPS = 'PRIVILEGE_READ_APPS',
     PRIVILEGE_WRITE_APPS = 'PRIVILEGE_WRITE_APPS',
@@ -52,5 +45,10 @@ export enum UserPrivilege {
 
     PRIVILEGE_READ_FILES = 'PRIVILEGE_READ_FILES',
     PRIVILEGE_WRITE_FILES = 'PRIVILEGE_WRITE_FILES',
-    PRIVILEGE_DELETE_FILES = 'PRIVILEGE_DELETE_FILES',
+
+    PRIVILEGE_READ_ASSETS = 'PRIVILEGE_READ_ASSETS',
+    PRIVILEGE_WRITE_ASSETS = 'PRIVILEGE_WRITE_ASSETS',
+
+    PRIVILEGE_READ_LABELS = 'PRIVILEGE_READ_LABELS',
+    PRIVILEGE_WRITE_LABELS = 'PRIVILEGE_WRITE_LABELS',
 }
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 fab5cecf00..0f3ebc4468 100644
--- a/ui/src/app/_guards/page-auth.can-active.guard.ts
+++ b/ui/src/app/_guards/page-auth.can-active.guard.ts
@@ -18,7 +18,6 @@
 
 import { ActivatedRouteSnapshot } from '@angular/router';
 import { AuthService } from '../services/auth.service';
-import { PageName } from '../_enums/page-name.enum';
 import { Injectable } from '@angular/core';
 
 @Injectable()
@@ -26,8 +25,8 @@ export class PageAuthGuard {
     constructor(private authService: AuthService) {}
 
     canActivateChild(activatedRouteSnapshot: ActivatedRouteSnapshot): boolean {
-        const pageNames: PageName[] = 
activatedRouteSnapshot.data.authPageNames;
+        const privileges: string[] = activatedRouteSnapshot.data.privileges;
 
-        return this.authService.isAnyAccessGranted(pageNames, true);
+        return this.authService.isAnyAccessGranted(privileges, true);
     }
 }
diff --git 
a/ui/src/app/assets/components/asset-overview/asset-overview.component.html 
b/ui/src/app/assets/components/asset-overview/asset-overview.component.html
index 22451587b9..6c6b0fb2db 100644
--- a/ui/src/app/assets/components/asset-overview/asset-overview.component.html
+++ b/ui/src/app/assets/components/asset-overview/asset-overview.component.html
@@ -24,6 +24,7 @@
         class="pl-10"
     >
         <button
+            *ngIf="hasWritePrivilege"
             mat-button
             mat-raised-button
             color="accent"
@@ -100,6 +101,7 @@
                                     <i class="material-icons">search</i>
                                 </button>
                                 <button
+                                    *ngIf="hasWritePrivilege"
                                     color="accent"
                                     mat-icon-button
                                     matTooltip="Edit asset"
@@ -111,6 +113,7 @@
                                 </button>
 
                                 <button
+                                    *ngIf="hasWritePrivilege"
                                     color="accent"
                                     mat-icon-button
                                     matTooltip="Delete asset"
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 88a5b3f79f..386a03157d 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
@@ -24,6 +24,7 @@ import {
     SpAssetModel,
 } from '@streampipes/platform-services';
 import {
+    CurrentUserService,
     DialogService,
     PanelType,
     SpAssetBrowserService,
@@ -33,6 +34,7 @@ import { SpAssetRoutes } from '../../assets.routes';
 import { Router } from '@angular/router';
 import { SpCreateAssetDialogComponent } from 
'../../dialog/create-asset/create-asset-dialog.component';
 import { IdGeneratorService } from 
'../../../core-services/id-generator/id-generator.service';
+import { UserPrivilege } from '../../../_enums/user-privilege.enum';
 
 @Component({
     selector: 'sp-asset-overview',
@@ -47,6 +49,8 @@ export class SpAssetOverviewComponent implements OnInit {
     dataSource: MatTableDataSource<SpAssetModel> =
         new MatTableDataSource<SpAssetModel>();
 
+    hasWritePrivilege = false;
+
     constructor(
         private genericStorageService: GenericStorageService,
         private breadcrumbService: SpBreadcrumbService,
@@ -54,9 +58,13 @@ export class SpAssetOverviewComponent implements OnInit {
         private router: Router,
         private idGeneratorService: IdGeneratorService,
         private assetBrowserService: SpAssetBrowserService,
+        private currentUserService: CurrentUserService,
     ) {}
 
     ngOnInit(): void {
+        this.hasWritePrivilege = this.currentUserService.hasRole(
+            UserPrivilege.PRIVILEGE_WRITE_ASSETS,
+        );
         this.breadcrumbService.updateBreadcrumb(
             this.breadcrumbService.getRootLink(SpAssetRoutes.BASE),
         );
diff --git a/ui/src/app/configuration/configuration-tabs.service.ts 
b/ui/src/app/configuration/configuration-tabs.service.ts
index e1e2db1f81..dc1187b0aa 100644
--- a/ui/src/app/configuration/configuration-tabs.service.ts
+++ b/ui/src/app/configuration/configuration-tabs.service.ts
@@ -53,6 +53,12 @@ export class SpConfigurationTabsService {
             itemLink: ['configuration', 'extensions-services'],
             roles: ['ROLE_ADMIN'],
         },
+        {
+            itemId: 'files',
+            itemTitle: 'Files',
+            itemLink: ['configuration', 'files'],
+            roles: ['PRIVILEGE_READ_FILES', 'PRIVILEGE_WRITE_FILES'],
+        },
         {
             itemId: 'labels',
             itemTitle: 'Labels',
diff --git a/ui/src/app/configuration/configuration.module.ts 
b/ui/src/app/configuration/configuration.module.ts
index 5b9a22c875..f24da2f959 100644
--- a/ui/src/app/configuration/configuration.module.ts
+++ b/ui/src/app/configuration/configuration.module.ts
@@ -91,6 +91,11 @@ import { EditRoleDialogComponent } from 
'./security-configuration/edit-role-dial
 import { MatListModule } from '@angular/material/list';
 import { configurationRouteGuard } from './configuration-route.guard';
 import { ServiceConfigsItemComponent } from 
'./extensions-service-management/extensions-service-configuration/service-configs/service-configs-item/service-configs-item.component';
+import { FilesComponent } from './files/files.component';
+import { FileOverviewComponent } from 
'./files/file-overview/file-overview.component';
+import { FileUploadDialogComponent } from 
'./dialog/file-upload/file-upload-dialog.component';
+import { FileRenameDialogComponent } from 
'./dialog/file-rename/file-rename-dialog.component';
+import { MatDialogModule } from '@angular/material/dialog';
 
 @NgModule({
     imports: [
@@ -164,6 +169,11 @@ import { ServiceConfigsItemComponent } from 
'./extensions-service-management/ext
                         component: ExtensionsServiceManagementComponent,
                         canActivate: [configurationRouteGuard],
                     },
+                    {
+                        path: 'files',
+                        component: FilesComponent,
+                        canActivate: [configurationRouteGuard],
+                    },
                     {
                         path: 'security',
                         component: SecurityConfigurationComponent,
@@ -182,6 +192,7 @@ import { ServiceConfigsItemComponent } from 
'./extensions-service-management/ext
         CodemirrorModule,
         MatSort,
         MatListModule,
+        MatDialogModule,
     ],
     declarations: [
         ServiceConfigsComponent,
@@ -197,6 +208,10 @@ import { ServiceConfigsItemComponent } from 
'./extensions-service-management/ext
         EditUserDialogComponent,
         EditGroupDialogComponent,
         EmailConfigurationComponent,
+        FilesComponent,
+        FileOverviewComponent,
+        FileUploadDialogComponent,
+        FileRenameDialogComponent,
         GeneralConfigurationComponent,
         ExtensionsServiceManagementComponent,
         LocationFeaturesConfigurationComponent,
diff --git 
a/ui/src/app/files/dialog/file-rename/file-rename-dialog.component.html 
b/ui/src/app/configuration/dialog/file-rename/file-rename-dialog.component.html
similarity index 100%
rename from 
ui/src/app/files/dialog/file-rename/file-rename-dialog.component.html
rename to 
ui/src/app/configuration/dialog/file-rename/file-rename-dialog.component.html
diff --git 
a/ui/src/app/files/dialog/file-rename/file-rename-dialog.component.scss 
b/ui/src/app/configuration/dialog/file-rename/file-rename-dialog.component.scss
similarity index 95%
rename from 
ui/src/app/files/dialog/file-rename/file-rename-dialog.component.scss
rename to 
ui/src/app/configuration/dialog/file-rename/file-rename-dialog.component.scss
index 5af8ee0fc0..13cbc4aacb 100644
--- a/ui/src/app/files/dialog/file-rename/file-rename-dialog.component.scss
+++ 
b/ui/src/app/configuration/dialog/file-rename/file-rename-dialog.component.scss
@@ -15,5 +15,3 @@
  * limitations under the License.
  *
  */
-
-@import '../../../../scss/sp/sp-dialog';
diff --git 
a/ui/src/app/files/dialog/file-rename/file-rename-dialog.component.ts 
b/ui/src/app/configuration/dialog/file-rename/file-rename-dialog.component.ts
similarity index 100%
rename from ui/src/app/files/dialog/file-rename/file-rename-dialog.component.ts
rename to 
ui/src/app/configuration/dialog/file-rename/file-rename-dialog.component.ts
diff --git 
a/ui/src/app/files/dialog/file-upload/file-upload-dialog.component.html 
b/ui/src/app/configuration/dialog/file-upload/file-upload-dialog.component.html
similarity index 100%
rename from 
ui/src/app/files/dialog/file-upload/file-upload-dialog.component.html
rename to 
ui/src/app/configuration/dialog/file-upload/file-upload-dialog.component.html
diff --git 
a/ui/src/app/files/dialog/file-upload/file-upload-dialog.component.scss 
b/ui/src/app/configuration/dialog/file-upload/file-upload-dialog.component.scss
similarity index 95%
rename from 
ui/src/app/files/dialog/file-upload/file-upload-dialog.component.scss
rename to 
ui/src/app/configuration/dialog/file-upload/file-upload-dialog.component.scss
index 5af8ee0fc0..13cbc4aacb 100644
--- a/ui/src/app/files/dialog/file-upload/file-upload-dialog.component.scss
+++ 
b/ui/src/app/configuration/dialog/file-upload/file-upload-dialog.component.scss
@@ -15,5 +15,3 @@
  * limitations under the License.
  *
  */
-
-@import '../../../../scss/sp/sp-dialog';
diff --git 
a/ui/src/app/files/dialog/file-upload/file-upload-dialog.component.ts 
b/ui/src/app/configuration/dialog/file-upload/file-upload-dialog.component.ts
similarity index 100%
rename from ui/src/app/files/dialog/file-upload/file-upload-dialog.component.ts
rename to 
ui/src/app/configuration/dialog/file-upload/file-upload-dialog.component.ts
diff --git 
a/ui/src/app/files/components/file-overview/file-overview.component.html 
b/ui/src/app/configuration/files/file-overview/file-overview.component.html
similarity index 100%
rename from 
ui/src/app/files/components/file-overview/file-overview.component.html
rename to 
ui/src/app/configuration/files/file-overview/file-overview.component.html
diff --git 
a/ui/src/app/files/components/file-overview/file-overview.component.scss 
b/ui/src/app/configuration/files/file-overview/file-overview.component.scss
similarity index 100%
rename from 
ui/src/app/files/components/file-overview/file-overview.component.scss
rename to 
ui/src/app/configuration/files/file-overview/file-overview.component.scss
diff --git 
a/ui/src/app/files/components/file-overview/file-overview.component.ts 
b/ui/src/app/configuration/files/file-overview/file-overview.component.ts
similarity index 100%
rename from ui/src/app/files/components/file-overview/file-overview.component.ts
rename to 
ui/src/app/configuration/files/file-overview/file-overview.component.ts
diff --git a/ui/src/app/files/files.component.html 
b/ui/src/app/configuration/files/files.component.html
similarity index 54%
rename from ui/src/app/files/files.component.html
rename to ui/src/app/configuration/files/files.component.html
index bbdd7e0319..b4b058e804 100644
--- a/ui/src/app/files/files.component.html
+++ b/ui/src/app/configuration/files/files.component.html
@@ -16,36 +16,30 @@
   ~
   -->
 
-<sp-basic-view [showBackLink]="false" [padding]="true">
-    <div
-        nav
-        fxFlex="100"
-        fxLayoutAlign="start center"
-        fxLayout="row"
-        class="pl-10"
+<sp-basic-nav-tabs [spNavigationItems]="tabs" [activeLink]="'files'">
+    <sp-split-section
+        title="Files"
+        subtitle="Upload and manage files that are used by adapters or 
pipeline elements."
     >
-        <button
-            mat-button
-            mat-raised-button
-            color="accent"
-            (click)="openFileUploadDialog()"
-            data-cy="sp-open-file-upload-dialog"
-            class="mr-10"
-        >
-            <i class="material-icons">cloud_upload</i>
-            &nbsp;Upload new file
-        </button>
-    </div>
+        <div fxLayout="row" fxLayoutAlign="start start" fxLayoutGap="10px">
+            <button
+                mat-button
+                mat-raised-button
+                color="accent"
+                (click)="openFileUploadDialog()"
+                data-cy="sp-open-file-upload-dialog"
+                class="mr-10"
+            >
+                <i class="material-icons">cloud_upload</i>
+                &nbsp;Upload new file
+            </button>
+        </div>
 
-    <div fxFlex="100" fxLayout="column">
-        <sp-basic-header-title-component
-            title="Files"
-        ></sp-basic-header-title-component>
-        <div fxFlex="100" fxLayout="row" fxLayoutAlign="center start">
+        <div fxFlex="100" fxLayout="column">
             <sp-file-overview
-                fxFlex="90"
+                fxFlex="100"
                 #fileOverviewComponent
             ></sp-file-overview>
         </div>
-    </div>
-</sp-basic-view>
+    </sp-split-section>
+</sp-basic-nav-tabs>
diff --git a/ui/src/app/files/files.component.scss 
b/ui/src/app/configuration/files/files.component.scss
similarity index 100%
rename from ui/src/app/files/files.component.scss
rename to ui/src/app/configuration/files/files.component.scss
diff --git a/ui/src/app/files/files.component.ts 
b/ui/src/app/configuration/files/files.component.ts
similarity index 75%
rename from ui/src/app/files/files.component.ts
rename to ui/src/app/configuration/files/files.component.ts
index 3129ef4897..642c471bc7 100644
--- a/ui/src/app/files/files.component.ts
+++ b/ui/src/app/configuration/files/files.component.ts
@@ -21,26 +21,33 @@ import {
     DialogService,
     PanelType,
     SpBreadcrumbService,
+    SpNavigationItem,
 } from '@streampipes/shared-ui';
-import { FileUploadDialogComponent } from 
'./dialog/file-upload/file-upload-dialog.component';
-import { SpFilesRoutes } from './files.routes';
+import { FileUploadDialogComponent } from 
'../dialog/file-upload/file-upload-dialog.component';
+import { SpConfigurationTabsService } from '../configuration-tabs.service';
+import { SpConfigurationRoutes } from '../configuration.routes';
 
 @Component({
     templateUrl: './files.component.html',
     styleUrls: ['./files.component.scss'],
 })
 export class FilesComponent implements OnInit {
+    tabs: SpNavigationItem[] = [];
+
     @ViewChild('fileOverviewComponent') fileOverviewComponent;
 
     constructor(
         private dialogService: DialogService,
         private breadcrumbService: SpBreadcrumbService,
+        private tabService: SpConfigurationTabsService,
     ) {}
 
     ngOnInit() {
-        this.breadcrumbService.updateBreadcrumb(
-            this.breadcrumbService.getRootLink(SpFilesRoutes.BASE),
-        );
+        this.tabs = this.tabService.getTabs();
+        this.breadcrumbService.updateBreadcrumb([
+            SpConfigurationRoutes.BASE,
+            { label: this.tabService.getTabTitle('files') },
+        ]);
     }
 
     openFileUploadDialog() {
diff --git 
a/ui/src/app/core-ui/static-properties/static-file-input/static-file-input.component.ts
 
b/ui/src/app/core-ui/static-properties/static-file-input/static-file-input.component.ts
index e181e438fe..600058ad46 100644
--- 
a/ui/src/app/core-ui/static-properties/static-file-input/static-file-input.component.ts
+++ 
b/ui/src/app/core-ui/static-properties/static-file-input/static-file-input.component.ts
@@ -19,15 +19,15 @@
 import { Component, EventEmitter, OnInit, Output } from '@angular/core';
 import { HttpEventType, HttpResponse } from '@angular/common/http';
 import {
+    FileMetadata,
     FilesService,
     FileStaticProperty,
-    FileMetadata,
 } from '@streampipes/platform-services';
 import { ConfigurationInfo } from '../../../connect/model/ConfigurationInfo';
 import { AbstractValidatedStaticPropertyRenderer } from 
'../base/abstract-validated-static-property';
 import { UntypedFormControl, ValidatorFn, Validators } from '@angular/forms';
 import { MatDialog, MatDialogRef } from '@angular/material/dialog';
-import { FileRenameDialogComponent } from 
'../../../files/dialog/file-rename/file-rename-dialog.component';
+import { FileRenameDialogComponent } from 
'../../../configuration/dialog/file-rename/file-rename-dialog.component';
 
 @Component({
     selector: 'sp-static-file-input',
diff --git a/ui/src/app/core/components/iconbar/iconbar.component.html 
b/ui/src/app/core/components/iconbar/iconbar.component.html
index 873dc19adf..85d6238171 100644
--- a/ui/src/app/core/components/iconbar/iconbar.component.html
+++ b/ui/src/app/core/components/iconbar/iconbar.component.html
@@ -16,16 +16,11 @@
   ~
   -->
 
-<div style="padding-top: 0px" fxFlex="100" fxLayout="column">
+<div style="padding-top: 0" fxFlex="100" fxLayout="column">
     <div *ngFor="let item of menu">
         <div
             *ngIf="item.visible"
-            style="
-                min-width: 0px;
-                padding: 0px;
-                padding-top: 5px;
-                padding-bottom: 5px;
-            "
+            style="min-width: 0; padding: 5px 0"
             [ngClass]="
                 item.link === activePage
                     ? 'sp-navbar-item-selected'
@@ -52,37 +47,4 @@
             </button>
         </div>
     </div>
-
-    <mat-divider
-        style="border-top-color: var(--color-navigation-text)"
-    ></mat-divider>
-    <div *ngFor="let item of admin">
-        <div
-            [ngClass]="
-                item.link === activePage
-                    ? 'sp-navbar-item-selected'
-                    : 'sp-navbar-item'
-            "
-            style="padding-top: 5px; padding-bottom: 5px"
-            *ngIf="item.visible"
-        >
-            <button
-                mat-icon-button
-                class="md-icon-button button-margin-iconbar iconbar-size"
-                (click)="go(item.link)"
-                matTooltip="{{ item.title }}"
-                matTooltipPosition="right"
-            >
-                <mat-icon
-                    [ngClass]="
-                        item.link === activePage
-                            ? 'sp-navbar-icon-selected'
-                            : 'sp-navbar-icon'
-                    "
-                    data-cy="navigation-icon"
-                    >{{ item.icon }}</mat-icon
-                >
-            </button>
-        </div>
-    </div>
 </div>
diff --git a/ui/src/app/core/components/iconbar/iconbar.component.ts 
b/ui/src/app/core/components/iconbar/iconbar.component.ts
index dbfef7651b..7230e58cb5 100644
--- a/ui/src/app/core/components/iconbar/iconbar.component.ts
+++ b/ui/src/app/core/components/iconbar/iconbar.component.ts
@@ -19,9 +19,7 @@
 import { Component, OnInit } from '@angular/core';
 import { BaseNavigationComponent } from '../base-navigation.component';
 import { Router } from '@angular/router';
-import { NotificationCountService } from 
'../../../services/notification-count-service';
 import { AuthService } from '../../../services/auth.service';
-import { RestApi } from '../../../services/rest-api.service';
 import { AppConstants } from '../../../services/app.constants';
 import { CurrentUserService } from '@streampipes/shared-ui';
 
@@ -38,8 +36,6 @@ export class IconbarComponent
         router: Router,
         authService: AuthService,
         currentUserService: CurrentUserService,
-        public notificationCountService: NotificationCountService,
-        private restApi: RestApi,
         appConstants: AppConstants,
     ) {
         super(authService, currentUserService, router, appConstants);
diff --git a/ui/src/app/files/files.module.ts b/ui/src/app/files/files.module.ts
index 20794c27cb..991569618d 100644
--- a/ui/src/app/files/files.module.ts
+++ b/ui/src/app/files/files.module.ts
@@ -24,16 +24,14 @@ import { MatGridListModule } from 
'@angular/material/grid-list';
 import { MatIconModule } from '@angular/material/icon';
 import { MatDividerModule } from '@angular/material/divider';
 import { MatListModule } from '@angular/material/list';
-import { FilesComponent } from './files.component';
+import { FilesComponent } from '../configuration/files/files.component';
 import { MatTabsModule } from '@angular/material/tabs';
 import { CoreUiModule } from '../core-ui/core-ui.module';
-import { FileUploadDialogComponent } from 
'./dialog/file-upload/file-upload-dialog.component';
 import { FormsModule, ReactiveFormsModule } from '@angular/forms';
 import { MatFormFieldModule } from '@angular/material/form-field';
 import { MatProgressBarModule } from '@angular/material/progress-bar';
 import { MatInputModule } from '@angular/material/input';
 import { ServicesModule } from '../services/services.module';
-import { FileOverviewComponent } from 
'./components/file-overview/file-overview.component';
 import { MatTableModule } from '@angular/material/table';
 import { MatPaginatorModule } from '@angular/material/paginator';
 import { MatChipsModule } from '@angular/material/chips';
@@ -41,7 +39,6 @@ import { MatTooltipModule } from '@angular/material/tooltip';
 import { PlatformServicesModule } from '@streampipes/platform-services';
 import { RouterModule } from '@angular/router';
 import { SharedUiModule } from '@streampipes/shared-ui';
-import { FileRenameDialogComponent } from 
'./dialog/file-rename/file-rename-dialog.component';
 import { MatDialogModule } from '@angular/material/dialog';
 
 @NgModule({
@@ -80,12 +77,7 @@ import { MatDialogModule } from '@angular/material/dialog';
         ]),
         MatDialogModule,
     ],
-    declarations: [
-        FilesComponent,
-        FileOverviewComponent,
-        FileUploadDialogComponent,
-        FileRenameDialogComponent,
-    ],
+    declarations: [],
     providers: [],
 })
 export class FilesModule {}
diff --git a/ui/src/app/home/models/home.model.ts 
b/ui/src/app/home/models/home.model.ts
index d27ae16a27..7bea8078c3 100644
--- a/ui/src/app/home/models/home.model.ts
+++ b/ui/src/app/home/models/home.model.ts
@@ -18,7 +18,6 @@
 
 import { Observable } from 'rxjs';
 import { PageName } from '../../_enums/page-name.enum';
-import { UserRole } from '../../_enums/user-role.enum';
 
 export interface StatusBox {
     link: string[];
@@ -26,8 +25,8 @@ export interface StatusBox {
     title: string;
     createTitle: string;
     dataFns: Observable<any>[];
-    viewRoles: UserRole[];
-    createRoles: UserRole[];
+    viewRoles: string[];
+    createRoles: string[];
     icon: string;
 }
 
@@ -41,6 +40,7 @@ export interface ServiceLink {
     description: string;
     icon: string;
     pageNames: PageName[];
+    privileges: string[];
     link: Link;
     showStatusBox: boolean;
     statusBox?: StatusBox;
diff --git a/ui/src/app/pipelines/pipelines.component.html 
b/ui/src/app/pipelines/pipelines.component.html
index 1c1847df3a..9538b01fc1 100644
--- a/ui/src/app/pipelines/pipelines.component.html
+++ b/ui/src/app/pipelines/pipelines.component.html
@@ -34,6 +34,7 @@
                 mat-button
                 mat-raised-button
                 color="accent"
+                *ngIf="hasPipelineWritePrivileges"
                 (click)="navigateToPipelineEditor()"
                 data-cy="pipelines-navigate-to-editor"
             >
diff --git a/ui/src/app/services/auth.service.ts 
b/ui/src/app/services/auth.service.ts
index c48cff00f9..a3da9a4fdb 100644
--- a/ui/src/app/services/auth.service.ts
+++ b/ui/src/app/services/auth.service.ts
@@ -23,10 +23,9 @@ import { JwtHelperService } from '@auth0/angular-jwt';
 import { filter, map, switchMap } from 'rxjs/operators';
 import { Router } from '@angular/router';
 import { LoginService } from '../login/services/login.service';
-import { PageName } from '../_enums/page-name.enum';
 import {
-    JwtTokenStorageService,
     CurrentUserService,
+    JwtTokenStorageService,
 } from '@streampipes/shared-ui';
 
 @Injectable({ providedIn: 'root' })
@@ -148,94 +147,23 @@ export class AuthService {
             });
     }
 
-    getUserRoles(): string[] {
-        return this.currentUserService.getCurrentUser().roles;
-    }
-
     public hasRole(role: string): boolean {
-        return (
-            this.getUserRoles().includes('ROLE_ADMIN') ||
-            this.getUserRoles().includes(role)
-        );
+        return this.currentUserService.hasRole(role);
     }
 
     public hasAnyRole(roles: string[]): boolean {
-        if (Array.isArray(roles)) {
-            return roles.reduce(
-                (aggregator: false, role: string) =>
-                    aggregator || this.hasRole(role),
-                false,
-            );
-        }
-
-        return false;
+        return this.currentUserService.hasAnyRole(roles);
     }
 
-    isAnyAccessGranted(pageNames: PageName[], redirect?: boolean): boolean {
-        if (!pageNames || pageNames.length === 0) {
+    isAnyAccessGranted(privileges: string[], redirect?: boolean): boolean {
+        if (!privileges || privileges.length === 0) {
             return true;
         }
 
-        const result = pageNames.some(pageName =>
-            this.isAccessGranted(pageName),
-        );
+        const result = this.hasAnyRole(privileges);
         if (!result && redirect) {
             this.router.navigate(['']);
         }
         return result;
     }
-
-    isAccessGranted(pageName: PageName) {
-        if (this.hasRole('ROLE_ADMIN')) {
-            return true;
-        }
-        switch (pageName) {
-            case PageName.HOME:
-                return true;
-            case PageName.PIPELINE_EDITOR:
-                return this.hasAnyRole(['ROLE_PIPELINE_ADMIN']);
-            case PageName.PIPELINE_OVERVIEW:
-                return this.hasAnyRole([
-                    'ROLE_PIPELINE_ADMIN',
-                    'ROLE_PIPELINE_USER',
-                ]);
-            case PageName.CONNECT:
-                return this.hasAnyRole(['ROLE_CONNECT_ADMIN']);
-            case PageName.DASHBOARD:
-                return this.hasAnyRole([
-                    'ROLE_DASHBOARD_USER',
-                    'ROLE_DASHBOARD_ADMIN',
-                ]);
-            case PageName.DATA_EXPLORER:
-                return this.hasAnyRole([
-                    'ROLE_DATA_EXPLORER_ADMIN',
-                    'ROLE_DATA_EXPLORER_USER',
-                ]);
-            case PageName.APPS:
-                return this.hasAnyRole(['ROLE_APP_USER']);
-            case PageName.FILE_UPLOAD:
-                return this.hasAnyRole([
-                    'ROLE_CONNECT_ADMIN',
-                    'ROLE_PIPELINE_ADMIN',
-                ]);
-            case PageName.INSTALL_PIPELINE_ELEMENTS:
-                return this.hasAnyRole(['ROLE_ADMIN']);
-            case PageName.NOTIFICATIONS:
-                return this.hasAnyRole(['ROLE_PIPELINE_ADMIN']);
-            case PageName.ASSETS:
-                return this.hasAnyRole([
-                    'ROLE_ADMIN',
-                    'PRIVILEGE_READ_ASSETS',
-                    'PRIVILEGE_WRITE_ASSETS',
-                ]);
-            case PageName.SETTINGS:
-                return this.hasAnyRole([
-                    'ROLE_ADMIN',
-                    'PRIVILEGE_WRITE_ASSETS',
-                    'PRIVILEGE_WRITE_LABELS',
-                ]);
-            default:
-                return true;
-        }
-    }
 }

Reply via email to