This is an automated email from the ASF dual-hosted git repository. riemer pushed a commit to branch deduplicate-configuration-tabs in repository https://gitbox.apache.org/repos/asf/streampipes.git
commit 0149595a57a07120573f1ff17dfdbcebb3c520a0 Author: Dominik Riemer <[email protected]> AuthorDate: Sat Mar 7 00:14:53 2026 +0100 refactor: Improve registration of available settings views --- .../api/system/ISpCoreConfigurationStorage.java | 4 - .../impl/system/CoreConfigurationStorageImpl.java | 10 +- .../lib/models/sp-configuration-section.model.ts | 30 ++--- .../lib/services/configuration-sections.service.ts | 104 +++++++++++++++++ .../lib/services/configuration-sections.token.ts | 34 +++--- .../streampipes/shared-ui/src/public-api.ts | 3 + ui/src/app/app.config.ts | 2 + .../app/configuration/configuration-route.guard.ts | 22 +++- .../configuration-section-host.component.ts | 59 ++++++++++ .../configuration-sections.providers.ts | 129 +++++++++++++++++++++ .../configuration/configuration-tabs.service.ts | 100 ++++------------ ui/src/app/configuration/configuration.routes.ts | 68 ++--------- 12 files changed, 374 insertions(+), 191 deletions(-) diff --git a/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/system/ISpCoreConfigurationStorage.java b/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/system/ISpCoreConfigurationStorage.java index 468bbf5a05..38aafa7c41 100644 --- a/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/system/ISpCoreConfigurationStorage.java +++ b/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/system/ISpCoreConfigurationStorage.java @@ -20,14 +20,10 @@ package org.apache.streampipes.storage.api.system; import org.apache.streampipes.model.configuration.SpCoreConfiguration; -import java.util.List; - public interface ISpCoreConfigurationStorage { boolean exists(); - List<SpCoreConfiguration> getAll(); - void createElement(SpCoreConfiguration element); SpCoreConfiguration get(); diff --git a/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/impl/system/CoreConfigurationStorageImpl.java b/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/impl/system/CoreConfigurationStorageImpl.java index f18edc7394..19c28a454f 100644 --- a/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/impl/system/CoreConfigurationStorageImpl.java +++ b/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/impl/system/CoreConfigurationStorageImpl.java @@ -23,24 +23,16 @@ import org.apache.streampipes.storage.api.system.ISpCoreConfigurationStorage; import org.apache.streampipes.storage.couchdb.dao.AbstractDao; import org.apache.streampipes.storage.couchdb.utils.Utils; -import java.util.List; - public class CoreConfigurationStorageImpl extends AbstractDao<SpCoreConfiguration> implements ISpCoreConfigurationStorage { - public CoreConfigurationStorageImpl() { super(Utils::getCouchDbGeneralConfigStorage, SpCoreConfiguration.class); } @Override public boolean exists() { - return !findAll().isEmpty(); - } - - @Override - public List<SpCoreConfiguration> getAll() { - return findAll(); + return get() != null; } @Override diff --git a/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/system/ISpCoreConfigurationStorage.java b/ui/projects/streampipes/shared-ui/src/lib/models/sp-configuration-section.model.ts similarity index 65% copy from streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/system/ISpCoreConfigurationStorage.java copy to ui/projects/streampipes/shared-ui/src/lib/models/sp-configuration-section.model.ts index 468bbf5a05..b79a0c255c 100644 --- a/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/system/ISpCoreConfigurationStorage.java +++ b/ui/projects/streampipes/shared-ui/src/lib/models/sp-configuration-section.model.ts @@ -16,23 +16,17 @@ * */ -package org.apache.streampipes.storage.api.system; +import { Type } from '@angular/core'; -import org.apache.streampipes.model.configuration.SpCoreConfiguration; - -import java.util.List; - -public interface ISpCoreConfigurationStorage { - - boolean exists(); - - List<SpCoreConfiguration> getAll(); - - void createElement(SpCoreConfiguration element); - - SpCoreConfiguration get(); - - SpCoreConfiguration updateElement(SpCoreConfiguration element); - - void deleteElement(); +interface SpConfigurationSectionBase { + itemId: string; + itemTitle: string; + roles: string[]; + order?: number; } + +export type SpConfigurationSection = SpConfigurationSectionBase & + ( + | { component: Type<unknown> } + | { loadComponent: () => Promise<Type<unknown>> } + ); diff --git a/ui/projects/streampipes/shared-ui/src/lib/services/configuration-sections.service.ts b/ui/projects/streampipes/shared-ui/src/lib/services/configuration-sections.service.ts new file mode 100644 index 0000000000..dff3baabe9 --- /dev/null +++ b/ui/projects/streampipes/shared-ui/src/lib/services/configuration-sections.service.ts @@ -0,0 +1,104 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import { Injectable, inject, Type } from '@angular/core'; +import { TranslateService } from '@ngx-translate/core'; +import { SpNavigationItem } from '../models/sp-navigation.model'; +import { CurrentUserService } from './current-user.service'; +import { SpConfigurationSection } from '../models/sp-configuration-section.model'; +import { SP_CONFIGURATION_SECTIONS } from './configuration-sections.token'; + +@Injectable({ providedIn: 'root' }) +export class SpConfigurationSectionsService { + private currentUserService = inject(CurrentUserService); + private translateService = inject(TranslateService); + private registeredSections = + inject(SP_CONFIGURATION_SECTIONS, { optional: true }) ?? []; + + public getTabs(): SpNavigationItem[] { + return this.getVisibleSections().map(section => ({ + itemId: section.itemId, + itemTitle: this.translateService.instant(section.itemTitle), + itemLink: ['configuration', section.itemId], + roles: section.roles, + })); + } + + public getTabTitle(itemId: string): string { + const section = this.getSection(itemId); + return section + ? this.translateService.instant(section.itemTitle) + : itemId; + } + + public getSection(itemId: string): SpConfigurationSection | undefined { + return this.getSections().find(section => section.itemId === itemId); + } + + public async getSectionComponent( + itemId: string, + ): Promise<Type<unknown> | undefined> { + const section = this.getSection(itemId); + if (!section) { + return undefined; + } + + if ('component' in section) { + return section.component; + } + + if ('loadComponent' in section) { + return section.loadComponent(); + } + + return undefined; + } + + public getDefaultTab(): SpNavigationItem | undefined { + return this.getTabs()[0]; + } + + public isTabActive( + activeTabs: SpNavigationItem[], + itemId: string, + ): boolean { + return activeTabs.some(tab => tab.itemId === itemId); + } + + private getVisibleSections(): SpConfigurationSection[] { + return this.getSections().filter(section => + this.currentUserService.hasAnyRole(section.roles), + ); + } + + private getSections(): SpConfigurationSection[] { + const sections = new Map<string, SpConfigurationSection>(); + this.registeredSections.forEach(section => + sections.set(section.itemId, section), + ); + + return Array.from(sections.values()).sort((left, right) => { + const leftOrder = left.order ?? Number.MAX_SAFE_INTEGER; + const rightOrder = right.order ?? Number.MAX_SAFE_INTEGER; + if (leftOrder === rightOrder) { + return left.itemId.localeCompare(right.itemId); + } + return leftOrder - rightOrder; + }); + } +} diff --git a/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/system/ISpCoreConfigurationStorage.java b/ui/projects/streampipes/shared-ui/src/lib/services/configuration-sections.token.ts similarity index 63% copy from streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/system/ISpCoreConfigurationStorage.java copy to ui/projects/streampipes/shared-ui/src/lib/services/configuration-sections.token.ts index 468bbf5a05..a7f5286c4a 100644 --- a/streampipes-storage-api/src/main/java/org/apache/streampipes/storage/api/system/ISpCoreConfigurationStorage.java +++ b/ui/projects/streampipes/shared-ui/src/lib/services/configuration-sections.token.ts @@ -16,23 +16,19 @@ * */ -package org.apache.streampipes.storage.api.system; - -import org.apache.streampipes.model.configuration.SpCoreConfiguration; - -import java.util.List; - -public interface ISpCoreConfigurationStorage { - - boolean exists(); - - List<SpCoreConfiguration> getAll(); - - void createElement(SpCoreConfiguration element); - - SpCoreConfiguration get(); - - SpCoreConfiguration updateElement(SpCoreConfiguration element); - - void deleteElement(); +import { InjectionToken, Provider } from '@angular/core'; +import { SpConfigurationSection } from '../models/sp-configuration-section.model'; + +export const SP_CONFIGURATION_SECTIONS = new InjectionToken< + SpConfigurationSection[] +>('SP_CONFIGURATION_SECTIONS'); + +export function provideConfigurationSection( + section: SpConfigurationSection, +): Provider { + return { + provide: SP_CONFIGURATION_SECTIONS, + useValue: section, + multi: true, + }; } diff --git a/ui/projects/streampipes/shared-ui/src/public-api.ts b/ui/projects/streampipes/shared-ui/src/public-api.ts index 5b4a0b2060..446a78381e 100644 --- a/ui/projects/streampipes/shared-ui/src/public-api.ts +++ b/ui/projects/streampipes/shared-ui/src/public-api.ts @@ -62,8 +62,11 @@ export * from './lib/components/feature-card-host/feature-card-meta-section/feat export * from './lib/components/feature-card-host/feature-card-meta-creation/feature-card-meta-creation.component'; export * from './lib/models/sp-navigation.model'; +export * from './lib/models/sp-configuration-section.model'; export * from './lib/services/breadcrumb.service'; +export * from './lib/services/configuration-sections.service'; +export * from './lib/services/configuration-sections.token'; export * from './lib/services/jwt-token-storage.service'; export * from './lib/services/current-user.service'; export * from './lib/services/echarts-toolbox.service'; diff --git a/ui/src/app/app.config.ts b/ui/src/app/app.config.ts index 6f3a05bbaa..d2bdfa6643 100644 --- a/ui/src/app/app.config.ts +++ b/ui/src/app/app.config.ts @@ -49,6 +49,7 @@ import { provideTranslateHttpLoader } from '@ngx-translate/http-loader'; import { NgxEchartsModule } from 'ngx-echarts'; import { MatNativeDateModule } from '@angular/material/core'; import { MonacoEditorModule } from 'ngx-monaco-editor-v2'; +import { CONFIGURATION_SECTION_PROVIDERS } from './configuration/configuration-sections.providers'; export const appConfig: ApplicationConfig = { providers: [ @@ -93,6 +94,7 @@ export const appConfig: ApplicationConfig = { provide: MatPaginatorIntl, useClass: PaginatorService, }, + ...CONFIGURATION_SECTION_PROVIDERS, provideAnimations(), ], }; diff --git a/ui/src/app/configuration/configuration-route.guard.ts b/ui/src/app/configuration/configuration-route.guard.ts index 312ccecc14..dfbdf2ab7b 100644 --- a/ui/src/app/configuration/configuration-route.guard.ts +++ b/ui/src/app/configuration/configuration-route.guard.ts @@ -20,15 +20,25 @@ import { inject } from '@angular/core'; import { CanActivateFn, Router } from '@angular/router'; import { SpConfigurationTabsService } from './configuration-tabs.service'; +export const configurationDefaultRouteGuard: CanActivateFn = () => { + const tabService = inject(SpConfigurationTabsService); + const router = inject(Router); + const defaultTab = tabService.getDefaultTab(); + return defaultTab ? router.createUrlTree(defaultTab.itemLink) : false; +}; + export const configurationRouteGuard: CanActivateFn = route => { const tabService = inject(SpConfigurationTabsService); const tabs = tabService.getTabs(); - const router: Router = inject(Router); - const path = route.routeConfig.path; - if (tabService.isTabActive(tabs, path)) { + const router = inject(Router); + const configurationSectionId = route.paramMap.get('configurationSectionId'); + if ( + configurationSectionId && + tabService.isTabActive(tabs, configurationSectionId) + ) { return true; - } else { - router.navigate(tabs[0].itemLink, { skipLocationChange: true }); - return false; } + + const defaultTab = tabService.getDefaultTab(); + return defaultTab ? router.createUrlTree(defaultTab.itemLink) : false; }; diff --git a/ui/src/app/configuration/configuration-section-host.component.ts b/ui/src/app/configuration/configuration-section-host.component.ts new file mode 100644 index 0000000000..999cea157d --- /dev/null +++ b/ui/src/app/configuration/configuration-section-host.component.ts @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import { NgComponentOutlet } from '@angular/common'; +import { Component, Type, inject } from '@angular/core'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { ActivatedRoute } from '@angular/router'; +import { map } from 'rxjs/operators'; +import { SpConfigurationTabsService } from './configuration-tabs.service'; + +@Component({ + selector: 'sp-configuration-section-host', + template: ` + @if (sectionComponent) { + <ng-container *ngComponentOutlet="sectionComponent"></ng-container> + } + `, + imports: [NgComponentOutlet], +}) +export class ConfigurationSectionHostComponent { + sectionComponent?: Type<unknown>; + + private route = inject(ActivatedRoute); + private tabService = inject(SpConfigurationTabsService); + + constructor() { + this.route.paramMap + .pipe( + map(params => params.get('configurationSectionId')), + takeUntilDestroyed(), + ) + .subscribe(sectionId => { + void this.updateSectionComponent(sectionId); + }); + } + + private async updateSectionComponent( + sectionId: string | null, + ): Promise<void> { + this.sectionComponent = sectionId + ? await this.tabService.getSectionComponent(sectionId) + : undefined; + } +} diff --git a/ui/src/app/configuration/configuration-sections.providers.ts b/ui/src/app/configuration/configuration-sections.providers.ts new file mode 100644 index 0000000000..bb7a387ab4 --- /dev/null +++ b/ui/src/app/configuration/configuration-sections.providers.ts @@ -0,0 +1,129 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import { Provider } from '@angular/core'; +import { + SpConfigurationSection, + provideConfigurationSection, +} from '@streampipes/shared-ui'; + +const CORE_CONFIGURATION_SECTIONS: SpConfigurationSection[] = [ + { + itemId: 'general', + itemTitle: 'General', + roles: ['ROLE_ADMIN'], + loadComponent: () => + import('./general-configuration/general-configuration.component').then( + m => m.GeneralConfigurationComponent, + ), + order: 100, + }, + { + itemId: 'export', + itemTitle: 'Export/Import', + roles: ['ROLE_ADMIN'], + loadComponent: () => + import('./export/data-export-import.component').then( + m => m.SpDataExportImportComponent, + ), + order: 200, + }, + { + itemId: 'extensions-installation', + itemTitle: 'Extensions', + roles: ['ROLE_ADMIN'], + loadComponent: () => + import('./extensions-installation/extensions-installation.component').then( + m => m.SpExtensionsInstallationComponent, + ), + order: 300, + }, + { + itemId: 'extensions-services', + itemTitle: 'Extension Services', + roles: ['ROLE_ADMIN'], + loadComponent: () => + import('./extensions-service-management/extensions-service-management.component').then( + m => m.ExtensionsServiceManagementComponent, + ), + order: 400, + }, + { + itemId: 'files', + itemTitle: 'Files', + roles: ['PRIVILEGE_WRITE_FILES'], + loadComponent: () => + import('./files/files.component').then(m => m.FilesComponent), + order: 500, + }, + { + itemId: 'labels', + itemTitle: 'Labels', + roles: ['PRIVILEGE_WRITE_LABELS'], + loadComponent: () => + import('./label-configuration/label-configuration.component').then( + m => m.SpLabelConfigurationComponent, + ), + order: 600, + }, + { + itemId: 'email', + itemTitle: 'Mail', + roles: ['ROLE_ADMIN'], + loadComponent: () => + import('./email-configuration/email-configuration.component').then( + m => m.EmailConfigurationComponent, + ), + order: 700, + }, + { + itemId: 'messaging', + itemTitle: 'Messaging', + roles: ['ROLE_ADMIN'], + loadComponent: () => + import('./messaging-configuration/messaging-configuration.component').then( + m => m.MessagingConfigurationComponent, + ), + order: 800, + }, + { + itemId: 'security', + itemTitle: 'Security', + roles: ['ROLE_ADMIN'], + loadComponent: () => + import('./security-configuration/security-configuration.component').then( + m => m.SecurityConfigurationComponent, + ), + order: 900, + }, + { + itemId: 'sites', + itemTitle: 'Sites', + roles: ['PRIVILEGE_WRITE_ASSETS'], + loadComponent: () => + import('./sites-configuration/sites-configuration.component').then( + m => m.SitesConfigurationComponent, + ), + order: 1000, + }, +]; + +export const CONFIGURATION_SECTION_PROVIDERS: Provider[] = + CORE_CONFIGURATION_SECTIONS.map(section => + provideConfigurationSection(section), + ); diff --git a/ui/src/app/configuration/configuration-tabs.service.ts b/ui/src/app/configuration/configuration-tabs.service.ts index 1c8c0558e9..f4620f8989 100644 --- a/ui/src/app/configuration/configuration-tabs.service.ts +++ b/ui/src/app/configuration/configuration-tabs.service.ts @@ -16,95 +16,43 @@ * */ -import { SpNavigationItem } from '@streampipes/shared-ui'; -import { Injectable, inject } from '@angular/core'; -import { AuthService } from '../services/auth.service'; -import { TranslateService } from '@ngx-translate/core'; +import { + SpConfigurationSectionsService, + SpNavigationItem, +} from '@streampipes/shared-ui'; +import { Injectable, Type, inject } from '@angular/core'; @Injectable({ providedIn: 'root' }) export class SpConfigurationTabsService { - private translateService = inject(TranslateService); - allConfigurationTabs: SpNavigationItem[] = [ - { - itemId: 'general', - itemTitle: this.translateService.instant('General'), - itemLink: ['configuration', 'general'], - roles: ['ROLE_ADMIN'], - }, - { - itemId: 'export', - itemTitle: this.translateService.instant('Export/Import'), - itemLink: ['configuration', 'export'], - roles: ['ROLE_ADMIN'], - }, - { - itemId: 'extensions-installation', - itemTitle: this.translateService.instant('Extensions'), - itemLink: ['configuration', 'extensions-installation'], - roles: ['ROLE_ADMIN'], - }, - { - itemId: 'extensions-services', - itemTitle: this.translateService.instant('Extension Services'), - itemLink: ['configuration', 'extensions-services'], - roles: ['ROLE_ADMIN'], - }, - { - itemId: 'files', - itemTitle: this.translateService.instant('Files'), - itemLink: ['configuration', 'files'], - roles: ['PRIVILEGE_WRITE_FILES'], - }, - { - itemId: 'labels', - itemTitle: this.translateService.instant('Labels'), - itemLink: ['configuration', 'labels'], - roles: ['PRIVILEGE_WRITE_LABELS'], - }, - { - itemId: 'email', - itemTitle: this.translateService.instant('Mail'), - itemLink: ['configuration', 'email'], - roles: ['ROLE_ADMIN'], - }, - { - itemId: 'messaging', - itemTitle: this.translateService.instant('Messaging'), - itemLink: ['configuration', 'messaging'], - roles: ['ROLE_ADMIN'], - }, - { - itemId: 'security', - itemTitle: this.translateService.instant('Security'), - itemLink: ['configuration', 'security'], - roles: ['ROLE_ADMIN'], - }, - { - itemId: 'sites', - itemTitle: this.translateService.instant('Sites'), - itemLink: ['configuration', 'sites'], - roles: ['PRIVILEGE_WRITE_ASSETS'], - }, - ]; - - constructor(private authService: AuthService) {} + private configurationSectionsService = inject( + SpConfigurationSectionsService, + ); public getTabs(): SpNavigationItem[] { - return this.allConfigurationTabs.filter(c => - this.authService.hasAnyRole(c.roles), - ); + return this.configurationSectionsService.getTabs(); } public getTabTitle(itemId: string): string { - return this.allConfigurationTabs.find(t => t.itemId === itemId) - .itemTitle; + return this.configurationSectionsService.getTabTitle(itemId); + } + + public getSectionComponent( + itemId: string, + ): Promise<Type<unknown> | undefined> { + return this.configurationSectionsService.getSectionComponent(itemId); + } + + public getDefaultTab(): SpNavigationItem | undefined { + return this.configurationSectionsService.getDefaultTab(); } public isTabActive( activeTabs: SpNavigationItem[], itemId: string, ): boolean { - const links = activeTabs.map(tab => tab.itemLink[1]); - return links.indexOf(itemId) !== -1; + return this.configurationSectionsService.isTabActive( + activeTabs, + itemId, + ); } } diff --git a/ui/src/app/configuration/configuration.routes.ts b/ui/src/app/configuration/configuration.routes.ts index ef7910790a..1473e354ee 100644 --- a/ui/src/app/configuration/configuration.routes.ts +++ b/ui/src/app/configuration/configuration.routes.ts @@ -17,21 +17,15 @@ */ import { Routes } from '@angular/router'; -import { GeneralConfigurationComponent } from './general-configuration/general-configuration.component'; -import { configurationRouteGuard } from './configuration-route.guard'; -import { EmailConfigurationComponent } from './email-configuration/email-configuration.component'; -import { SpDataExportImportComponent } from './export/data-export-import.component'; -import { SpLabelConfigurationComponent } from './label-configuration/label-configuration.component'; -import { MessagingConfigurationComponent } from './messaging-configuration/messaging-configuration.component'; -import { SpExtensionsInstallationComponent } from './extensions-installation/extensions-installation.component'; -import { ExtensionsServiceManagementComponent } from './extensions-service-management/extensions-service-management.component'; -import { FilesComponent } from './files/files.component'; -import { SecurityConfigurationComponent } from './security-configuration/security-configuration.component'; -import { SitesConfigurationComponent } from './sites-configuration/sites-configuration.component'; +import { + configurationDefaultRouteGuard, + configurationRouteGuard, +} from './configuration-route.guard'; import { OrderByPipe } from './extensions-installation/filter/order-by.pipe'; import { PipelineElementInstallationStatusFilter } from './extensions-installation/filter/pipeline-element-installation-status.pipe'; import { PipelineElementNameFilter } from './extensions-installation/filter/pipeline-element-name.pipe'; import { PipelineElementTypeFilter } from './extensions-installation/filter/pipeline-element-type.pipe'; +import { ConfigurationSectionHostComponent } from './configuration-section-host.component'; export const CONFIGURATION_ROUTES: Routes = [ { @@ -39,57 +33,13 @@ export const CONFIGURATION_ROUTES: Routes = [ children: [ { path: '', - redirectTo: 'general', pathMatch: 'full', + component: ConfigurationSectionHostComponent, + canActivate: [configurationDefaultRouteGuard], }, { - path: 'general', - component: GeneralConfigurationComponent, - canActivate: [configurationRouteGuard], - }, - { - path: 'email', - component: EmailConfigurationComponent, - canActivate: [configurationRouteGuard], - }, - { - path: 'export', - component: SpDataExportImportComponent, - canActivate: [configurationRouteGuard], - }, - { - path: 'labels', - component: SpLabelConfigurationComponent, - canActivate: [configurationRouteGuard], - }, - { - path: 'messaging', - component: MessagingConfigurationComponent, - canActivate: [configurationRouteGuard], - }, - { - path: 'extensions-installation', - component: SpExtensionsInstallationComponent, - canActivate: [configurationRouteGuard], - }, - { - path: 'extensions-services', - component: ExtensionsServiceManagementComponent, - canActivate: [configurationRouteGuard], - }, - { - path: 'files', - component: FilesComponent, - canActivate: [configurationRouteGuard], - }, - { - path: 'security', - component: SecurityConfigurationComponent, - canActivate: [configurationRouteGuard], - }, - { - path: 'sites', - component: SitesConfigurationComponent, + path: ':configurationSectionId', + component: ConfigurationSectionHostComponent, canActivate: [configurationRouteGuard], }, ],
