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 c0825352d1..d675251ac4 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 @@ -233,6 +233,13 @@ namespace Volo.Docs.Pages.Documents.Project } } } + else + { + LatestVersionInfo = new VersionInfoViewModel( + $"{DocsAppConsts.Latest}", + DocsAppConsts.Latest, + true); + } VersionSelectItems = versions.Select(v => new SelectListItem { diff --git a/npm/ng-packs/angular.json b/npm/ng-packs/angular.json index 90a1df64d0..d06f64cd18 100644 --- a/npm/ng-packs/angular.json +++ b/npm/ng-packs/angular.json @@ -75,11 +75,9 @@ } }, "test": { - "builder": "@angular-devkit/build-angular:karma", + "builder": "@angular-builders/jest:run", "options": { - "main": "packages/theme-basic/src/test.ts", - "tsConfig": "packages/theme-basic/tsconfig.spec.json", - "karmaConfig": "packages/theme-basic/karma.conf.js" + "coverage": true } }, "lint": { @@ -135,11 +133,9 @@ } }, "test": { - "builder": "@angular-devkit/build-angular:karma", + "builder": "@angular-builders/jest:run", "options": { - "main": "packages/permission-management/src/test.ts", - "tsConfig": "packages/permission-management/tsconfig.spec.json", - "karmaConfig": "packages/permission-management/karma.conf.js" + "coverage": true } }, "lint": { @@ -168,11 +164,9 @@ } }, "test": { - "builder": "@angular-devkit/build-angular:karma", + "builder": "@angular-builders/jest:run", "options": { - "main": "packages/identity/src/test.ts", - "tsConfig": "packages/identity/tsconfig.spec.json", - "karmaConfig": "packages/identity/karma.conf.js" + "coverage": true } }, "lint": { @@ -198,11 +192,9 @@ } }, "test": { - "builder": "@angular-devkit/build-angular:karma", + "builder": "@angular-builders/jest:run", "options": { - "main": "packages/feature-management/src/test.ts", - "tsConfig": "packages/feature-management/tsconfig.spec.json", - "karmaConfig": "packages/feature-management/karma.conf.js" + "coverage": true } }, "lint": { @@ -231,11 +223,9 @@ } }, "test": { - "builder": "@angular-devkit/build-angular:karma", + "builder": "@angular-builders/jest:run", "options": { - "main": "packages/tenant-management/src/test.ts", - "tsConfig": "packages/tenant-management/tsconfig.spec.json", - "karmaConfig": "packages/tenant-management/karma.conf.js" + "coverage": true } }, "lint": { diff --git a/npm/ng-packs/package.json b/npm/ng-packs/package.json index 99e8eff80a..1ecfd007f2 100644 --- a/npm/ng-packs/package.json +++ b/npm/ng-packs/package.json @@ -50,12 +50,12 @@ "codelyzer": "^5.1.2", "cz-conventional-changelog": "3.0.2", "font-awesome": "^4.7.0", - "husky": "^3.0.7", + "husky": "^3.0.9", "jest": "^24.9.0", "jest-preset-angular": "^7.1.1", "just-clone": "3.1.0", "just-compare": "^1.3.0", - "lint-staged": "^9.4.0", + "lint-staged": "^9.4.2", "ng-packagr": "^5.5.0", "ngx-perfect-scrollbar": "^8.0.0", "ngxs-reset-plugin": "^1.2.0", diff --git a/npm/ng-packs/packages/core/src/lib/tests/ng-model.component.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/ng-model.component.spec.ts new file mode 100644 index 0000000000..3478a5e39d --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/tests/ng-model.component.spec.ts @@ -0,0 +1,77 @@ +import { Component, forwardRef, Input, OnInit } from '@angular/core'; +import { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms'; +import { createHostFactory, SpectatorHost } from '@ngneat/spectator'; +import { AbstractNgModelComponent } from '../abstracts'; + +@Component({ + selector: 'abp-test', + template: '', + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => TestComponent), + multi: true, + }, + ], +}) +export class TestComponent extends AbstractNgModelComponent implements OnInit { + @Input() override: boolean; + + ngOnInit() { + setTimeout(() => { + if (this.override) { + this.value = 'test'; + } + }, 0); + } +} + +describe('AbstractNgModelComponent', () => { + const createHost = createHostFactory({ + component: TestComponent, + declarations: [AbstractNgModelComponent], + imports: [FormsModule], + }); + + it('should pass the value with ngModel', done => { + const spectator = createHost('', { + hostProps: { + val: '1', + }, + }); + + setTimeout(() => { + expect(spectator.component.value).toBe('1'); + done(); + }, 0); + }); + + it('should set the value with ngModel', done => { + const spectator = createHost('', { + hostProps: { + val: '2', + override: true, + }, + }); + + setTimeout(() => { + expect(spectator.hostComponent['val']).toBe('test'); + done(); + }, 0); + }); + + it('should not change value when disable is true', done => { + const spectator = createHost('', { + hostProps: { + val: '2', + }, + }); + + spectator.component['val'] = '3'; + + setTimeout(() => { + expect(spectator.hostComponent['val']).toBe('2'); + done(); + }, 0); + }); +}); diff --git a/npm/ng-packs/packages/feature-management/jest.config.js b/npm/ng-packs/packages/feature-management/jest.config.js new file mode 100644 index 0000000000..febb971892 --- /dev/null +++ b/npm/ng-packs/packages/feature-management/jest.config.js @@ -0,0 +1,7 @@ +const jestConfig = require('../../jest.config'); + +module.exports = { + ...jestConfig, + name: 'feature-management', + 'ts-jest': { allowSyntheticDefaultImports: true }, +}; diff --git a/npm/ng-packs/packages/feature-management/tsconfig.spec.json b/npm/ng-packs/packages/feature-management/tsconfig.spec.json index ebce9b9fdb..54e55c4f05 100644 --- a/npm/ng-packs/packages/feature-management/tsconfig.spec.json +++ b/npm/ng-packs/packages/feature-management/tsconfig.spec.json @@ -1,9 +1,11 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "outDir": "../../out-tsc/spec", - "types": ["node", "jest"] + "emitDecoratorMetadata": true, + "esModuleInterop": true, + "outDir": "../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] }, - "files": [], "include": ["**/*.spec.ts", "**/*.d.ts"] } diff --git a/npm/ng-packs/packages/identity/jest.config.js b/npm/ng-packs/packages/identity/jest.config.js new file mode 100644 index 0000000000..272aeb04c5 --- /dev/null +++ b/npm/ng-packs/packages/identity/jest.config.js @@ -0,0 +1,7 @@ +const jestConfig = require('../../jest.config'); + +module.exports = { + ...jestConfig, + name: 'identity', + 'ts-jest': { allowSyntheticDefaultImports: true }, +}; diff --git a/npm/ng-packs/packages/identity/tsconfig.spec.json b/npm/ng-packs/packages/identity/tsconfig.spec.json index ebce9b9fdb..54e55c4f05 100644 --- a/npm/ng-packs/packages/identity/tsconfig.spec.json +++ b/npm/ng-packs/packages/identity/tsconfig.spec.json @@ -1,9 +1,11 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "outDir": "../../out-tsc/spec", - "types": ["node", "jest"] + "emitDecoratorMetadata": true, + "esModuleInterop": true, + "outDir": "../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] }, - "files": [], "include": ["**/*.spec.ts", "**/*.d.ts"] } diff --git a/npm/ng-packs/packages/permission-management/jest.config.js b/npm/ng-packs/packages/permission-management/jest.config.js new file mode 100644 index 0000000000..89d7bd65f1 --- /dev/null +++ b/npm/ng-packs/packages/permission-management/jest.config.js @@ -0,0 +1,7 @@ +const jestConfig = require('../../jest.config'); + +module.exports = { + ...jestConfig, + name: 'permission-management', + 'ts-jest': { allowSyntheticDefaultImports: true }, +}; diff --git a/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts b/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts index c968df1e3d..7419acc013 100644 --- a/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts +++ b/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts @@ -7,7 +7,7 @@ import { Output, Renderer2, SimpleChanges, - TrackByFunction + TrackByFunction, } from '@angular/core'; import { Select, Store } from '@ngxs/store'; import { from, Observable } from 'rxjs'; @@ -22,7 +22,7 @@ type PermissionWithMargin = PermissionManagement.Permission & { @Component({ selector: 'abp-permission-management', - templateUrl: './permission-management.component.html' + templateUrl: './permission-management.component.html', }) export class PermissionManagementComponent implements OnInit, OnChanges { @Input() @@ -54,7 +54,7 @@ export class PermissionManagementComponent implements OnInit, OnChanges { @Select(PermissionManagementState.getPermissionGroups) groups$: Observable; - @Select(PermissionManagementState.getEntitiyDisplayName) + @Select(PermissionManagementState.getEntityDisplayName) entityName$: Observable; selectedGroup: PermissionManagement.Group; @@ -72,7 +72,7 @@ export class PermissionManagementComponent implements OnInit, OnChanges { get selectedGroupPermissions$(): Observable { return this.groups$.pipe( map(groups => - this.selectedGroup ? groups.find(group => group.name === this.selectedGroup.name).permissions : [] + this.selectedGroup ? groups.find(group => group.name === this.selectedGroup.name).permissions : [], ), map(permissions => permissions.map( @@ -80,10 +80,10 @@ export class PermissionManagementComponent implements OnInit, OnChanges { (({ ...permission, margin: findMargin(permissions, permission), - isGranted: this.permissions.find(per => per.name === permission.name).isGranted - } as any) as PermissionWithMargin) - ) - ) + isGranted: this.permissions.find(per => per.name === permission.name).isGranted, + } as any) as PermissionWithMargin), + ), + ), ); } @@ -165,7 +165,7 @@ export class PermissionManagementComponent implements OnInit, OnChanges { this.permissions = [ ...this.permissions.slice(0, index), { ...this.permissions[index], isGranted: !this.selectThisTab }, - ...this.permissions.slice(index + 1) + ...this.permissions.slice(index + 1), ]; }); }); @@ -176,7 +176,7 @@ export class PermissionManagementComponent implements OnInit, OnChanges { onClickSelectAll() { this.permissions = this.permissions.map(permission => ({ ...permission, - isGranted: !this.selectAllTab + isGranted: !this.selectAllTab, })); this.selectThisTab = !this.selectAllTab; @@ -190,12 +190,12 @@ export class PermissionManagementComponent implements OnInit, OnChanges { submit() { this.modalBusy = true; const unchangedPermissions = getPermissions( - this.store.selectSnapshot(PermissionManagementState.getPermissionGroups) + this.store.selectSnapshot(PermissionManagementState.getPermissionGroups), ); const changedPermissions: PermissionManagement.MinimumPermission[] = this.permissions .filter(per => - unchangedPermissions.find(unchanged => unchanged.name === per.name).isGranted === per.isGranted ? false : true + unchangedPermissions.find(unchanged => unchanged.name === per.name).isGranted === per.isGranted ? false : true, ) .map(({ name, isGranted }) => ({ name, isGranted })); @@ -205,8 +205,8 @@ export class PermissionManagementComponent implements OnInit, OnChanges { new UpdatePermissions({ providerKey: this.providerKey, providerName: this.providerName, - permissions: changedPermissions - }) + permissions: changedPermissions, + }), ) .subscribe(() => { this.modalBusy = false; @@ -227,8 +227,8 @@ export class PermissionManagementComponent implements OnInit, OnChanges { .dispatch( new GetPermissions({ providerKey: this.providerKey, - providerName: this.providerName - }) + providerName: this.providerName, + }), ) .pipe(pluck('PermissionManagementState', 'permissionRes')) .subscribe((permissionRes: PermissionManagement.Response) => { diff --git a/npm/ng-packs/packages/permission-management/src/lib/services/permission-management-state.service.ts b/npm/ng-packs/packages/permission-management/src/lib/services/permission-management-state.service.ts index 431b7be19f..a85d637c87 100644 --- a/npm/ng-packs/packages/permission-management/src/lib/services/permission-management-state.service.ts +++ b/npm/ng-packs/packages/permission-management/src/lib/services/permission-management-state.service.ts @@ -12,6 +12,6 @@ export class PermissionManagementStateService { return this.store.selectSnapshot(PermissionManagementState.getPermissionGroups); } getEntityDisplayName() { - return this.store.selectSnapshot(PermissionManagementState.getPermissionGroups); + return this.store.selectSnapshot(PermissionManagementState.getEntityDisplayName); } } diff --git a/npm/ng-packs/packages/permission-management/src/lib/states/permission-management.state.ts b/npm/ng-packs/packages/permission-management/src/lib/states/permission-management.state.ts index 2da786b063..671c9f5cf3 100644 --- a/npm/ng-packs/packages/permission-management/src/lib/states/permission-management.state.ts +++ b/npm/ng-packs/packages/permission-management/src/lib/states/permission-management.state.ts @@ -15,7 +15,7 @@ export class PermissionManagementState { } @Selector() - static getEntitiyDisplayName({ permissionRes }: PermissionManagement.State): string { + static getEntityDisplayName({ permissionRes }: PermissionManagement.State): string { return permissionRes.entityDisplayName; } diff --git a/npm/ng-packs/packages/permission-management/tsconfig.spec.json b/npm/ng-packs/packages/permission-management/tsconfig.spec.json index ebce9b9fdb..54e55c4f05 100644 --- a/npm/ng-packs/packages/permission-management/tsconfig.spec.json +++ b/npm/ng-packs/packages/permission-management/tsconfig.spec.json @@ -1,9 +1,11 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "outDir": "../../out-tsc/spec", - "types": ["node", "jest"] + "emitDecoratorMetadata": true, + "esModuleInterop": true, + "outDir": "../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] }, - "files": [], "include": ["**/*.spec.ts", "**/*.d.ts"] } 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 209c6741b1..bc1dc78da3 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 @@ -12,6 +12,7 @@ export class SettingManagementConfigService { name: 'AbpSettingManagement::Settings', path: 'setting-management', parentName: 'AbpUiNavigation::Menu:Administration', + requiredPolicy: 'AbpAccount.SettingManagement', layout: eLayoutType.application, order: 6, iconClass: 'fa fa-cog', diff --git a/npm/ng-packs/packages/setting-management/src/lib/setting-management-routing.module.ts b/npm/ng-packs/packages/setting-management/src/lib/setting-management-routing.module.ts index d1cb780777..c3eb479d2d 100644 --- a/npm/ng-packs/packages/setting-management/src/lib/setting-management-routing.module.ts +++ b/npm/ng-packs/packages/setting-management/src/lib/setting-management-routing.module.ts @@ -7,7 +7,9 @@ const routes: Routes = [ { path: '', component: DynamicLayoutComponent, - children: [{ path: '', component: SettingManagementComponent }], + children: [ + { path: '', component: SettingManagementComponent, data: { requiredPolicy: 'AbpAccount.SettingManagement' } }, + ], }, ]; diff --git a/npm/ng-packs/packages/tenant-management/jest.config.js b/npm/ng-packs/packages/tenant-management/jest.config.js new file mode 100644 index 0000000000..5daf04ea93 --- /dev/null +++ b/npm/ng-packs/packages/tenant-management/jest.config.js @@ -0,0 +1,7 @@ +const jestConfig = require('../../jest.config'); + +module.exports = { + ...jestConfig, + name: 'tenant-management', + 'ts-jest': { allowSyntheticDefaultImports: true }, +}; diff --git a/npm/ng-packs/packages/tenant-management/src/lib/services/tenant-management-state.service.ts b/npm/ng-packs/packages/tenant-management/src/lib/services/tenant-management-state.service.ts index 1b3200f155..442289a66f 100644 --- a/npm/ng-packs/packages/tenant-management/src/lib/services/tenant-management-state.service.ts +++ b/npm/ng-packs/packages/tenant-management/src/lib/services/tenant-management-state.service.ts @@ -8,7 +8,7 @@ import { TenantManagementState } from '../states/tenant-management.state'; export class TenantManagementStateService { constructor(private store: Store) {} - getTenants() { + get() { return this.store.selectSnapshot(TenantManagementState.get); } diff --git a/npm/ng-packs/packages/tenant-management/tsconfig.spec.json b/npm/ng-packs/packages/tenant-management/tsconfig.spec.json index ebce9b9fdb..54e55c4f05 100644 --- a/npm/ng-packs/packages/tenant-management/tsconfig.spec.json +++ b/npm/ng-packs/packages/tenant-management/tsconfig.spec.json @@ -1,9 +1,11 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "outDir": "../../out-tsc/spec", - "types": ["node", "jest"] + "emitDecoratorMetadata": true, + "esModuleInterop": true, + "outDir": "../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] }, - "files": [], "include": ["**/*.spec.ts", "**/*.d.ts"] } diff --git a/npm/ng-packs/packages/theme-basic/jest.config.js b/npm/ng-packs/packages/theme-basic/jest.config.js new file mode 100644 index 0000000000..ffb4ca0be6 --- /dev/null +++ b/npm/ng-packs/packages/theme-basic/jest.config.js @@ -0,0 +1,7 @@ +const jestConfig = require('../../jest.config'); + +module.exports = { + ...jestConfig, + name: 'theme-basic', + 'ts-jest': { allowSyntheticDefaultImports: true }, +}; diff --git a/npm/ng-packs/packages/theme-basic/src/lib/components/application-layout/application-layout.component.html b/npm/ng-packs/packages/theme-basic/src/lib/components/application-layout/application-layout.component.html index 12b68c98c9..82d561c83a 100644 --- a/npm/ng-packs/packages/theme-basic/src/lib/components/application-layout/application-layout.component.html +++ b/npm/ng-packs/packages/theme-basic/src/lib/components/application-layout/application-layout.component.html @@ -15,10 +15,10 @@ > -