diff --git a/npm/ng-packs/packages/core/src/lib/actions/index.ts b/npm/ng-packs/packages/core/src/lib/actions/index.ts index cf05aac81d..46269fd60a 100644 --- a/npm/ng-packs/packages/core/src/lib/actions/index.ts +++ b/npm/ng-packs/packages/core/src/lib/actions/index.ts @@ -1,5 +1,6 @@ export * from './config.actions'; export * from './loader.actions'; export * from './profile.actions'; +export * from './replaceable-components.actions'; export * from './rest.actions'; -export * from './session.actions'; +export * from './session.actions'; \ No newline at end of file diff --git a/npm/ng-packs/packages/core/src/lib/actions/replaceable-components.actions.ts b/npm/ng-packs/packages/core/src/lib/actions/replaceable-components.actions.ts new file mode 100644 index 0000000000..b5f6480b2a --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/actions/replaceable-components.actions.ts @@ -0,0 +1,6 @@ +import { ReplaceableComponents } from '../models/replaceable-components'; + +export class AddReplaceableComponent { + static readonly type = '[ReplaceableComponents] Add'; + constructor(public payload: ReplaceableComponents.Data | ReplaceableComponents.Data[]) {} +} 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 d53f90da13..983fad2125 100644 --- a/npm/ng-packs/packages/core/src/lib/core.module.ts +++ b/npm/ng-packs/packages/core/src/lib/core.module.ts @@ -30,10 +30,11 @@ import { SessionState } from './states/session.state'; import { getInitialData, localeInitializer } from './utils/initial-utils'; import './utils/date-extensions'; import { ReplaceableRouteContainerComponent } from './components/replaceable-route-container.component'; +import { ReplaceableComponentsState } from './states/replaceable-components.state'; @NgModule({ imports: [ - NgxsModule.forFeature([ProfileState, SessionState, ConfigState]), + NgxsModule.forFeature([ReplaceableComponentsState, ProfileState, SessionState, ConfigState]), NgxsRouterPluginModule.forRoot(), NgxsStoragePluginModule.forRoot({ key: ['SessionState'] }), OAuthModule.forRoot(), diff --git a/npm/ng-packs/packages/core/src/lib/models/index.ts b/npm/ng-packs/packages/core/src/lib/models/index.ts index 63302c9ab8..213218d811 100644 --- a/npm/ng-packs/packages/core/src/lib/models/index.ts +++ b/npm/ng-packs/packages/core/src/lib/models/index.ts @@ -1,6 +1,7 @@ export * from './application-configuration'; export * from './common'; export * from './config'; -export * from './rest'; -export * from './session'; export * from './profile'; +export * from './replaceable-components'; +export * from './rest'; +export * from './session'; \ No newline at end of file diff --git a/npm/ng-packs/packages/core/src/lib/models/replaceable-components.ts b/npm/ng-packs/packages/core/src/lib/models/replaceable-components.ts new file mode 100644 index 0000000000..8f46faf01e --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/models/replaceable-components.ts @@ -0,0 +1,12 @@ +import { Type } from '@angular/core'; + +export namespace ReplaceableComponents { + export interface State { + replaceableComponents: Data[]; + } + + export interface Data { + component: Type; + key: string; + } +} diff --git a/npm/ng-packs/packages/core/src/lib/states/index.ts b/npm/ng-packs/packages/core/src/lib/states/index.ts index b7626c2842..d70de13d43 100644 --- a/npm/ng-packs/packages/core/src/lib/states/index.ts +++ b/npm/ng-packs/packages/core/src/lib/states/index.ts @@ -1,3 +1,4 @@ -export * from './profile.state'; +export * from "./replaceable-components.state"; export * from './config.state'; -export * from './session.state'; +export * from './profile.state'; +export * from './session.state'; \ No newline at end of file diff --git a/npm/ng-packs/packages/core/src/lib/states/replaceable-components.state.ts b/npm/ng-packs/packages/core/src/lib/states/replaceable-components.state.ts new file mode 100644 index 0000000000..7391f79ec2 --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/states/replaceable-components.state.ts @@ -0,0 +1,44 @@ +import { State, Action, StateContext, Selector, createSelector } from '@ngxs/store'; +import { AddReplaceableComponent } from '../actions/replaceable-components.actions'; +import { ReplaceableComponents } from '../models/replaceable-components'; +import snq from 'snq'; + +@State({ + name: 'ReplaceableComponentsState', + defaults: { replaceableComponents: [] } as ReplaceableComponents.State, +}) +export class ReplaceableComponentsState { + @Selector() + static getAll({ + replaceableComponents, + }: ReplaceableComponents.State): ReplaceableComponents.Data[] { + return replaceableComponents || []; + } + + static getOne(key: string) { + const selector = createSelector( + [ReplaceableComponentsState], + ({ replaceableComponents }: ReplaceableComponents.State) => { + return snq(() => replaceableComponents.find(component => component.key === key)); + }, + ); + + return selector; + } + + @Action(AddReplaceableComponent) + replaceableComponentsAction( + { getState, patchState }: StateContext, + { payload }: AddReplaceableComponent, + ) { + if (!Array.isArray(payload)) { + payload = [payload]; + } + + const { replaceableComponents } = getState(); + + patchState({ + replaceableComponents: [...replaceableComponents, ...payload], + }); + } +}