@mintplayer/ng-spark 0.0.4 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mintplayer/ng-spark",
3
3
  "private": false,
4
- "version": "0.0.4",
4
+ "version": "0.0.5",
5
5
  "description": "Angular component library for MintPlayer.Spark CRUD applications",
6
6
  "repository": {
7
7
  "type": "git",
@@ -1,5 +1,5 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { InjectionToken, TemplateRef, QueryList, PipeTransform, Provider } from '@angular/core';
2
+ import { InjectionToken, Type, TemplateRef, PipeTransform, InputSignal, Provider } from '@angular/core';
3
3
  import { Color } from '@mintplayer/ng-bootstrap';
4
4
  import { DatatableSettings } from '@mintplayer/ng-bootstrap/datatable';
5
5
  import { PaginationResponse } from '@mintplayer/pagination';
@@ -54,6 +54,10 @@ interface PersistentObjectAttribute {
54
54
  isValueChanged?: boolean;
55
55
  rules: ValidationRule[];
56
56
  group?: string;
57
+ /** Renderer component name for custom display in detail/list views */
58
+ renderer?: string;
59
+ /** Options passed to the renderer component */
60
+ rendererOptions?: Record<string, any>;
57
61
  }
58
62
 
59
63
  interface PersistentObject {
@@ -95,6 +99,10 @@ interface EntityAttributeDefinition {
95
99
  group?: string;
96
100
  /** Number of grid columns this attribute spans within a tab's column layout */
97
101
  columnSpan?: number;
102
+ /** Renderer component name for custom display in detail/list views */
103
+ renderer?: string;
104
+ /** Options passed to the renderer component */
105
+ rendererOptions?: Record<string, any>;
98
106
  }
99
107
  interface AttributeTab {
100
108
  id: string;
@@ -297,31 +305,15 @@ declare class RetryActionService {
297
305
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<RetryActionService>;
298
306
  }
299
307
 
300
- interface SparkFieldTemplateContext {
301
- $implicit: EntityAttributeDefinition;
302
- formData: Record<string, any>;
303
- value: any;
304
- hasError: boolean;
305
- errorMessage: TranslatedString | null;
306
- }
307
- declare class SparkFieldTemplateDirective {
308
- template: TemplateRef<SparkFieldTemplateContext>;
309
- name: _angular_core.InputSignal<string>;
310
- constructor(template: TemplateRef<SparkFieldTemplateContext>);
311
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<SparkFieldTemplateDirective, never>;
312
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<SparkFieldTemplateDirective, "[sparkFieldTemplate]", never, { "name": { "alias": "sparkFieldTemplate"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
313
- }
314
-
315
308
  declare class SparkPoFormComponent {
316
309
  private readonly sparkService;
317
310
  private readonly translations;
318
- fieldTemplates: QueryList<SparkFieldTemplateDirective>;
311
+ private readonly rendererRegistry;
319
312
  entityType: _angular_core.InputSignal<EntityType>;
320
313
  formData: _angular_core.ModelSignal<Record<string, any>>;
321
314
  validationErrors: _angular_core.InputSignal<ValidationError[]>;
322
315
  showButtons: _angular_core.InputSignal<boolean>;
323
316
  isSaving: _angular_core.InputSignal<boolean>;
324
- externalFieldTemplates: _angular_core.InputSignal<SparkFieldTemplateDirective[]>;
325
317
  save: _angular_core.OutputEmitterRef<void>;
326
318
  cancel: _angular_core.OutputEmitterRef<void>;
327
319
  colors: typeof Color;
@@ -354,8 +346,6 @@ declare class SparkPoFormComponent {
354
346
  attrsForGroup(group: AttributeGroup): EntityAttributeDefinition[];
355
347
  referenceVisibleAttributes: _angular_core.Signal<EntityAttributeDefinition[]>;
356
348
  filteredLookupItems: _angular_core.Signal<LookupReferenceValue[]>;
357
- getFieldTemplate(attr: EntityAttributeDefinition): TemplateRef<SparkFieldTemplateContext> | null;
358
- getFieldTemplateContext(attr: EntityAttributeDefinition): SparkFieldTemplateContext;
359
349
  constructor();
360
350
  private toRecord;
361
351
  loadReferenceOptions(): Promise<void>;
@@ -366,6 +356,8 @@ declare class SparkPoFormComponent {
366
356
  openLookupSelector(attr: EntityAttributeDefinition): void;
367
357
  selectLookupItem(item: LookupReferenceValue): void;
368
358
  closeLookupModal(): void;
359
+ getEditRendererComponent(attr: EntityAttributeDefinition): Type<any> | null;
360
+ getEditRendererInputs(attr: EntityAttributeDefinition): Record<string, any>;
369
361
  hasError(attrName: string): boolean;
370
362
  onFieldChange(): void;
371
363
  onSave(): void;
@@ -384,14 +376,13 @@ declare class SparkPoFormComponent {
384
376
  selectReferenceItem(item: PersistentObject): void;
385
377
  closeReferenceModal(): void;
386
378
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SparkPoFormComponent, never>;
387
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SparkPoFormComponent, "spark-po-form", never, { "entityType": { "alias": "entityType"; "required": false; "isSignal": true; }; "formData": { "alias": "formData"; "required": false; "isSignal": true; }; "validationErrors": { "alias": "validationErrors"; "required": false; "isSignal": true; }; "showButtons": { "alias": "showButtons"; "required": false; "isSignal": true; }; "isSaving": { "alias": "isSaving"; "required": false; "isSignal": true; }; "externalFieldTemplates": { "alias": "externalFieldTemplates"; "required": false; "isSignal": true; }; }, { "formData": "formDataChange"; "save": "save"; "cancel": "cancel"; }, ["fieldTemplates"], never, true, never>;
379
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SparkPoFormComponent, "spark-po-form", never, { "entityType": { "alias": "entityType"; "required": false; "isSignal": true; }; "formData": { "alias": "formData"; "required": false; "isSignal": true; }; "validationErrors": { "alias": "validationErrors"; "required": false; "isSignal": true; }; "showButtons": { "alias": "showButtons"; "required": false; "isSignal": true; }; "isSaving": { "alias": "isSaving"; "required": false; "isSignal": true; }; }, { "formData": "formDataChange"; "save": "save"; "cancel": "cancel"; }, never, never, true, never>;
388
380
  }
389
381
 
390
382
  declare class SparkPoCreateComponent {
391
383
  private readonly route;
392
384
  private readonly router;
393
385
  private readonly sparkService;
394
- fieldTemplates: QueryList<SparkFieldTemplateDirective>;
395
386
  saved: _angular_core.OutputEmitterRef<PersistentObject>;
396
387
  cancelled: _angular_core.OutputEmitterRef<void>;
397
388
  colors: typeof Color;
@@ -408,14 +399,13 @@ declare class SparkPoCreateComponent {
408
399
  onSave(): Promise<void>;
409
400
  onCancel(): void;
410
401
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SparkPoCreateComponent, never>;
411
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SparkPoCreateComponent, "spark-po-create", never, {}, { "saved": "saved"; "cancelled": "cancelled"; }, ["fieldTemplates"], never, true, never>;
402
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SparkPoCreateComponent, "spark-po-create", never, {}, { "saved": "saved"; "cancelled": "cancelled"; }, never, never, true, never>;
412
403
  }
413
404
 
414
405
  declare class SparkPoEditComponent {
415
406
  private readonly route;
416
407
  private readonly router;
417
408
  private readonly sparkService;
418
- fieldTemplates: QueryList<SparkFieldTemplateDirective>;
419
409
  saved: _angular_core.OutputEmitterRef<PersistentObject>;
420
410
  cancelled: _angular_core.OutputEmitterRef<void>;
421
411
  colors: typeof Color;
@@ -434,20 +424,7 @@ declare class SparkPoEditComponent {
434
424
  onSave(): Promise<void>;
435
425
  onCancel(): void;
436
426
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SparkPoEditComponent, never>;
437
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SparkPoEditComponent, "spark-po-edit", never, {}, { "saved": "saved"; "cancelled": "cancelled"; }, ["fieldTemplates"], never, true, never>;
438
- }
439
-
440
- interface SparkDetailFieldTemplateContext {
441
- $implicit: EntityAttributeDefinition;
442
- item: PersistentObject;
443
- value: any;
444
- }
445
- declare class SparkDetailFieldTemplateDirective {
446
- template: TemplateRef<SparkDetailFieldTemplateContext>;
447
- name: _angular_core.InputSignal<string>;
448
- constructor(template: TemplateRef<SparkDetailFieldTemplateContext>);
449
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<SparkDetailFieldTemplateDirective, never>;
450
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<SparkDetailFieldTemplateDirective, "[sparkDetailFieldTemplate]", never, { "name": { "alias": "sparkDetailFieldTemplate"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
427
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SparkPoEditComponent, "spark-po-edit", never, {}, { "saved": "saved"; "cancelled": "cancelled"; }, never, never, true, never>;
451
428
  }
452
429
 
453
430
  declare class SparkPoDetailComponent {
@@ -455,7 +432,7 @@ declare class SparkPoDetailComponent {
455
432
  private readonly router;
456
433
  private readonly sparkService;
457
434
  private readonly lang;
458
- detailFieldTemplates: QueryList<SparkDetailFieldTemplateDirective>;
435
+ private readonly rendererRegistry;
459
436
  showCustomActions: _angular_core.InputSignal<boolean>;
460
437
  extraActionsTemplate: _angular_core.InputSignal<TemplateRef<void>>;
461
438
  extraContentTemplate: _angular_core.InputSignal<TemplateRef<{
@@ -489,8 +466,8 @@ declare class SparkPoDetailComponent {
489
466
  resolvedTabs: _angular_core.Signal<AttributeTab[]>;
490
467
  groupsForTab(tab: AttributeTab): AttributeGroup[];
491
468
  attrsForGroup(group: AttributeGroup): EntityAttributeDefinition[];
492
- getDetailFieldTemplate(attr: EntityAttributeDefinition): TemplateRef<SparkDetailFieldTemplateContext> | null;
493
- getDetailFieldContext(attr: EntityAttributeDefinition, item: PersistentObject): SparkDetailFieldTemplateContext;
469
+ getDetailRendererComponent(attr: EntityAttributeDefinition): Type<any> | null;
470
+ getDetailRendererInputs(attr: EntityAttributeDefinition, item: PersistentObject): Record<string, any>;
494
471
  private loadLookupReferenceOptions;
495
472
  private loadAsDetailTypes;
496
473
  onCustomAction(action: CustomActionDefinition): Promise<void>;
@@ -498,27 +475,14 @@ declare class SparkPoDetailComponent {
498
475
  onDelete(): Promise<void>;
499
476
  onBack(): void;
500
477
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SparkPoDetailComponent, never>;
501
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SparkPoDetailComponent, "spark-po-detail", never, { "showCustomActions": { "alias": "showCustomActions"; "required": false; "isSignal": true; }; "extraActionsTemplate": { "alias": "extraActionsTemplate"; "required": false; "isSignal": true; }; "extraContentTemplate": { "alias": "extraContentTemplate"; "required": false; "isSignal": true; }; }, { "edited": "edited"; "deleted": "deleted"; "customActionExecuted": "customActionExecuted"; }, ["detailFieldTemplates"], never, true, never>;
502
- }
503
-
504
- interface SparkColumnTemplateContext {
505
- $implicit: PersistentObject;
506
- attr: EntityAttributeDefinition;
507
- value: any;
508
- }
509
- declare class SparkColumnTemplateDirective {
510
- template: TemplateRef<SparkColumnTemplateContext>;
511
- name: _angular_core.InputSignal<string>;
512
- constructor(template: TemplateRef<SparkColumnTemplateContext>);
513
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<SparkColumnTemplateDirective, never>;
514
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<SparkColumnTemplateDirective, "[sparkColumnTemplate]", never, { "name": { "alias": "sparkColumnTemplate"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
478
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SparkPoDetailComponent, "spark-po-detail", never, { "showCustomActions": { "alias": "showCustomActions"; "required": false; "isSignal": true; }; "extraActionsTemplate": { "alias": "extraActionsTemplate"; "required": false; "isSignal": true; }; "extraContentTemplate": { "alias": "extraContentTemplate"; "required": false; "isSignal": true; }; }, { "edited": "edited"; "deleted": "deleted"; "customActionExecuted": "customActionExecuted"; }, never, never, true, never>;
515
479
  }
516
480
 
517
481
  declare class SparkQueryListComponent {
518
482
  private readonly route;
519
483
  private readonly router;
520
484
  private readonly sparkService;
521
- columnTemplates: QueryList<SparkColumnTemplateDirective>;
485
+ private readonly rendererRegistry;
522
486
  extraActionsTemplate: _angular_core.InputSignal<TemplateRef<void>>;
523
487
  rowClicked: _angular_core.OutputEmitterRef<PersistentObject>;
524
488
  createClicked: _angular_core.OutputEmitterRef<void>;
@@ -545,13 +509,13 @@ declare class SparkQueryListComponent {
545
509
  applyFilter(): void;
546
510
  clearSearch(): void;
547
511
  visibleAttributes: _angular_core.Signal<EntityAttributeDefinition[]>;
548
- getColumnTemplate(attr: EntityAttributeDefinition): TemplateRef<SparkColumnTemplateContext> | null;
549
- getColumnTemplateContext(item: PersistentObject, attr: EntityAttributeDefinition): SparkColumnTemplateContext;
512
+ getColumnRendererComponent(attr: EntityAttributeDefinition): Type<any> | null;
513
+ getColumnRendererInputs(item: PersistentObject, attr: EntityAttributeDefinition): Record<string, any>;
550
514
  private loadLookupReferenceOptions;
551
515
  onRowClick(item: PersistentObject): void;
552
516
  onCreate(): void;
553
517
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SparkQueryListComponent, never>;
554
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SparkQueryListComponent, "spark-query-list", never, { "extraActionsTemplate": { "alias": "extraActionsTemplate"; "required": false; "isSignal": true; }; }, { "rowClicked": "rowClicked"; "createClicked": "createClicked"; }, ["columnTemplates"], never, true, never>;
518
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SparkQueryListComponent, "spark-query-list", never, { "extraActionsTemplate": { "alias": "extraActionsTemplate"; "required": false; "isSignal": true; }; }, { "rowClicked": "rowClicked"; "createClicked": "createClicked"; }, never, never, true, never>;
555
519
  }
556
520
 
557
521
  declare class SparkRetryActionModalComponent {
@@ -721,6 +685,69 @@ declare class ArrayValuePipe implements PipeTransform {
721
685
  static ɵpipe: _angular_core.ɵɵPipeDeclaration<ArrayValuePipe, "arrayValue", true>;
722
686
  }
723
687
 
688
+ /**
689
+ * Contract for detail-page renderers (spark-po-detail).
690
+ * Displays a single attribute value in the PO detail view.
691
+ */
692
+ interface SparkAttributeDetailRenderer {
693
+ /** The current attribute value */
694
+ value: InputSignal<any>;
695
+ /** The attribute definition metadata */
696
+ attribute: InputSignal<EntityAttributeDefinition | undefined>;
697
+ /** Renderer-specific options from rendererOptions */
698
+ options: InputSignal<Record<string, any> | undefined>;
699
+ /** The full form data (for cross-field dependencies) */
700
+ formData: InputSignal<Record<string, any>>;
701
+ }
702
+ /**
703
+ * Contract for query-list column renderers (spark-query-list).
704
+ * Displays a compact cell value in the list/grid view.
705
+ */
706
+ interface SparkAttributeColumnRenderer {
707
+ /** The current attribute value */
708
+ value: InputSignal<any>;
709
+ /** The attribute definition metadata */
710
+ attribute: InputSignal<EntityAttributeDefinition | undefined>;
711
+ /** Renderer-specific options from rendererOptions */
712
+ options: InputSignal<Record<string, any> | undefined>;
713
+ }
714
+ /**
715
+ * Contract for edit-form renderers (spark-po-form on create/edit pages).
716
+ * Replaces the default <input> for this attribute.
717
+ */
718
+ interface SparkAttributeEditRenderer {
719
+ /** The current attribute value */
720
+ value: InputSignal<any>;
721
+ /** The attribute definition metadata */
722
+ attribute: InputSignal<EntityAttributeDefinition | undefined>;
723
+ /** Renderer-specific options from rendererOptions */
724
+ options: InputSignal<Record<string, any> | undefined>;
725
+ /** Callback to notify parent form of value changes (since NgComponentOutlet doesn't support outputs) */
726
+ valueChange: InputSignal<(value: any) => void>;
727
+ }
728
+
729
+ interface SparkAttributeRendererRegistration {
730
+ /** The renderer name (must match attr.renderer in model JSON) */
731
+ name: string;
732
+ /** Component for the PO detail page. Must implement SparkAttributeDetailRenderer. */
733
+ detailComponent: Type<any>;
734
+ /** Component for query-list column cells. Must implement SparkAttributeColumnRenderer. */
735
+ columnComponent: Type<any>;
736
+ /** Optional component for create/edit forms. Must implement SparkAttributeEditRenderer. When omitted, the default input is used. */
737
+ editComponent?: Type<any>;
738
+ }
739
+ declare const SPARK_ATTRIBUTE_RENDERERS: InjectionToken<SparkAttributeRendererRegistration[]>;
740
+ /**
741
+ * Register custom attribute renderers globally.
742
+ *
743
+ * @example
744
+ * provideSparkAttributeRenderers([
745
+ * { name: 'video-player', detailComponent: VideoDetailComponent, columnComponent: VideoColumnComponent },
746
+ * { name: 'color-swatch', detailComponent: ColorDetailComponent, columnComponent: ColorColumnComponent },
747
+ * ])
748
+ */
749
+ declare function provideSparkAttributeRenderers(renderers: SparkAttributeRendererRegistration[]): Provider;
750
+
724
751
  interface SparkRouteConfig {
725
752
  queryList?: Route['loadComponent'];
726
753
  poCreate?: Route['loadComponent'];
@@ -731,5 +758,5 @@ declare function sparkRoutes(config?: SparkRouteConfig): Routes;
731
758
 
732
759
  declare function provideSpark(config?: Partial<SparkConfig>): Provider[];
733
760
 
734
- export { ArrayValuePipe, AsDetailCellValuePipe, AsDetailColumnsPipe, AsDetailDisplayValuePipe, AsDetailTypePipe, AttributeValuePipe, CanCreateDetailRowPipe, CanDeleteDetailRowPipe, ELookupDisplayType, ErrorForAttributePipe, IconNamePipe, InlineRefOptionsPipe, InputTypePipe, LookupDisplayTypePipe, LookupDisplayValuePipe, LookupOptionsPipe, RawAttributeValuePipe, ReferenceAttrValuePipe, ReferenceDisplayValuePipe, ReferenceLinkRoutePipe, ResolveTranslationPipe, RetryActionService, RouterLinkPipe, SPARK_CONFIG, ShowedOn, SparkColumnTemplateDirective, SparkDetailFieldTemplateDirective, SparkFieldTemplateDirective, SparkIconComponent, SparkIconRegistry, SparkLanguageService, SparkPoCreateComponent, SparkPoDetailComponent, SparkPoEditComponent, SparkPoFormComponent, SparkQueryListComponent, SparkRetryActionModalComponent, SparkService, TranslateKeyPipe, defaultSparkConfig, hasShowedOnFlag, provideSpark, resolveTranslation, sparkRoutes };
735
- export type { AttributeGroup, AttributeTab, CustomActionDefinition, EntityAttributeDefinition, EntityPermissions, EntityType, LookupReference, LookupReferenceListItem, LookupReferenceValue, PersistentObject, PersistentObjectAttribute, ProgramUnit, ProgramUnitGroup, ProgramUnitsConfiguration, RetryActionPayload, RetryActionResult, SparkColumnTemplateContext, SparkConfig, SparkDetailFieldTemplateContext, SparkFieldTemplateContext, SparkQuery, SparkRouteConfig, TranslatedString, ValidationError, ValidationRule };
761
+ export { ArrayValuePipe, AsDetailCellValuePipe, AsDetailColumnsPipe, AsDetailDisplayValuePipe, AsDetailTypePipe, AttributeValuePipe, CanCreateDetailRowPipe, CanDeleteDetailRowPipe, ELookupDisplayType, ErrorForAttributePipe, IconNamePipe, InlineRefOptionsPipe, InputTypePipe, LookupDisplayTypePipe, LookupDisplayValuePipe, LookupOptionsPipe, RawAttributeValuePipe, ReferenceAttrValuePipe, ReferenceDisplayValuePipe, ReferenceLinkRoutePipe, ResolveTranslationPipe, RetryActionService, RouterLinkPipe, SPARK_ATTRIBUTE_RENDERERS, SPARK_CONFIG, ShowedOn, SparkIconComponent, SparkIconRegistry, SparkLanguageService, SparkPoCreateComponent, SparkPoDetailComponent, SparkPoEditComponent, SparkPoFormComponent, SparkQueryListComponent, SparkRetryActionModalComponent, SparkService, TranslateKeyPipe, defaultSparkConfig, hasShowedOnFlag, provideSpark, provideSparkAttributeRenderers, resolveTranslation, sparkRoutes };
762
+ export type { AttributeGroup, AttributeTab, CustomActionDefinition, EntityAttributeDefinition, EntityPermissions, EntityType, LookupReference, LookupReferenceListItem, LookupReferenceValue, PersistentObject, PersistentObjectAttribute, ProgramUnit, ProgramUnitGroup, ProgramUnitsConfiguration, RetryActionPayload, RetryActionResult, SparkAttributeColumnRenderer, SparkAttributeDetailRenderer, SparkAttributeEditRenderer, SparkAttributeRendererRegistration, SparkConfig, SparkQuery, SparkRouteConfig, TranslatedString, ValidationError, ValidationRule };