diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/abstract-actions/abstract-actions.component.ts b/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/abstract-actions/abstract-actions.component.ts index 6f24273812..285e3fd00a 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/abstract-actions/abstract-actions.component.ts +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/abstract-actions/abstract-actions.component.ts @@ -2,6 +2,7 @@ import { Directive, Injector, Input } from '@angular/core'; import { ActionData, ActionList } from '../../models/actions'; import { ExtensionsService } from '../../services/extensions.service'; import { EXTENSIONS_ACTION_TYPE, EXTENSIONS_IDENTIFIER } from '../../tokens/extensions.token'; +import { InferredData, InferredRecord } from '../../models/toolbar-actions'; // Fix for https://github.com/angular/angular/issues/23904 // @dynamic @@ -25,6 +26,3 @@ export abstract class AbstractActionsComponent> extend this.actionList = extensions[type].get(name).actions as unknown as L; } } - -type InferredData = ActionData>; -type InferredRecord = L extends ActionList ? R : never; diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/page-toolbar/page-toolbar.component.html b/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/page-toolbar/page-toolbar.component.html index e012030bc0..80cb4f2e60 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/page-toolbar/page-toolbar.component.html +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/page-toolbar/page-toolbar.component.html @@ -8,7 +8,7 @@ diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/page-toolbar/page-toolbar.component.ts b/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/page-toolbar/page-toolbar.component.ts index c46a459f6f..8015aaa84f 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/page-toolbar/page-toolbar.component.ts +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/page-toolbar/page-toolbar.component.ts @@ -1,18 +1,10 @@ +import { ChangeDetectionStrategy, Component, Injector, TrackByFunction } from '@angular/core'; import { - ChangeDetectionStrategy, - Component, - InjectFlags, - InjectionToken, - Injector, - TrackByFunction, - Type, -} from '@angular/core'; -import { ToolbarActionList, ToolbarComponent } from '../../models/toolbar-actions'; -import { - EXTENSIONS_ACTION_CALLBACK, - EXTENSIONS_ACTION_DATA, - EXTENSIONS_ACTION_TYPE, -} from '../../tokens/extensions.token'; + HasCreateInjectorPipe, + ToolbarActionList, + ToolbarComponent, +} from '../../models/toolbar-actions'; +import { EXTENSIONS_ACTION_TYPE } from '../../tokens/extensions.token'; import { AbstractActionsComponent } from '../abstract-actions/abstract-actions.component'; @Component({ @@ -27,24 +19,17 @@ import { AbstractActionsComponent } from '../abstract-actions/abstract-actions.c ], changeDetection: ChangeDetectionStrategy.OnPush, }) -export class PageToolbarComponent extends AbstractActionsComponent> { +export class PageToolbarComponent + extends AbstractActionsComponent> + implements HasCreateInjectorPipe +{ defaultBtnClass = 'btn btn-sm btn-primary'; + + getData = () => this.data; + readonly trackByFn: TrackByFunction> = (_, item) => item.action || item.component; - - constructor(private readonly injector: Injector) { + constructor(public readonly injector: Injector) { super(injector); } - - createInjector(action: ToolbarComponent): Injector { - const get = (token: Type | InjectionToken, notFoundValue?: T, flags?: InjectFlags) => { - return token === EXTENSIONS_ACTION_DATA - ? this.data - : token === EXTENSIONS_ACTION_CALLBACK - ? (data = this.data) => action.action(data) - : this.getInjected.call(this.injector, token, notFoundValue, flags); - }; - - return { get }; - } } diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/toolbar-actions.ts b/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/toolbar-actions.ts index 5d9cdf7b07..048ce486c8 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/toolbar-actions.ts +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/toolbar-actions.ts @@ -1,12 +1,14 @@ -import { Type } from '@angular/core'; +import { Injector, Type } from '@angular/core'; import { O } from 'ts-toolbelt'; import { Action, ActionContributorCallback, ActionContributorCallbacks, + ActionData, ActionList, Actions, ActionsFactory, + ReadonlyActionData, } from './actions'; export class ToolbarActionList extends ActionList< @@ -31,9 +33,9 @@ export class ToolbarAction extends Action { super(options.permission || '', options.visible, options.action); this.text = options.text; this.icon = options.icon || ''; - if(options.btnClass){ - this.btnClass = options.btnClass; - }; + if (options.btnClass) { + this.btnClass = options.btnClass; + } } static create(options: ToolbarActionOptions) { @@ -72,10 +74,20 @@ export type ToolbarComponentOptions = O.Optional< 'permission' | 'visible' | 'action' >; -export type ToolbarActionDefaults = Record[]>; +export type ToolbarActionDefault = ToolbarAction | ToolbarComponent; + +export type ToolbarActionDefaults = Record>>; export type ToolbarActionContributorCallback = ActionContributorCallback< ToolbarActionList >; export type ToolbarActionContributorCallbacks = ActionContributorCallbacks< ToolbarActionList >; +export type InferredData = ActionData>; +export type InferredRecord = L extends ActionList ? R : never; + +export interface HasCreateInjectorPipe { + getData: () => ReadonlyActionData; + injector: Injector; + getInjected: InferredData>['getInjected']; +} diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/pipes/create-injector.pipe.ts b/npm/ng-packs/packages/theme-shared/extensions/src/lib/pipes/create-injector.pipe.ts new file mode 100644 index 0000000000..7941a2fe56 --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/pipes/create-injector.pipe.ts @@ -0,0 +1,35 @@ +import { InjectFlags, InjectionToken, Injector, Pipe, PipeTransform, Type } from '@angular/core'; +import { HasCreateInjectorPipe, ToolbarComponent } from '../models/toolbar-actions'; +import { EXTENSIONS_ACTION_CALLBACK, EXTENSIONS_ACTION_DATA } from '../tokens/extensions.token'; + +@Pipe({ + name: 'createInjector', +}) +export class CreateInjectorPipe implements PipeTransform { + public transform( + _: any, + action: ToolbarComponent, + context: HasCreateInjectorPipe, + ): Injector { + const get = (token: Type | InjectionToken, notFoundValue?: T, flags?: InjectFlags) => { + const componentData = context.getData(); + const componentDataCallback = data => { + data = data ?? context.getData(); + return action.action(data); + }; + let extensionData; + switch (token) { + case EXTENSIONS_ACTION_DATA: + extensionData = componentData; + break; + case EXTENSIONS_ACTION_CALLBACK: + extensionData = componentDataCallback; + break; + default: + extensionData = context.getInjected.call(context.injector, token, notFoundValue, flags); + } + return extensionData; + }; + return { get }; + } +} diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/ui-extensions.module.ts b/npm/ng-packs/packages/theme-shared/extensions/src/lib/ui-extensions.module.ts index 28456e0324..aebaa16036 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/ui-extensions.module.ts +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/ui-extensions.module.ts @@ -16,6 +16,7 @@ import { GridActionsComponent } from './components/grid-actions/grid-actions.com import { PageToolbarComponent } from './components/page-toolbar/page-toolbar.component'; import { DisabledDirective } from './directives/disabled.directive'; import { PropDataDirective } from './directives/prop-data.directive'; +import { CreateInjectorPipe } from './pipes/create-injector.pipe'; @NgModule({ exports: [ @@ -26,6 +27,7 @@ import { PropDataDirective } from './directives/prop-data.directive'; ExtensibleTableComponent, PropDataDirective, DisabledDirective, + CreateInjectorPipe, ], declarations: [ DateTimePickerComponent, @@ -36,6 +38,7 @@ import { PropDataDirective } from './directives/prop-data.directive'; ExtensibleTableComponent, PropDataDirective, DisabledDirective, + CreateInjectorPipe, ], imports: [ CoreModule, diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/public-api.ts b/npm/ng-packs/packages/theme-shared/extensions/src/public-api.ts index a3afbe7efd..b19f8eb0d9 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/public-api.ts +++ b/npm/ng-packs/packages/theme-shared/extensions/src/public-api.ts @@ -61,6 +61,7 @@ export { ToolbarComponent, ToolbarComponentOptions, } from './lib/models/toolbar-actions'; +export * from './lib/pipes/create-injector.pipe'; export * from './lib/services/extensions.service'; export * from './lib/tokens/extensions.token'; export * from './lib/ui-extensions.module';