From 4bfe91cdabd713daf460f337c58d89abcae4500d Mon Sep 17 00:00:00 2001 From: TheDiaval Date: Mon, 7 Oct 2019 17:58:10 +0300 Subject: [PATCH 01/15] feature(theme-shared): add sort order icon component --- .../theme-shared/src/lib/components/index.ts | 1 + .../sort-order-icon.component.html | 3 ++ .../sort-order-icon.component.ts | 29 +++++++++++++++++++ .../src/lib/theme-shared.module.ts | 19 +++++++----- 4 files changed, 44 insertions(+), 8 deletions(-) create mode 100644 npm/ng-packs/packages/theme-shared/src/lib/components/sort-order-icon/sort-order-icon.component.html create mode 100644 npm/ng-packs/packages/theme-shared/src/lib/components/sort-order-icon/sort-order-icon.component.ts diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/index.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/index.ts index 0792538400..900d9fa925 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/index.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/index.ts @@ -8,3 +8,4 @@ export * from './modal/modal.component'; export * from './profile/profile.component'; export * from './table-empty-message/table-empty-message.component'; export * from './toast/toast.component'; +export * from './sort-order-icon/sort-order-icon.component'; diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/sort-order-icon/sort-order-icon.component.html b/npm/ng-packs/packages/theme-shared/src/lib/components/sort-order-icon/sort-order-icon.component.html new file mode 100644 index 0000000000..e554610d3c --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/sort-order-icon/sort-order-icon.component.html @@ -0,0 +1,3 @@ + + + diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/sort-order-icon/sort-order-icon.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/sort-order-icon/sort-order-icon.component.ts new file mode 100644 index 0000000000..0a71a4b9d7 --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/sort-order-icon/sort-order-icon.component.ts @@ -0,0 +1,29 @@ +import { Component, Input, OnInit } from '@angular/core'; + +@Component({ + selector: 'abp-sort-order-icon', + templateUrl: './sort-order-icon.component.html', +}) +export class SortOrderIconComponent implements OnInit { + @Input() + selectedKey: string; + + @Input() + key: string; + + @Input() + order: string; + + @Input() + iconClass: string; + + get icon(): string { + if (!this.selectedKey) return 'fa-sort'; + if (this.selectedKey === this.key) return `fa-sort-${this.order}`; + else return ''; + } + + constructor() {} + + ngOnInit(): void {} +} 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 a1839f6217..2c7292ebc4 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 @@ -14,6 +14,7 @@ import { LoaderBarComponent } from './components/loader-bar/loader-bar.component import { ModalComponent } from './components/modal/modal.component'; import { ProfileComponent } from './components/profile/profile.component'; import { ToastComponent } from './components/toast/toast.component'; +import { SortOrderIconComponent } from './components/sort-order-icon/sort-order-icon.component'; import styles from './contants/styles'; import { ErrorHandler } from './handlers/error.handler'; import { chartJsLoaded$ } from './utils/widget-utils'; @@ -32,8 +33,8 @@ export function appendScript(injector: Injector) { 'style', styles, 'head', - 'afterbegin' - ) /* lazyLoadService.load(null, 'script', scripts) */ + 'afterbegin', + ) /* lazyLoadService.load(null, 'script', scripts) */, ).pipe(take(1)); }; @@ -53,7 +54,8 @@ export function appendScript(injector: Injector) { ModalComponent, ProfileComponent, TableEmptyMessageComponent, - ToastComponent + ToastComponent, + SortOrderIconComponent, ], exports: [ BreadcrumbComponent, @@ -65,9 +67,10 @@ export function appendScript(injector: Injector) { ModalComponent, ProfileComponent, TableEmptyMessageComponent, - ToastComponent + ToastComponent, + SortOrderIconComponent, ], - entryComponents: [ErrorComponent] + entryComponents: [ErrorComponent], }) export class ThemeSharedModule { static forRoot(): ModuleWithProviders { @@ -78,10 +81,10 @@ export class ThemeSharedModule { provide: APP_INITIALIZER, multi: true, deps: [Injector, ErrorHandler], - useFactory: appendScript + useFactory: appendScript, }, - { provide: MessageService, useClass: MessageService } - ] + { provide: MessageService, useClass: MessageService }, + ], }; } } From a99496f2efd229b9250334f7eb9c0371b276fa33 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 8 Oct 2019 09:22:33 +0300 Subject: [PATCH 02/15] feat: create module template main app #1652 --- templates/app/angular/package.json | 2 +- templates/module/angular/.editorconfig | 13 ++ templates/module/angular/.gitignore | 48 +++++++ templates/module/angular/.npmrc | 1 + templates/module/angular/README.md | 27 ++++ templates/module/angular/angular.json | 136 ++++++++++++++++++ templates/module/angular/browserslist | 12 ++ .../module/angular/e2e/protractor.conf.js | 32 +++++ .../module/angular/e2e/src/app.e2e-spec.ts | 23 +++ templates/module/angular/e2e/src/app.po.ts | 11 ++ templates/module/angular/e2e/tsconfig.json | 13 ++ templates/module/angular/karma.conf.js | 32 +++++ templates/module/angular/package.json | 55 +++++++ .../angular/src/app/app-routing.module.ts | 25 ++++ .../module/angular/src/app/app.component.ts | 10 ++ .../module/angular/src/app/app.module.ts | 38 +++++ .../src/app/home/home-routing.module.ts | 18 +++ .../angular/src/app/home/home.component.html | 15 ++ .../angular/src/app/home/home.component.ts | 14 ++ .../angular/src/app/home/home.module.ts | 10 ++ .../app/lazy-libs/account-wrapper.module.ts | 7 + .../angular/src/app/shared/shared.module.ts | 14 ++ templates/module/angular/src/assets/.gitkeep | 0 .../src/environments/environment.hmr.ts | 25 ++++ .../src/environments/environment.prod.ts | 25 ++++ .../angular/src/environments/environment.ts | 25 ++++ templates/module/angular/src/favicon.ico | Bin 0 -> 5430 bytes templates/module/angular/src/index.html | 16 +++ templates/module/angular/src/main.ts | 20 +++ templates/module/angular/src/polyfills.ts | 63 ++++++++ templates/module/angular/src/styles.scss | 27 ++++ templates/module/angular/src/test.ts | 20 +++ templates/module/angular/tsconfig.app.json | 9 ++ templates/module/angular/tsconfig.json | 23 +++ templates/module/angular/tsconfig.spec.json | 18 +++ templates/module/angular/tslint.json | 92 ++++++++++++ 36 files changed, 918 insertions(+), 1 deletion(-) create mode 100644 templates/module/angular/.editorconfig create mode 100644 templates/module/angular/.gitignore create mode 100644 templates/module/angular/.npmrc create mode 100644 templates/module/angular/README.md create mode 100644 templates/module/angular/angular.json create mode 100644 templates/module/angular/browserslist create mode 100644 templates/module/angular/e2e/protractor.conf.js create mode 100644 templates/module/angular/e2e/src/app.e2e-spec.ts create mode 100644 templates/module/angular/e2e/src/app.po.ts create mode 100644 templates/module/angular/e2e/tsconfig.json create mode 100644 templates/module/angular/karma.conf.js create mode 100644 templates/module/angular/package.json create mode 100644 templates/module/angular/src/app/app-routing.module.ts create mode 100644 templates/module/angular/src/app/app.component.ts create mode 100644 templates/module/angular/src/app/app.module.ts create mode 100644 templates/module/angular/src/app/home/home-routing.module.ts create mode 100644 templates/module/angular/src/app/home/home.component.html create mode 100644 templates/module/angular/src/app/home/home.component.ts create mode 100644 templates/module/angular/src/app/home/home.module.ts create mode 100644 templates/module/angular/src/app/lazy-libs/account-wrapper.module.ts create mode 100644 templates/module/angular/src/app/shared/shared.module.ts create mode 100644 templates/module/angular/src/assets/.gitkeep create mode 100644 templates/module/angular/src/environments/environment.hmr.ts create mode 100644 templates/module/angular/src/environments/environment.prod.ts create mode 100644 templates/module/angular/src/environments/environment.ts create mode 100644 templates/module/angular/src/favicon.ico create mode 100644 templates/module/angular/src/index.html create mode 100644 templates/module/angular/src/main.ts create mode 100644 templates/module/angular/src/polyfills.ts create mode 100644 templates/module/angular/src/styles.scss create mode 100644 templates/module/angular/src/test.ts create mode 100644 templates/module/angular/tsconfig.app.json create mode 100644 templates/module/angular/tsconfig.json create mode 100644 templates/module/angular/tsconfig.spec.json create mode 100644 templates/module/angular/tslint.json diff --git a/templates/app/angular/package.json b/templates/app/angular/package.json index 0ec7111eb6..47c4654cd2 100644 --- a/templates/app/angular/package.json +++ b/templates/app/angular/package.json @@ -26,8 +26,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", + "@ngxs/devtools-plugin": "^3.5.0", "rxjs": "~6.4.0", "tslib": "^1.10.0", "zone.js": "~0.9.1" diff --git a/templates/module/angular/.editorconfig b/templates/module/angular/.editorconfig new file mode 100644 index 0000000000..e89330a618 --- /dev/null +++ b/templates/module/angular/.editorconfig @@ -0,0 +1,13 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/templates/module/angular/.gitignore b/templates/module/angular/.gitignore new file mode 100644 index 0000000000..c3569131e4 --- /dev/null +++ b/templates/module/angular/.gitignore @@ -0,0 +1,48 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc +# Only exists if Bazel was run +/bazel-out + +# dependencies +/node_modules + +# profiling files +chrome-profiler-events.json +speed-measure-plugin.json + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings + +# System Files +.DS_Store +Thumbs.db + +yarn.lock* \ No newline at end of file diff --git a/templates/module/angular/.npmrc b/templates/module/angular/.npmrc new file mode 100644 index 0000000000..5d05609c19 --- /dev/null +++ b/templates/module/angular/.npmrc @@ -0,0 +1 @@ +@volo:registry=http://192.168.1.45:4873/ \ No newline at end of file diff --git a/templates/module/angular/README.md b/templates/module/angular/README.md new file mode 100644 index 0000000000..787553e60c --- /dev/null +++ b/templates/module/angular/README.md @@ -0,0 +1,27 @@ +# MyProjectName + +This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.0.3. + +## Development server + +Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. + +## Code scaffolding + +Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. + +## Build + +Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build. + +## Running unit tests + +Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). + +## Running end-to-end tests + +Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). + +## 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/templates/module/angular/angular.json b/templates/module/angular/angular.json new file mode 100644 index 0000000000..5d5b8fae2b --- /dev/null +++ b/templates/module/angular/angular.json @@ -0,0 +1,136 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "myProjectName": { + "projectType": "application", + "schematics": { + "@schematics/angular:component": { + "style": "scss" + } + }, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "dist/myProjectName", + "index": "src/index.html", + "main": "src/main.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.app.json", + "aot": false, + "extractCss": true, + "assets": ["src/favicon.ico", "src/assets"], + "styles": [ + "src/styles.scss", + "node_modules/bootstrap/dist/css/bootstrap.min.css", + "node_modules/font-awesome/css/font-awesome.min.css", + "node_modules/primeng/resources/themes/nova-light/theme.css", + "node_modules/primeicons/primeicons.css", + "node_modules/primeng/resources/primeng.min.css" + ], + "scripts": [] + }, + "configurations": { + "production": { + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ], + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "extractCss": true, + "namedChunks": false, + "aot": true, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true, + "budgets": [ + { + "type": "initial", + "maximumWarning": "2mb", + "maximumError": "5mb" + } + ] + }, + "hmr": { + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.hmr.ts" + } + ] + } + } + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "options": { + "browserTarget": "myProjectName:build" + }, + "configurations": { + "production": { + "browserTarget": "myProjectName:build:production" + }, + "hmr": { + "hmr": true, + "browserTarget": "myProjectName:build:hmr" + } + } + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "myProjectName:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.spec.json", + "karmaConfig": "karma.conf.js", + "assets": ["src/favicon.ico", "src/assets"], + "styles": [ + "src/styles.scss", + "node_modules/bootstrap/dist/css/bootstrap.min.css", + "node_modules/font-awesome/css/font-awesome.min.css", + "node_modules/primeng/resources/themes/nova-light/theme.css", + "node_modules/primeicons/primeicons.css", + "node_modules/primeng/resources/primeng.min.css" + ], + "scripts": [] + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": ["tsconfig.app.json", "tsconfig.spec.json", "e2e/tsconfig.json"], + "exclude": ["**/node_modules/**"] + } + }, + "e2e": { + "builder": "@angular-devkit/build-angular:protractor", + "options": { + "protractorConfig": "e2e/protractor.conf.js", + "devServerTarget": "myProjectName:serve" + }, + "configurations": { + "production": { + "devServerTarget": "myProjectName:serve:production" + } + } + } + } + } + }, + "defaultProject": "myProjectName" +} diff --git a/templates/module/angular/browserslist b/templates/module/angular/browserslist new file mode 100644 index 0000000000..80848532e4 --- /dev/null +++ b/templates/module/angular/browserslist @@ -0,0 +1,12 @@ +# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. +# For additional information regarding the format and rule options, please see: +# https://github.com/browserslist/browserslist#queries + +# You can see what browsers were selected by your queries by running: +# npx browserslist + +> 0.5% +last 2 versions +Firefox ESR +not dead +not IE 9-11 # For IE 9-11 support, remove 'not'. \ No newline at end of file diff --git a/templates/module/angular/e2e/protractor.conf.js b/templates/module/angular/e2e/protractor.conf.js new file mode 100644 index 0000000000..73e4e6806c --- /dev/null +++ b/templates/module/angular/e2e/protractor.conf.js @@ -0,0 +1,32 @@ +// @ts-check +// Protractor configuration file, see link for more information +// https://github.com/angular/protractor/blob/master/lib/config.ts + +const { SpecReporter } = require('jasmine-spec-reporter'); + +/** + * @type { import("protractor").Config } + */ +exports.config = { + allScriptsTimeout: 11000, + specs: [ + './src/**/*.e2e-spec.ts' + ], + capabilities: { + 'browserName': 'chrome' + }, + directConnect: true, + baseUrl: 'http://localhost:4200/', + framework: 'jasmine', + jasmineNodeOpts: { + showColors: true, + defaultTimeoutInterval: 30000, + print: function() {} + }, + onPrepare() { + require('ts-node').register({ + project: require('path').join(__dirname, './tsconfig.json') + }); + jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); + } +}; \ No newline at end of file diff --git a/templates/module/angular/e2e/src/app.e2e-spec.ts b/templates/module/angular/e2e/src/app.e2e-spec.ts new file mode 100644 index 0000000000..ddea6e46a7 --- /dev/null +++ b/templates/module/angular/e2e/src/app.e2e-spec.ts @@ -0,0 +1,23 @@ +import { AppPage } from './app.po'; +import { browser, logging } from 'protractor'; + +describe('workspace-project App', () => { + let page: AppPage; + + beforeEach(() => { + page = new AppPage(); + }); + + it('should display welcome message', () => { + page.navigateTo(); + expect(page.getTitleText()).toEqual('Welcome to myProjectName!'); + }); + + afterEach(async () => { + // Assert that there are no errors emitted from the browser + const logs = await browser.manage().logs().get(logging.Type.BROWSER); + expect(logs).not.toContain(jasmine.objectContaining({ + level: logging.Level.SEVERE, + } as logging.Entry)); + }); +}); diff --git a/templates/module/angular/e2e/src/app.po.ts b/templates/module/angular/e2e/src/app.po.ts new file mode 100644 index 0000000000..5776aa9eb8 --- /dev/null +++ b/templates/module/angular/e2e/src/app.po.ts @@ -0,0 +1,11 @@ +import { browser, by, element } from 'protractor'; + +export class AppPage { + navigateTo() { + return browser.get(browser.baseUrl) as Promise; + } + + getTitleText() { + return element(by.css('app-root h1')).getText() as Promise; + } +} diff --git a/templates/module/angular/e2e/tsconfig.json b/templates/module/angular/e2e/tsconfig.json new file mode 100644 index 0000000000..39b800f789 --- /dev/null +++ b/templates/module/angular/e2e/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/e2e", + "module": "commonjs", + "target": "es5", + "types": [ + "jasmine", + "jasminewd2", + "node" + ] + } +} diff --git a/templates/module/angular/karma.conf.js b/templates/module/angular/karma.conf.js new file mode 100644 index 0000000000..4e919a630c --- /dev/null +++ b/templates/module/angular/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/myProjectName'), + 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/templates/module/angular/package.json b/templates/module/angular/package.json new file mode 100644 index 0000000000..09791aefac --- /dev/null +++ b/templates/module/angular/package.json @@ -0,0 +1,55 @@ +{ + "name": "my-project-name", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "start": "ng serve", + "start:hmr": "ng serve --configuration hmr", + "build": "ng build", + "build:prod": "ng build --configuration production", + "test": "ng test", + "lint": "ng lint", + "e2e": "ng e2e" + }, + "private": true, + "dependencies": { + "@abp/ng.account": "^0.9.0", + "@abp/ng.theme.basic": "^0.9.0", + "@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", + "@ngxs/devtools-plugin": "^3.5.0", + "@angularclass/hmr": "^2.1.3", + "@ngxs/hmr-plugin": "^3.5.0", + "rxjs": "~6.4.0", + "tslib": "^1.10.0", + "zone.js": "~0.9.1" + }, + "devDependencies": { + "@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", + "codelyzer": "^5.0.0", + "jasmine-core": "~3.4.0", + "jasmine-spec-reporter": "~4.2.1", + "karma": "~4.1.0", + "karma-chrome-launcher": "~2.2.0", + "karma-coverage-istanbul-reporter": "~2.0.1", + "karma-jasmine": "~2.0.1", + "karma-jasmine-html-reporter": "^1.4.0", + "ngxs-schematic": "^1.1.9", + "protractor": "~5.4.0", + "ts-node": "~7.0.0", + "tslint": "~5.15.0", + "typescript": "~3.5.3" + } +} diff --git a/templates/module/angular/src/app/app-routing.module.ts b/templates/module/angular/src/app/app-routing.module.ts new file mode 100644 index 0000000000..f65d8238eb --- /dev/null +++ b/templates/module/angular/src/app/app-routing.module.ts @@ -0,0 +1,25 @@ +import { ABP } from '@abp/ng.core'; +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +const routes: Routes = [ + { + path: '', + loadChildren: () => import('./home/home.module').then(m => m.HomeModule), + data: { + routes: { + name: '::Menu:Home', + } as ABP.Route, + }, + }, + { + path: 'account', + loadChildren: () => import('./lazy-libs/account-wrapper.module').then(m => m.AccountWrapperModule), + }, +]; + +@NgModule({ + imports: [RouterModule.forRoot(routes)], + exports: [RouterModule], +}) +export class AppRoutingModule {} diff --git a/templates/module/angular/src/app/app.component.ts b/templates/module/angular/src/app/app.component.ts new file mode 100644 index 0000000000..bf2a27962a --- /dev/null +++ b/templates/module/angular/src/app/app.component.ts @@ -0,0 +1,10 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-root', + template: ` + + + `, +}) +export class AppComponent {} diff --git a/templates/module/angular/src/app/app.module.ts b/templates/module/angular/src/app/app.module.ts new file mode 100644 index 0000000000..9bc1839b11 --- /dev/null +++ b/templates/module/angular/src/app/app.module.ts @@ -0,0 +1,38 @@ +import { CoreModule } from '@abp/ng.core'; +import { LAYOUTS } from '@abp/ng.theme.basic'; +import { NgModule } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { NgxsReduxDevtoolsPluginModule } from '@ngxs/devtools-plugin'; +import { NgxsModule } from '@ngxs/store'; +import { OAuthModule } from 'angular-oauth2-oidc'; +import { environment } from '../environments/environment'; +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 { AccountConfigModule } from '@abp/ng.account.config'; + +@NgModule({ + declarations: [AppComponent], + imports: [ + ThemeSharedModule.forRoot(), + CoreModule.forRoot({ + environment, + requirements: { + layouts: LAYOUTS, + }, + }), + OAuthModule.forRoot(), + NgxsModule.forRoot([]), + AccountConfigModule.forRoot({ redirectUrl: '/' }), + BrowserModule, + BrowserAnimationsModule, + AppRoutingModule, + SharedModule, + + NgxsReduxDevtoolsPluginModule.forRoot({ disabled: environment.production }), + ], + bootstrap: [AppComponent], +}) +export class AppModule {} diff --git a/templates/module/angular/src/app/home/home-routing.module.ts b/templates/module/angular/src/app/home/home-routing.module.ts new file mode 100644 index 0000000000..367affb583 --- /dev/null +++ b/templates/module/angular/src/app/home/home-routing.module.ts @@ -0,0 +1,18 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; +import { HomeComponent } from './home.component'; +import { ApplicationLayoutComponent } from '@abp/ng.theme.basic'; + +const routes: Routes = [ + { + path: '', + component: ApplicationLayoutComponent, + children: [{ path: '', component: HomeComponent }], + }, +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class HomeRoutingModule {} diff --git a/templates/module/angular/src/app/home/home.component.html b/templates/module/angular/src/app/home/home.component.html new file mode 100644 index 0000000000..4fafc67398 --- /dev/null +++ b/templates/module/angular/src/app/home/home.component.html @@ -0,0 +1,15 @@ +
+
{{ '::Welcome' | abpLocalization }}
+
+

