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>
- 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>
+ 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;
- }
- }
}