diff --git a/npm/ng-packs/angular.json b/npm/ng-packs/angular.json
index 819ae99025..617e907f3f 100644
--- a/npm/ng-packs/angular.json
+++ b/npm/ng-packs/angular.json
@@ -253,6 +253,41 @@
}
}
}
+ },
+ "setting-management": {
+ "projectType": "library",
+ "root": "packages/setting-management",
+ "sourceRoot": "packages/setting-management/src",
+ "prefix": "abp",
+ "architect": {
+ "build": {
+ "builder": "@angular-devkit/build-ng-packagr:build",
+ "options": {
+ "tsConfig": "packages/setting-management/tsconfig.lib.json",
+ "project": "packages/setting-management/ng-package.json"
+ }
+ },
+ "test": {
+ "builder": "@angular-devkit/build-angular:karma",
+ "options": {
+ "main": "packages/setting-management/src/test.ts",
+ "tsConfig": "packages/setting-management/tsconfig.spec.json",
+ "karmaConfig": "packages/setting-management/karma.conf.js"
+ }
+ },
+ "lint": {
+ "builder": "@angular-devkit/build-angular:tslint",
+ "options": {
+ "tsConfig": [
+ "packages/setting-management/tsconfig.lib.json",
+ "packages/setting-management/tsconfig.spec.json"
+ ],
+ "exclude": [
+ "**/node_modules/**"
+ ]
+ }
+ }
+ }
}
},
"defaultProject": "core"
diff --git a/npm/ng-packs/packages/account/src/lib/constants/routes.ts b/npm/ng-packs/packages/account/src/lib/constants/routes.ts
index c1ba80be83..b1a29f8009 100644
--- a/npm/ng-packs/packages/account/src/lib/constants/routes.ts
+++ b/npm/ng-packs/packages/account/src/lib/constants/routes.ts
@@ -1,11 +1,14 @@
import { ABP, eLayoutType } from '@abp/ng.core';
-export const ACCOUNT_ROUTES = [
- {
- name: 'Account',
- path: 'account',
- invisible: true,
- layout: eLayoutType.application,
- children: [{ path: 'login', name: 'Login', order: 1 }, { path: 'register', name: 'Register', order: 2 }],
- },
-] as ABP.FullRoute[];
+export const ACCOUNT_ROUTES = {
+ routes: [
+ {
+ name: 'Account',
+ path: 'account',
+ invisible: true,
+ layout: eLayoutType.application,
+ children: [{ path: 'login', name: 'Login', order: 1 }, { path: 'register', name: 'Register', order: 2 }],
+ },
+ ] as ABP.FullRoute[],
+ settings: [],
+};
diff --git a/npm/ng-packs/packages/core/src/lib/components/dynamic-layout.component.ts b/npm/ng-packs/packages/core/src/lib/components/dynamic-layout.component.ts
index 30852429f5..517e1974ad 100644
--- a/npm/ng-packs/packages/core/src/lib/components/dynamic-layout.component.ts
+++ b/npm/ng-packs/packages/core/src/lib/components/dynamic-layout.component.ts
@@ -57,7 +57,7 @@ function findLayout(segments: UrlSegment[], routes: ABP.FullRoute[]): eLayoutTyp
if (route.children && route.children.length && segments.length > 1) {
const child = route.children.find(c => c.path === segments[1].path);
- if (child.layout) {
+ if (child && child.layout) {
layout = child.layout;
}
}
diff --git a/npm/ng-packs/packages/core/src/lib/plugins/config/config.plugin.ts b/npm/ng-packs/packages/core/src/lib/plugins/config/config.plugin.ts
index 361c48b08b..9064461f53 100644
--- a/npm/ng-packs/packages/core/src/lib/plugins/config/config.plugin.ts
+++ b/npm/ng-packs/packages/core/src/lib/plugins/config/config.plugin.ts
@@ -38,9 +38,9 @@ export class ConfigPlugin implements NgxsPlugin {
function transformRoutes(routes: Routes = [], wrappers: ABP.FullRoute[] = []): any {
const abpRoutes: ABP.FullRoute[] = routes
.filter(route => {
- return snq(() => route.data.routes.find(r => r.path === route.path), false);
+ return snq(() => route.data.routes.routes.find(r => r.path === route.path), false);
})
- .reduce((acc, val) => [...acc, ...val.data.routes], []);
+ .reduce((acc, val) => [...acc, ...val.data.routes.routes], []);
wrappers = abpRoutes.filter(ar => ar.wrapper);
const transformed = [] as ABP.FullRoute[];
@@ -48,7 +48,7 @@ function transformRoutes(routes: Routes = [], wrappers: ABP.FullRoute[] = []): a
.filter(route => (route.data || {}).routes && (route.component || route.loadChildren))
.forEach(route => {
const abpPackage = abpRoutes.find(
- abp => abp.path.toLowerCase() === route.path.toLowerCase() && snq(() => route.data.routes.length, false),
+ abp => abp.path.toLowerCase() === route.path.toLowerCase() && snq(() => route.data.routes.routes.length, false),
);
const { length } = transformed;
diff --git a/npm/ng-packs/packages/core/src/lib/states/config.state.ts b/npm/ng-packs/packages/core/src/lib/states/config.state.ts
index 9ad6c08527..aa3fa0e5e2 100644
--- a/npm/ng-packs/packages/core/src/lib/states/config.state.ts
+++ b/npm/ng-packs/packages/core/src/lib/states/config.state.ts
@@ -60,6 +60,17 @@ export class ConfigState {
return selector;
}
+ static getRoute(path?: string, name?: string) {
+ const selector = createSelector(
+ [ConfigState],
+ function(state: Config.State) {
+ return findRoute(state.routes, path, name);
+ },
+ );
+
+ return selector;
+ }
+
static getApiUrl(key?: string) {
const selector = createSelector(
[ConfigState],
@@ -229,3 +240,22 @@ function patchRouteDeep(
return organizeRoutes(routes);
}
+
+function findRoute(routes: ABP.FullRoute[], path?: string, name?: string) {
+ let foundRoute;
+ routes.forEach(route => {
+ if (foundRoute) return;
+
+ if (path && route.path === path) {
+ foundRoute = route;
+ } else if (name && route.name === name) {
+ foundRoute = route;
+ return;
+ } else if (route.children && route.children.length) {
+ foundRoute = findRoute(route.children, path, name);
+ return;
+ }
+ });
+
+ return foundRoute;
+}
diff --git a/npm/ng-packs/packages/core/src/lib/utils/common-utils.ts b/npm/ng-packs/packages/core/src/lib/utils/common-utils.ts
new file mode 100644
index 0000000000..ba76b0f97f
--- /dev/null
+++ b/npm/ng-packs/packages/core/src/lib/utils/common-utils.ts
@@ -0,0 +1,4 @@
+export function noop() {
+ const fn = function() {};
+ return fn;
+}
diff --git a/npm/ng-packs/packages/core/src/lib/utils/index.ts b/npm/ng-packs/packages/core/src/lib/utils/index.ts
index e2a72ebd3f..0043152ada 100644
--- a/npm/ng-packs/packages/core/src/lib/utils/index.ts
+++ b/npm/ng-packs/packages/core/src/lib/utils/index.ts
@@ -1,3 +1,4 @@
+export * from './common-utils';
export * from './generator-utils';
export * from './initial-utils';
export * from './route-utils';
diff --git a/npm/ng-packs/packages/identity/src/lib/constants/routes.ts b/npm/ng-packs/packages/identity/src/lib/constants/routes.ts
index f8dbcc88df..b524bac753 100644
--- a/npm/ng-packs/packages/identity/src/lib/constants/routes.ts
+++ b/npm/ng-packs/packages/identity/src/lib/constants/routes.ts
@@ -1,22 +1,25 @@
import { eLayoutType, ABP } from '@abp/ng.core';
-export const IDENTITY_ROUTES = [
- {
- name: 'AbpUiNavigation::Menu:Administration',
- path: '',
- order: 1,
- wrapper: true,
- },
- {
- name: 'AbpIdentity::Menu:IdentityManagement',
- path: 'identity',
- order: 1,
- parentName: 'AbpUiNavigation::Menu:Administration',
- layout: eLayoutType.application,
- iconClass: 'fa fa-id-card-o',
- children: [
- { path: 'roles', name: 'AbpIdentity::Roles', order: 2, requiredPolicy: 'AbpIdentity.Roles' },
- { path: 'users', name: 'AbpIdentity::Users', order: 1, requiredPolicy: 'AbpIdentity.Users' },
- ],
- },
-] as ABP.FullRoute[];
+export const IDENTITY_ROUTES = {
+ routes: [
+ {
+ name: 'AbpUiNavigation::Menu:Administration',
+ path: '',
+ order: 1,
+ wrapper: true,
+ },
+ {
+ name: 'AbpIdentity::Menu:IdentityManagement',
+ path: 'identity',
+ order: 1,
+ parentName: 'AbpUiNavigation::Menu:Administration',
+ layout: eLayoutType.application,
+ iconClass: 'fa fa-id-card-o',
+ children: [
+ { path: 'roles', name: 'AbpIdentity::Roles', order: 2, requiredPolicy: 'AbpIdentity.Roles' },
+ { path: 'users', name: 'AbpIdentity::Users', order: 1, requiredPolicy: 'AbpIdentity.Users' },
+ ],
+ },
+ ] as ABP.FullRoute[],
+ settings: [],
+};
diff --git a/npm/ng-packs/packages/setting-management/README.md b/npm/ng-packs/packages/setting-management/README.md
new file mode 100644
index 0000000000..54044cc8c0
--- /dev/null
+++ b/npm/ng-packs/packages/setting-management/README.md
@@ -0,0 +1 @@
+
@abp/ng.setting-management
\ No newline at end of file
diff --git a/npm/ng-packs/packages/setting-management/karma.conf.js b/npm/ng-packs/packages/setting-management/karma.conf.js
new file mode 100644
index 0000000000..51ccc0578d
--- /dev/null
+++ b/npm/ng-packs/packages/setting-management/karma.conf.js
@@ -0,0 +1,32 @@
+// Karma configuration file, see link for more information
+// https://karma-runner.github.io/1.0/config/configuration-file.html
+
+module.exports = function (config) {
+ config.set({
+ basePath: '',
+ frameworks: ['jasmine', '@angular-devkit/build-angular'],
+ plugins: [
+ require('karma-jasmine'),
+ require('karma-chrome-launcher'),
+ require('karma-jasmine-html-reporter'),
+ require('karma-coverage-istanbul-reporter'),
+ require('@angular-devkit/build-angular/plugins/karma')
+ ],
+ client: {
+ clearContext: false // leave Jasmine Spec Runner output visible in browser
+ },
+ coverageIstanbulReporter: {
+ dir: require('path').join(__dirname, '../../coverage/setting-management'),
+ reports: ['html', 'lcovonly', 'text-summary'],
+ fixWebpackSourcePaths: true
+ },
+ reporters: ['progress', 'kjhtml'],
+ port: 9876,
+ colors: true,
+ logLevel: config.LOG_INFO,
+ autoWatch: true,
+ browsers: ['Chrome'],
+ singleRun: false,
+ restartOnFileChange: true
+ });
+};
diff --git a/npm/ng-packs/packages/setting-management/ng-package.json b/npm/ng-packs/packages/setting-management/ng-package.json
new file mode 100644
index 0000000000..e5ba9f97fc
--- /dev/null
+++ b/npm/ng-packs/packages/setting-management/ng-package.json
@@ -0,0 +1,8 @@
+{
+ "$schema": "../../node_modules/ng-packagr/ng-package.schema.json",
+ "dest": "../../dist/setting-management",
+ "lib": {
+ "entryFile": "src/public-api.ts"
+ },
+ "whitelistedNonPeerDependencies": ["@abp/ng.theme.shared"]
+}
diff --git a/npm/ng-packs/packages/setting-management/package.json b/npm/ng-packs/packages/setting-management/package.json
new file mode 100644
index 0000000000..354fa248c3
--- /dev/null
+++ b/npm/ng-packs/packages/setting-management/package.json
@@ -0,0 +1,10 @@
+{
+ "name": "@abp/ng.setting-management",
+ "version": "0.0.1",
+ "dependencies": {
+ "@abp/ng.theme.shared": "^0.8.3"
+ },
+ "publishConfig": {
+ "access": "public"
+ }
+}
diff --git a/npm/ng-packs/packages/setting-management/src/lib/components/index.ts b/npm/ng-packs/packages/setting-management/src/lib/components/index.ts
new file mode 100644
index 0000000000..4f59d5c056
--- /dev/null
+++ b/npm/ng-packs/packages/setting-management/src/lib/components/index.ts
@@ -0,0 +1 @@
+export * from './setting/setting.component';
diff --git a/npm/ng-packs/packages/setting-management/src/lib/components/services/initial.service.ts b/npm/ng-packs/packages/setting-management/src/lib/components/services/initial.service.ts
new file mode 100644
index 0000000000..44f289a362
--- /dev/null
+++ b/npm/ng-packs/packages/setting-management/src/lib/components/services/initial.service.ts
@@ -0,0 +1,17 @@
+import { SettingTab } from '@abp/ng.theme.shared';
+import { Injectable, OnInit } from '@angular/core';
+import { Router } from '@angular/router';
+import snq from 'snq';
+
+@Injectable()
+export class InitialService {
+ public settings: SettingTab[];
+
+ constructor(private router: Router) {
+ this.settings = this.router.config
+ .map(route => snq(() => route.data.routes.settings))
+ .filter(settings => settings && settings.length)
+ .reduce((acc, val) => [...acc, ...val], [])
+ .sort((a, b) => a.order - b.order);
+ }
+}
diff --git a/npm/ng-packs/packages/setting-management/src/lib/components/setting/setting.component.html b/npm/ng-packs/packages/setting-management/src/lib/components/setting/setting.component.html
new file mode 100644
index 0000000000..60da5a0508
--- /dev/null
+++ b/npm/ng-packs/packages/setting-management/src/lib/components/setting/setting.component.html
@@ -0,0 +1,176 @@
+
+
+
+
+
+
+
+
+
+
+
{{ selected.name | abpLocalization }}
+
+
+
+
+
+
Lepton theme settings
+
+
+
+
+
+
+
+
+
+
+
diff --git a/npm/ng-packs/packages/setting-management/src/lib/components/setting/setting.component.ts b/npm/ng-packs/packages/setting-management/src/lib/components/setting/setting.component.ts
new file mode 100644
index 0000000000..d61df13012
--- /dev/null
+++ b/npm/ng-packs/packages/setting-management/src/lib/components/setting/setting.component.ts
@@ -0,0 +1,20 @@
+import { Component, OnInit } from '@angular/core';
+import { SettingTab } from '@abp/ng.theme.shared';
+import { InitialService } from '../services/initial.service';
+
+@Component({
+ selector: 'abp-setting',
+ templateUrl: './setting.component.html',
+})
+export class SettingComponent implements OnInit {
+ settings: SettingTab[];
+
+ selected = {} as SettingTab;
+
+ constructor(private initialService: InitialService) {}
+
+ ngOnInit() {
+ this.settings = this.initialService.settings;
+ this.selected = this.settings[0];
+ }
+}
diff --git a/npm/ng-packs/packages/setting-management/src/lib/constants/index.ts b/npm/ng-packs/packages/setting-management/src/lib/constants/index.ts
new file mode 100644
index 0000000000..a3820983e2
--- /dev/null
+++ b/npm/ng-packs/packages/setting-management/src/lib/constants/index.ts
@@ -0,0 +1 @@
+export * from './routes';
diff --git a/npm/ng-packs/packages/setting-management/src/lib/constants/routes.ts b/npm/ng-packs/packages/setting-management/src/lib/constants/routes.ts
new file mode 100644
index 0000000000..067f8e9c02
--- /dev/null
+++ b/npm/ng-packs/packages/setting-management/src/lib/constants/routes.ts
@@ -0,0 +1,15 @@
+import { ABP, eLayoutType } from '@abp/ng.core';
+
+export const SETTING_MANAGEMENT_ROUTES = {
+ routes: [
+ {
+ name: 'Settings',
+ path: 'setting-management',
+ parentName: 'AbpUiNavigation::Menu:Administration',
+ layout: eLayoutType.application,
+ order: 6,
+ iconClass: 'fa fa-cog',
+ },
+ ] as ABP.FullRoute[],
+ settings: [],
+};
diff --git a/npm/ng-packs/packages/setting-management/src/lib/setting-management-routing.module.ts b/npm/ng-packs/packages/setting-management/src/lib/setting-management-routing.module.ts
new file mode 100644
index 0000000000..dcafc14f41
--- /dev/null
+++ b/npm/ng-packs/packages/setting-management/src/lib/setting-management-routing.module.ts
@@ -0,0 +1,18 @@
+import { DynamicLayoutComponent } from '@abp/ng.core';
+import { NgModule } from '@angular/core';
+import { RouterModule, Routes } from '@angular/router';
+import { SettingComponent } from './components/setting/setting.component';
+
+const routes: Routes = [
+ {
+ path: '',
+ component: DynamicLayoutComponent,
+ children: [{ path: '', component: SettingComponent }],
+ },
+];
+
+@NgModule({
+ imports: [RouterModule.forChild(routes)],
+ exports: [RouterModule],
+})
+export class SettingManagementRoutingModule {}
diff --git a/npm/ng-packs/packages/setting-management/src/lib/setting-management.module.ts b/npm/ng-packs/packages/setting-management/src/lib/setting-management.module.ts
new file mode 100644
index 0000000000..6c0918788c
--- /dev/null
+++ b/npm/ng-packs/packages/setting-management/src/lib/setting-management.module.ts
@@ -0,0 +1,15 @@
+import { CoreModule, noop } from '@abp/ng.core';
+import { NgModule, ModuleWithProviders, APP_INITIALIZER, Self } from '@angular/core';
+import { SettingComponent } from './components/setting/setting.component';
+import { SettingManagementRoutingModule } from './setting-management-routing.module';
+import { ThemeSharedModule } from '@abp/ng.theme.shared';
+import { InitialService } from './components/services/initial.service';
+
+@NgModule({
+ declarations: [SettingComponent],
+ imports: [SettingManagementRoutingModule, CoreModule, ThemeSharedModule],
+ providers: [InitialService],
+})
+export class SettingManagementModule {
+ constructor(@Self() initialService: InitialService) {}
+}
diff --git a/npm/ng-packs/packages/setting-management/src/public-api.ts b/npm/ng-packs/packages/setting-management/src/public-api.ts
new file mode 100644
index 0000000000..1a713b6a24
--- /dev/null
+++ b/npm/ng-packs/packages/setting-management/src/public-api.ts
@@ -0,0 +1,3 @@
+export * from './lib/setting-management.module';
+export * from './lib/components';
+export * from './lib/constants';
diff --git a/npm/ng-packs/packages/setting-management/src/test.ts b/npm/ng-packs/packages/setting-management/src/test.ts
new file mode 100644
index 0000000000..978c64fb83
--- /dev/null
+++ b/npm/ng-packs/packages/setting-management/src/test.ts
@@ -0,0 +1,21 @@
+// This file is required by karma.conf.js and loads recursively all the .spec and framework files
+
+import 'zone.js/dist/zone';
+import 'zone.js/dist/zone-testing';
+import { getTestBed } from '@angular/core/testing';
+import {
+ BrowserDynamicTestingModule,
+ platformBrowserDynamicTesting
+} from '@angular/platform-browser-dynamic/testing';
+
+declare const require: any;
+
+// First, initialize the Angular testing environment.
+getTestBed().initTestEnvironment(
+ BrowserDynamicTestingModule,
+ platformBrowserDynamicTesting()
+);
+// Then we find all the tests.
+const context = require.context('./', true, /\.spec\.ts$/);
+// And load the modules.
+context.keys().map(context);
diff --git a/npm/ng-packs/packages/setting-management/tsconfig.lib.json b/npm/ng-packs/packages/setting-management/tsconfig.lib.json
new file mode 100644
index 0000000000..bd23948e59
--- /dev/null
+++ b/npm/ng-packs/packages/setting-management/tsconfig.lib.json
@@ -0,0 +1,26 @@
+{
+ "extends": "../../tsconfig.json",
+ "compilerOptions": {
+ "outDir": "../../out-tsc/lib",
+ "target": "es2015",
+ "declaration": true,
+ "inlineSources": true,
+ "types": [],
+ "lib": [
+ "dom",
+ "es2018"
+ ]
+ },
+ "angularCompilerOptions": {
+ "annotateForClosureCompiler": true,
+ "skipTemplateCodegen": true,
+ "strictMetadataEmit": true,
+ "fullTemplateTypeCheck": true,
+ "strictInjectionParameters": true,
+ "enableResourceInlining": true
+ },
+ "exclude": [
+ "src/test.ts",
+ "**/*.spec.ts"
+ ]
+}
diff --git a/npm/ng-packs/packages/setting-management/tsconfig.spec.json b/npm/ng-packs/packages/setting-management/tsconfig.spec.json
new file mode 100644
index 0000000000..16da33db07
--- /dev/null
+++ b/npm/ng-packs/packages/setting-management/tsconfig.spec.json
@@ -0,0 +1,17 @@
+{
+ "extends": "../../tsconfig.json",
+ "compilerOptions": {
+ "outDir": "../../out-tsc/spec",
+ "types": [
+ "jasmine",
+ "node"
+ ]
+ },
+ "files": [
+ "src/test.ts"
+ ],
+ "include": [
+ "**/*.spec.ts",
+ "**/*.d.ts"
+ ]
+}
diff --git a/npm/ng-packs/packages/setting-management/tslint.json b/npm/ng-packs/packages/setting-management/tslint.json
new file mode 100644
index 0000000000..8c3919ea62
--- /dev/null
+++ b/npm/ng-packs/packages/setting-management/tslint.json
@@ -0,0 +1,17 @@
+{
+ "extends": "../../tslint.json",
+ "rules": {
+ "directive-selector": [
+ true,
+ "attribute",
+ "abp",
+ "camelCase"
+ ],
+ "component-selector": [
+ true,
+ "element",
+ "abp",
+ "kebab-case"
+ ]
+ }
+}
diff --git a/npm/ng-packs/packages/tenant-management/src/lib/constants/routes.ts b/npm/ng-packs/packages/tenant-management/src/lib/constants/routes.ts
index 2fcc7004bb..6982285e95 100644
--- a/npm/ng-packs/packages/tenant-management/src/lib/constants/routes.ts
+++ b/npm/ng-packs/packages/tenant-management/src/lib/constants/routes.ts
@@ -1,19 +1,22 @@
import { ABP, eLayoutType } from '@abp/ng.core';
-export const TENANT_MANAGEMENT_ROUTES = [
- {
- name: 'AbpTenantManagement::Menu:TenantManagement',
- path: 'tenant-management',
- parentName: 'AbpUiNavigation::Menu:Administration',
- layout: eLayoutType.application,
- iconClass: 'fa fa-users',
- children: [
- {
- path: 'tenants',
- name: 'AbpTenantManagement::Tenants',
- order: 1,
- requiredPolicy: 'AbpTenantManagement.Tenants',
- },
- ],
- },
-] as ABP.FullRoute[];
+export const TENANT_MANAGEMENT_ROUTES = {
+ routes: [
+ {
+ name: 'AbpTenantManagement::Menu:TenantManagement',
+ path: 'tenant-management',
+ parentName: 'AbpUiNavigation::Menu:Administration',
+ layout: eLayoutType.application,
+ iconClass: 'fa fa-users',
+ children: [
+ {
+ path: 'tenants',
+ name: 'AbpTenantManagement::Tenants',
+ order: 1,
+ requiredPolicy: 'AbpTenantManagement.Tenants',
+ },
+ ],
+ },
+ ] as ABP.FullRoute[],
+ settings: [],
+};
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/animations/fade.animations.ts b/npm/ng-packs/packages/theme-shared/src/lib/animations/fade.animations.ts
new file mode 100644
index 0000000000..e03c768fbe
--- /dev/null
+++ b/npm/ng-packs/packages/theme-shared/src/lib/animations/fade.animations.ts
@@ -0,0 +1,7 @@
+import { animate, state, style, transition, trigger } from '@angular/animations';
+
+export const fade = trigger('fade', [
+ state('void', style({ opacity: 1 })),
+ transition(':enter', [style({ opacity: 0 }), animate(250)]),
+ transition(':leave', animate(250, style({ opacity: 0 }))),
+]);
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/animations/index.ts b/npm/ng-packs/packages/theme-shared/src/lib/animations/index.ts
index 6fd1d939c4..6a03cccac4 100644
--- a/npm/ng-packs/packages/theme-shared/src/lib/animations/index.ts
+++ b/npm/ng-packs/packages/theme-shared/src/lib/animations/index.ts
@@ -1 +1,2 @@
-export * from './slide.animation';
+export * from './fade.animations';
+export * from './slide.animations';
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/models/index.ts b/npm/ng-packs/packages/theme-shared/src/lib/models/index.ts
index 2da3330aa7..da311b86be 100644
--- a/npm/ng-packs/packages/theme-shared/src/lib/models/index.ts
+++ b/npm/ng-packs/packages/theme-shared/src/lib/models/index.ts
@@ -1,2 +1,3 @@
export * from './confirmation';
export * from './toaster';
+export * from './setting-management';
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/models/setting-management.ts b/npm/ng-packs/packages/theme-shared/src/lib/models/setting-management.ts
new file mode 100644
index 0000000000..68bd0335a5
--- /dev/null
+++ b/npm/ng-packs/packages/theme-shared/src/lib/models/setting-management.ts
@@ -0,0 +1,8 @@
+import { Type } from '@angular/core';
+
+export interface SettingTab {
+ name: string;
+ order: number;
+ component: Type;
+ requiredPolicy?: string;
+}
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts b/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts
index c2d920118d..639c6e5979 100644
--- a/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts
+++ b/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts
@@ -16,6 +16,7 @@ import { ButtonComponent } from './components/button/button.component';
import { ValidationErrorComponent } from './components/errors/validation-error.component';
import { ChangePasswordComponent } from './components/change-password/change-password.component';
import { ProfileComponent } from './components/profile/profile.component';
+import { BreadcrumbComponent } from './components/breadcrumb/breadcrumb.component';
export function appendScript(injector: Injector) {
const fn = function() {
@@ -63,6 +64,7 @@ export function appendScript(injector: Injector) {
ValidationErrorComponent,
ChangePasswordComponent,
ProfileComponent,
+ BreadcrumbComponent,
],
exports: [
ButtonComponent,
@@ -72,6 +74,7 @@ export function appendScript(injector: Injector) {
LoaderBarComponent,
ChangePasswordComponent,
ProfileComponent,
+ BreadcrumbComponent,
],
entryComponents: [ErrorComponent, ValidationErrorComponent],
})