+ {{ '::LongWelcomeMessage' | abpLocalization }} +

+

+ {{ 'AbpIdentity::Login' | abpLocalization }} +

+
+

abp.io

+
+
diff --git a/templates/module/angular/src/app/home/home.component.ts b/templates/module/angular/src/app/home/home.component.ts new file mode 100644 index 0000000000..aa56d34131 --- /dev/null +++ b/templates/module/angular/src/app/home/home.component.ts @@ -0,0 +1,14 @@ +import { Component } from '@angular/core'; +import { OAuthService } from 'angular-oauth2-oidc'; + +@Component({ + selector: 'abp-home', + templateUrl: './home.component.html', +}) +export class HomeComponent { + get hasLoggedIn(): boolean { + return this.oAuthService.hasValidAccessToken(); + } + + constructor(private oAuthService: OAuthService) {} +} diff --git a/templates/module/angular/src/app/home/home.module.ts b/templates/module/angular/src/app/home/home.module.ts new file mode 100644 index 0000000000..72d20ccc65 --- /dev/null +++ b/templates/module/angular/src/app/home/home.module.ts @@ -0,0 +1,10 @@ +import { NgModule } from '@angular/core'; +import { SharedModule } from '../shared/shared.module'; +import { HomeRoutingModule } from './home-routing.module'; +import { HomeComponent } from './home.component'; + +@NgModule({ + declarations: [HomeComponent], + imports: [SharedModule, HomeRoutingModule], +}) +export class HomeModule {} diff --git a/templates/module/angular/src/app/lazy-libs/account-wrapper.module.ts b/templates/module/angular/src/app/lazy-libs/account-wrapper.module.ts new file mode 100644 index 0000000000..7130bb1a1a --- /dev/null +++ b/templates/module/angular/src/app/lazy-libs/account-wrapper.module.ts @@ -0,0 +1,7 @@ +import { NgModule } from '@angular/core'; +import { AccountModule } from '@abp/ng.account'; + +@NgModule({ + imports: [AccountModule], +}) +export class AccountWrapperModule {} diff --git a/templates/module/angular/src/app/shared/shared.module.ts b/templates/module/angular/src/app/shared/shared.module.ts new file mode 100644 index 0000000000..6bae4ea332 --- /dev/null +++ b/templates/module/angular/src/app/shared/shared.module.ts @@ -0,0 +1,14 @@ +import { CoreModule } from '@abp/ng.core'; +import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; +import { NgModule } from '@angular/core'; +import { ThemeBasicModule } from '@abp/ng.theme.basic'; +import { ThemeSharedModule } from '@abp/ng.theme.shared'; +import { TableModule } from 'primeng/table'; + +@NgModule({ + declarations: [], + imports: [CoreModule, ThemeSharedModule, ThemeBasicModule, TableModule, NgbDropdownModule], + exports: [CoreModule, ThemeSharedModule, ThemeBasicModule, TableModule, NgbDropdownModule], + providers: [], +}) +export class SharedModule {} diff --git a/templates/module/angular/src/assets/.gitkeep b/templates/module/angular/src/assets/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/templates/module/angular/src/environments/environment.hmr.ts b/templates/module/angular/src/environments/environment.hmr.ts new file mode 100644 index 0000000000..64e134b252 --- /dev/null +++ b/templates/module/angular/src/environments/environment.hmr.ts @@ -0,0 +1,25 @@ +export const environment = { + production: false, + hmr: true, + application: { + name: 'MyProjectName', + logoUrl: '', + }, + oAuthConfig: { + issuer: 'https://localhost:44305', + clientId: 'MyProjectName_App', + dummyClientSecret: '1q2w3e*', + scope: 'MyProjectName', + showDebugInformation: true, + oidc: false, + requireHttps: true, + }, + apis: { + default: { + url: 'https://localhost:44305', + }, + }, + localization: { + defaultResourceName: 'MyProjectName', + }, +}; diff --git a/templates/module/angular/src/environments/environment.prod.ts b/templates/module/angular/src/environments/environment.prod.ts new file mode 100644 index 0000000000..5b42ebace3 --- /dev/null +++ b/templates/module/angular/src/environments/environment.prod.ts @@ -0,0 +1,25 @@ +export const environment = { + production: true, + hmr: false, + application: { + name: 'MyProjectName', + logoUrl: '', + }, + oAuthConfig: { + issuer: 'https://localhost:44305', + clientId: 'MyProjectName_App', + dummyClientSecret: '1q2w3e*', + scope: 'MyProjectName', + showDebugInformation: true, + oidc: false, + requireHttps: true, + }, + apis: { + default: { + url: 'https://localhost:44305', + }, + }, + localization: { + defaultResourceName: 'MyProjectName', + }, +}; diff --git a/templates/module/angular/src/environments/environment.ts b/templates/module/angular/src/environments/environment.ts new file mode 100644 index 0000000000..ca462ff043 --- /dev/null +++ b/templates/module/angular/src/environments/environment.ts @@ -0,0 +1,25 @@ +export const environment = { + production: false, + hmr: false, + application: { + name: 'MyProjectName', + logoUrl: '', + }, + oAuthConfig: { + issuer: 'https://localhost:44305', + clientId: 'MyProjectName_App', + dummyClientSecret: '1q2w3e*', + scope: 'MyProjectName', + showDebugInformation: true, + oidc: false, + requireHttps: true, + }, + apis: { + default: { + url: 'https://localhost:44305', + }, + }, + localization: { + defaultResourceName: 'MyProjectName', + }, +}; diff --git a/templates/module/angular/src/favicon.ico b/templates/module/angular/src/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..8081c7ceaf2be08bf59010158c586170d9d2d517 GIT binary patch literal 5430 zcmc(je{54#6vvCoAI3i*G5%$U7!sA3wtMZ$fH6V9C`=eXGJb@R1%(I_{vnZtpD{6n z5Pl{DmxzBDbrB>}`90e12m8T*36WoeDLA&SD_hw{H^wM!cl_RWcVA!I+x87ee975; z@4kD^=bYPn&pmG@(+JZ`rqQEKxW<}RzhW}I!|ulN=fmjVi@x{p$cC`)5$a!)X&U+blKNvN5tg=uLvuLnuqRM;Yc*swiexsoh#XPNu{9F#c`G zQLe{yWA(Y6(;>y|-efAy11k<09(@Oo1B2@0`PtZSkqK&${ zgEY}`W@t{%?9u5rF?}Y7OL{338l*JY#P!%MVQY@oqnItpZ}?s z!r?*kwuR{A@jg2Chlf0^{q*>8n5Ir~YWf*wmsh7B5&EpHfd5@xVaj&gqsdui^spyL zB|kUoblGoO7G(MuKTfa9?pGH0@QP^b#!lM1yHWLh*2iq#`C1TdrnO-d#?Oh@XV2HK zKA{`eo{--^K&MW66Lgsktfvn#cCAc*(}qsfhrvOjMGLE?`dHVipu1J3Kgr%g?cNa8 z)pkmC8DGH~fG+dlrp(5^-QBeEvkOvv#q7MBVLtm2oD^$lJZx--_=K&Ttd=-krx(Bb zcEoKJda@S!%%@`P-##$>*u%T*mh+QjV@)Qa=Mk1?#zLk+M4tIt%}wagT{5J%!tXAE;r{@=bb%nNVxvI+C+$t?!VJ@0d@HIyMJTI{vEw0Ul ze(ha!e&qANbTL1ZneNl45t=#Ot??C0MHjjgY8%*mGisN|S6%g3;Hlx#fMNcL<87MW zZ>6moo1YD?P!fJ#Jb(4)_cc50X5n0KoDYfdPoL^iV`k&o{LPyaoqMqk92wVM#_O0l z09$(A-D+gVIlq4TA&{1T@BsUH`Bm=r#l$Z51J-U&F32+hfUP-iLo=jg7Xmy+WLq6_tWv&`wDlz#`&)Jp~iQf zZP)tu>}pIIJKuw+$&t}GQuqMd%Z>0?t%&BM&Wo^4P^Y z)c6h^f2R>X8*}q|bblAF?@;%?2>$y+cMQbN{X$)^R>vtNq_5AB|0N5U*d^T?X9{xQnJYeU{ zoZL#obI;~Pp95f1`%X3D$Mh*4^?O?IT~7HqlWguezmg?Ybq|7>qQ(@pPHbE9V?f|( z+0xo!#m@Np9PljsyxBY-UA*{U*la#8Wz2sO|48_-5t8%_!n?S$zlGe+NA%?vmxjS- zHE5O3ZarU=X}$7>;Okp(UWXJxI%G_J-@IH;%5#Rt$(WUX?6*Ux!IRd$dLP6+SmPn= z8zjm4jGjN772R{FGkXwcNv8GBcZI#@Y2m{RNF_w8(Z%^A*!bS*!}s6sh*NnURytky humW;*g7R+&|Ledvc- + + + + MyProjectName + + + + + + + +
+
+ + diff --git a/templates/module/angular/src/main.ts b/templates/module/angular/src/main.ts new file mode 100644 index 0000000000..bbdf75c32d --- /dev/null +++ b/templates/module/angular/src/main.ts @@ -0,0 +1,20 @@ +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; +import { BootstrapModuleFn as Bootstrap, hmr, WebpackModule } from '@ngxs/hmr-plugin'; + +import { AppModule } from './app/app.module'; +import { environment } from './environments/environment'; + +declare const module: WebpackModule; + +if (environment.production) { + enableProdMode(); +} + +const bootstrap: Bootstrap = () => platformBrowserDynamic().bootstrapModule(AppModule); + +if (environment.hmr) { + hmr(module, bootstrap).catch(err => console.error(err)); +} else { + bootstrap().catch(err => console.log(err)); +} diff --git a/templates/module/angular/src/polyfills.ts b/templates/module/angular/src/polyfills.ts new file mode 100644 index 0000000000..aa665d6b87 --- /dev/null +++ b/templates/module/angular/src/polyfills.ts @@ -0,0 +1,63 @@ +/** + * This file includes polyfills needed by Angular and is loaded before the app. + * You can add your own extra polyfills to this file. + * + * This file is divided into 2 sections: + * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. + * 2. Application imports. Files imported after ZoneJS that should be loaded before your main + * file. + * + * The current setup is for so-called "evergreen" browsers; the last versions of browsers that + * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), + * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. + * + * Learn more in https://angular.io/guide/browser-support + */ + +/*************************************************************************************************** + * BROWSER POLYFILLS + */ + +/** IE10 and IE11 requires the following for NgClass support on SVG elements */ +// import 'classlist.js'; // Run `npm install --save classlist.js`. + +/** + * Web Animations `@angular/platform-browser/animations` + * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. + * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). + */ +// import 'web-animations-js'; // Run `npm install --save web-animations-js`. + +/** + * By default, zone.js will patch all possible macroTask and DomEvents + * user can disable parts of macroTask/DomEvents patch by setting following flags + * because those flags need to be set before `zone.js` being loaded, and webpack + * will put import in the top of bundle, so user need to create a separate file + * in this directory (for example: zone-flags.ts), and put the following flags + * into that file, and then add the following code before importing zone.js. + * import './zone-flags.ts'; + * + * The flags allowed in zone-flags.ts are listed here. + * + * The following flags will work for all browsers. + * + * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame + * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick + * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames + * + * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js + * with the following flag, it will bypass `zone.js` patch for IE/Edge + * + * (window as any).__Zone_enable_cross_context_check = true; + * + */ + +/*************************************************************************************************** + * Zone JS is required by default for Angular itself. + */ +import 'zone.js/dist/zone'; // Included with Angular CLI. + + +/*************************************************************************************************** + * APPLICATION IMPORTS + */ diff --git a/templates/module/angular/src/styles.scss b/templates/module/angular/src/styles.scss new file mode 100644 index 0000000000..d62aefa968 --- /dev/null +++ b/templates/module/angular/src/styles.scss @@ -0,0 +1,27 @@ +/* You can add global styles to this file, and also import other style files */ + +@keyframes donut-spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} +.donut { + display: inline-block; + border: 4px solid rgba(0, 0, 0, 0.1); + border-left-color: #7983ff; + border-radius: 50%; + width: 30px; + height: 30px; + animation: donut-spin 1.2s linear infinite; + + &.centered { + position: fixed; + top: 50%; + left: 50%; + /* bring your own prefixes */ + transform: translate(-50%, -50%); + } +} diff --git a/templates/module/angular/src/test.ts b/templates/module/angular/src/test.ts new file mode 100644 index 0000000000..16317897b1 --- /dev/null +++ b/templates/module/angular/src/test.ts @@ -0,0 +1,20 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +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/templates/module/angular/tsconfig.app.json b/templates/module/angular/tsconfig.app.json new file mode 100644 index 0000000000..b750221da5 --- /dev/null +++ b/templates/module/angular/tsconfig.app.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": ["node"] + }, + "include": ["src/**/*.ts"], + "exclude": ["src/test.ts", "src/**/*.spec.ts"] +} diff --git a/templates/module/angular/tsconfig.json b/templates/module/angular/tsconfig.json new file mode 100644 index 0000000000..0a91f81078 --- /dev/null +++ b/templates/module/angular/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./", + "outDir": "./dist/out-tsc", + "sourceMap": true, + "declaration": false, + "downlevelIteration": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "module": "esnext", + "moduleResolution": "node", + "importHelpers": true, + "target": "es2015", + "typeRoots": [ + "node_modules/@types" + ], + "lib": [ + "es2018", + "dom" + ] + } +} diff --git a/templates/module/angular/tsconfig.spec.json b/templates/module/angular/tsconfig.spec.json new file mode 100644 index 0000000000..6400fde7d5 --- /dev/null +++ b/templates/module/angular/tsconfig.spec.json @@ -0,0 +1,18 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/spec", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "src/test.ts", + "src/polyfills.ts" + ], + "include": [ + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +} diff --git a/templates/module/angular/tslint.json b/templates/module/angular/tslint.json new file mode 100644 index 0000000000..188bd78d32 --- /dev/null +++ b/templates/module/angular/tslint.json @@ -0,0 +1,92 @@ +{ + "extends": "tslint:recommended", + "rules": { + "array-type": false, + "arrow-parens": false, + "deprecation": { + "severity": "warn" + }, + "component-class-suffix": true, + "contextual-lifecycle": true, + "directive-class-suffix": true, + "directive-selector": [ + true, + "attribute", + "app", + "camelCase" + ], + "component-selector": [ + true, + "element", + "app", + "kebab-case" + ], + "import-blacklist": [ + true, + "rxjs/Rx" + ], + "interface-name": false, + "max-classes-per-file": false, + "max-line-length": [ + true, + 140 + ], + "member-access": false, + "member-ordering": [ + true, + { + "order": [ + "static-field", + "instance-field", + "static-method", + "instance-method" + ] + } + ], + "no-consecutive-blank-lines": false, + "no-console": [ + true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-empty": false, + "no-inferrable-types": [ + true, + "ignore-params" + ], + "no-non-null-assertion": true, + "no-redundant-jsdoc": true, + "no-switch-case-fall-through": true, + "no-use-before-declare": true, + "no-var-requires": false, + "object-literal-key-quotes": [ + true, + "as-needed" + ], + "object-literal-sort-keys": false, + "ordered-imports": false, + "quotemark": [ + true, + "single" + ], + "trailing-comma": false, + "no-conflicting-lifecycle": true, + "no-host-metadata-property": true, + "no-input-rename": true, + "no-inputs-metadata-property": true, + "no-output-native": true, + "no-output-on-prefix": true, + "no-output-rename": true, + "no-outputs-metadata-property": true, + "template-banana-in-box": true, + "template-no-negated-async": true, + "use-lifecycle-interface": true, + "use-pipe-transform-interface": true + }, + "rulesDirectory": [ + "codelyzer" + ] +} \ No newline at end of file From 71d8779b631acce36a872f53a1d2e935974b025a Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 8 Oct 2019 09:23:52 +0300 Subject: [PATCH 03/15] refactor(core): add addAbpRoutes method --- .../lib/services/account-config.service.ts | 4 +-- npm/ng-packs/packages/account/ng-package.json | 2 +- npm/ng-packs/packages/account/package.json | 3 ++- .../src/lib/plugins/config/config.plugin.ts | 14 +++++++++- .../core/src/lib/tests/config.plugin.spec.ts | 6 ++--- .../lib/services/identity-config.service.ts | 6 ++--- .../setting-management-config.service.ts | 4 +-- .../tenant-management-config.service.ts | 4 +-- templates/module/angular/symlink.config.json | 26 +++++++++++++++++++ 9 files changed, 54 insertions(+), 15 deletions(-) create mode 100644 templates/module/angular/symlink.config.json 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 index 7af86a49c9..dac3704a06 100644 --- 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 @@ -1,4 +1,4 @@ -import { ABP_ROUTES, eLayoutType, RestService } from '@abp/ng.core'; +import { eLayoutType, RestService, addAbpRoutes } from '@abp/ng.core'; import { Injectable } from '@angular/core'; import { Router } from '@angular/router'; @@ -7,7 +7,7 @@ import { Router } from '@angular/router'; }) export class AccountConfigService { constructor(private router: Router, private restService: RestService) { - ABP_ROUTES.push({ + addAbpRoutes({ name: 'AbpAccount::Menu:Account', path: 'account', invisible: true, diff --git a/npm/ng-packs/packages/account/ng-package.json b/npm/ng-packs/packages/account/ng-package.json index 9e94619264..ad23aa3fd2 100644 --- a/npm/ng-packs/packages/account/ng-package.json +++ b/npm/ng-packs/packages/account/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.account.config"] } diff --git a/npm/ng-packs/packages/account/package.json b/npm/ng-packs/packages/account/package.json index 495b427bf3..a0e5dae2da 100644 --- a/npm/ng-packs/packages/account/package.json +++ b/npm/ng-packs/packages/account/package.json @@ -2,7 +2,8 @@ "name": "@abp/ng.account", "version": "0.9.0", "dependencies": { - "@abp/ng.theme.shared": "^0.9.0" + "@abp/ng.theme.shared": "^0.9.0", + "abp/ng.account.config": "^0.0.1" }, "publishConfig": { "access": "public" 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 2c15787f84..daab72d249 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,7 +8,19 @@ import clone from 'just-clone'; export const NGXS_CONFIG_PLUGIN_OPTIONS = new InjectionToken('NGXS_CONFIG_PLUGIN_OPTIONS'); -export let ABP_ROUTES = [] as ABP.FullRoute[]; +let ABP_ROUTES = [] as ABP.FullRoute[]; + +export function addAbpRoutes(routes: ABP.FullRoute | ABP.FullRoute[]): void { + if (!Array.isArray(routes)) { + routes = [routes]; + } + + ABP_ROUTES.push(...routes); +} + +export function getAbpRoutes(): ABP.FullRoute[] { + return []; +} @Injectable() export class ConfigPlugin implements NgxsPlugin { diff --git a/npm/ng-packs/packages/core/src/lib/tests/config.plugin.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/config.plugin.spec.ts index 1cd4266924..b9560ddf87 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/config.plugin.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/config.plugin.spec.ts @@ -4,13 +4,13 @@ import { NGXS_PLUGINS, NgxsModule, InitState, Store } from '@ngxs/store'; import { environment } from '../../../../../apps/dev-app/src/environments/environment'; import { LAYOUTS } from '../../../../theme-basic/src/public-api'; import { ABP } from '../models'; -import { ConfigPlugin, NGXS_CONFIG_PLUGIN_OPTIONS, ABP_ROUTES } from '../plugins'; +import { ConfigPlugin, NGXS_CONFIG_PLUGIN_OPTIONS, addAbpRoutes } from '../plugins'; import { RouterOutletComponent } from '../components'; import { ConfigState } from '../states'; import { CoreModule } from '../core.module'; import { eLayoutType } from '../enums/common'; -ABP_ROUTES.push( +addAbpRoutes([ { name: 'AbpUiNavigation::Menu:Administration', path: '', @@ -54,7 +54,7 @@ ABP_ROUTES.push( }, ], }, -); +]); const expectedState = { environment, 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 index fe78f8e810..960634809d 100644 --- 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 @@ -1,4 +1,4 @@ -import { ABP_ROUTES, eLayoutType, RestService } from '@abp/ng.core'; +import { addAbpRoutes, eLayoutType, RestService } from '@abp/ng.core'; import { Injectable } from '@angular/core'; import { Router } from '@angular/router'; import { Observable } from 'rxjs'; @@ -8,7 +8,7 @@ import { Observable } from 'rxjs'; }) export class IdentityConfigService { constructor(private router: Router, private restService: RestService) { - ABP_ROUTES.push( + addAbpRoutes([ { name: 'AbpUiNavigation::Menu:Administration', path: '', @@ -27,6 +27,6 @@ export class IdentityConfigService { { path: 'users', name: 'AbpIdentity::Users', order: 1, requiredPolicy: 'AbpIdentity.Users' }, ], }, - ); + ]); } } 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 index 851f435449..6d4fbec90b 100644 --- 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 @@ -1,12 +1,12 @@ import { Injectable } from '@angular/core'; -import { ABP_ROUTES, eLayoutType } from '@abp/ng.core'; +import { addAbpRoutes, eLayoutType } from '@abp/ng.core'; @Injectable({ providedIn: 'root', }) export class SettingManagementConfigService { constructor() { - ABP_ROUTES.push({ + addAbpRoutes({ name: 'Settings', path: 'setting-management', parentName: 'AbpUiNavigation::Menu:Administration', 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 index 8d77d1005f..48a6d31c84 100644 --- 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 @@ -1,12 +1,12 @@ import { Injectable } from '@angular/core'; -import { ABP_ROUTES, eLayoutType } from '@abp/ng.core'; +import { addAbpRoutes, eLayoutType } from '@abp/ng.core'; @Injectable({ providedIn: 'root', }) export class TenantManagementConfigService { constructor() { - ABP_ROUTES.push({ + addAbpRoutes({ name: 'AbpTenantManagement::Menu:TenantManagement', path: 'tenant-management', parentName: 'AbpUiNavigation::Menu:Administration', diff --git a/templates/module/angular/symlink.config.json b/templates/module/angular/symlink.config.json new file mode 100644 index 0000000000..f67140e55a --- /dev/null +++ b/templates/module/angular/symlink.config.json @@ -0,0 +1,26 @@ +{ + "yarn": true, + "packages": [ + { + "libraryFolderPath": "../../../npm/ng-packs/packages/core", + "linkFolderPath": "../../../npm/ng-packs/dist/core", + "buildCommand": "ng build core", + "buildCommandRunPath": "../../../npm/ng-packs/", + "exclude": ["node_modules", "dist"] + }, + { + "libraryFolderPath": "../../../npm/ng-packs/packages/account", + "linkFolderPath": "../../../npm/ng-packs/dist/account", + "buildCommand": "ng build account", + "buildCommandRunPath": "../../../npm/ng-packs/", + "exclude": ["node_modules", "dist"] + }, + { + "libraryFolderPath": "../../../npm/ng-packs/packages/account-config", + "linkFolderPath": "../../../npm/ng-packs/dist/account-config", + "buildCommand": "ng build account-config", + "buildCommandRunPath": "../../../npm/ng-packs/", + "exclude": ["node_modules", "dist"] + } + ] +} From 7856b223533aaedbb9b068ab8116daffa985b70c Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 8 Oct 2019 10:14:02 +0300 Subject: [PATCH 04/15] feat: create libraries in the module-template #1652 --- .../src/lib/services/account.service.ts | 6 +- templates/module/angular/angular.json | 70 +++++++++++++++++++ templates/module/angular/package.json | 3 + .../projects/my-project-name-config/README.md | 1 + .../my-project-name-config/karma.conf.js | 32 +++++++++ .../my-project-name-config/ng-package.json | 7 ++ .../my-project-name-config/package.json | 7 ++ .../src/lib/my-project-name-config.module.ts | 10 +++ .../my-project-name-config.service.ts | 16 +++++ .../my-project-name-config/src/public-api.ts | 2 + .../my-project-name-config/src/test.ts | 21 ++++++ .../my-project-name-config/tsconfig.lib.json | 26 +++++++ .../my-project-name-config/tsconfig.spec.json | 17 +++++ .../my-project-name-config/tslint.json | 17 +++++ .../projects/my-project-name/README.md | 1 + .../projects/my-project-name/karma.conf.js | 32 +++++++++ .../projects/my-project-name/ng-package.json | 8 +++ .../projects/my-project-name/package.json | 8 +++ .../my-project-name.component.spec.ts | 24 +++++++ .../components/my-project-name.component.ts | 19 +++++ .../src/lib/my-project-name-routing.module.ts | 20 ++++++ .../src/lib/my-project-name.module.ts | 12 ++++ .../my-project-name/src/public-api.ts | 2 + .../projects/my-project-name/src/test.ts | 21 ++++++ .../my-project-name/tsconfig.lib.json | 26 +++++++ .../my-project-name/tsconfig.spec.json | 17 +++++ .../projects/my-project-name/tslint.json | 17 +++++ .../angular/src/app/app-routing.module.ts | 4 ++ .../module/angular/src/app/app.module.ts | 2 + .../my-project-name-wrapper.module.ts | 7 ++ templates/module/angular/tsconfig.json | 18 ++++- 31 files changed, 468 insertions(+), 5 deletions(-) create mode 100644 templates/module/angular/projects/my-project-name-config/README.md create mode 100644 templates/module/angular/projects/my-project-name-config/karma.conf.js create mode 100644 templates/module/angular/projects/my-project-name-config/ng-package.json create mode 100644 templates/module/angular/projects/my-project-name-config/package.json create mode 100644 templates/module/angular/projects/my-project-name-config/src/lib/my-project-name-config.module.ts create mode 100644 templates/module/angular/projects/my-project-name-config/src/lib/services/my-project-name-config.service.ts create mode 100644 templates/module/angular/projects/my-project-name-config/src/public-api.ts create mode 100644 templates/module/angular/projects/my-project-name-config/src/test.ts create mode 100644 templates/module/angular/projects/my-project-name-config/tsconfig.lib.json create mode 100644 templates/module/angular/projects/my-project-name-config/tsconfig.spec.json create mode 100644 templates/module/angular/projects/my-project-name-config/tslint.json create mode 100644 templates/module/angular/projects/my-project-name/README.md create mode 100644 templates/module/angular/projects/my-project-name/karma.conf.js create mode 100644 templates/module/angular/projects/my-project-name/ng-package.json create mode 100644 templates/module/angular/projects/my-project-name/package.json create mode 100644 templates/module/angular/projects/my-project-name/src/lib/components/my-project-name.component.spec.ts create mode 100644 templates/module/angular/projects/my-project-name/src/lib/components/my-project-name.component.ts create mode 100644 templates/module/angular/projects/my-project-name/src/lib/my-project-name-routing.module.ts create mode 100644 templates/module/angular/projects/my-project-name/src/lib/my-project-name.module.ts create mode 100644 templates/module/angular/projects/my-project-name/src/public-api.ts create mode 100644 templates/module/angular/projects/my-project-name/src/test.ts create mode 100644 templates/module/angular/projects/my-project-name/tsconfig.lib.json create mode 100644 templates/module/angular/projects/my-project-name/tsconfig.spec.json create mode 100644 templates/module/angular/projects/my-project-name/tslint.json create mode 100644 templates/module/angular/src/app/lazy-libs/my-project-name-wrapper.module.ts diff --git a/npm/ng-packs/packages/account/src/lib/services/account.service.ts b/npm/ng-packs/packages/account/src/lib/services/account.service.ts index 5061cfeea1..6c2571a518 100644 --- a/npm/ng-packs/packages/account/src/lib/services/account.service.ts +++ b/npm/ng-packs/packages/account/src/lib/services/account.service.ts @@ -4,7 +4,7 @@ import { RestService, Rest } from '@abp/ng.core'; import { RegisterResponse, RegisterRequest, TenantIdResponse } from '../models'; @Injectable({ - providedIn: 'root' + providedIn: 'root', }) export class AccountService { constructor(private rest: RestService) {} @@ -12,7 +12,7 @@ export class AccountService { findTenant(tenantName: string): Observable { const request: Rest.Request = { method: 'GET', - url: `/api/abp/multi-tenancy/tenants/by-name/${tenantName}` + url: `/api/abp/multi-tenancy/tenants/by-name/${tenantName}`, }; return this.rest.request(request); @@ -22,7 +22,7 @@ export class AccountService { const request: Rest.Request = { method: 'POST', url: '/api/account/register', - body + body, }; return this.rest.request(request, { skipHandleError: true }); diff --git a/templates/module/angular/angular.json b/templates/module/angular/angular.json index 5d5b8fae2b..1f298b967c 100644 --- a/templates/module/angular/angular.json +++ b/templates/module/angular/angular.json @@ -130,6 +130,76 @@ } } } + }, + "my-project-name": { + "projectType": "library", + "root": "projects/my-project-name", + "sourceRoot": "projects/my-project-name/src", + "prefix": "lib", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/my-project-name/tsconfig.lib.json", + "project": "projects/my-project-name/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/my-project-name/src/test.ts", + "tsConfig": "projects/my-project-name/tsconfig.spec.json", + "karmaConfig": "projects/my-project-name/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/my-project-name/tsconfig.lib.json", + "projects/my-project-name/tsconfig.spec.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + } + } + }, + "my-project-name-config": { + "projectType": "library", + "root": "projects/my-project-name-config", + "sourceRoot": "projects/my-project-name-config/src", + "prefix": "lib", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/my-project-name-config/tsconfig.lib.json", + "project": "projects/my-project-name-config/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/my-project-name-config/src/test.ts", + "tsConfig": "projects/my-project-name-config/tsconfig.spec.json", + "karmaConfig": "projects/my-project-name-config/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/my-project-name-config/tsconfig.lib.json", + "projects/my-project-name-config/tsconfig.spec.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + } + } } }, "defaultProject": "myProjectName" diff --git a/templates/module/angular/package.json b/templates/module/angular/package.json index 09791aefac..93edc29006 100644 --- a/templates/module/angular/package.json +++ b/templates/module/angular/package.json @@ -32,6 +32,7 @@ }, "devDependencies": { "@angular-devkit/build-angular": "~0.803.6", + "@angular-devkit/build-ng-packagr": "~0.803.6", "@angular/cli": "~8.3.6", "@angular/compiler-cli": "~8.2.8", "@angular/language-service": "~8.2.8", @@ -46,9 +47,11 @@ "karma-coverage-istanbul-reporter": "~2.0.1", "karma-jasmine": "~2.0.1", "karma-jasmine-html-reporter": "^1.4.0", + "ng-packagr": "^5.4.0", "ngxs-schematic": "^1.1.9", "protractor": "~5.4.0", "ts-node": "~7.0.0", + "tsickle": "^0.37.0", "tslint": "~5.15.0", "typescript": "~3.5.3" } diff --git a/templates/module/angular/projects/my-project-name-config/README.md b/templates/module/angular/projects/my-project-name-config/README.md new file mode 100644 index 0000000000..3fea508c67 --- /dev/null +++ b/templates/module/angular/projects/my-project-name-config/README.md @@ -0,0 +1 @@ +# MyProjectNameConfig \ No newline at end of file diff --git a/templates/module/angular/projects/my-project-name-config/karma.conf.js b/templates/module/angular/projects/my-project-name-config/karma.conf.js new file mode 100644 index 0000000000..ea173152ce --- /dev/null +++ b/templates/module/angular/projects/my-project-name-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/my-project-name-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/templates/module/angular/projects/my-project-name-config/ng-package.json b/templates/module/angular/projects/my-project-name-config/ng-package.json new file mode 100644 index 0000000000..ed77c0b99d --- /dev/null +++ b/templates/module/angular/projects/my-project-name-config/ng-package.json @@ -0,0 +1,7 @@ +{ + "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../../dist/my-project-name-config", + "lib": { + "entryFile": "src/public-api.ts" + } +} \ No newline at end of file diff --git a/templates/module/angular/projects/my-project-name-config/package.json b/templates/module/angular/projects/my-project-name-config/package.json new file mode 100644 index 0000000000..35666a4240 --- /dev/null +++ b/templates/module/angular/projects/my-project-name-config/package.json @@ -0,0 +1,7 @@ +{ + "name": "my-project-name.config", + "version": "0.0.1", + "peerDependencies": { + "@abp/ng.core": ">=0.9.0" + } +} diff --git a/templates/module/angular/projects/my-project-name-config/src/lib/my-project-name-config.module.ts b/templates/module/angular/projects/my-project-name-config/src/lib/my-project-name-config.module.ts new file mode 100644 index 0000000000..e230b3c2c0 --- /dev/null +++ b/templates/module/angular/projects/my-project-name-config/src/lib/my-project-name-config.module.ts @@ -0,0 +1,10 @@ +import { NgModule, APP_INITIALIZER } from '@angular/core'; +import { MyProjectNameConfigService } from './services/my-project-name-config.service'; +import { noop } from '@abp/ng.core'; + +@NgModule({ + declarations: [], + providers: [{ provide: APP_INITIALIZER, deps: [MyProjectNameConfigService], multi: true, useFactory: noop }], + exports: [], +}) +export class MyProjectNameConfigModule {} diff --git a/templates/module/angular/projects/my-project-name-config/src/lib/services/my-project-name-config.service.ts b/templates/module/angular/projects/my-project-name-config/src/lib/services/my-project-name-config.service.ts new file mode 100644 index 0000000000..0596ab8711 --- /dev/null +++ b/templates/module/angular/projects/my-project-name-config/src/lib/services/my-project-name-config.service.ts @@ -0,0 +1,16 @@ +import { Injectable } from '@angular/core'; +import { eLayoutType, addAbpRoutes, ABP } from '@abp/ng.core'; + +@Injectable({ + providedIn: 'root', +}) +export class MyProjectNameConfigService { + constructor() { + addAbpRoutes({ + name: 'MyProjectName', + path: 'my-project-name', + layout: eLayoutType.application, + order: 2, + } as ABP.FullRoute); + } +} diff --git a/templates/module/angular/projects/my-project-name-config/src/public-api.ts b/templates/module/angular/projects/my-project-name-config/src/public-api.ts new file mode 100644 index 0000000000..6d4033b309 --- /dev/null +++ b/templates/module/angular/projects/my-project-name-config/src/public-api.ts @@ -0,0 +1,2 @@ +export * from './lib/services/my-project-name-config.service'; +export * from './lib/my-project-name-config.module'; diff --git a/templates/module/angular/projects/my-project-name-config/src/test.ts b/templates/module/angular/projects/my-project-name-config/src/test.ts new file mode 100644 index 0000000000..978c64fb83 --- /dev/null +++ b/templates/module/angular/projects/my-project-name-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/templates/module/angular/projects/my-project-name-config/tsconfig.lib.json b/templates/module/angular/projects/my-project-name-config/tsconfig.lib.json new file mode 100644 index 0000000000..bd23948e59 --- /dev/null +++ b/templates/module/angular/projects/my-project-name-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/templates/module/angular/projects/my-project-name-config/tsconfig.spec.json b/templates/module/angular/projects/my-project-name-config/tsconfig.spec.json new file mode 100644 index 0000000000..16da33db07 --- /dev/null +++ b/templates/module/angular/projects/my-project-name-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/templates/module/angular/projects/my-project-name-config/tslint.json b/templates/module/angular/projects/my-project-name-config/tslint.json new file mode 100644 index 0000000000..124133f849 --- /dev/null +++ b/templates/module/angular/projects/my-project-name-config/tslint.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tslint.json", + "rules": { + "directive-selector": [ + true, + "attribute", + "lib", + "camelCase" + ], + "component-selector": [ + true, + "element", + "lib", + "kebab-case" + ] + } +} diff --git a/templates/module/angular/projects/my-project-name/README.md b/templates/module/angular/projects/my-project-name/README.md new file mode 100644 index 0000000000..04db0abd53 --- /dev/null +++ b/templates/module/angular/projects/my-project-name/README.md @@ -0,0 +1 @@ +# MyProjectName \ No newline at end of file diff --git a/templates/module/angular/projects/my-project-name/karma.conf.js b/templates/module/angular/projects/my-project-name/karma.conf.js new file mode 100644 index 0000000000..ef0285b27f --- /dev/null +++ b/templates/module/angular/projects/my-project-name/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/my-project-name'), + 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/templates/module/angular/projects/my-project-name/ng-package.json b/templates/module/angular/projects/my-project-name/ng-package.json new file mode 100644 index 0000000000..d201249406 --- /dev/null +++ b/templates/module/angular/projects/my-project-name/ng-package.json @@ -0,0 +1,8 @@ +{ + "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../../dist/my-project-name", + "lib": { + "entryFile": "src/public-api.ts" + }, + "whitelistedNonPeerDependencies": ["@abp/ng.theme.shared", "my-project-name.config"] +} diff --git a/templates/module/angular/projects/my-project-name/package.json b/templates/module/angular/projects/my-project-name/package.json new file mode 100644 index 0000000000..91425b889b --- /dev/null +++ b/templates/module/angular/projects/my-project-name/package.json @@ -0,0 +1,8 @@ +{ + "name": "my-project-name", + "version": "0.0.1", + "dependencies": { + "@abp/ng.theme.shared": "^0.9.0", + "my-project-name.config": "^0.0.1" + } +} diff --git a/templates/module/angular/projects/my-project-name/src/lib/components/my-project-name.component.spec.ts b/templates/module/angular/projects/my-project-name/src/lib/components/my-project-name.component.spec.ts new file mode 100644 index 0000000000..5dfc08774c --- /dev/null +++ b/templates/module/angular/projects/my-project-name/src/lib/components/my-project-name.component.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { MyProjectNameComponent } from './my-project-name.component'; + +describe('MyProjectNameComponent', () => { + let component: MyProjectNameComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [MyProjectNameComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MyProjectNameComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/templates/module/angular/projects/my-project-name/src/lib/components/my-project-name.component.ts b/templates/module/angular/projects/my-project-name/src/lib/components/my-project-name.component.ts new file mode 100644 index 0000000000..3f3fa9ec0d --- /dev/null +++ b/templates/module/angular/projects/my-project-name/src/lib/components/my-project-name.component.ts @@ -0,0 +1,19 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'lib-my-project-name', + template: ` +

+ my-project-name works! +

+ `, + styles: [] +}) +export class MyProjectNameComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/templates/module/angular/projects/my-project-name/src/lib/my-project-name-routing.module.ts b/templates/module/angular/projects/my-project-name/src/lib/my-project-name-routing.module.ts new file mode 100644 index 0000000000..5ef00189aa --- /dev/null +++ b/templates/module/angular/projects/my-project-name/src/lib/my-project-name-routing.module.ts @@ -0,0 +1,20 @@ +import { AuthGuard, DynamicLayoutComponent, PermissionGuard } from '@abp/ng.core'; +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { MyProjectNameComponent } from './components/my-project-name.component'; + +const routes: Routes = [ + { + path: '', + component: DynamicLayoutComponent, + canActivate: [AuthGuard, PermissionGuard], + data: { requiredPolicy: '' }, + children: [{ path: '', component: MyProjectNameComponent }], + }, +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class MyProjectNameRoutingModule {} diff --git a/templates/module/angular/projects/my-project-name/src/lib/my-project-name.module.ts b/templates/module/angular/projects/my-project-name/src/lib/my-project-name.module.ts new file mode 100644 index 0000000000..a446b97bb5 --- /dev/null +++ b/templates/module/angular/projects/my-project-name/src/lib/my-project-name.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from '@angular/core'; +import { MyProjectNameComponent } from './components/my-project-name.component'; +import { MyProjectNameRoutingModule } from './my-project-name-routing.module'; +import { ThemeSharedModule } from '@abp/ng.theme.shared'; +import { CoreModule } from '@abp/ng.core'; + +@NgModule({ + declarations: [MyProjectNameComponent], + imports: [CoreModule, ThemeSharedModule, MyProjectNameRoutingModule], + exports: [MyProjectNameComponent], +}) +export class MyProjectNameModule {} diff --git a/templates/module/angular/projects/my-project-name/src/public-api.ts b/templates/module/angular/projects/my-project-name/src/public-api.ts new file mode 100644 index 0000000000..06a1e26fb3 --- /dev/null +++ b/templates/module/angular/projects/my-project-name/src/public-api.ts @@ -0,0 +1,2 @@ +export * from './lib/components/my-project-name.component'; +export * from './lib/my-project-name.module'; diff --git a/templates/module/angular/projects/my-project-name/src/test.ts b/templates/module/angular/projects/my-project-name/src/test.ts new file mode 100644 index 0000000000..978c64fb83 --- /dev/null +++ b/templates/module/angular/projects/my-project-name/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/templates/module/angular/projects/my-project-name/tsconfig.lib.json b/templates/module/angular/projects/my-project-name/tsconfig.lib.json new file mode 100644 index 0000000000..bd23948e59 --- /dev/null +++ b/templates/module/angular/projects/my-project-name/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/templates/module/angular/projects/my-project-name/tsconfig.spec.json b/templates/module/angular/projects/my-project-name/tsconfig.spec.json new file mode 100644 index 0000000000..16da33db07 --- /dev/null +++ b/templates/module/angular/projects/my-project-name/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/templates/module/angular/projects/my-project-name/tslint.json b/templates/module/angular/projects/my-project-name/tslint.json new file mode 100644 index 0000000000..124133f849 --- /dev/null +++ b/templates/module/angular/projects/my-project-name/tslint.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tslint.json", + "rules": { + "directive-selector": [ + true, + "attribute", + "lib", + "camelCase" + ], + "component-selector": [ + true, + "element", + "lib", + "kebab-case" + ] + } +} diff --git a/templates/module/angular/src/app/app-routing.module.ts b/templates/module/angular/src/app/app-routing.module.ts index f65d8238eb..30dacd8547 100644 --- a/templates/module/angular/src/app/app-routing.module.ts +++ b/templates/module/angular/src/app/app-routing.module.ts @@ -16,6 +16,10 @@ const routes: Routes = [ path: 'account', loadChildren: () => import('./lazy-libs/account-wrapper.module').then(m => m.AccountWrapperModule), }, + { + path: 'my-project-name', + loadChildren: () => import('./lazy-libs/my-project-name-wrapper.module').then(m => m.MyProjectNameWrapperModule), + }, ]; @NgModule({ diff --git a/templates/module/angular/src/app/app.module.ts b/templates/module/angular/src/app/app.module.ts index 9bc1839b11..60ab3844ca 100644 --- a/templates/module/angular/src/app/app.module.ts +++ b/templates/module/angular/src/app/app.module.ts @@ -12,6 +12,7 @@ import { AppComponent } from './app.component'; import { SharedModule } from './shared/shared.module'; import { ThemeSharedModule } from '@abp/ng.theme.shared'; import { AccountConfigModule } from '@abp/ng.account.config'; +import { MyProjectNameConfigModule } from '../../projects/my-project-name-config/src/public-api'; @NgModule({ declarations: [AppComponent], @@ -26,6 +27,7 @@ import { AccountConfigModule } from '@abp/ng.account.config'; OAuthModule.forRoot(), NgxsModule.forRoot([]), AccountConfigModule.forRoot({ redirectUrl: '/' }), + MyProjectNameConfigModule, BrowserModule, BrowserAnimationsModule, AppRoutingModule, diff --git a/templates/module/angular/src/app/lazy-libs/my-project-name-wrapper.module.ts b/templates/module/angular/src/app/lazy-libs/my-project-name-wrapper.module.ts new file mode 100644 index 0000000000..2f62d47b39 --- /dev/null +++ b/templates/module/angular/src/app/lazy-libs/my-project-name-wrapper.module.ts @@ -0,0 +1,7 @@ +import { NgModule } from '@angular/core'; +import { MyProjectNameModule } from '../../../projects/my-project-name/src/public-api'; + +@NgModule({ + imports: [MyProjectNameModule], +}) +export class MyProjectNameWrapperModule {} diff --git a/templates/module/angular/tsconfig.json b/templates/module/angular/tsconfig.json index 0a91f81078..76dbb7747d 100644 --- a/templates/module/angular/tsconfig.json +++ b/templates/module/angular/tsconfig.json @@ -18,6 +18,20 @@ "lib": [ "es2018", "dom" - ] + ], + "paths": { + "my-project-name": [ + "dist/my-project-name" + ], + "my-project-name/*": [ + "dist/my-project-name/*" + ], + "my-project-name-config": [ + "dist/my-project-name-config" + ], + "my-project-name-config/*": [ + "dist/my-project-name-config/*" + ] + } } -} +} \ No newline at end of file From 28377fbf1d67f9155cdc43ff2fb998f9017349c7 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 8 Oct 2019 10:18:31 +0300 Subject: [PATCH 05/15] fix: remove symlink config --- templates/module/angular/symlink.config.json | 26 -------------------- 1 file changed, 26 deletions(-) delete mode 100644 templates/module/angular/symlink.config.json diff --git a/templates/module/angular/symlink.config.json b/templates/module/angular/symlink.config.json deleted file mode 100644 index f67140e55a..0000000000 --- a/templates/module/angular/symlink.config.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "yarn": true, - "packages": [ - { - "libraryFolderPath": "../../../npm/ng-packs/packages/core", - "linkFolderPath": "../../../npm/ng-packs/dist/core", - "buildCommand": "ng build core", - "buildCommandRunPath": "../../../npm/ng-packs/", - "exclude": ["node_modules", "dist"] - }, - { - "libraryFolderPath": "../../../npm/ng-packs/packages/account", - "linkFolderPath": "../../../npm/ng-packs/dist/account", - "buildCommand": "ng build account", - "buildCommandRunPath": "../../../npm/ng-packs/", - "exclude": ["node_modules", "dist"] - }, - { - "libraryFolderPath": "../../../npm/ng-packs/packages/account-config", - "linkFolderPath": "../../../npm/ng-packs/dist/account-config", - "buildCommand": "ng build account-config", - "buildCommandRunPath": "../../../npm/ng-packs/", - "exclude": ["node_modules", "dist"] - } - ] -} From 8b2b5deddd41f399d072e60446023b6908e7f758 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Tue, 8 Oct 2019 11:22:25 +0300 Subject: [PATCH 06/15] fixed project chnage bug in docs module --- .../docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml | 2 +- .../src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml index 38daad78b0..f74a47fb50 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml @@ -87,7 +87,7 @@ - + diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs index 1b5c446e04..d35e60fd5e 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs @@ -187,7 +187,7 @@ namespace Volo.Docs.Pages.Documents.Project ProjectSelectItems = projects.Items.Select(p => new SelectListItem { Text = p.Name, - Value = p.Id != Project.Id ? "/" + DocumentsUrlPrefix + LanguageCode + "/" + p.ShortName + "/" + DocsAppConsts.Latest : null, + Value = p.Id != Project.Id ? DocumentsUrlPrefix + LanguageCode + "/" + p.ShortName + "/" + DocsAppConsts.Latest : null, Selected = p.Id == Project.Id }).ToList(); } From 633d1cd1552107fe5f5d019340b5521e1c320b34 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 8 Oct 2019 11:53:51 +0300 Subject: [PATCH 07/15] refactor: routes and settings contants pushing method #1652 --- .../src/lib/plugins/config/config.plugin.ts | 29 ++++--------------- .../core/src/lib/utils/route-utils.ts | 14 +++++++++ .../setting-management-config.service.ts | 19 +++++++++--- .../setting-management.component.ts | 8 ++--- .../src/lib/models/setting-management.ts | 14 ++++++++- 5 files changed, 52 insertions(+), 32 deletions(-) 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 daab72d249..99ca53ebbd 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 @@ -3,25 +3,11 @@ import { Router, Routes } from '@angular/router'; import { actionMatcher, InitState, NgxsNextPluginFn, NgxsPlugin, setValue, UpdateState } from '@ngxs/store'; import snq from 'snq'; import { ABP } from '../../models'; -import { organizeRoutes } from '../../utils/route-utils'; +import { organizeRoutes, getAbpRoutes } from '../../utils/route-utils'; import clone from 'just-clone'; export const NGXS_CONFIG_PLUGIN_OPTIONS = new InjectionToken('NGXS_CONFIG_PLUGIN_OPTIONS'); -let ABP_ROUTES = [] as ABP.FullRoute[]; - -export function addAbpRoutes(routes: ABP.FullRoute | ABP.FullRoute[]): void { - if (!Array.isArray(routes)) { - routes = [routes]; - } - - ABP_ROUTES.push(...routes); -} - -export function getAbpRoutes(): ABP.FullRoute[] { - return []; -} - @Injectable() export class ConfigPlugin implements NgxsPlugin { private initialized = false; @@ -54,24 +40,21 @@ export class ConfigPlugin implements NgxsPlugin { } function transformRoutes(routes: Routes = [], wrappers: ABP.FullRoute[] = []): any { - /** - * - * @deprecated since version 0.9.0 - */ - const abpRoutes: ABP.FullRoute[] = routes + // TODO: remove in v1 + const oldAbpRoutes: 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], []); // tslint:disable-next-line: deprecation - ABP_ROUTES = [...ABP_ROUTES, ...abpRoutes]; + const abpRoutes = [...getAbpRoutes(), ...oldAbpRoutes]; - wrappers = ABP_ROUTES.filter(ar => ar.wrapper); + wrappers = abpRoutes.filter(ar => ar.wrapper); const transformed = [] as ABP.FullRoute[]; routes .filter(route => route.component || route.loadChildren) .forEach(route => { - const abpPackage = ABP_ROUTES.find(abp => abp.path.toLowerCase() === route.path.toLowerCase() && !abp.wrapper); + const abpPackage = abpRoutes.find(abp => abp.path.toLowerCase() === route.path.toLowerCase() && !abp.wrapper); const { length } = transformed; diff --git a/npm/ng-packs/packages/core/src/lib/utils/route-utils.ts b/npm/ng-packs/packages/core/src/lib/utils/route-utils.ts index 2199fa1df6..05b7185d82 100644 --- a/npm/ng-packs/packages/core/src/lib/utils/route-utils.ts +++ b/npm/ng-packs/packages/core/src/lib/utils/route-utils.ts @@ -60,3 +60,17 @@ export function sortRoutes(routes: ABP.FullRoute[] = []): ABP.FullRoute[] { return route; }); } + +const ABP_ROUTES = [] as ABP.FullRoute[]; + +export function addAbpRoutes(routes: ABP.FullRoute | ABP.FullRoute[]): void { + if (!Array.isArray(routes)) { + routes = [routes]; + } + + ABP_ROUTES.push(...routes); +} + +export function getAbpRoutes(): ABP.FullRoute[] { + return ABP_ROUTES; +} 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 index 6d4fbec90b..209c6741b1 100644 --- 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 @@ -1,18 +1,29 @@ import { Injectable } from '@angular/core'; -import { addAbpRoutes, eLayoutType } from '@abp/ng.core'; +import { addAbpRoutes, eLayoutType, PatchRouteByName, ABP } from '@abp/ng.core'; +import { getSettingTabs } from '@abp/ng.theme.shared'; +import { Store } from '@ngxs/store'; @Injectable({ providedIn: 'root', }) export class SettingManagementConfigService { - constructor() { - addAbpRoutes({ - name: 'Settings', + constructor(private store: Store) { + const route = { + name: 'AbpSettingManagement::Settings', path: 'setting-management', parentName: 'AbpUiNavigation::Menu:Administration', layout: eLayoutType.application, order: 6, iconClass: 'fa fa-cog', + } as ABP.FullRoute; + + addAbpRoutes(route); + + setTimeout(() => { + const tabs = getSettingTabs(); + if (!tabs || !tabs.length) { + this.store.dispatch(new PatchRouteByName('AbpSettingManagement::Settings', { ...route, invisible: true })); + } }); } } 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 index 17f0f93bb0..7a267b3517 100644 --- 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 @@ -1,5 +1,5 @@ import { Component, TrackByFunction, OnInit } from '@angular/core'; -import { SettingTab, SETTING_TABS } from '@abp/ng.theme.shared'; +import { SettingTab, getSettingTabs } from '@abp/ng.theme.shared'; import { Router } from '@angular/router'; import { Store } from '@ngxs/store'; import { ConfigState } from '@abp/ng.core'; @@ -18,9 +18,9 @@ export class SettingManagementComponent implements OnInit { constructor(private router: Router, private store: Store) {} ngOnInit() { - this.settings = SETTING_TABS.filter(setting => - this.store.selectSnapshot(ConfigState.getGrantedPolicy(setting.requiredPolicy)), - ).sort((a, b) => a.order - b.order); + this.settings = getSettingTabs() + .filter(setting => this.store.selectSnapshot(ConfigState.getGrantedPolicy(setting.requiredPolicy))) + .sort((a, b) => a.order - b.order); if (this.settings.length) { this.selected = this.settings[0]; } 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 b9778da11f..1faeb40875 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 @@ -7,4 +7,16 @@ export interface SettingTab { requiredPolicy?: string; } -export const SETTING_TABS = [] as SettingTab[]; +const SETTING_TABS = [] as SettingTab[]; + +export function addSettingTab(tab: SettingTab | SettingTab[]): void { + if (!Array.isArray(tab)) { + tab = [tab]; + } + + SETTING_TABS.push(...tab); +} + +export function getSettingTabs(): SettingTab[] { + return SETTING_TABS; +} From 5c1bcbb256c0b1b8bb948d256ee5e4c8162d12c3 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 8 Oct 2019 11:55:30 +0300 Subject: [PATCH 08/15] feat(module-template): add identity, tenant management, setting-management modules #1652 --- .../packages/core/src/lib/states/config.state.ts | 1 + templates/module/angular/package.json | 3 +++ .../module/angular/src/app/app-routing.module.ts | 14 ++++++++++++++ templates/module/angular/src/app/app.module.ts | 6 ++++++ .../src/app/lazy-libs/identity-wrapper.module.ts | 7 +++++++ .../lazy-libs/setting-management-wrapper.module.ts | 7 +++++++ .../lazy-libs/tenant-management-wrapper.module.ts | 7 +++++++ 7 files changed, 45 insertions(+) create mode 100644 templates/module/angular/src/app/lazy-libs/identity-wrapper.module.ts create mode 100644 templates/module/angular/src/app/lazy-libs/setting-management-wrapper.module.ts create mode 100644 templates/module/angular/src/app/lazy-libs/tenant-management-wrapper.module.ts 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 1c0f533079..08bb79a171 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 @@ -230,6 +230,7 @@ export class ConfigState { }); } + if (typeof localization !== 'string') localization = ''; return localization || defaultValue || key; }, ); diff --git a/templates/module/angular/package.json b/templates/module/angular/package.json index 93edc29006..37f54f145d 100644 --- a/templates/module/angular/package.json +++ b/templates/module/angular/package.json @@ -15,6 +15,9 @@ "dependencies": { "@abp/ng.account": "^0.9.0", "@abp/ng.theme.basic": "^0.9.0", + "@abp/ng.identity": "^0.9.0", + "@abp/ng.tenant-management": "^0.9.0", + "@abp/ng.setting-management": "^0.9.0", "@angular/animations": "~8.2.8", "@angular/common": "~8.2.8", "@angular/compiler": "~8.2.8", diff --git a/templates/module/angular/src/app/app-routing.module.ts b/templates/module/angular/src/app/app-routing.module.ts index 30dacd8547..1714a2e06e 100644 --- a/templates/module/angular/src/app/app-routing.module.ts +++ b/templates/module/angular/src/app/app-routing.module.ts @@ -12,10 +12,24 @@ const routes: Routes = [ } as ABP.Route, }, }, + { + path: 'identity', + loadChildren: () => import('./lazy-libs/identity-wrapper.module').then(m => m.IdentityWrapperModule), + }, + { + path: 'tenant-management', + loadChildren: () => + import('./lazy-libs/tenant-management-wrapper.module').then(m => m.TenantManagementWrapperModule), + }, { path: 'account', loadChildren: () => import('./lazy-libs/account-wrapper.module').then(m => m.AccountWrapperModule), }, + { + path: 'setting-management', + loadChildren: () => + import('./lazy-libs/setting-management-wrapper.module').then(m => m.SettingManagementWrapperModule), + }, { path: 'my-project-name', loadChildren: () => import('./lazy-libs/my-project-name-wrapper.module').then(m => m.MyProjectNameWrapperModule), diff --git a/templates/module/angular/src/app/app.module.ts b/templates/module/angular/src/app/app.module.ts index 60ab3844ca..b670735c59 100644 --- a/templates/module/angular/src/app/app.module.ts +++ b/templates/module/angular/src/app/app.module.ts @@ -12,6 +12,9 @@ import { AppComponent } from './app.component'; import { SharedModule } from './shared/shared.module'; import { ThemeSharedModule } from '@abp/ng.theme.shared'; import { AccountConfigModule } from '@abp/ng.account.config'; +import { IdentityConfigModule } from '@abp/ng.identity.config'; +import { TenantManagementConfigModule } from '@abp/ng.tenant-management.config'; +import { SettingManagementConfigModule } from '@abp/ng.setting-management.config'; import { MyProjectNameConfigModule } from '../../projects/my-project-name-config/src/public-api'; @NgModule({ @@ -27,6 +30,9 @@ import { MyProjectNameConfigModule } from '../../projects/my-project-name-config OAuthModule.forRoot(), NgxsModule.forRoot([]), AccountConfigModule.forRoot({ redirectUrl: '/' }), + IdentityConfigModule, + TenantManagementConfigModule, + SettingManagementConfigModule, MyProjectNameConfigModule, BrowserModule, BrowserAnimationsModule, diff --git a/templates/module/angular/src/app/lazy-libs/identity-wrapper.module.ts b/templates/module/angular/src/app/lazy-libs/identity-wrapper.module.ts new file mode 100644 index 0000000000..fed1dcd1ec --- /dev/null +++ b/templates/module/angular/src/app/lazy-libs/identity-wrapper.module.ts @@ -0,0 +1,7 @@ +import { NgModule } from '@angular/core'; +import { IdentityModule } from '@abp/ng.identity'; + +@NgModule({ + imports: [IdentityModule], +}) +export class IdentityWrapperModule {} diff --git a/templates/module/angular/src/app/lazy-libs/setting-management-wrapper.module.ts b/templates/module/angular/src/app/lazy-libs/setting-management-wrapper.module.ts new file mode 100644 index 0000000000..e5f3db8878 --- /dev/null +++ b/templates/module/angular/src/app/lazy-libs/setting-management-wrapper.module.ts @@ -0,0 +1,7 @@ +import { NgModule } from '@angular/core'; +import { SettingManagementModule } from '@abp/ng.setting-management'; + +@NgModule({ + imports: [SettingManagementModule], +}) +export class SettingManagementWrapperModule {} diff --git a/templates/module/angular/src/app/lazy-libs/tenant-management-wrapper.module.ts b/templates/module/angular/src/app/lazy-libs/tenant-management-wrapper.module.ts new file mode 100644 index 0000000000..63eabda505 --- /dev/null +++ b/templates/module/angular/src/app/lazy-libs/tenant-management-wrapper.module.ts @@ -0,0 +1,7 @@ +import { NgModule } from '@angular/core'; +import { TenantManagementModule } from '@abp/ng.tenant-management'; + +@NgModule({ + imports: [TenantManagementModule], +}) +export class TenantManagementWrapperModule {} From 4fa105bb77b123ec2861b8f9033bb6f986b960e4 Mon Sep 17 00:00:00 2001 From: TheDiaval Date: Tue, 8 Oct 2019 13:02:40 +0300 Subject: [PATCH 09/15] fix(core): change pipe inputs --- npm/ng-packs/packages/core/src/lib/pipes/sort.pipe.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/npm/ng-packs/packages/core/src/lib/pipes/sort.pipe.ts b/npm/ng-packs/packages/core/src/lib/pipes/sort.pipe.ts index ce8ac78bb1..262025345d 100644 --- a/npm/ng-packs/packages/core/src/lib/pipes/sort.pipe.ts +++ b/npm/ng-packs/packages/core/src/lib/pipes/sort.pipe.ts @@ -9,7 +9,7 @@ export type SortOrder = 'asc' | 'desc'; export class SortPipe implements PipeTransform { intialValue: any[]; - transform(value: any[], sortOrder: SortOrder = 'asc', sortKey: string): any { + transform(value: any[], sortOrder: SortOrder | string = 'asc', sortKey?: string): any { sortOrder = sortOrder && (sortOrder.toLowerCase() as any); if (!this.intialValue) this.intialValue = clone(value); From d78000144e069c57d4144da8f0754ce79cd4114b Mon Sep 17 00:00:00 2001 From: TheDiaval Date: Tue, 8 Oct 2019 13:03:36 +0300 Subject: [PATCH 10/15] feature(identity): add abpSort pipe --- .../lib/components/roles/roles.component.html | 8 ++- .../lib/components/roles/roles.component.ts | 36 +++++++++---- .../lib/components/users/users.component.html | 18 ++++--- .../lib/components/users/users.component.ts | 50 ++++++++++++------- 4 files changed, 71 insertions(+), 41 deletions(-) diff --git a/npm/ng-packs/packages/identity/src/lib/components/roles/roles.component.html b/npm/ng-packs/packages/identity/src/lib/components/roles/roles.component.html index db52b77f82..c6d86b5968 100644 --- a/npm/ng-packs/packages/identity/src/lib/components/roles/roles.component.html +++ b/npm/ng-packs/packages/identity/src/lib/components/roles/roles.component.html @@ -24,7 +24,7 @@ {{ 'AbpIdentity::Actions' | abpLocalization }} - + {{ 'AbpIdentity::RoleName' | abpLocalization }} - + diff --git a/npm/ng-packs/packages/identity/src/lib/components/roles/roles.component.ts b/npm/ng-packs/packages/identity/src/lib/components/roles/roles.component.ts index 7ebda6be18..f179e6b713 100644 --- a/npm/ng-packs/packages/identity/src/lib/components/roles/roles.component.ts +++ b/npm/ng-packs/packages/identity/src/lib/components/roles/roles.component.ts @@ -11,7 +11,7 @@ import { IdentityState } from '../../states/identity.state'; @Component({ selector: 'abp-roles', - templateUrl: './roles.component.html' + templateUrl: './roles.component.html', }) export class RolesComponent { @Select(IdentityState.getRoles) @@ -30,15 +30,15 @@ export class RolesComponent { providerKey: string; - pageQuery: ABP.PageQueryParams = { - sorting: 'name' - }; + pageQuery: ABP.PageQueryParams = {}; loading = false; modalBusy = false; - sortOrder = 'asc'; + sortOrder: string = ''; + + sortKey: string = ''; @ViewChild('modalContent', { static: false }) modalContent: TemplateRef; @@ -54,10 +54,10 @@ export class RolesComponent { this.form = this.fb.group({ name: new FormControl({ value: this.selected.name || '', disabled: this.selected.isStatic }, [ Validators.required, - Validators.maxLength(256) + Validators.maxLength(256), ]), isDefault: [this.selected.isDefault || false], - isPublic: [this.selected.isPublic || false] + isPublic: [this.selected.isPublic || false], }); } @@ -89,7 +89,7 @@ export class RolesComponent { .dispatch( this.selected.id ? new UpdateRole({ ...this.form.value, id: this.selected.id }) - : new CreateRole(this.form.value) + : new CreateRole(this.form.value), ) .subscribe(() => { this.modalBusy = false; @@ -100,7 +100,7 @@ export class RolesComponent { delete(id: string, name: string) { this.confirmationService .warn('AbpIdentity::RoleDeletionConfirmationMessage', 'AbpIdentity::AreYouSure', { - messageLocalizationParams: [name] + messageLocalizationParams: [name], }) .subscribe((status: Toaster.Status) => { if (status === Toaster.Status.confirm) { @@ -124,7 +124,21 @@ export class RolesComponent { .subscribe(); } - changeSortOrder() { - this.sortOrder = this.sortOrder.toLowerCase() === 'asc' ? 'desc' : 'asc'; + sortByKey(sortKey: string) { + this.sortKey = sortKey; + switch (this.sortOrder) { + case '': + this.sortOrder = 'asc'; + break; + case 'asc': + this.sortOrder = 'desc'; + break; + case 'desc': + this.sortOrder = ''; + this.sortKey = ''; + break; + default: + break; + } } } diff --git a/npm/ng-packs/packages/identity/src/lib/components/users/users.component.html b/npm/ng-packs/packages/identity/src/lib/components/users/users.component.html index c17fd7f7c0..84746413fe 100644 --- a/npm/ng-packs/packages/identity/src/lib/components/users/users.component.html +++ b/npm/ng-packs/packages/identity/src/lib/components/users/users.component.html @@ -30,7 +30,7 @@ {{ 'AbpIdentity::Actions' | abpLocalization }} - + {{ 'AbpIdentity::UserName' | abpLocalization }} - + + + + {{ 'AbpIdentity::EmailAddress' | abpLocalization }} + + + + {{ 'AbpIdentity::PhoneNumber' | abpLocalization }} + - {{ 'AbpIdentity::EmailAddress' | abpLocalization }} - {{ 'AbpIdentity::PhoneNumber' | abpLocalization }} diff --git a/npm/ng-packs/packages/identity/src/lib/components/users/users.component.ts b/npm/ng-packs/packages/identity/src/lib/components/users/users.component.ts index 18f7507f29..16fadcfa63 100644 --- a/npm/ng-packs/packages/identity/src/lib/components/users/users.component.ts +++ b/npm/ng-packs/packages/identity/src/lib/components/users/users.component.ts @@ -12,13 +12,13 @@ import { GetUserById, GetUserRoles, GetUsers, - UpdateUser + UpdateUser, } from '../../actions/identity.actions'; import { Identity } from '../../models/identity'; import { IdentityState } from '../../states/identity.state'; @Component({ selector: 'abp-users', - templateUrl: './users.component.html' + templateUrl: './users.component.html', }) export class UsersComponent { @Select(IdentityState.getUsers) @@ -42,9 +42,7 @@ export class UsersComponent { providerKey: string; - pageQuery: ABP.PageQueryParams = { - sorting: 'userName' - }; + pageQuery: ABP.PageQueryParams = {}; isModalVisible: boolean; @@ -52,7 +50,9 @@ export class UsersComponent { modalBusy = false; - sortOrder = 'asc'; + sortOrder: string = ''; + + sortKey: string = ''; trackByFn: TrackByFunction = (index, item) => Object.keys(item)[0] || index; @@ -80,10 +80,10 @@ export class UsersComponent { roleNames: this.fb.array( this.roles.map(role => this.fb.group({ - [role.name]: [!!snq(() => this.selectedUserRoles.find(userRole => userRole.id === role.id))] - }) - ) - ) + [role.name]: [!!snq(() => this.selectedUserRoles.find(userRole => userRole.id === role.id))], + }), + ), + ), }); if (!this.selected.userName) { this.form.addControl('password', new FormControl('', [Validators.required, Validators.maxLength(32)])); @@ -107,7 +107,7 @@ export class UsersComponent { .pipe( switchMap(() => this.store.dispatch(new GetUserRoles(id))), pluck('IdentityState'), - take(1) + take(1), ) .subscribe((state: Identity.State) => { this.selected = state.selectedUser; @@ -123,7 +123,7 @@ export class UsersComponent { const { roleNames } = this.form.value; const mappedRoleNames = snq( () => roleNames.filter(role => !!role[Object.keys(role)[0]]).map(role => Object.keys(role)[0]), - [] + [], ); this.store @@ -132,12 +132,12 @@ export class UsersComponent { ? new UpdateUser({ ...this.form.value, id: this.selected.id, - roleNames: mappedRoleNames + roleNames: mappedRoleNames, }) : new CreateUser({ ...this.form.value, - roleNames: mappedRoleNames - }) + roleNames: mappedRoleNames, + }), ) .subscribe(() => { this.modalBusy = false; @@ -148,7 +148,7 @@ export class UsersComponent { delete(id: string, userName: string) { this.confirmationService .warn('AbpIdentity::UserDeletionConfirmationMessage', 'AbpIdentity::AreYouSure', { - messageLocalizationParams: [userName] + messageLocalizationParams: [userName], }) .subscribe((status: Toaster.Status) => { if (status === Toaster.Status.confirm) { @@ -172,7 +172,21 @@ export class UsersComponent { .subscribe(); } - changeSortOrder() { - this.sortOrder = this.sortOrder.toLowerCase() === 'asc' ? 'desc' : 'asc'; + sortByKey(sortKey: string) { + this.sortKey = sortKey; + switch (this.sortOrder) { + case '': + this.sortOrder = 'asc'; + break; + case 'asc': + this.sortOrder = 'desc'; + break; + case 'desc': + this.sortOrder = ''; + this.sortKey = ''; + break; + default: + break; + } } } From 4eef7393f87ef7331351564530cc0869a4598b1f Mon Sep 17 00:00:00 2001 From: TheDiaval Date: Tue, 8 Oct 2019 13:03:58 +0300 Subject: [PATCH 11/15] feature(tenant-management): add abpSort pipe --- .../components/tenants/tenants.component.html | 8 ++-- .../components/tenants/tenants.component.ts | 48 ++++++++++++------- 2 files changed, 34 insertions(+), 22 deletions(-) diff --git a/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.html b/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.html index 2b84c34dea..8c27fe180c 100644 --- a/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.html +++ b/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.html @@ -31,7 +31,7 @@ {{ 'AbpTenantManagement::Actions' | abpLocalization }} - + {{ 'AbpTenantManagement::TenantName' | abpLocalization }} - + diff --git a/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.ts b/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.ts index f9c90764c2..e945cc5e69 100644 --- a/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.ts +++ b/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.ts @@ -10,7 +10,7 @@ import { DeleteTenant, GetTenants, GetTenantById, - UpdateTenant + UpdateTenant, } from '../../actions/tenant-management.actions'; import { TenantManagementService } from '../../services/tenant-management.service'; import { TenantManagementState } from '../../states/tenant-management.state'; @@ -23,7 +23,7 @@ interface SelectedModalContent { @Component({ selector: 'abp-tenants', - templateUrl: './tenants.component.html' + templateUrl: './tenants.component.html', }) export class TenantsComponent { @Select(TenantManagementState.get) @@ -50,15 +50,15 @@ export class TenantsComponent { _useSharedDatabase: boolean; - pageQuery: ABP.PageQueryParams = { - sorting: 'name' - }; + pageQuery: ABP.PageQueryParams = {}; loading = false; modalBusy = false; - sortOrder = 'asc'; + sortOrder: string = ''; + + sortKey: string = ''; get useSharedDatabase(): boolean { return this.defaultConnectionStringForm.get('useSharedDatabase').value; @@ -78,7 +78,7 @@ export class TenantsComponent { private confirmationService: ConfirmationService, private tenantService: TenantManagementService, private fb: FormBuilder, - private store: Store + private store: Store, ) {} onSearch(value) { @@ -88,14 +88,14 @@ export class TenantsComponent { private createTenantForm() { this.tenantForm = this.fb.group({ - name: [this.selected.name || '', [Validators.required, Validators.maxLength(256)]] + name: [this.selected.name || '', [Validators.required, Validators.maxLength(256)]], }); } private createDefaultConnectionStringForm() { this.defaultConnectionStringForm = this.fb.group({ useSharedDatabase: this._useSharedDatabase, - defaultConnectionString: [this.defaultConnectionString || ''] + defaultConnectionString: [this.defaultConnectionString || ''], }); } @@ -103,7 +103,7 @@ export class TenantsComponent { this.selectedModalContent = { title, template, - type + type, }; this.isModalVisible = true; @@ -117,7 +117,7 @@ export class TenantsComponent { switchMap(selected => { this.selected = selected; return this.tenantService.getDefaultConnectionString(id); - }) + }), ) .subscribe(fetchedConnectionString => { this._useSharedDatabase = fetchedConnectionString ? false : true; @@ -158,7 +158,7 @@ export class TenantsComponent { .deleteDefaultConnectionString(this.selected.id) .pipe( take(1), - finalize(() => (this.modalBusy = false)) + finalize(() => (this.modalBusy = false)), ) .subscribe(() => { this.isModalVisible = false; @@ -168,7 +168,7 @@ export class TenantsComponent { .updateDefaultConnectionString({ id: this.selected.id, defaultConnectionString: this.connectionString }) .pipe( take(1), - finalize(() => (this.modalBusy = false)) + finalize(() => (this.modalBusy = false)), ) .subscribe(() => { this.isModalVisible = false; @@ -184,7 +184,7 @@ export class TenantsComponent { .dispatch( this.selected.id ? new UpdateTenant({ ...this.tenantForm.value, id: this.selected.id }) - : new CreateTenant(this.tenantForm.value) + : new CreateTenant(this.tenantForm.value), ) .pipe(finalize(() => (this.modalBusy = false))) .subscribe(() => { @@ -195,7 +195,7 @@ export class TenantsComponent { delete(id: string, name: string) { this.confirmationService .warn('AbpTenantManagement::TenantDeletionConfirmationMessage', 'AbpTenantManagement::AreYouSure', { - messageLocalizationParams: [name] + messageLocalizationParams: [name], }) .subscribe((status: Toaster.Status) => { if (status === Toaster.Status.confirm) { @@ -219,7 +219,21 @@ export class TenantsComponent { .subscribe(); } - changeSortOrder() { - this.sortOrder = this.sortOrder.toLowerCase() === 'asc' ? 'desc' : 'asc'; + sortByKey(sortKey: string) { + this.sortKey = sortKey; + switch (this.sortOrder) { + case '': + this.sortOrder = 'asc'; + break; + case 'asc': + this.sortOrder = 'desc'; + break; + case 'desc': + this.sortOrder = ''; + this.sortKey = ''; + break; + default: + break; + } } } From d3303420e0485ccfbff02840101b9f686c7cb328 Mon Sep 17 00:00:00 2001 From: TheDiaval Date: Tue, 8 Oct 2019 13:04:54 +0300 Subject: [PATCH 12/15] fix(theme-shared): remove unnecessary brackets --- .../components/sort-order-icon/sort-order-icon.component.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/sort-order-icon/sort-order-icon.component.html b/npm/ng-packs/packages/theme-shared/src/lib/components/sort-order-icon/sort-order-icon.component.html index e554610d3c..63b4f648f5 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/sort-order-icon/sort-order-icon.component.html +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/sort-order-icon/sort-order-icon.component.html @@ -1,3 +1,3 @@ - - + + From d7713ee30836cf667ae96fd8bd8a584f377cab82 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 8 Oct 2019 13:09:19 +0300 Subject: [PATCH 13/15] feat(module-template): add settings component #1652 --- .../lib/components/my-project-name-settings.component.ts | 9 +++++++++ .../src/lib/my-project-name-config.module.ts | 6 ++++-- .../src/lib/services/my-project-name-config.service.ts | 9 +++++++++ .../projects/my-project-name-config/src/public-api.ts | 1 + 4 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 templates/module/angular/projects/my-project-name-config/src/lib/components/my-project-name-settings.component.ts diff --git a/templates/module/angular/projects/my-project-name-config/src/lib/components/my-project-name-settings.component.ts b/templates/module/angular/projects/my-project-name-config/src/lib/components/my-project-name-settings.component.ts new file mode 100644 index 0000000000..39db5d23d5 --- /dev/null +++ b/templates/module/angular/projects/my-project-name-config/src/lib/components/my-project-name-settings.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'my-project-name-settings', + template: ` +

MyProjectName Settings

+ `, +}) +export class MyProjectNameSettingsComponent {} diff --git a/templates/module/angular/projects/my-project-name-config/src/lib/my-project-name-config.module.ts b/templates/module/angular/projects/my-project-name-config/src/lib/my-project-name-config.module.ts index e230b3c2c0..1af221be40 100644 --- a/templates/module/angular/projects/my-project-name-config/src/lib/my-project-name-config.module.ts +++ b/templates/module/angular/projects/my-project-name-config/src/lib/my-project-name-config.module.ts @@ -1,10 +1,12 @@ import { NgModule, APP_INITIALIZER } from '@angular/core'; import { MyProjectNameConfigService } from './services/my-project-name-config.service'; import { noop } from '@abp/ng.core'; +import { MyProjectNameSettingsComponent } from './components/my-project-name-settings.component'; @NgModule({ - declarations: [], + declarations: [MyProjectNameSettingsComponent], providers: [{ provide: APP_INITIALIZER, deps: [MyProjectNameConfigService], multi: true, useFactory: noop }], - exports: [], + exports: [MyProjectNameSettingsComponent], + entryComponents: [MyProjectNameSettingsComponent], }) export class MyProjectNameConfigModule {} diff --git a/templates/module/angular/projects/my-project-name-config/src/lib/services/my-project-name-config.service.ts b/templates/module/angular/projects/my-project-name-config/src/lib/services/my-project-name-config.service.ts index 0596ab8711..9cf1443edc 100644 --- a/templates/module/angular/projects/my-project-name-config/src/lib/services/my-project-name-config.service.ts +++ b/templates/module/angular/projects/my-project-name-config/src/lib/services/my-project-name-config.service.ts @@ -1,5 +1,7 @@ import { Injectable } from '@angular/core'; import { eLayoutType, addAbpRoutes, ABP } from '@abp/ng.core'; +import { addSettingTab } from '@abp/ng.theme.shared'; +import { MyProjectNameSettingsComponent } from '../components/my-project-name-settings.component'; @Injectable({ providedIn: 'root', @@ -12,5 +14,12 @@ export class MyProjectNameConfigService { layout: eLayoutType.application, order: 2, } as ABP.FullRoute); + + const route = addSettingTab({ + component: MyProjectNameSettingsComponent, + name: 'MyProjectName Settings', + order: 1, + requiredPolicy: '', + }); } } diff --git a/templates/module/angular/projects/my-project-name-config/src/public-api.ts b/templates/module/angular/projects/my-project-name-config/src/public-api.ts index 6d4033b309..e931e6159e 100644 --- a/templates/module/angular/projects/my-project-name-config/src/public-api.ts +++ b/templates/module/angular/projects/my-project-name-config/src/public-api.ts @@ -1,2 +1,3 @@ +export * from './lib/components/my-project-name-settings.component'; export * from './lib/services/my-project-name-config.service'; export * from './lib/my-project-name-config.module'; From 6b7f2ae2ca47001c7f8bd977ea9827c9b273a6ea Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 8 Oct 2019 14:08:48 +0300 Subject: [PATCH 14/15] feat(core): add sort method to sort.pipe --- .../packages/core/src/lib/core.module.ts | 3 ++ .../core/src/lib/directives/sort.directive.ts | 12 +++++ npm/ng-packs/packages/core/src/public-api.ts | 1 + .../lib/components/users/users.component.html | 22 ++++++--- .../lib/components/users/users.component.ts | 22 +-------- .../components/tenants/tenants.component.html | 9 +++- .../components/tenants/tenants.component.ts | 22 +-------- .../sort-order-icon.component.ts | 46 ++++++++++++++++--- 8 files changed, 82 insertions(+), 55 deletions(-) create mode 100644 npm/ng-packs/packages/core/src/lib/directives/sort.directive.ts diff --git a/npm/ng-packs/packages/core/src/lib/core.module.ts b/npm/ng-packs/packages/core/src/lib/core.module.ts index d3c98f9925..7e002884db 100644 --- a/npm/ng-packs/packages/core/src/lib/core.module.ts +++ b/npm/ng-packs/packages/core/src/lib/core.module.ts @@ -27,6 +27,7 @@ import { getInitialData, localeInitializer } from './utils/initial-utils'; import { ConfigPlugin, NGXS_CONFIG_PLUGIN_OPTIONS } from './plugins/config/config.plugin'; import { ForDirective } from './directives/for.directive'; import { AbstractNgModelComponent } from './abstracts/ng-model.component'; +import { SortDirective } from './directives/sort.directive'; @NgModule({ imports: [ @@ -46,6 +47,7 @@ import { AbstractNgModelComponent } from './abstracts/ng-model.component'; EllipsisDirective, ForDirective, FormSubmitDirective, + SortDirective, LocalizationPipe, SortPipe, PermissionDirective, @@ -68,6 +70,7 @@ import { AbstractNgModelComponent } from './abstracts/ng-model.component'; FormSubmitDirective, LocalizationPipe, SortPipe, + SortDirective, PermissionDirective, VisibilityDirective, InputEventDebounceDirective, diff --git a/npm/ng-packs/packages/core/src/lib/directives/sort.directive.ts b/npm/ng-packs/packages/core/src/lib/directives/sort.directive.ts new file mode 100644 index 0000000000..c00892998d --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/directives/sort.directive.ts @@ -0,0 +1,12 @@ +import { Directive, ElementRef, Input, Optional, Self } from '@angular/core'; +import { Table } from 'primeng/table'; + +@Directive({ + selector: '[abpSort]', +}) +export class SortDirective { + constructor(private elementRef: ElementRef, @Optional() @Self() table: Table) { + console.warn(elementRef); + setInterval(() => console.warn(table.value), 1000); + } +} diff --git a/npm/ng-packs/packages/core/src/public-api.ts b/npm/ng-packs/packages/core/src/public-api.ts index 4178d9e13f..3513427c2d 100644 --- a/npm/ng-packs/packages/core/src/public-api.ts +++ b/npm/ng-packs/packages/core/src/public-api.ts @@ -12,6 +12,7 @@ export * from './lib/enums'; export * from './lib/guards'; export * from './lib/interceptors'; export * from './lib/models'; +export * from './lib/pipes'; export * from './lib/plugins'; export * from './lib/services'; export * from './lib/states'; diff --git a/npm/ng-packs/packages/identity/src/lib/components/users/users.component.html b/npm/ng-packs/packages/identity/src/lib/components/users/users.component.html index 84746413fe..4bc837f1fd 100644 --- a/npm/ng-packs/packages/identity/src/lib/components/users/users.component.html +++ b/npm/ng-packs/packages/identity/src/lib/components/users/users.component.html @@ -29,6 +29,7 @@ /> {{ 'AbpIdentity::Actions' | abpLocalization }} - + {{ 'AbpIdentity::UserName' | abpLocalization }} - + - + {{ 'AbpIdentity::EmailAddress' | abpLocalization }} - + - + {{ 'AbpIdentity::PhoneNumber' | abpLocalization }} - + diff --git a/npm/ng-packs/packages/identity/src/lib/components/users/users.component.ts b/npm/ng-packs/packages/identity/src/lib/components/users/users.component.ts index 16fadcfa63..ffc69c58ed 100644 --- a/npm/ng-packs/packages/identity/src/lib/components/users/users.component.ts +++ b/npm/ng-packs/packages/identity/src/lib/components/users/users.component.ts @@ -50,9 +50,9 @@ export class UsersComponent { modalBusy = false; - sortOrder: string = ''; + sortOrder = ''; - sortKey: string = ''; + sortKey = ''; trackByFn: TrackByFunction = (index, item) => Object.keys(item)[0] || index; @@ -171,22 +171,4 @@ export class UsersComponent { .pipe(finalize(() => (this.loading = false))) .subscribe(); } - - sortByKey(sortKey: string) { - this.sortKey = sortKey; - switch (this.sortOrder) { - case '': - this.sortOrder = 'asc'; - break; - case 'asc': - this.sortOrder = 'desc'; - break; - case 'desc': - this.sortOrder = ''; - this.sortKey = ''; - break; - default: - break; - } - } } diff --git a/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.html b/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.html index 8c27fe180c..ef4a69daf4 100644 --- a/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.html +++ b/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.html @@ -58,9 +58,14 @@ {{ 'AbpTenantManagement::Actions' | abpLocalization }} - + {{ 'AbpTenantManagement::TenantName' | abpLocalization }} - + diff --git a/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.ts b/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.ts index e945cc5e69..439a6dadc1 100644 --- a/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.ts +++ b/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.ts @@ -56,9 +56,9 @@ export class TenantsComponent { modalBusy = false; - sortOrder: string = ''; + sortOrder = ''; - sortKey: string = ''; + sortKey = ''; get useSharedDatabase(): boolean { return this.defaultConnectionStringForm.get('useSharedDatabase').value; @@ -218,22 +218,4 @@ export class TenantsComponent { .pipe(finalize(() => (this.loading = false))) .subscribe(); } - - sortByKey(sortKey: string) { - this.sortKey = sortKey; - switch (this.sortOrder) { - case '': - this.sortOrder = 'asc'; - break; - case 'asc': - this.sortOrder = 'desc'; - break; - case 'desc': - this.sortOrder = ''; - this.sortKey = ''; - break; - default: - break; - } - } } diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/sort-order-icon/sort-order-icon.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/sort-order-icon/sort-order-icon.component.ts index 0a71a4b9d7..d42603d3a2 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/sort-order-icon/sort-order-icon.component.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/sort-order-icon/sort-order-icon.component.ts @@ -1,18 +1,37 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, EventEmitter, Input, Output } from '@angular/core'; @Component({ selector: 'abp-sort-order-icon', templateUrl: './sort-order-icon.component.html', }) -export class SortOrderIconComponent implements OnInit { +export class SortOrderIconComponent { + private _order: string; + private _selectedKey: string; + @Input() - selectedKey: string; + set selectedKey(value: string) { + this._selectedKey = value; + this.selectedKeyChange.emit(value); + } + get selectedKey(): string { + return this._selectedKey; + } + + @Output() readonly selectedKeyChange = new EventEmitter(); @Input() key: string; @Input() - order: string; + set order(value: string) { + this._order = value; + this.orderChange.emit(value); + } + get order(): string { + return this._order; + } + + @Output() readonly orderChange = new EventEmitter(); @Input() iconClass: string; @@ -23,7 +42,20 @@ export class SortOrderIconComponent implements OnInit { else return ''; } - constructor() {} - - ngOnInit(): void {} + sort(key: string) { + this.selectedKey = key; + switch (this.order) { + case '': + this.order = 'asc'; + break; + case 'asc': + this.order = 'desc'; + this.orderChange.emit('desc'); + break; + case 'desc': + this.order = ''; + this.selectedKey = ''; + break; + } + } } From 5c29d1f69f9f94f5ecd473a40b0a049ecc51c4eb Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 8 Oct 2019 14:52:13 +0300 Subject: [PATCH 15/15] feat(templates): add setting management module closes #1652 --- .../dev-app/src/app/app-routing.module.ts | 5 ++++ .../apps/dev-app/src/app/app.module.ts | 2 ++ .../setting-management-wrapper.module.ts | 7 +++++ templates/app/angular/package.json | 3 +- .../app/angular/src/app/app-routing.module.ts | 5 ++++ templates/app/angular/src/app/app.module.ts | 2 ++ .../setting-management-wrapper.module.ts | 7 +++++ templates/module/angular/README.md | 28 +------------------ templates/module/angular/package.json | 9 +++--- 9 files changed, 35 insertions(+), 33 deletions(-) create mode 100644 npm/ng-packs/apps/dev-app/src/app/lazy-libs/setting-management-wrapper.module.ts create mode 100644 templates/app/angular/src/app/lazy-libs/setting-management-wrapper.module.ts diff --git a/npm/ng-packs/apps/dev-app/src/app/app-routing.module.ts b/npm/ng-packs/apps/dev-app/src/app/app-routing.module.ts index d6fa06f853..bd2debf0cb 100644 --- a/npm/ng-packs/apps/dev-app/src/app/app-routing.module.ts +++ b/npm/ng-packs/apps/dev-app/src/app/app-routing.module.ts @@ -25,6 +25,11 @@ const routes: Routes = [ loadChildren: () => import('./lazy-libs/tenant-management-wrapper.module').then(m => m.TenantManagementWrapperModule), }, + { + path: 'setting-management', + loadChildren: () => + import('./lazy-libs/setting-management-wrapper.module').then(m => m.SettingManagementWrapperModule), + }, ]; @NgModule({ diff --git a/npm/ng-packs/apps/dev-app/src/app/app.module.ts b/npm/ng-packs/apps/dev-app/src/app/app.module.ts index 14c9a7bb4f..17f75b6471 100644 --- a/npm/ng-packs/apps/dev-app/src/app/app.module.ts +++ b/npm/ng-packs/apps/dev-app/src/app/app.module.ts @@ -14,6 +14,7 @@ import { ThemeSharedModule } from '@abp/ng.theme.shared'; import { AccountConfigModule } from '@abp/ng.account.config'; import { IdentityConfigModule } from '@abp/ng.identity.config'; import { TenantManagementConfigModule } from '@abp/ng.tenant-management.config'; +import { SettingManagementConfigModule } from '@abp/ng.setting-management.config'; @NgModule({ declarations: [AppComponent], @@ -28,6 +29,7 @@ import { TenantManagementConfigModule } from '@abp/ng.tenant-management.config'; AccountConfigModule.forRoot({ redirectUrl: '/' }), IdentityConfigModule, TenantManagementConfigModule, + SettingManagementConfigModule, BrowserModule, BrowserAnimationsModule, AppRoutingModule, diff --git a/npm/ng-packs/apps/dev-app/src/app/lazy-libs/setting-management-wrapper.module.ts b/npm/ng-packs/apps/dev-app/src/app/lazy-libs/setting-management-wrapper.module.ts new file mode 100644 index 0000000000..e5f3db8878 --- /dev/null +++ b/npm/ng-packs/apps/dev-app/src/app/lazy-libs/setting-management-wrapper.module.ts @@ -0,0 +1,7 @@ +import { NgModule } from '@angular/core'; +import { SettingManagementModule } from '@abp/ng.setting-management'; + +@NgModule({ + imports: [SettingManagementModule], +}) +export class SettingManagementWrapperModule {} diff --git a/templates/app/angular/package.json b/templates/app/angular/package.json index 47c4654cd2..6a8fb96d91 100644 --- a/templates/app/angular/package.json +++ b/templates/app/angular/package.json @@ -15,8 +15,9 @@ "dependencies": { "@abp/ng.account": "^0.9.0", "@abp/ng.identity": "^0.9.0", - "@abp/ng.tenant-management": "^0.9.0", "@abp/ng.theme.basic": "^0.9.0", + "@abp/ng.tenant-management": "^0.9.0", + "@abp/ng.setting-management": "^0.9.0", "@angular/animations": "~8.2.8", "@angular/common": "~8.2.8", "@angular/compiler": "~8.2.8", diff --git a/templates/app/angular/src/app/app-routing.module.ts b/templates/app/angular/src/app/app-routing.module.ts index d6fa06f853..bd2debf0cb 100644 --- a/templates/app/angular/src/app/app-routing.module.ts +++ b/templates/app/angular/src/app/app-routing.module.ts @@ -25,6 +25,11 @@ const routes: Routes = [ loadChildren: () => import('./lazy-libs/tenant-management-wrapper.module').then(m => m.TenantManagementWrapperModule), }, + { + path: 'setting-management', + loadChildren: () => + import('./lazy-libs/setting-management-wrapper.module').then(m => m.SettingManagementWrapperModule), + }, ]; @NgModule({ diff --git a/templates/app/angular/src/app/app.module.ts b/templates/app/angular/src/app/app.module.ts index 9c5f3416de..26f3b24e1c 100644 --- a/templates/app/angular/src/app/app.module.ts +++ b/templates/app/angular/src/app/app.module.ts @@ -14,6 +14,7 @@ import { ThemeSharedModule } from '@abp/ng.theme.shared'; import { AccountConfigModule } from '@abp/ng.account.config'; import { IdentityConfigModule } from '@abp/ng.identity.config'; import { TenantManagementConfigModule } from '@abp/ng.tenant-management.config'; +import { SettingManagementConfigModule } from '@abp/ng.setting-management.config'; @NgModule({ declarations: [AppComponent], @@ -30,6 +31,7 @@ import { TenantManagementConfigModule } from '@abp/ng.tenant-management.config'; AccountConfigModule.forRoot({ redirectUrl: '/' }), IdentityConfigModule, TenantManagementConfigModule, + SettingManagementConfigModule, BrowserModule, BrowserAnimationsModule, AppRoutingModule, diff --git a/templates/app/angular/src/app/lazy-libs/setting-management-wrapper.module.ts b/templates/app/angular/src/app/lazy-libs/setting-management-wrapper.module.ts new file mode 100644 index 0000000000..e5f3db8878 --- /dev/null +++ b/templates/app/angular/src/app/lazy-libs/setting-management-wrapper.module.ts @@ -0,0 +1,7 @@ +import { NgModule } from '@angular/core'; +import { SettingManagementModule } from '@abp/ng.setting-management'; + +@NgModule({ + imports: [SettingManagementModule], +}) +export class SettingManagementWrapperModule {} diff --git a/templates/module/angular/README.md b/templates/module/angular/README.md index 787553e60c..04db0abd53 100644 --- a/templates/module/angular/README.md +++ b/templates/module/angular/README.md @@ -1,27 +1 @@ -# MyProjectName - -This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.0.3. - -## Development server - -Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. - -## Code scaffolding - -Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. - -## Build - -Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build. - -## Running unit tests - -Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). - -## Running end-to-end tests - -Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). - -## 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). +# MyProjectName \ No newline at end of file diff --git a/templates/module/angular/package.json b/templates/module/angular/package.json index 37f54f145d..6dc784d0c5 100644 --- a/templates/module/angular/package.json +++ b/templates/module/angular/package.json @@ -5,11 +5,10 @@ "ng": "ng", "start": "ng serve", "start:hmr": "ng serve --configuration hmr", - "build": "ng build", - "build:prod": "ng build --configuration production", - "test": "ng test", - "lint": "ng lint", - "e2e": "ng e2e" + "build": "ng build my-project-name", + "test": "ng test my-project-name", + "lint": "ng lint my-project-name", + "e2e": "ng e2e my-project-name" }, "private": true, "dependencies": {