From d839655149958b74b89e678a329e68567dc8e506 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yasin=20Ayd=C4=B1n?= Date: Mon, 21 Oct 2019 10:58:58 +0300 Subject: [PATCH] Feature/state services (#1945) * feat(core): add profile-state service * feat(core): add session-state service * feat(feature-management): add feature-management-state service * feat(identity): add identity-state service * feat(permission-management): add permission-management-state service * feat(tenant-management): add tenant-management-state service * feat(theme-basic): add layout-state service * style: change vscode color settings * test(core): add config-state service test * test(core): add profile-state, session-state service tests * test(feature-management): add feature-management-state service test * test(identity): add identity-state service test * test(permission-management): add permission-management-state service test * test(tenant-management): add tenant-management-state service test * test(theme-basic): add layout-state service test * fix(core): change decorator parameters * fix(core): add missing service methods --- npm/ng-packs/.vscode/settings.json | 16 +++--- .../src/lib/services/config-state.service.ts | 36 ++++++++++--- .../src/lib/services/session-state.service.ts | 4 +- .../core/src/lib/states/config.state.ts | 52 ------------------- .../core/src/lib/states/profile.state.ts | 6 +-- .../core/src/lib/states/session.state.ts | 6 +-- .../lib/tests/config-state.service.spec.ts | 21 ++++++++ .../lib/tests/profile-state.service.spec.ts | 21 ++++++++ .../lib/tests/session-state.service.spec.ts | 21 ++++++++ .../feature-management-state.service.spec.ts | 22 ++++++++ .../lib/tests/identity-state.service.spec.ts | 21 ++++++++ ...ermission-management-state.service.spec.ts | 21 ++++++++ .../tenant-management-state.service.spec.ts | 21 ++++++++ .../lib/tests/layout-state.service.spec.ts | 21 ++++++++ 14 files changed, 216 insertions(+), 73 deletions(-) create mode 100644 npm/ng-packs/packages/core/src/lib/tests/config-state.service.spec.ts create mode 100644 npm/ng-packs/packages/core/src/lib/tests/profile-state.service.spec.ts create mode 100644 npm/ng-packs/packages/core/src/lib/tests/session-state.service.spec.ts create mode 100644 npm/ng-packs/packages/feature-management/src/lib/tests/feature-management-state.service.spec.ts create mode 100644 npm/ng-packs/packages/identity/src/lib/tests/identity-state.service.spec.ts create mode 100644 npm/ng-packs/packages/permission-management/src/lib/tests/permission-management-state.service.spec.ts create mode 100644 npm/ng-packs/packages/tenant-management/src/lib/tests/tenant-management-state.service.spec.ts create mode 100644 npm/ng-packs/packages/theme-basic/src/lib/tests/layout-state.service.spec.ts diff --git a/npm/ng-packs/.vscode/settings.json b/npm/ng-packs/.vscode/settings.json index 0e7b4b1be1..47b4042ef7 100644 --- a/npm/ng-packs/.vscode/settings.json +++ b/npm/ng-packs/.vscode/settings.json @@ -5,18 +5,18 @@ "tslint.rulesDirectory": "../node_modules/codelyzer", "typescript.tsdk": "../node_modules/typescript/lib", "workbench.colorCustomizations": { - "activityBar.background": "#90164b", + "activityBar.background": "#258ecd", "activityBar.foreground": "#e7e7e7", "activityBar.inactiveForeground": "#e7e7e799", - "activityBarBadge.background": "#0e1c04", - "activityBarBadge.foreground": "#e7e7e7", - "titleBar.activeBackground": "#640f34", - "titleBar.inactiveBackground": "#640f3499", + "activityBarBadge.background": "#f0aed7", + "activityBarBadge.foreground": "#15202b", + "titleBar.activeBackground": "#1d70a2", + "titleBar.inactiveBackground": "#1d70a299", "titleBar.activeForeground": "#e7e7e7", "titleBar.inactiveForeground": "#e7e7e799", - "statusBar.background": "#640f34", - "statusBarItem.hoverBackground": "#90164b", + "statusBar.background": "#1d70a2", + "statusBarItem.hoverBackground": "#258ecd", "statusBar.foreground": "#e7e7e7" }, - "peacock.color": "#640f34" + "peacock.color": "#1D70A2" } diff --git a/npm/ng-packs/packages/core/src/lib/services/config-state.service.ts b/npm/ng-packs/packages/core/src/lib/services/config-state.service.ts index 0efa55c179..d238fd4734 100644 --- a/npm/ng-packs/packages/core/src/lib/services/config-state.service.ts +++ b/npm/ng-packs/packages/core/src/lib/services/config-state.service.ts @@ -12,15 +12,39 @@ export class ConfigStateService { return this.store.selectSnapshot(ConfigState.getAll); } - getOne(key: string) { - return this.store.selectSnapshot(ConfigState.getOne(key)); + getApplicationInfo() { + return this.store.selectSnapshot(ConfigState.getApplicationInfo); } - getDeep(keys: string[] | string) { - return this.store.selectSnapshot(ConfigState.getDeep(keys)); + getOne(...args: Parameters) { + return this.store.selectSnapshot(ConfigState.getOne(...args)); } - getSetting(key: string) { - return this.store.selectSnapshot(ConfigState.getSetting(key)); + getDeep(...args: Parameters) { + return this.store.selectSnapshot(ConfigState.getDeep(...args)); + } + + getRoute(...args: Parameters) { + return this.store.selectSnapshot(ConfigState.getRoute(...args)); + } + + getApiUrl(...args: Parameters) { + return this.store.selectSnapshot(ConfigState.getApiUrl(...args)); + } + + getSetting(...args: Parameters) { + return this.store.selectSnapshot(ConfigState.getSetting(...args)); + } + + getSettings(...args: Parameters) { + return this.store.selectSnapshot(ConfigState.getSettings(...args)); + } + + getGrantedPolicy(...args: Parameters) { + return this.store.selectSnapshot(ConfigState.getGrantedPolicy(...args)); + } + + getLocalization(...args: Parameters) { + return this.store.selectSnapshot(ConfigState.getLocalization(...args)); } } diff --git a/npm/ng-packs/packages/core/src/lib/services/session-state.service.ts b/npm/ng-packs/packages/core/src/lib/services/session-state.service.ts index 03076e2eeb..b74a8ed397 100644 --- a/npm/ng-packs/packages/core/src/lib/services/session-state.service.ts +++ b/npm/ng-packs/packages/core/src/lib/services/session-state.service.ts @@ -2,7 +2,9 @@ import { Injectable } from '@angular/core'; import { Store } from '@ngxs/store'; import { SessionState } from '../states'; -@Injectable() +@Injectable({ + providedIn: 'root', +}) export class SessionStateService { constructor(private store: Store) {} 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 affa63892d..381dc3e0f6 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 @@ -130,58 +130,6 @@ export class ConfigState { return selector; } - /** - * - * @deprecated, Use getLocalization instead. To be delete in v1 - */ - static getCopy(key: string, ...interpolateParams: string[]) { - if (!key) key = ''; - - const keys = key.split('::') as string[]; - const selector = createSelector( - [ConfigState], - (state: Config.State) => { - if (!state.localization) return key; - - const { defaultResourceName } = state.environment.localization; - if (keys[0] === '') { - if (!defaultResourceName) { - throw new Error( - `Please check your environment. May you forget set defaultResourceName? - Here is the example: - { production: false, - localization: { - defaultResourceName: 'MyProjectName' - } - }`, - ); - } - - keys[0] = snq(() => defaultResourceName); - } - - let copy = (keys as any).reduce((acc, val) => { - if (acc) { - return acc[val]; - } - - return undefined; - }, state.localization.values); - - interpolateParams = interpolateParams.filter(params => params != null); - if (copy && interpolateParams && interpolateParams.length) { - interpolateParams.forEach(param => { - copy = copy.replace(/[\'\"]?\{[\d]+\}[\'\"]?/, param); - }); - } - - return copy || key; - }, - ); - - return selector; - } - static getLocalization(key: string | Config.LocalizationWithDefault, ...interpolateParams: string[]) { let defaultValue: string; diff --git a/npm/ng-packs/packages/core/src/lib/states/profile.state.ts b/npm/ng-packs/packages/core/src/lib/states/profile.state.ts index c19b120e1b..47e0506f2e 100644 --- a/npm/ng-packs/packages/core/src/lib/states/profile.state.ts +++ b/npm/ng-packs/packages/core/src/lib/states/profile.state.ts @@ -1,8 +1,8 @@ -import { State, Action, StateContext, Selector } from '@ngxs/store'; -import { GetProfile, ChangePassword, UpdateProfile } from '../actions/profile.actions'; +import { Action, Selector, State, StateContext } from '@ngxs/store'; +import { tap } from 'rxjs/operators'; +import { ChangePassword, GetProfile, UpdateProfile } from '../actions/profile.actions'; import { Profile } from '../models/profile'; import { ProfileService } from '../services/profile.service'; -import { tap } from 'rxjs/operators'; @State({ name: 'ProfileState', diff --git a/npm/ng-packs/packages/core/src/lib/states/session.state.ts b/npm/ng-packs/packages/core/src/lib/states/session.state.ts index 9f90e0ded9..06372c8e7d 100644 --- a/npm/ng-packs/packages/core/src/lib/states/session.state.ts +++ b/npm/ng-packs/packages/core/src/lib/states/session.state.ts @@ -1,10 +1,10 @@ import { Action, Selector, State, StateContext } from '@ngxs/store'; +import { from } from 'rxjs'; +import { switchMap } from 'rxjs/operators'; +import { GetAppConfiguration } from '../actions/config.actions'; import { SetLanguage, SetTenant } from '../actions/session.actions'; import { ABP, Session } from '../models'; -import { GetAppConfiguration } from '../actions/config.actions'; import { LocalizationService } from '../services/localization.service'; -import { from, combineLatest } from 'rxjs'; -import { switchMap } from 'rxjs/operators'; @State({ name: 'SessionState', diff --git a/npm/ng-packs/packages/core/src/lib/tests/config-state.service.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/config-state.service.spec.ts new file mode 100644 index 0000000000..d7bae11a51 --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/tests/config-state.service.spec.ts @@ -0,0 +1,21 @@ +import { createServiceFactory, SpectatorService } from '@ngneat/spectator/jest'; +import { ConfigStateService } from '../services/config-state.service'; +import { ConfigState } from '../states'; +import { Store } from '@ngxs/store'; +describe('ConfigStateService', () => { + let service: ConfigStateService; + let spectator: SpectatorService; + const createService = createServiceFactory({ service: ConfigStateService, mocks: [Store] }); + beforeEach(() => { + spectator = createService(); + service = spectator.service; + }); + test('should have the all ConfigState static methods', () => { + const reg = /(?<=static )(.*)(?=\()/gm; + ConfigState.toString() + .match(reg) + .forEach(fnName => { + expect(service[fnName]).toBeTruthy(); + }); + }); +}); diff --git a/npm/ng-packs/packages/core/src/lib/tests/profile-state.service.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/profile-state.service.spec.ts new file mode 100644 index 0000000000..4cd7016aca --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/tests/profile-state.service.spec.ts @@ -0,0 +1,21 @@ +import { createServiceFactory, SpectatorService } from '@ngneat/spectator/jest'; +import { ProfileStateService } from '../services/profile-state.service'; +import { ProfileState } from '../states/profile.state'; +import { Store } from '@ngxs/store'; +describe('ProfileStateService', () => { + let service: ProfileStateService; + let spectator: SpectatorService; + const createService = createServiceFactory({ service: ProfileStateService, mocks: [Store] }); + beforeEach(() => { + spectator = createService(); + service = spectator.service; + }); + test('should have the all ProfileState static methods', () => { + const reg = /(?<=static )(.*)(?=\()/gm; + ProfileState.toString() + .match(reg) + .forEach(fnName => { + expect(service[fnName]).toBeTruthy(); + }); + }); +}); diff --git a/npm/ng-packs/packages/core/src/lib/tests/session-state.service.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/session-state.service.spec.ts new file mode 100644 index 0000000000..aa76e9fccf --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/tests/session-state.service.spec.ts @@ -0,0 +1,21 @@ +import { createServiceFactory, SpectatorService } from '@ngneat/spectator/jest'; +import { SessionStateService } from '../services/session-state.service'; +import { SessionState } from '../states/session.state'; +import { Store } from '@ngxs/store'; +describe('SessionStateService', () => { + let service: SessionStateService; + let spectator: SpectatorService; + const createService = createServiceFactory({ service: SessionStateService, mocks: [Store] }); + beforeEach(() => { + spectator = createService(); + service = spectator.service; + }); + test('should have the all SessionState static methods', () => { + const reg = /(?<=static )(.*)(?=\()/gm; + SessionState.toString() + .match(reg) + .forEach(fnName => { + expect(service[fnName]).toBeTruthy(); + }); + }); +}); diff --git a/npm/ng-packs/packages/feature-management/src/lib/tests/feature-management-state.service.spec.ts b/npm/ng-packs/packages/feature-management/src/lib/tests/feature-management-state.service.spec.ts new file mode 100644 index 0000000000..0463fccf8f --- /dev/null +++ b/npm/ng-packs/packages/feature-management/src/lib/tests/feature-management-state.service.spec.ts @@ -0,0 +1,22 @@ +import { createServiceFactory, SpectatorService } from '@ngneat/spectator/jest'; +import { Store } from '@ngxs/store'; +import { FeatureManagementStateService } from '../services/feature-management-state.service'; +import { FeatureManagementState } from '../states'; + +describe('FeatureManagementStateService', () => { + let service: FeatureManagementStateService; + let spectator: SpectatorService; + const createService = createServiceFactory({ service: FeatureManagementStateService, mocks: [Store] }); + beforeEach(() => { + spectator = createService(); + service = spectator.service; + }); + test('should have the all FeatureManagementState static methods', () => { + const reg = /(?<=static )(.*)(?=\()/gm; + FeatureManagementState.toString() + .match(reg) + .forEach(fnName => { + expect(service[fnName]).toBeTruthy(); + }); + }); +}); diff --git a/npm/ng-packs/packages/identity/src/lib/tests/identity-state.service.spec.ts b/npm/ng-packs/packages/identity/src/lib/tests/identity-state.service.spec.ts new file mode 100644 index 0000000000..393aaeabf5 --- /dev/null +++ b/npm/ng-packs/packages/identity/src/lib/tests/identity-state.service.spec.ts @@ -0,0 +1,21 @@ +import { createServiceFactory, SpectatorService } from '@ngneat/spectator/jest'; +import { IdentityStateService } from '../services/identity-state.service'; +import { IdentityState } from '../states/identity.state'; +import { Store } from '@ngxs/store'; +describe('IdentityStateService', () => { + let service: IdentityStateService; + let spectator: SpectatorService; + const createService = createServiceFactory({ service: IdentityStateService, mocks: [Store] }); + beforeEach(() => { + spectator = createService(); + service = spectator.service; + }); + test('should have the all IdentityState static methods', () => { + const reg = /(?<=static )(.*)(?=\()/gm; + IdentityState.toString() + .match(reg) + .forEach(fnName => { + expect(service[fnName]).toBeTruthy(); + }); + }); +}); diff --git a/npm/ng-packs/packages/permission-management/src/lib/tests/permission-management-state.service.spec.ts b/npm/ng-packs/packages/permission-management/src/lib/tests/permission-management-state.service.spec.ts new file mode 100644 index 0000000000..190e670b8e --- /dev/null +++ b/npm/ng-packs/packages/permission-management/src/lib/tests/permission-management-state.service.spec.ts @@ -0,0 +1,21 @@ +import { createServiceFactory, SpectatorService } from '@ngneat/spectator/jest'; +import { PermissionManagementStateService } from '../services/permission-management-state.service'; +import { PermissionManagementState } from '../states/permission-management.state'; +import { Store } from '@ngxs/store'; +describe('PermissionManagementStateService', () => { + let service: PermissionManagementStateService; + let spectator: SpectatorService; + const createService = createServiceFactory({ service: PermissionManagementStateService, mocks: [Store] }); + beforeEach(() => { + spectator = createService(); + service = spectator.service; + }); + test('should have the all PermissionManagementState static methods', () => { + const reg = /(?<=static )(.*)(?=\()/gm; + PermissionManagementState.toString() + .match(reg) + .forEach(fnName => { + expect(service[fnName]).toBeTruthy(); + }); + }); +}); diff --git a/npm/ng-packs/packages/tenant-management/src/lib/tests/tenant-management-state.service.spec.ts b/npm/ng-packs/packages/tenant-management/src/lib/tests/tenant-management-state.service.spec.ts new file mode 100644 index 0000000000..1b45597075 --- /dev/null +++ b/npm/ng-packs/packages/tenant-management/src/lib/tests/tenant-management-state.service.spec.ts @@ -0,0 +1,21 @@ +import { createServiceFactory, SpectatorService } from '@ngneat/spectator/jest'; +import { TenantManagementStateService } from '../services/tenant-management-state.service'; +import { TenantManagementState } from '../states/tenant-management.state'; +import { Store } from '@ngxs/store'; +describe('TenantManagementStateService', () => { + let service: TenantManagementStateService; + let spectator: SpectatorService; + const createService = createServiceFactory({ service: TenantManagementStateService, mocks: [Store] }); + beforeEach(() => { + spectator = createService(); + service = spectator.service; + }); + test('should have the all TenantManagementState static methods', () => { + const reg = /(?<=static )(.*)(?=\()/gm; + TenantManagementState.toString() + .match(reg) + .forEach(fnName => { + expect(service[fnName]).toBeTruthy(); + }); + }); +}); diff --git a/npm/ng-packs/packages/theme-basic/src/lib/tests/layout-state.service.spec.ts b/npm/ng-packs/packages/theme-basic/src/lib/tests/layout-state.service.spec.ts new file mode 100644 index 0000000000..ccdb512c65 --- /dev/null +++ b/npm/ng-packs/packages/theme-basic/src/lib/tests/layout-state.service.spec.ts @@ -0,0 +1,21 @@ +import { createServiceFactory, SpectatorService } from '@ngneat/spectator/jest'; +import { LayoutStateService } from '../services/layout-state.service'; +import { LayoutState } from '../states/layout.state'; +import { Store } from '@ngxs/store'; +describe('LayoutStateService', () => { + let service: LayoutStateService; + let spectator: SpectatorService; + const createService = createServiceFactory({ service: LayoutStateService, mocks: [Store] }); + beforeEach(() => { + spectator = createService(); + service = spectator.service; + }); + test('should have the all LayoutState static methods', () => { + const reg = /(?<=static )(.*)(?=\()/gm; + LayoutState.toString() + .match(reg) + .forEach(fnName => { + expect(service[fnName]).toBeTruthy(); + }); + }); +});