diff --git a/npm/ng-packs/angular.json b/npm/ng-packs/angular.json index 617e907f3f..0aa1c106a5 100644 --- a/npm/ng-packs/angular.json +++ b/npm/ng-packs/angular.json @@ -288,6 +288,146 @@ } } } + }, + "setting-management-config": { + "projectType": "library", + "root": "packages/setting-management-config", + "sourceRoot": "packages/setting-management-config/src", + "prefix": "abp", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "packages/setting-management-config/tsconfig.lib.json", + "project": "packages/setting-management-config/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "packages/setting-management-config/src/test.ts", + "tsConfig": "packages/setting-management-config/tsconfig.spec.json", + "karmaConfig": "packages/setting-management-config/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "packages/setting-management-config/tsconfig.lib.json", + "packages/setting-management-config/tsconfig.spec.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + } + } + }, + "identity-config": { + "projectType": "library", + "root": "packages/identity-config", + "sourceRoot": "packages/identity-config/src", + "prefix": "abp", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "packages/identity-config/tsconfig.lib.json", + "project": "packages/identity-config/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "packages/identity-config/src/test.ts", + "tsConfig": "packages/identity-config/tsconfig.spec.json", + "karmaConfig": "packages/identity-config/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "packages/identity-config/tsconfig.lib.json", + "packages/identity-config/tsconfig.spec.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + } + } + }, + "account-config": { + "projectType": "library", + "root": "packages/account-config", + "sourceRoot": "packages/account-config/src", + "prefix": "abp", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "packages/account-config/tsconfig.lib.json", + "project": "packages/account-config/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "packages/account-config/src/test.ts", + "tsConfig": "packages/account-config/tsconfig.spec.json", + "karmaConfig": "packages/account-config/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "packages/account-config/tsconfig.lib.json", + "packages/account-config/tsconfig.spec.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + } + } + }, + "tenant-management-config": { + "projectType": "library", + "root": "packages/tenant-management-config", + "sourceRoot": "packages/tenant-management-config/src", + "prefix": "abp", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "packages/tenant-management-config/tsconfig.lib.json", + "project": "packages/tenant-management-config/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "packages/tenant-management-config/src/test.ts", + "tsConfig": "packages/tenant-management-config/tsconfig.spec.json", + "karmaConfig": "packages/tenant-management-config/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "packages/tenant-management-config/tsconfig.lib.json", + "packages/tenant-management-config/tsconfig.spec.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + } + } } }, "defaultProject": "core" diff --git a/npm/ng-packs/package.json b/npm/ng-packs/package.json index b647954502..009bc9d5f5 100644 --- a/npm/ng-packs/package.json +++ b/npm/ng-packs/package.json @@ -5,10 +5,10 @@ "abpng": "abpng" }, "devDependencies": { - "@abp/ng.core": "^0.8.3", - "@abp/ng.feature-management": "^0.8.3", - "@abp/ng.permission-management": "^0.8.3", - "@abp/ng.theme.shared": "^0.8.3", + "@abp/ng.core": "^0.9.0", + "@abp/ng.feature-management": "^0.9.0", + "@abp/ng.permission-management": "^0.9.0", + "@abp/ng.theme.shared": "^0.9.0", "@angular-devkit/build-angular": "~0.803.5", "@angular-devkit/build-ng-packagr": "~0.803.5", "@angular/animations": "~8.2.7", @@ -55,9 +55,11 @@ "symlink-manager": "^1.3.0", "ts-node": "~7.0.0", "tsickle": "^0.35.0", - "tslib": "^1.9.0", "tslint": "~5.15.0", "typescript": "~3.5.3", "zone.js": "~0.9.1" + }, + "dependencies": { + "tslib": "^1.10.0" } } diff --git a/npm/ng-packs/packages/account-config/README.md b/npm/ng-packs/packages/account-config/README.md new file mode 100644 index 0000000000..9ace70206e --- /dev/null +++ b/npm/ng-packs/packages/account-config/README.md @@ -0,0 +1 @@ +# @abp/ng.account.config \ No newline at end of file diff --git a/npm/ng-packs/packages/account-config/karma.conf.js b/npm/ng-packs/packages/account-config/karma.conf.js new file mode 100644 index 0000000000..e74978b4ca --- /dev/null +++ b/npm/ng-packs/packages/account-config/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/account-config'), + 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/account-config/ng-package.json b/npm/ng-packs/packages/account-config/ng-package.json new file mode 100644 index 0000000000..de9885883c --- /dev/null +++ b/npm/ng-packs/packages/account-config/ng-package.json @@ -0,0 +1,7 @@ +{ + "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../../dist/account-config", + "lib": { + "entryFile": "src/public-api.ts" + } +} \ No newline at end of file diff --git a/npm/ng-packs/packages/account-config/package.json b/npm/ng-packs/packages/account-config/package.json new file mode 100644 index 0000000000..4113d6e984 --- /dev/null +++ b/npm/ng-packs/packages/account-config/package.json @@ -0,0 +1,7 @@ +{ + "name": "@abp/ng.account.config", + "version": "0.0.1", + "publishConfig": { + "access": "public" + } +} diff --git a/npm/ng-packs/packages/account-config/src/lib/account-config.module.ts b/npm/ng-packs/packages/account-config/src/lib/account-config.module.ts new file mode 100644 index 0000000000..a94997e846 --- /dev/null +++ b/npm/ng-packs/packages/account-config/src/lib/account-config.module.ts @@ -0,0 +1,37 @@ +import { CoreModule, noop } from '@abp/ng.core'; +import { ThemeSharedModule } from '@abp/ng.theme.shared'; +import { APP_INITIALIZER, InjectionToken, ModuleWithProviders, NgModule } from '@angular/core'; +import { AccountConfigService } from './services/account-config.service'; + +export interface AccountConfigOptions { + redirectUrl?: string; +} + +export function accountOptionsFactory(options: AccountConfigOptions) { + return { + redirectUrl: '/', + ...options, + }; +} + +export const ACCOUNT_OPTIONS = new InjectionToken('ACCOUNT_OPTIONS'); + +@NgModule({ + imports: [CoreModule, ThemeSharedModule], + providers: [{ provide: APP_INITIALIZER, multi: true, deps: [AccountConfigService], useFactory: noop }], +}) +export class AccountConfigModule { + static forRoot(options = {} as AccountConfigOptions): ModuleWithProviders { + return { + ngModule: AccountConfigModule, + providers: [ + { provide: ACCOUNT_OPTIONS, useValue: options }, + { + provide: 'ACCOUNT_OPTIONS', + useFactory: accountOptionsFactory, + deps: [ACCOUNT_OPTIONS], + }, + ], + }; + } +} diff --git a/npm/ng-packs/packages/account-config/src/lib/services/account-config.service.ts b/npm/ng-packs/packages/account-config/src/lib/services/account-config.service.ts new file mode 100644 index 0000000000..7af86a49c9 --- /dev/null +++ b/npm/ng-packs/packages/account-config/src/lib/services/account-config.service.ts @@ -0,0 +1,21 @@ +import { ABP_ROUTES, eLayoutType, RestService } from '@abp/ng.core'; +import { Injectable } from '@angular/core'; +import { Router } from '@angular/router'; + +@Injectable({ + providedIn: 'root', +}) +export class AccountConfigService { + constructor(private router: Router, private restService: RestService) { + ABP_ROUTES.push({ + name: 'AbpAccount::Menu:Account', + path: 'account', + invisible: true, + layout: eLayoutType.application, + children: [ + { path: 'login', name: 'AbpAccount::Login', order: 1 }, + { path: 'register', name: 'AbpAccount::Register', order: 2 }, + ], + }); + } +} diff --git a/npm/ng-packs/packages/account-config/src/public-api.ts b/npm/ng-packs/packages/account-config/src/public-api.ts new file mode 100644 index 0000000000..83270614c0 --- /dev/null +++ b/npm/ng-packs/packages/account-config/src/public-api.ts @@ -0,0 +1,2 @@ +export * from './lib/services/account-config.service'; +export * from './lib/account-config.module'; diff --git a/npm/ng-packs/packages/account-config/src/test.ts b/npm/ng-packs/packages/account-config/src/test.ts new file mode 100644 index 0000000000..978c64fb83 --- /dev/null +++ b/npm/ng-packs/packages/account-config/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/account-config/tsconfig.lib.json b/npm/ng-packs/packages/account-config/tsconfig.lib.json new file mode 100644 index 0000000000..bd23948e59 --- /dev/null +++ b/npm/ng-packs/packages/account-config/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/account-config/tsconfig.spec.json b/npm/ng-packs/packages/account-config/tsconfig.spec.json new file mode 100644 index 0000000000..16da33db07 --- /dev/null +++ b/npm/ng-packs/packages/account-config/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/account-config/tslint.json b/npm/ng-packs/packages/account-config/tslint.json new file mode 100644 index 0000000000..8c3919ea62 --- /dev/null +++ b/npm/ng-packs/packages/account-config/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/account/src/lib/account.module.ts b/npm/ng-packs/packages/account/src/lib/account.module.ts index 8a790a21c1..d6b97fec84 100644 --- a/npm/ng-packs/packages/account/src/lib/account.module.ts +++ b/npm/ng-packs/packages/account/src/lib/account.module.ts @@ -18,6 +18,10 @@ import { ACCOUNT_OPTIONS, optionsFactory } from './tokens/options.token'; }) export class AccountModule {} +/** + * + * @deprecated since version 0.9 + */ export function AccountProviders(options = {} as Options): Provider[] { return [ { provide: ACCOUNT_OPTIONS, useValue: options }, 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 762d10c313..119bde1e7f 100644 --- a/npm/ng-packs/packages/account/src/lib/constants/routes.ts +++ b/npm/ng-packs/packages/account/src/lib/constants/routes.ts @@ -1,5 +1,9 @@ import { ABP, eLayoutType } from '@abp/ng.core'; +/** + * + * @deprecated since version 0.9 + */ export const ACCOUNT_ROUTES = { routes: [ { diff --git a/npm/ng-packs/packages/core/src/lib/enums/common.ts b/npm/ng-packs/packages/core/src/lib/enums/common.ts index 3b953b8ac7..1ecc29406c 100644 --- a/npm/ng-packs/packages/core/src/lib/enums/common.ts +++ b/npm/ng-packs/packages/core/src/lib/enums/common.ts @@ -2,5 +2,8 @@ export const enum eLayoutType { account = 'account', application = 'application', empty = 'empty', + /** + * @deprecated since version 0.9.0 + */ setting = 'setting', } diff --git a/npm/ng-packs/packages/core/src/lib/models/common.ts b/npm/ng-packs/packages/core/src/lib/models/common.ts index a5089760f0..95bf490e91 100644 --- a/npm/ng-packs/packages/core/src/lib/models/common.ts +++ b/npm/ng-packs/packages/core/src/lib/models/common.ts @@ -43,4 +43,8 @@ export namespace ABP { id: string; name: string; } + + export interface Dictionary { + [key: string]: T; + } } 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 5add16c31e..c65955f877 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 @@ -8,6 +8,8 @@ import clone from 'just-clone'; export const NGXS_CONFIG_PLUGIN_OPTIONS = new InjectionToken('NGXS_CONFIG_PLUGIN_OPTIONS'); +export let ABP_ROUTES = [] as ABP.FullRoute[]; + @Injectable() export class ConfigPlugin implements NgxsPlugin { private initialized: boolean = false; @@ -38,27 +40,31 @@ export class ConfigPlugin implements NgxsPlugin { } function transformRoutes(routes: Routes = [], wrappers: ABP.FullRoute[] = []): any { + /** + * + * @deprecated since version 0.9.0 + */ const abpRoutes: ABP.FullRoute[] = routes .filter(route => { return snq(() => route.data.routes.routes.find(r => r.path === route.path), false); }) .reduce((acc, val) => [...acc, ...val.data.routes.routes], []); + ABP_ROUTES = [...ABP_ROUTES, ...abpRoutes]; - wrappers = abpRoutes.filter(ar => ar.wrapper); + wrappers = ABP_ROUTES.filter(ar => ar.wrapper); const transformed = [] as ABP.FullRoute[]; routes - .filter(route => (route.data || {}).routes && (route.component || route.loadChildren)) + .filter(route => route.component || route.loadChildren) .forEach(route => { - const abpPackage = abpRoutes.find( - abp => abp.path.toLowerCase() === route.path.toLowerCase() && snq(() => route.data.routes.routes.length, false), - ); + const abpPackage = ABP_ROUTES.find(abp => abp.path.toLowerCase() === route.path.toLowerCase() && !abp.wrapper); + const { length } = transformed; if (abpPackage) { transformed.push(abpPackage); } - if (transformed.length === length) { + if (transformed.length === length && (route.data || {}).routes) { transformed.push({ ...route.data.routes, path: route.path, diff --git a/npm/ng-packs/packages/identity-config/README.md b/npm/ng-packs/packages/identity-config/README.md new file mode 100644 index 0000000000..8754748f6a --- /dev/null +++ b/npm/ng-packs/packages/identity-config/README.md @@ -0,0 +1 @@ +# @abp/ng.identity.config \ No newline at end of file diff --git a/npm/ng-packs/packages/identity-config/karma.conf.js b/npm/ng-packs/packages/identity-config/karma.conf.js new file mode 100644 index 0000000000..47f6e498d2 --- /dev/null +++ b/npm/ng-packs/packages/identity-config/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/identity-config'), + 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/identity-config/ng-package.json b/npm/ng-packs/packages/identity-config/ng-package.json new file mode 100644 index 0000000000..d72870cd39 --- /dev/null +++ b/npm/ng-packs/packages/identity-config/ng-package.json @@ -0,0 +1,7 @@ +{ + "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../../dist/identity-config", + "lib": { + "entryFile": "src/public-api.ts" + } +} diff --git a/npm/ng-packs/packages/identity-config/package.json b/npm/ng-packs/packages/identity-config/package.json new file mode 100644 index 0000000000..e7989e56de --- /dev/null +++ b/npm/ng-packs/packages/identity-config/package.json @@ -0,0 +1,7 @@ +{ + "name": "@abp/ng.identity.config", + "version": "0.0.1", + "publishConfig": { + "access": "public" + } +} diff --git a/npm/ng-packs/packages/identity-config/src/lib/identity-config.module.ts b/npm/ng-packs/packages/identity-config/src/lib/identity-config.module.ts new file mode 100644 index 0000000000..a354cd6a46 --- /dev/null +++ b/npm/ng-packs/packages/identity-config/src/lib/identity-config.module.ts @@ -0,0 +1,8 @@ +import { noop } from '@abp/ng.core'; +import { APP_INITIALIZER, NgModule } from '@angular/core'; +import { IdentityConfigService } from './services/identity-config.service'; + +@NgModule({ + providers: [{ provide: APP_INITIALIZER, deps: [IdentityConfigService], useFactory: noop, multi: true }], +}) +export class IdentityConfigModule {} diff --git a/npm/ng-packs/packages/identity-config/src/lib/services/identity-config.service.ts b/npm/ng-packs/packages/identity-config/src/lib/services/identity-config.service.ts new file mode 100644 index 0000000000..fe78f8e810 --- /dev/null +++ b/npm/ng-packs/packages/identity-config/src/lib/services/identity-config.service.ts @@ -0,0 +1,32 @@ +import { ABP_ROUTES, eLayoutType, RestService } from '@abp/ng.core'; +import { Injectable } from '@angular/core'; +import { Router } from '@angular/router'; +import { Observable } from 'rxjs'; + +@Injectable({ + providedIn: 'root', +}) +export class IdentityConfigService { + constructor(private router: Router, private restService: RestService) { + ABP_ROUTES.push( + { + 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' }, + ], + }, + ); + } +} diff --git a/npm/ng-packs/packages/identity-config/src/public-api.ts b/npm/ng-packs/packages/identity-config/src/public-api.ts new file mode 100644 index 0000000000..e702653211 --- /dev/null +++ b/npm/ng-packs/packages/identity-config/src/public-api.ts @@ -0,0 +1,2 @@ +export * from './lib/services/identity-config.service'; +export * from './lib/identity-config.module'; diff --git a/npm/ng-packs/packages/identity-config/src/test.ts b/npm/ng-packs/packages/identity-config/src/test.ts new file mode 100644 index 0000000000..978c64fb83 --- /dev/null +++ b/npm/ng-packs/packages/identity-config/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/identity-config/tsconfig.lib.json b/npm/ng-packs/packages/identity-config/tsconfig.lib.json new file mode 100644 index 0000000000..bd23948e59 --- /dev/null +++ b/npm/ng-packs/packages/identity-config/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/identity-config/tsconfig.spec.json b/npm/ng-packs/packages/identity-config/tsconfig.spec.json new file mode 100644 index 0000000000..16da33db07 --- /dev/null +++ b/npm/ng-packs/packages/identity-config/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/identity-config/tslint.json b/npm/ng-packs/packages/identity-config/tslint.json new file mode 100644 index 0000000000..8c3919ea62 --- /dev/null +++ b/npm/ng-packs/packages/identity-config/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/identity/ng-package.json b/npm/ng-packs/packages/identity/ng-package.json index aa178ed0d5..5f547dee2b 100644 --- a/npm/ng-packs/packages/identity/ng-package.json +++ b/npm/ng-packs/packages/identity/ng-package.json @@ -4,5 +4,5 @@ "lib": { "entryFile": "src/public-api.ts" }, - "whitelistedNonPeerDependencies": ["@abp/ng.theme.shared", "@abp/ng.permission-management"] + "whitelistedNonPeerDependencies": ["@abp/ng.theme.shared", "@abp/ng.permission-management", "@abp/ng.identity.config"] } diff --git a/npm/ng-packs/packages/identity/package.json b/npm/ng-packs/packages/identity/package.json index f139753679..7f0c47ef61 100644 --- a/npm/ng-packs/packages/identity/package.json +++ b/npm/ng-packs/packages/identity/package.json @@ -2,7 +2,9 @@ "name": "@abp/ng.identity", "version": "0.9.0", "dependencies": { - "@abp/ng.permission-management": "^0.9.0" + "@abp/ng.theme.shared": "^0.9.0", + "@abp/ng.permission-management": "^0.9.0", + "@abp/ng.identity.config": "0.0.1" }, "publishConfig": { "access": "public" 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 cece75ad63..1dfc53245e 100644 --- a/npm/ng-packs/packages/identity/src/lib/constants/routes.ts +++ b/npm/ng-packs/packages/identity/src/lib/constants/routes.ts @@ -1,5 +1,9 @@ import { eLayoutType, ABP } from '@abp/ng.core'; +/** + * + * @deprecated + */ export const IDENTITY_ROUTES = { routes: [ { diff --git a/npm/ng-packs/packages/identity/src/lib/identity-routing.module.ts b/npm/ng-packs/packages/identity/src/lib/identity-routing.module.ts index fbbecffc9b..ffe155a94f 100644 --- a/npm/ng-packs/packages/identity/src/lib/identity-routing.module.ts +++ b/npm/ng-packs/packages/identity/src/lib/identity-routing.module.ts @@ -9,21 +9,20 @@ import { UserResolver } from './resolvers/users.resolver'; const routes: Routes = [ { path: '', redirectTo: 'roles', pathMatch: 'full' }, { - path: 'roles', + path: '', component: DynamicLayoutComponent, canActivate: [AuthGuard, PermissionGuard], - data: { requiredPolicy: 'AbpIdentity.Roles' }, - children: [{ path: '', component: RolesComponent, resolve: [RoleResolver] }], - }, - { - path: 'users', - component: DynamicLayoutComponent, - canActivate: [AuthGuard, PermissionGuard], - data: { requiredPolicy: 'AbpIdentity.Users' }, children: [ { - path: '', + path: 'roles', + component: RolesComponent, + resolve: [RoleResolver], + data: { requiredPolicy: 'AbpIdentity.Roles' }, + }, + { + path: 'users', component: UsersComponent, + data: { requiredPolicy: 'AbpIdentity.Users' }, resolve: [RoleResolver, UserResolver], }, ], diff --git a/npm/ng-packs/packages/identity/src/lib/identity.module.ts b/npm/ng-packs/packages/identity/src/lib/identity.module.ts index d94ba410d9..15b1b1c7cb 100644 --- a/npm/ng-packs/packages/identity/src/lib/identity.module.ts +++ b/npm/ng-packs/packages/identity/src/lib/identity.module.ts @@ -27,6 +27,10 @@ import { NgxValidateCoreModule } from '@ngx-validate/core'; }) export class IdentityModule {} +/** + * + * @deprecated + */ export function IdentityProviders(): Provider[] { return []; } diff --git a/npm/ng-packs/packages/setting-management-config/README.md b/npm/ng-packs/packages/setting-management-config/README.md new file mode 100644 index 0000000000..9e69e2dce1 --- /dev/null +++ b/npm/ng-packs/packages/setting-management-config/README.md @@ -0,0 +1,24 @@ +# SettingManagementConfig + +This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.2.7. + +## Code scaffolding + +Run `ng generate component component-name --project setting-management-config` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project setting-management-config`. +> Note: Don't forget to add `--project setting-management-config` or else it will be added to the default project in your `angular.json` file. + +## Build + +Run `ng build setting-management-config` to build the project. The build artifacts will be stored in the `dist/` directory. + +## Publishing + +After building your library with `ng build setting-management-config`, go to the dist folder `cd dist/setting-management-config` and run `npm publish`. + +## Running unit tests + +Run `ng test setting-management-config` to execute the unit tests via [Karma](https://karma-runner.github.io). + +## Further help + +To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). diff --git a/npm/ng-packs/packages/setting-management-config/karma.conf.js b/npm/ng-packs/packages/setting-management-config/karma.conf.js new file mode 100644 index 0000000000..7ff4863cb0 --- /dev/null +++ b/npm/ng-packs/packages/setting-management-config/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-config'), + 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-config/ng-package.json b/npm/ng-packs/packages/setting-management-config/ng-package.json new file mode 100644 index 0000000000..0d24be4f85 --- /dev/null +++ b/npm/ng-packs/packages/setting-management-config/ng-package.json @@ -0,0 +1,7 @@ +{ + "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../../dist/setting-management-config", + "lib": { + "entryFile": "src/public-api.ts" + } +} \ No newline at end of file diff --git a/npm/ng-packs/packages/setting-management-config/package.json b/npm/ng-packs/packages/setting-management-config/package.json new file mode 100644 index 0000000000..9a9f49aa0a --- /dev/null +++ b/npm/ng-packs/packages/setting-management-config/package.json @@ -0,0 +1,7 @@ +{ + "name": "@abp/ng.setting-management.config", + "version": "0.0.1", + "publishConfig": { + "access": "public" + } +} diff --git a/npm/ng-packs/packages/setting-management-config/src/lib/services/setting-management-config.service.ts b/npm/ng-packs/packages/setting-management-config/src/lib/services/setting-management-config.service.ts new file mode 100644 index 0000000000..851f435449 --- /dev/null +++ b/npm/ng-packs/packages/setting-management-config/src/lib/services/setting-management-config.service.ts @@ -0,0 +1,18 @@ +import { Injectable } from '@angular/core'; +import { ABP_ROUTES, eLayoutType } from '@abp/ng.core'; + +@Injectable({ + providedIn: 'root', +}) +export class SettingManagementConfigService { + constructor() { + ABP_ROUTES.push({ + name: 'Settings', + path: 'setting-management', + parentName: 'AbpUiNavigation::Menu:Administration', + layout: eLayoutType.application, + order: 6, + iconClass: 'fa fa-cog', + }); + } +} diff --git a/npm/ng-packs/packages/setting-management-config/src/lib/setting-management-config.module.ts b/npm/ng-packs/packages/setting-management-config/src/lib/setting-management-config.module.ts new file mode 100644 index 0000000000..c11e712fa4 --- /dev/null +++ b/npm/ng-packs/packages/setting-management-config/src/lib/setting-management-config.module.ts @@ -0,0 +1,8 @@ +import { NgModule, APP_INITIALIZER } from '@angular/core'; +import { SettingManagementConfigService } from './services/setting-management-config.service'; +import { noop } from '@abp/ng.core'; + +@NgModule({ + providers: [{ provide: APP_INITIALIZER, deps: [SettingManagementConfigService], useFactory: noop, multi: true }], +}) +export class SettingManagementConfigModule {} diff --git a/npm/ng-packs/packages/setting-management-config/src/public-api.ts b/npm/ng-packs/packages/setting-management-config/src/public-api.ts new file mode 100644 index 0000000000..236ed82079 --- /dev/null +++ b/npm/ng-packs/packages/setting-management-config/src/public-api.ts @@ -0,0 +1 @@ +export * from './lib/setting-management-config.module'; diff --git a/npm/ng-packs/packages/setting-management-config/src/test.ts b/npm/ng-packs/packages/setting-management-config/src/test.ts new file mode 100644 index 0000000000..978c64fb83 --- /dev/null +++ b/npm/ng-packs/packages/setting-management-config/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-config/tsconfig.lib.json b/npm/ng-packs/packages/setting-management-config/tsconfig.lib.json new file mode 100644 index 0000000000..bd23948e59 --- /dev/null +++ b/npm/ng-packs/packages/setting-management-config/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-config/tsconfig.spec.json b/npm/ng-packs/packages/setting-management-config/tsconfig.spec.json new file mode 100644 index 0000000000..16da33db07 --- /dev/null +++ b/npm/ng-packs/packages/setting-management-config/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-config/tslint.json b/npm/ng-packs/packages/setting-management-config/tslint.json new file mode 100644 index 0000000000..8c3919ea62 --- /dev/null +++ b/npm/ng-packs/packages/setting-management-config/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/setting-management/ng-package.json b/npm/ng-packs/packages/setting-management/ng-package.json index e5ba9f97fc..7a08dda36b 100644 --- a/npm/ng-packs/packages/setting-management/ng-package.json +++ b/npm/ng-packs/packages/setting-management/ng-package.json @@ -4,5 +4,5 @@ "lib": { "entryFile": "src/public-api.ts" }, - "whitelistedNonPeerDependencies": ["@abp/ng.theme.shared"] + "whitelistedNonPeerDependencies": ["@abp/ng.theme.shared", "@abp/ng.setting-management.config"] } diff --git a/npm/ng-packs/packages/setting-management/package.json b/npm/ng-packs/packages/setting-management/package.json index f02d0f33b2..f0ebfe66c8 100644 --- a/npm/ng-packs/packages/setting-management/package.json +++ b/npm/ng-packs/packages/setting-management/package.json @@ -2,7 +2,8 @@ "name": "@abp/ng.setting-management", "version": "0.9.0", "dependencies": { - "@abp/ng.theme.shared": "^0.9.0" + "@abp/ng.theme.shared": "^0.9.0", + "@abp/ng.setting-management.config": "^0.0.1" }, "publishConfig": { "access": "public" diff --git a/npm/ng-packs/packages/setting-management/src/lib/components/setting-layout.component.ts b/npm/ng-packs/packages/setting-management/src/lib/components/setting-layout.component.ts deleted file mode 100644 index 1c9d702a01..0000000000 --- a/npm/ng-packs/packages/setting-management/src/lib/components/setting-layout.component.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { eLayoutType } from '@abp/ng.core'; -import { SettingTab } from '@abp/ng.theme.shared'; -import { Component, TrackByFunction } from '@angular/core'; -import { Router } from '@angular/router'; -import { timer } from 'rxjs'; -import { SettingManagementService } from '../services/setting-management.service'; - -@Component({ - selector: 'abp-setting-layout', - templateUrl: './setting-layout.component.html', -}) -export class SettingLayoutComponent { - // required for dynamic component - static type = eLayoutType.setting; - - trackByFn: TrackByFunction = (_, item) => item.name; - - constructor(public settingManagementService: SettingManagementService, private router: Router) { - if ( - settingManagementService.selected && - this.router.url !== settingManagementService.selected.url && - settingManagementService.settings.length - ) { - settingManagementService.setSelected(settingManagementService.settings[0]); - } - } - - ngOnDestroy() {} -} diff --git a/npm/ng-packs/packages/setting-management/src/lib/components/setting-layout.component.html b/npm/ng-packs/packages/setting-management/src/lib/components/setting-management.component.html similarity index 59% rename from npm/ng-packs/packages/setting-management/src/lib/components/setting-layout.component.html rename to npm/ng-packs/packages/setting-management/src/lib/components/setting-management.component.html index 379e368e9d..030a020418 100644 --- a/npm/ng-packs/packages/setting-management/src/lib/components/setting-layout.component.html +++ b/npm/ng-packs/packages/setting-management/src/lib/components/setting-management.component.html @@ -13,20 +13,15 @@
-
+
-
-
- +
+
+
diff --git a/npm/ng-packs/packages/setting-management/src/lib/components/setting-management.component.ts b/npm/ng-packs/packages/setting-management/src/lib/components/setting-management.component.ts new file mode 100644 index 0000000000..562f312eca --- /dev/null +++ b/npm/ng-packs/packages/setting-management/src/lib/components/setting-management.component.ts @@ -0,0 +1,28 @@ +import { Component, TrackByFunction, OnInit } from '@angular/core'; +import { SettingTab, SETTING_TABS } from '@abp/ng.theme.shared'; +import { Router } from '@angular/router'; +import { Store } from '@ngxs/store'; +import { ConfigState } from '@abp/ng.core'; + +@Component({ + selector: 'abp-setting-management', + templateUrl: './setting-management.component.html', +}) +export class SettingManagementComponent implements OnInit { + settings: SettingTab[] = []; + + selected = {} as SettingTab; + + trackByFn: TrackByFunction = (_, item) => item.name; + + constructor(private router: Router, private store: Store) {} + + ngOnInit() { + if (this.settings.length) { + this.settings = SETTING_TABS.filter(setting => + this.store.selectSnapshot(ConfigState.getGrantedPolicy(setting.requiredPolicy)), + ).sort((a, b) => a.order - b.order); + 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 deleted file mode 100644 index a3820983e2..0000000000 --- a/npm/ng-packs/packages/setting-management/src/lib/constants/index.ts +++ /dev/null @@ -1 +0,0 @@ -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 deleted file mode 100644 index 3f47c95eb7..0000000000 --- a/npm/ng-packs/packages/setting-management/src/lib/constants/routes.ts +++ /dev/null @@ -1,14 +0,0 @@ -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[], -}; diff --git a/npm/ng-packs/packages/setting-management/src/lib/services/setting-management.service.ts b/npm/ng-packs/packages/setting-management/src/lib/services/setting-management.service.ts deleted file mode 100644 index 79878b1717..0000000000 --- a/npm/ng-packs/packages/setting-management/src/lib/services/setting-management.service.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { SettingTab } from '@abp/ng.theme.shared'; -import { Injectable } from '@angular/core'; -import { Router } from '@angular/router'; -import { Navigate } from '@ngxs/router-plugin'; -import { Store, Actions, ofActionSuccessful } from '@ngxs/store'; -import { Subject } from 'rxjs'; -import { ConfigState, GetAppConfiguration } from '@abp/ng.core'; -import { OAuthService } from 'angular-oauth2-oidc'; -import { takeUntil } from 'rxjs/operators'; - -@Injectable({ providedIn: 'root' }) -export class SettingManagementService { - settings: SettingTab[] = []; - - selected = {} as SettingTab; - - private destroy$ = new Subject(); - - constructor( - private actions: Actions, - private router: Router, - private store: Store, - private oAuthService: OAuthService, - ) { - setTimeout(() => this.setSettings(), 0); - - this.actions - .pipe(ofActionSuccessful(GetAppConfiguration)) - .pipe(takeUntil(this.destroy$)) - .subscribe(() => { - if (this.oAuthService.hasValidAccessToken()) { - this.setSettings(); - } - }); - } - - ngOnDestroy() { - this.destroy$.next(); - } - - setSettings() { - const route = this.router.config.find(r => r.path === 'setting-management'); - this.settings = (route.data.settings as SettingTab[]) - .filter(setting => this.store.selectSnapshot(ConfigState.getGrantedPolicy(setting.requiredPolicy))) - .sort((a, b) => a.order - b.order); - this.checkSelected(); - } - - checkSelected() { - this.selected = this.settings.find(setting => setting.url === this.router.url) || ({} as SettingTab); - - if (!this.selected.name && this.settings.length) { - this.setSelected(this.settings[0]); - } - } - - setSelected(selected: SettingTab) { - this.selected = selected; - this.store.dispatch(new Navigate([selected.url])); - } -} 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 index e401df16de..d1cb780777 100644 --- 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 @@ -1,15 +1,13 @@ -import { DynamicLayoutComponent } from '@abp/ng.core'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { SETTING_MANAGEMENT_ROUTES } from './constants/routes'; -import { SettingLayoutComponent } from './components/setting-layout.component'; +import { SettingManagementComponent } from './components/setting-management.component'; +import { DynamicLayoutComponent } from '@abp/ng.core'; const routes: Routes = [ { - path: 'setting-management', + path: '', component: DynamicLayoutComponent, - children: [{ path: '', component: SettingLayoutComponent }], - data: { routes: SETTING_MANAGEMENT_ROUTES, settings: [] }, + children: [{ path: '', component: SettingManagementComponent }], }, ]; 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 index b3959e6650..397c581587 100644 --- 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 @@ -1,14 +1,11 @@ import { CoreModule } from '@abp/ng.core'; import { ThemeSharedModule } from '@abp/ng.theme.shared'; import { NgModule } from '@angular/core'; -import { SettingLayoutComponent } from './components/setting-layout.component'; import { SettingManagementRoutingModule } from './setting-management-routing.module'; - -export const SETTING_LAYOUT = SettingLayoutComponent; +import { SettingManagementComponent } from './components/setting-management.component'; @NgModule({ - declarations: [SETTING_LAYOUT], + declarations: [SettingManagementComponent], imports: [SettingManagementRoutingModule, CoreModule, ThemeSharedModule], - entryComponents: [SETTING_LAYOUT], }) export class SettingManagementModule {} diff --git a/npm/ng-packs/packages/setting-management/src/public-api.ts b/npm/ng-packs/packages/setting-management/src/public-api.ts index 5343d9e457..8027d769f9 100644 --- a/npm/ng-packs/packages/setting-management/src/public-api.ts +++ b/npm/ng-packs/packages/setting-management/src/public-api.ts @@ -1,3 +1,2 @@ export * from './lib/setting-management.module'; -export * from './lib/constants'; -export * from './lib/components/setting-layout.component'; +export * from './lib/components/setting-management.component'; diff --git a/npm/ng-packs/packages/tenant-management-config/README.md b/npm/ng-packs/packages/tenant-management-config/README.md new file mode 100644 index 0000000000..77548feaf9 --- /dev/null +++ b/npm/ng-packs/packages/tenant-management-config/README.md @@ -0,0 +1 @@ +# @abp/ng.tenant-management.config \ No newline at end of file diff --git a/npm/ng-packs/packages/tenant-management-config/karma.conf.js b/npm/ng-packs/packages/tenant-management-config/karma.conf.js new file mode 100644 index 0000000000..850929cc06 --- /dev/null +++ b/npm/ng-packs/packages/tenant-management-config/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/tenant-management-config'), + 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/tenant-management-config/ng-package.json b/npm/ng-packs/packages/tenant-management-config/ng-package.json new file mode 100644 index 0000000000..834556113c --- /dev/null +++ b/npm/ng-packs/packages/tenant-management-config/ng-package.json @@ -0,0 +1,7 @@ +{ + "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../../dist/tenant-management-config", + "lib": { + "entryFile": "src/public-api.ts" + } +} \ No newline at end of file diff --git a/npm/ng-packs/packages/tenant-management-config/package.json b/npm/ng-packs/packages/tenant-management-config/package.json new file mode 100644 index 0000000000..43b4392733 --- /dev/null +++ b/npm/ng-packs/packages/tenant-management-config/package.json @@ -0,0 +1,7 @@ +{ + "name": "@abp/ng.tenant-management.config", + "version": "0.0.1", + "publishConfig": { + "access": "public" + } +} diff --git a/npm/ng-packs/packages/tenant-management-config/src/lib/services/tenant-management-config.service.ts b/npm/ng-packs/packages/tenant-management-config/src/lib/services/tenant-management-config.service.ts new file mode 100644 index 0000000000..8d77d1005f --- /dev/null +++ b/npm/ng-packs/packages/tenant-management-config/src/lib/services/tenant-management-config.service.ts @@ -0,0 +1,25 @@ +import { Injectable } from '@angular/core'; +import { ABP_ROUTES, eLayoutType } from '@abp/ng.core'; + +@Injectable({ + providedIn: 'root', +}) +export class TenantManagementConfigService { + constructor() { + ABP_ROUTES.push({ + 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', + }, + ], + }); + } +} diff --git a/npm/ng-packs/packages/tenant-management-config/src/lib/tenant-management-config.module.ts b/npm/ng-packs/packages/tenant-management-config/src/lib/tenant-management-config.module.ts new file mode 100644 index 0000000000..7f59d28be4 --- /dev/null +++ b/npm/ng-packs/packages/tenant-management-config/src/lib/tenant-management-config.module.ts @@ -0,0 +1,8 @@ +import { NgModule, APP_INITIALIZER } from '@angular/core'; +import { TenantManagementConfigService } from './services/tenant-management-config.service'; +import { noop } from '@abp/ng.core'; + +@NgModule({ + providers: [{ provide: APP_INITIALIZER, deps: [TenantManagementConfigService], useFactory: noop, multi: true }], +}) +export class TenantManagementConfigModule {} diff --git a/npm/ng-packs/packages/tenant-management-config/src/public-api.ts b/npm/ng-packs/packages/tenant-management-config/src/public-api.ts new file mode 100644 index 0000000000..a6d21694db --- /dev/null +++ b/npm/ng-packs/packages/tenant-management-config/src/public-api.ts @@ -0,0 +1,2 @@ +export * from './lib/services/tenant-management-config.service'; +export * from './lib/tenant-management-config.module'; diff --git a/npm/ng-packs/packages/tenant-management-config/src/test.ts b/npm/ng-packs/packages/tenant-management-config/src/test.ts new file mode 100644 index 0000000000..978c64fb83 --- /dev/null +++ b/npm/ng-packs/packages/tenant-management-config/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/tenant-management-config/tsconfig.lib.json b/npm/ng-packs/packages/tenant-management-config/tsconfig.lib.json new file mode 100644 index 0000000000..bd23948e59 --- /dev/null +++ b/npm/ng-packs/packages/tenant-management-config/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/tenant-management-config/tsconfig.spec.json b/npm/ng-packs/packages/tenant-management-config/tsconfig.spec.json new file mode 100644 index 0000000000..16da33db07 --- /dev/null +++ b/npm/ng-packs/packages/tenant-management-config/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/tenant-management-config/tslint.json b/npm/ng-packs/packages/tenant-management-config/tslint.json new file mode 100644 index 0000000000..8c3919ea62 --- /dev/null +++ b/npm/ng-packs/packages/tenant-management-config/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/ng-package.json b/npm/ng-packs/packages/tenant-management/ng-package.json index 07fbab773b..959eae44ab 100644 --- a/npm/ng-packs/packages/tenant-management/ng-package.json +++ b/npm/ng-packs/packages/tenant-management/ng-package.json @@ -4,5 +4,9 @@ "lib": { "entryFile": "src/public-api.ts" }, - "whitelistedNonPeerDependencies": ["@abp/ng.theme.shared", "@abp/ng.feature-management"] + "whitelistedNonPeerDependencies": [ + "@abp/ng.theme.shared", + "@abp/ng.feature-management", + "@abp/ng.tenant-management.config" + ] } diff --git a/npm/ng-packs/packages/tenant-management/package.json b/npm/ng-packs/packages/tenant-management/package.json index 8f59b9179d..c1b3909534 100644 --- a/npm/ng-packs/packages/tenant-management/package.json +++ b/npm/ng-packs/packages/tenant-management/package.json @@ -3,7 +3,8 @@ "version": "0.9.0", "dependencies": { "@abp/ng.theme.shared": "^0.9.0", - "@abp/ng.feature-management": "^0.9.0" + "@abp/ng.feature-management": "^0.9.0", + "@abp/ng.tenant-management.config": "^0.0.1" }, "publishConfig": { "access": "public" 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 5aad33a3c4..ad919c8ee1 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,5 +1,9 @@ import { ABP, eLayoutType } from '@abp/ng.core'; +/** + * + * @deprecated since version 0.9.0 + */ export const TENANT_MANAGEMENT_ROUTES = { routes: [ { diff --git a/npm/ng-packs/packages/tenant-management/src/lib/tenant-management.module.ts b/npm/ng-packs/packages/tenant-management/src/lib/tenant-management.module.ts index f8a258da3b..5ab4f20716 100644 --- a/npm/ng-packs/packages/tenant-management/src/lib/tenant-management.module.ts +++ b/npm/ng-packs/packages/tenant-management/src/lib/tenant-management.module.ts @@ -25,6 +25,10 @@ import { NgxValidateCoreModule } from '@ngx-validate/core'; }) export class TenantManagementModule {} +/** + * + * @deprecated since version 0.9.0 + */ export function TenantManagementProviders(): Provider[] { return []; } diff --git a/npm/ng-packs/packages/theme-shared/src/lib/contants/styles.ts b/npm/ng-packs/packages/theme-shared/src/lib/contants/styles.ts index 73a21eeda7..9e9203cff3 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/contants/styles.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/contants/styles.ts @@ -176,7 +176,7 @@ export default ` } to { - transform: translateY(5px); + transform: translateY(0px); opacity: 1; } } 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 index 1b8c36412e..b9778da11f 100644 --- 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 @@ -1,6 +1,10 @@ +import { Type } from '@angular/core'; + export interface SettingTab { + component: Type; name: string; order: number; requiredPolicy?: string; - url?: string; } + +export const SETTING_TABS = [] as SettingTab[]; diff --git a/templates/app/angular/angular.json b/templates/app/angular/angular.json index 6b5e7df965..8a844d2562 100644 --- a/templates/app/angular/angular.json +++ b/templates/app/angular/angular.json @@ -23,7 +23,10 @@ "polyfills": "src/polyfills.ts", "tsConfig": "tsconfig.app.json", "aot": false, - "assets": ["src/favicon.ico", "src/assets"], + "assets": [ + "src/favicon.ico", + "src/assets" + ], "styles": [ "src/styles.scss", "node_modules/bootstrap/dist/css/bootstrap.min.css", @@ -97,7 +100,10 @@ "polyfills": "src/polyfills.ts", "tsConfig": "tsconfig.spec.json", "karmaConfig": "karma.conf.js", - "assets": ["src/favicon.ico", "src/assets"], + "assets": [ + "src/favicon.ico", + "src/assets" + ], "styles": [ "src/styles.scss", "node_modules/bootstrap/dist/css/bootstrap.min.css", @@ -112,8 +118,14 @@ "lint": { "builder": "@angular-devkit/build-angular:tslint", "options": { - "tsConfig": ["tsconfig.app.json", "tsconfig.spec.json", "e2e/tsconfig.json"], - "exclude": ["**/node_modules/**"] + "tsConfig": [ + "tsconfig.app.json", + "tsconfig.spec.json", + "e2e/tsconfig.json" + ], + "exclude": [ + "**/node_modules/**" + ] } }, "e2e": { @@ -131,5 +143,8 @@ } } }, - "defaultProject": "myProjectName" -} + "defaultProject": "myProjectName", + "cli": { + "analytics": "07ef29be-2b85-4919-9f78-44994f63b8b7" + } +} \ No newline at end of file diff --git a/templates/app/angular/package.json b/templates/app/angular/package.json index e409934329..0ec7111eb6 100644 --- a/templates/app/angular/package.json +++ b/templates/app/angular/package.json @@ -17,14 +17,14 @@ "@abp/ng.identity": "^0.9.0", "@abp/ng.tenant-management": "^0.9.0", "@abp/ng.theme.basic": "^0.9.0", - "@angular/animations": "~8.2.2", - "@angular/common": "~8.2.2", - "@angular/compiler": "~8.2.2", - "@angular/core": "~8.2.2", - "@angular/forms": "~8.2.2", - "@angular/platform-browser": "~8.2.2", - "@angular/platform-browser-dynamic": "~8.2.2", - "@angular/router": "~8.2.2", + "@angular/animations": "~8.2.8", + "@angular/common": "~8.2.8", + "@angular/compiler": "~8.2.8", + "@angular/core": "~8.2.8", + "@angular/forms": "~8.2.8", + "@angular/platform-browser": "~8.2.8", + "@angular/platform-browser-dynamic": "~8.2.8", + "@angular/router": "~8.2.8", "@angularclass/hmr": "^2.1.3", "@ngxs/devtools-plugin": "^3.5.0", "@ngxs/hmr-plugin": "^3.5.0", @@ -33,10 +33,10 @@ "zone.js": "~0.9.1" }, "devDependencies": { - "@angular-devkit/build-angular": "~0.802.2", - "@angular/cli": "~8.2.2", - "@angular/compiler-cli": "~8.2.2", - "@angular/language-service": "~8.2.2", + "@angular-devkit/build-angular": "~0.803.6", + "@angular/cli": "~8.3.6", + "@angular/compiler-cli": "~8.2.8", + "@angular/language-service": "~8.2.8", "@types/jasmine": "~3.3.8", "@types/jasminewd2": "~2.0.3", "@types/node": "~8.9.4", diff --git a/templates/app/angular/src/app/app-routing.module.ts b/templates/app/angular/src/app/app-routing.module.ts index eac8712bad..d6fa06f853 100644 --- a/templates/app/angular/src/app/app-routing.module.ts +++ b/templates/app/angular/src/app/app-routing.module.ts @@ -1,9 +1,6 @@ -import { IDENTITY_ROUTES } from '@abp/ng.identity'; -import { ACCOUNT_ROUTES } from '@abp/ng.account'; -import { NgModule } from '@angular/core'; -import { Routes, RouterModule } from '@angular/router'; import { ABP } from '@abp/ng.core'; -import { TENANT_MANAGEMENT_ROUTES } from '@abp/ng.tenant-management'; +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; const routes: Routes = [ { @@ -18,18 +15,15 @@ const routes: Routes = [ { path: 'account', loadChildren: () => import('./lazy-libs/account-wrapper.module').then(m => m.AccountWrapperModule), - data: { routes: ACCOUNT_ROUTES }, }, { path: 'identity', loadChildren: () => import('./lazy-libs/identity-wrapper.module').then(m => m.IdentityWrapperModule), - data: { routes: IDENTITY_ROUTES }, }, { path: 'tenant-management', loadChildren: () => import('./lazy-libs/tenant-management-wrapper.module').then(m => m.TenantManagementWrapperModule), - data: { routes: TENANT_MANAGEMENT_ROUTES }, }, ]; diff --git a/templates/app/angular/src/app/app.module.ts b/templates/app/angular/src/app/app.module.ts index 9613016256..9c5f3416de 100644 --- a/templates/app/angular/src/app/app.module.ts +++ b/templates/app/angular/src/app/app.module.ts @@ -11,9 +11,9 @@ import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; import { SharedModule } from './shared/shared.module'; import { ThemeSharedModule } from '@abp/ng.theme.shared'; -import { AccountProviders } from '@abp/ng.account'; -import { IdentityProviders } from '@abp/ng.identity'; -import { TenantManagementProviders } from '@abp/ng.tenant-management'; +import { AccountConfigModule } from '@abp/ng.account.config'; +import { IdentityConfigModule } from '@abp/ng.identity.config'; +import { TenantManagementConfigModule } from '@abp/ng.tenant-management.config'; @NgModule({ declarations: [AppComponent], @@ -27,13 +27,16 @@ import { TenantManagementProviders } from '@abp/ng.tenant-management'; }), OAuthModule.forRoot(), NgxsModule.forRoot([]), + AccountConfigModule.forRoot({ redirectUrl: '/' }), + IdentityConfigModule, + TenantManagementConfigModule, BrowserModule, BrowserAnimationsModule, AppRoutingModule, SharedModule, + NgxsReduxDevtoolsPluginModule.forRoot({ disabled: environment.production }), ], - providers: [...AccountProviders({ redirectUrl: '/' }), ...IdentityProviders(), ...TenantManagementProviders()], bootstrap: [AppComponent], }) export class AppModule {}