ngssm-data 21.1.3 → 21.1.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/README.md CHANGED
@@ -129,6 +129,23 @@ The `provideNgssmDataSource` function accepts:
129
129
  - `linkedDataSources`: Sources to reload when this updates
130
130
  - `dependsOnDataSource`: Load this source first before loading current
131
131
  - `additionalPropertyLoadingFunc`: Function to load additional properties
132
+ - `onLoaded`: Callback run after successful value load (in DI context)
133
+ - `onLoadError`: Callback run after failed load (in DI context)
134
+
135
+ #### Callback example
136
+
137
+ ```ts
138
+ provideNgssmDataSource('users', usersLoader, {
139
+ onLoaded: (state, key, parameter, value) => {
140
+ const audit = inject(AuditService);
141
+ audit.trackLoadSuccess(key, parameter, value);
142
+ },
143
+ onLoadError: (state, key, parameter, error) => {
144
+ const audit = inject(AuditService);
145
+ audit.trackLoadFailure(key, parameter, error);
146
+ }
147
+ });
148
+ ```
132
149
 
133
150
  ## Usage
134
151
 
@@ -279,10 +279,10 @@ class NgssmDataSourceValueSetter {
279
279
  throw new Error(`Data source '${datasourceKey}' is not initialized.`);
280
280
  }
281
281
  }
282
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: NgssmDataSourceValueSetter, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
283
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: NgssmDataSourceValueSetter });
282
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NgssmDataSourceValueSetter, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
283
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NgssmDataSourceValueSetter });
284
284
  }
285
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: NgssmDataSourceValueSetter, decorators: [{
285
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NgssmDataSourceValueSetter, decorators: [{
286
286
  type: Injectable
287
287
  }] });
288
288
  const ngssmDataSourceValueSetter = () => TestBed.inject(NgssmDataSourceValueSetter);
@@ -218,7 +218,9 @@ const provideNgssmDataSource = (key, loadingFunc, options) => {
218
218
  key,
219
219
  dataLifetimeInSeconds: options?.dataLifetimeInSeconds,
220
220
  dataLoadingFunc: loadingFunc,
221
- additionalPropertyLoadingFunc: options?.additionalPropertyLoadingFunc
221
+ additionalPropertyLoadingFunc: options?.additionalPropertyLoadingFunc,
222
+ onLoaded: options?.onLoaded,
223
+ onLoadError: options?.onLoadError
222
224
  };
223
225
  if (options?.initialParameter) {
224
226
  dataSource.initialParameter = options?.initialParameter;
@@ -357,10 +359,10 @@ class DataSourcesRegistrationReducer {
357
359
  }
358
360
  return state;
359
361
  }
360
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: DataSourcesRegistrationReducer, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
361
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: DataSourcesRegistrationReducer });
362
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: DataSourcesRegistrationReducer, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
363
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: DataSourcesRegistrationReducer });
362
364
  }
363
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: DataSourcesRegistrationReducer, decorators: [{
365
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: DataSourcesRegistrationReducer, decorators: [{
364
366
  type: Injectable
365
367
  }] });
366
368
 
@@ -416,10 +418,10 @@ class DataSourceValueReducer {
416
418
  }
417
419
  return state;
418
420
  }
419
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: DataSourceValueReducer, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
420
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: DataSourceValueReducer });
421
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: DataSourceValueReducer, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
422
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: DataSourceValueReducer });
421
423
  }
422
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: DataSourceValueReducer, decorators: [{
424
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: DataSourceValueReducer, decorators: [{
423
425
  type: Injectable
424
426
  }] });
425
427
 
@@ -514,10 +516,10 @@ class LoadDataSourceValueReducer {
514
516
  }
515
517
  return state;
516
518
  }
517
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: LoadDataSourceValueReducer, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
518
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: LoadDataSourceValueReducer });
519
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: LoadDataSourceValueReducer, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
520
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: LoadDataSourceValueReducer });
519
521
  }
520
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: LoadDataSourceValueReducer, decorators: [{
522
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: LoadDataSourceValueReducer, decorators: [{
521
523
  type: Injectable
522
524
  }] });
523
525
 
@@ -584,10 +586,10 @@ class DataSourceAdditionalPropertyValueReducer {
584
586
  }
585
587
  return state;
586
588
  }
587
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: DataSourceAdditionalPropertyValueReducer, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
588
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: DataSourceAdditionalPropertyValueReducer });
589
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: DataSourceAdditionalPropertyValueReducer, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
590
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: DataSourceAdditionalPropertyValueReducer });
589
591
  }
590
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: DataSourceAdditionalPropertyValueReducer, decorators: [{
592
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: DataSourceAdditionalPropertyValueReducer, decorators: [{
591
593
  type: Injectable
592
594
  }] });
593
595
 
@@ -745,10 +747,10 @@ class DataSourceParameterReducer {
745
747
  }
746
748
  });
747
749
  }
748
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: DataSourceParameterReducer, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
749
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: DataSourceParameterReducer });
750
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: DataSourceParameterReducer, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
751
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: DataSourceParameterReducer });
750
752
  }
751
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: DataSourceParameterReducer, decorators: [{
753
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: DataSourceParameterReducer, decorators: [{
752
754
  type: Injectable
753
755
  }] });
754
756
 
@@ -775,9 +777,31 @@ class DataLoadingEffect {
775
777
  }
776
778
  runInInjectionContext(this.injector, () => {
777
779
  dataSource.dataLoadingFunc(state, key, dataSourceValue.parameter).subscribe({
778
- next: (value) => actiondispatcher.dispatchAction(new NgssmSetDataSourceValueAction(key, NgssmDataSourceValueStatus.loaded, value)),
780
+ next: (value) => {
781
+ if (dataSource.onLoaded) {
782
+ try {
783
+ runInInjectionContext(this.injector, () => {
784
+ dataSource.onLoaded(state, key, dataSourceValue.parameter, value);
785
+ });
786
+ }
787
+ catch (callbackError) {
788
+ this.logger.error(`Error in onLoaded callback for '${key}'`, callbackError);
789
+ }
790
+ }
791
+ actiondispatcher.dispatchAction(new NgssmSetDataSourceValueAction(key, NgssmDataSourceValueStatus.loaded, value));
792
+ },
779
793
  error: (error) => {
780
794
  this.logger.error(`Unable to load data for '${key}'`, error);
795
+ if (dataSource.onLoadError) {
796
+ try {
797
+ runInInjectionContext(this.injector, () => {
798
+ dataSource.onLoadError(state, key, dataSourceValue.parameter, error);
799
+ });
800
+ }
801
+ catch (callbackError) {
802
+ this.logger.error(`Error in onLoadError callback for '${key}'`, callbackError);
803
+ }
804
+ }
781
805
  actiondispatcher.dispatchAction(new NgssmSetDataSourceValueAction(key, NgssmDataSourceValueStatus.error, undefined, error));
782
806
  }
783
807
  });
@@ -804,10 +828,10 @@ class DataLoadingEffect {
804
828
  }
805
829
  }
806
830
  }
807
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: DataLoadingEffect, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
808
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: DataLoadingEffect });
831
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: DataLoadingEffect, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
832
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: DataLoadingEffect });
809
833
  }
810
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: DataLoadingEffect, decorators: [{
834
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: DataLoadingEffect, decorators: [{
811
835
  type: Injectable
812
836
  }] });
813
837
 
@@ -943,10 +967,10 @@ class IsNgssmDataSourceValueStatusPipe {
943
967
  const itemStatus = selectNgssmDataSourceValue(value, key).status;
944
968
  return expectedStatuses.includes(itemStatus);
945
969
  }
946
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: IsNgssmDataSourceValueStatusPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
947
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.5", ngImport: i0, type: IsNgssmDataSourceValueStatusPipe, isStandalone: true, name: "isNgssmDataSourceValueStatus" });
970
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: IsNgssmDataSourceValueStatusPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
971
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.8", ngImport: i0, type: IsNgssmDataSourceValueStatusPipe, isStandalone: true, name: "isNgssmDataSourceValueStatus" });
948
972
  }
949
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: IsNgssmDataSourceValueStatusPipe, decorators: [{
973
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: IsNgssmDataSourceValueStatusPipe, decorators: [{
950
974
  type: Pipe,
951
975
  args: [{
952
976
  name: 'isNgssmDataSourceValueStatus'
@@ -985,10 +1009,10 @@ class NgssmAutoReloadComponent {
985
1009
  this.timerId = undefined;
986
1010
  }
987
1011
  }
988
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: NgssmAutoReloadComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
989
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: NgssmAutoReloadComponent, isStandalone: true, selector: "ngssm-auto-reload", inputs: { autoReloadAction: { classPropertyName: "autoReloadAction", publicName: "autoReloadAction", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<mat-form-field>\n <mat-label>Select auto reload period</mat-label>\n <mat-select [formControl]=\"reloadTypeControl\">\n @for (option of reloadTypes; track option.value){\n <mat-option [value]=\"option.value\">\n {{option.label}}\n </mat-option>\n }\n </mat-select>\n</mat-form-field>", dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "component", type: MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1012
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NgssmAutoReloadComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1013
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: NgssmAutoReloadComponent, isStandalone: true, selector: "ngssm-auto-reload", inputs: { autoReloadAction: { classPropertyName: "autoReloadAction", publicName: "autoReloadAction", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<mat-form-field>\n <mat-label>Select auto reload period</mat-label>\n <mat-select [formControl]=\"reloadTypeControl\">\n @for (option of reloadTypes; track option.value){\n <mat-option [value]=\"option.value\">\n {{option.label}}\n </mat-option>\n }\n </mat-select>\n</mat-form-field>", dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "component", type: MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
990
1014
  }
991
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: NgssmAutoReloadComponent, decorators: [{
1015
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NgssmAutoReloadComponent, decorators: [{
992
1016
  type: Component,
993
1017
  args: [{ selector: 'ngssm-auto-reload', imports: [ReactiveFormsModule, MatFormField, MatLabel, MatSelect, MatOption], changeDetection: ChangeDetectionStrategy.OnPush, template: "<mat-form-field>\n <mat-label>Select auto reload period</mat-label>\n <mat-select [formControl]=\"reloadTypeControl\">\n @for (option of reloadTypes; track option.value){\n <mat-option [value]=\"option.value\">\n {{option.label}}\n </mat-option>\n }\n </mat-select>\n</mat-form-field>" }]
994
1018
  }], ctorParameters: () => [], propDecorators: { autoReloadAction: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoReloadAction", required: false }] }] } });
@@ -1046,10 +1070,10 @@ class NgssmDataReloadButtonComponent {
1046
1070
  }
1047
1071
  this.dataSourceKeys().forEach((key) => this.store.dispatchAction(new NgssmLoadDataSourceValueAction(key, { forceReload: true, keepAdditionalProperties: this.keepAdditionalProperties() })));
1048
1072
  }
1049
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: NgssmDataReloadButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1050
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: NgssmDataReloadButtonComponent, isStandalone: true, selector: "ngssm-data-reload-button", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, keepAdditionalProperties: { classPropertyName: "keepAdditionalProperties", publicName: "keepAdditionalProperties", isSignal: true, isRequired: false, transformFunction: null }, buttonIcon: { classPropertyName: "buttonIcon", publicName: "buttonIcon", isSignal: true, isRequired: false, transformFunction: null }, autoReloadEnabled: { classPropertyName: "autoReloadEnabled", publicName: "autoReloadEnabled", isSignal: true, isRequired: false, transformFunction: null }, dataSourceKeys: { classPropertyName: "dataSourceKeys", publicName: "dataSourceKeys", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"flex-row-center\">\n @if (label(); as buttonLabel) {\n <button\n mat-stroked-button\n [color]=\"color()\"\n class=\"mat-{{color()}}\"\n (click)=\"reload()\"\n [matTooltip]=\"tooltipMessage()\"\n [disabled]=\"buttonDisabled() === true\"\n id=\"reloadButton\">\n <div class=\"flex-row-center\">\n @if (loadInProgress()) {\n <mat-spinner [diameter]=\"24\" id=\"loadingSpinner\"></mat-spinner>\n } @else {\n <mat-icon [ngClass]=\"buttonIcon()\" [color]=\"color()\"></mat-icon>\n }\n\n <span style=\"width: 0.5rem\"></span>\n\n {{ buttonLabel }}\n </div>\n </button>\n } @else {\n <button\n mat-icon-button\n [color]=\"color()\"\n class=\"mat-{{color()}}\"\n (click)=\"reload()\"\n [matTooltip]=\"tooltipMessage()\"\n [disabled]=\"buttonDisabled() === true\"\n id=\"reloadButton\">\n @if (loadInProgress()) {\n <mat-spinner [diameter]=\"24\" id=\"loadingSpinner\"></mat-spinner>\n } @else {\n <mat-icon [ngClass]=\"buttonIcon()\" [color]=\"color()\"></mat-icon>\n }\n </button>\n }\n\n @if (autoReloadEnabled()) {\n <ngssm-auto-reload class=\"with-margin-left-8\" [autoReloadAction]=\"reloadAction\"></ngssm-auto-reload>\n }\n</div>\n", dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: NgssmAutoReloadComponent, selector: "ngssm-auto-reload", inputs: ["autoReloadAction"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1073
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NgssmDataReloadButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1074
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: NgssmDataReloadButtonComponent, isStandalone: true, selector: "ngssm-data-reload-button", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, keepAdditionalProperties: { classPropertyName: "keepAdditionalProperties", publicName: "keepAdditionalProperties", isSignal: true, isRequired: false, transformFunction: null }, buttonIcon: { classPropertyName: "buttonIcon", publicName: "buttonIcon", isSignal: true, isRequired: false, transformFunction: null }, autoReloadEnabled: { classPropertyName: "autoReloadEnabled", publicName: "autoReloadEnabled", isSignal: true, isRequired: false, transformFunction: null }, dataSourceKeys: { classPropertyName: "dataSourceKeys", publicName: "dataSourceKeys", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"flex-row-center\">\n @if (label(); as buttonLabel) {\n <button\n mat-stroked-button\n [color]=\"color()\"\n class=\"mat-{{color()}}\"\n (click)=\"reload()\"\n [matTooltip]=\"tooltipMessage()\"\n [disabled]=\"buttonDisabled() === true\"\n id=\"reloadButton\">\n <div class=\"flex-row-center\">\n @if (loadInProgress()) {\n <mat-spinner [diameter]=\"24\" id=\"loadingSpinner\"></mat-spinner>\n } @else {\n <mat-icon [ngClass]=\"buttonIcon()\" [color]=\"color()\"></mat-icon>\n }\n\n <span style=\"width: 0.5rem\"></span>\n\n {{ buttonLabel }}\n </div>\n </button>\n } @else {\n <button\n mat-icon-button\n [color]=\"color()\"\n class=\"mat-{{color()}}\"\n (click)=\"reload()\"\n [matTooltip]=\"tooltipMessage()\"\n [disabled]=\"buttonDisabled() === true\"\n id=\"reloadButton\">\n @if (loadInProgress()) {\n <mat-spinner [diameter]=\"24\" id=\"loadingSpinner\"></mat-spinner>\n } @else {\n <mat-icon [ngClass]=\"buttonIcon()\" [color]=\"color()\"></mat-icon>\n }\n </button>\n }\n\n @if (autoReloadEnabled()) {\n <ngssm-auto-reload class=\"with-margin-left-8\" [autoReloadAction]=\"reloadAction\"></ngssm-auto-reload>\n }\n</div>\n", dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: NgssmAutoReloadComponent, selector: "ngssm-auto-reload", inputs: ["autoReloadAction"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1051
1075
  }
1052
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: NgssmDataReloadButtonComponent, decorators: [{
1076
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NgssmDataReloadButtonComponent, decorators: [{
1053
1077
  type: Component,
1054
1078
  args: [{ selector: 'ngssm-data-reload-button', imports: [NgClass, MatButton, MatIconButton, MatTooltip, MatIcon, MatProgressSpinner, NgssmAutoReloadComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex-row-center\">\n @if (label(); as buttonLabel) {\n <button\n mat-stroked-button\n [color]=\"color()\"\n class=\"mat-{{color()}}\"\n (click)=\"reload()\"\n [matTooltip]=\"tooltipMessage()\"\n [disabled]=\"buttonDisabled() === true\"\n id=\"reloadButton\">\n <div class=\"flex-row-center\">\n @if (loadInProgress()) {\n <mat-spinner [diameter]=\"24\" id=\"loadingSpinner\"></mat-spinner>\n } @else {\n <mat-icon [ngClass]=\"buttonIcon()\" [color]=\"color()\"></mat-icon>\n }\n\n <span style=\"width: 0.5rem\"></span>\n\n {{ buttonLabel }}\n </div>\n </button>\n } @else {\n <button\n mat-icon-button\n [color]=\"color()\"\n class=\"mat-{{color()}}\"\n (click)=\"reload()\"\n [matTooltip]=\"tooltipMessage()\"\n [disabled]=\"buttonDisabled() === true\"\n id=\"reloadButton\">\n @if (loadInProgress()) {\n <mat-spinner [diameter]=\"24\" id=\"loadingSpinner\"></mat-spinner>\n } @else {\n <mat-icon [ngClass]=\"buttonIcon()\" [color]=\"color()\"></mat-icon>\n }\n </button>\n }\n\n @if (autoReloadEnabled()) {\n <ngssm-auto-reload class=\"with-margin-left-8\" [autoReloadAction]=\"reloadAction\"></ngssm-auto-reload>\n }\n</div>\n" }]
1055
1079
  }], ctorParameters: () => [], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], keepAdditionalProperties: [{ type: i0.Input, args: [{ isSignal: true, alias: "keepAdditionalProperties", required: false }] }], buttonIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "buttonIcon", required: false }] }], autoReloadEnabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoReloadEnabled", required: false }] }], dataSourceKeys: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataSourceKeys", required: false }] }] } });
@@ -1077,10 +1101,10 @@ class NgssmScopedDataSourceDirective {
1077
1101
  this.isInitialized = true;
1078
1102
  return value;
1079
1103
  }
1080
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: NgssmScopedDataSourceDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1081
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.5", type: NgssmScopedDataSourceDirective, isStandalone: true, selector: "[ngssmScopedDataSource]", inputs: { ngssmScopedDataSource: { classPropertyName: "ngssmScopedDataSource", publicName: "ngssmScopedDataSource", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0 });
1104
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NgssmScopedDataSourceDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1105
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.8", type: NgssmScopedDataSourceDirective, isStandalone: true, selector: "[ngssmScopedDataSource]", inputs: { ngssmScopedDataSource: { classPropertyName: "ngssmScopedDataSource", publicName: "ngssmScopedDataSource", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0 });
1082
1106
  }
1083
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: NgssmScopedDataSourceDirective, decorators: [{
1107
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NgssmScopedDataSourceDirective, decorators: [{
1084
1108
  type: Directive,
1085
1109
  args: [{
1086
1110
  selector: '[ngssmScopedDataSource]'
@@ -1 +1 @@
1
- {"version":3,"file":"ngssm-data.mjs","sources":["../../../projects/ngssm-data/src/lib/ngssm-data/actions/ngssm-data-action-type.ts","../../../projects/ngssm-data/src/lib/ngssm-data/actions/ngssm-data-source-value.action.ts","../../../projects/ngssm-data/src/lib/ngssm-data/actions/ngssm-load-data-source-value.action.ts","../../../projects/ngssm-data/src/lib/ngssm-data/actions/ngssm-set-data-source-value.action.ts","../../../projects/ngssm-data/src/lib/ngssm-data/actions/ngssm-register-data-sources.action.ts","../../../projects/ngssm-data/src/lib/ngssm-data/actions/ngssm-clear-data-source-value.action.ts","../../../projects/ngssm-data/src/lib/ngssm-data/actions/ngssm-set-data-source-parameter.action.ts","../../../projects/ngssm-data/src/lib/ngssm-data/actions/ngssm-load-data-source-additional-property-value.action.ts","../../../projects/ngssm-data/src/lib/ngssm-data/actions/ngssm-set-data-source-additional-property-value.action.ts","../../../projects/ngssm-data/src/lib/ngssm-data/actions/ngssm-register-data-source.action.ts","../../../projects/ngssm-data/src/lib/ngssm-data/actions/ngssm-unregister-data-source.action.ts","../../../projects/ngssm-data/src/lib/ngssm-data/actions/ngssm-update-data-source-parameter.action.ts","../../../projects/ngssm-data/src/lib/ngssm-data/actions/ngssm-set-data-source-parameter-validity.action.ts","../../../projects/ngssm-data/src/lib/ngssm-data/model/ngssm-data-source.ts","../../../projects/ngssm-data/src/lib/ngssm-data/model/ngssm-data-source-value.ts","../../../projects/ngssm-data/src/lib/ngssm-data/state/ngssm-data.state.ts","../../../projects/ngssm-data/src/lib/ngssm-data/reducers/data-sources-registration.reducer.ts","../../../projects/ngssm-data/src/lib/ngssm-data/reducers/data-source-value.reducer.ts","../../../projects/ngssm-data/src/lib/ngssm-data/reducers/load-data-source-value.reducer.ts","../../../projects/ngssm-data/src/lib/ngssm-data/reducers/data-source-additional-property-value.reducer.ts","../../../projects/ngssm-data/src/lib/ngssm-data/selectors.ts","../../../projects/ngssm-data/src/lib/ngssm-data/reducers/data-source-parameter.reducer.ts","../../../projects/ngssm-data/src/lib/ngssm-data/effects/data-loading.effect.ts","../../../projects/ngssm-data/src/lib/ngssm-data/post-loading-action-executor.ts","../../../projects/ngssm-data/src/lib/ngssm-data/data-sources-linker.ts","../../../projects/ngssm-data/src/lib/ngssm-data/data-source-with-dependency.ts","../../../projects/ngssm-data/src/lib/ngssm-data/provide-ngssm-data.ts","../../../projects/ngssm-data/src/lib/ngssm-data/components/is-ngssm-data-source-value-status.pipe.ts","../../../projects/ngssm-data/src/lib/ngssm-data/components/ngssm-auto-reload/ngssm-auto-reload.component.ts","../../../projects/ngssm-data/src/lib/ngssm-data/components/ngssm-auto-reload/ngssm-auto-reload.component.html","../../../projects/ngssm-data/src/lib/ngssm-data/components/ngssm-data-reload-button/ngssm-data-reload-button.component.ts","../../../projects/ngssm-data/src/lib/ngssm-data/components/ngssm-data-reload-button/ngssm-data-reload-button.component.html","../../../projects/ngssm-data/src/lib/ngssm-data/components/ngssm-scoped-data-source.directive.ts","../../../projects/ngssm-data/src/lib/ngssm-data/data-source-signal.ts","../../../projects/ngssm-data/src/lib/ngssm-data/post-loading-helpers.ts","../../../projects/ngssm-data/src/public-api.ts","../../../projects/ngssm-data/src/ngssm-data.ts"],"sourcesContent":["export enum NgssmDataActionType {\n // Used by the library to initialize all the data sources provided by the application\n registerDataSources = '[NgssmDataActionType] registerDataSources',\n\n // Could be used by the application to register or unregister a data source.\n // This can be used, for example, to limit the lifetime of a data source to the lifetime of a component\n registerDataSource = '[NgssmDataActionType] registerDataSource',\n unregisterDataSource = '[NgssmDataActionType] unregisterDataSource',\n\n // Used to call the loading method to get the value for the data source\n loadDataSourceValue = '[NgssmDataActionType] loadDataSourceValue',\n\n // Update the parameter used by the loading method, if one is required\n setDataSourceParameter = '[NgssmDataActionType] setDataSourceParameter',\n\n // Used to partially update the parameter. Usefull when creating a search component with multiple search criteria.\n updateDataSourceParameter = '[NgssmDataActionType] updateDataSourceParameter',\n\n // Update only the validity of the parameter. Usefull in case of a partial update of the parameter.\n setDataSourceParameterValidity = '[NgssmDataActionType] setDataSourceParameterValidity',\n\n // Clear the stored value associated to a data source\n clearDataSourceValue = '[NgssmDataActionType] clearDataSourceValue',\n\n // Store the value for a given data source\n setDataSourceValue = '[NgssmDataActionType] setDataSourceValue',\n\n // Call the loading method to get the value for an additional property of the data source\n loadDataSourceAdditionalPropertyValue = '[NgssmDataActionType] loadDataSourceAdditionalPropertyValue',\n\n // Store the value for an additional property of the data source\n setDataSourceAdditionalPropertyValue = '[NgssmDataActionType] setDataSourceAdditionalPropertyValue'\n}\n","import { Action } from 'ngssm-store';\n\nexport class NgssmDataSourceValueAction implements Action {\n constructor(\n public readonly type: string,\n public readonly key: string\n ) {}\n}\n","import { NgssmDataSourceValueAction } from './ngssm-data-source-value.action';\nimport { NgssmDataActionType } from './ngssm-data-action-type';\nimport { NgssmLoadDataSourceOptions } from '../model';\n\nexport class NgssmLoadDataSourceValueAction<TParameter = unknown> extends NgssmDataSourceValueAction {\n constructor(\n key: string,\n public readonly options?: NgssmLoadDataSourceOptions<TParameter>\n ) {\n super(NgssmDataActionType.loadDataSourceValue, key);\n }\n}\n","import { HttpErrorResponse } from '@angular/common/http';\n\nimport { NgssmDataSourceValueAction } from './ngssm-data-source-value.action';\nimport { NgssmDataActionType } from './ngssm-data-action-type';\nimport { NgssmDataSourceValueStatus } from '../model';\n\nexport class NgssmSetDataSourceValueAction<TData = unknown> extends NgssmDataSourceValueAction {\n constructor(\n key: string,\n public readonly status: NgssmDataSourceValueStatus,\n public readonly value?: TData,\n public readonly httpErrorResponse?: HttpErrorResponse\n ) {\n super(NgssmDataActionType.setDataSourceValue, key);\n }\n}\n","import { Action } from 'ngssm-store';\n\nimport { NgssmDataActionType } from './ngssm-data-action-type';\nimport { NgssmDataSource } from '../model';\n\nexport class NgssmRegisterDataSourcesAction implements Action {\n public readonly type: string = NgssmDataActionType.registerDataSources;\n\n constructor(public readonly dataSources: NgssmDataSource[]) {}\n}\n","import { NgssmDataSourceValueAction } from './ngssm-data-source-value.action';\nimport { NgssmDataActionType } from './ngssm-data-action-type';\n\nexport class NgssmClearDataSourceValueAction extends NgssmDataSourceValueAction {\n constructor(\n key: string,\n public readonly clearParameter = false\n ) {\n super(NgssmDataActionType.clearDataSourceValue, key);\n }\n}\n","import { NgssmDataActionType } from './ngssm-data-action-type';\nimport { NgssmDataSourceValueAction } from './ngssm-data-source-value.action';\n\nexport class NgssmSetDataSourceParameterAction<TParameter = unknown> extends NgssmDataSourceValueAction {\n constructor(\n key: string,\n public readonly parameter?: TParameter,\n public readonly parameterIsValid?: boolean,\n public readonly doNotMarkParameterAsModified?: boolean\n ) {\n super(NgssmDataActionType.setDataSourceParameter, key);\n }\n}\n","import { NgssmDataSourceValueAction } from './ngssm-data-source-value.action';\nimport { NgssmDataActionType } from './ngssm-data-action-type';\n\nexport class NgssmLoadDataSourceAdditionalPropertyValueAction extends NgssmDataSourceValueAction {\n constructor(\n key: string,\n public readonly property: string,\n public readonly forceReload?: boolean,\n public readonly postLoadingAction?: () => void\n ) {\n super(NgssmDataActionType.loadDataSourceAdditionalPropertyValue, key);\n }\n}\n","import { HttpErrorResponse } from '@angular/common/http';\n\nimport { NgssmDataSourceValueAction } from './ngssm-data-source-value.action';\nimport { NgssmDataSourceValueStatus } from '../model';\nimport { NgssmDataActionType } from './ngssm-data-action-type';\n\nexport class NgssmSetDataSourceAdditionalPropertyValueAction<TProperty = unknown> extends NgssmDataSourceValueAction {\n constructor(\n key: string,\n public readonly property: string,\n public readonly status: NgssmDataSourceValueStatus,\n public readonly value?: TProperty,\n public readonly postLoadingAction?: () => void,\n public readonly httpErrorResponse?: HttpErrorResponse\n ) {\n super(NgssmDataActionType.setDataSourceAdditionalPropertyValue, key);\n }\n}\n","import { Action } from 'ngssm-store';\n\nimport { NgssmDataActionType } from './ngssm-data-action-type';\nimport { NgssmDataSource } from '../model';\n\nexport class NgssmRegisterDataSourceAction implements Action {\n public readonly type: string = NgssmDataActionType.registerDataSource;\n\n constructor(public readonly dataSource: NgssmDataSource) {}\n}\n","import { Action } from 'ngssm-store';\nimport { NgssmDataActionType } from './ngssm-data-action-type';\n\nexport class NgssmUnregisterDataSourceAction implements Action {\n public readonly type: string = NgssmDataActionType.unregisterDataSource;\n\n constructor(public readonly dataSourceKey: string) {}\n}\n","import { NgssmDataActionType } from './ngssm-data-action-type';\nimport { NgssmDataSourceValueAction } from './ngssm-data-source-value.action';\n\n/**\n * Action to update part (partial) of a data source parameter.\n *\n * This action carries a Partial<TParameter> that will be merged with the existing parameter\n * for the specified data source key. By default, updating the parameter will mark the data\n * source value as outdated so it can be reloaded; set doNotUpdateValueOutdated to true to\n * avoid changing the valueOutdated flag when dispatching this action.\n *\n * The update of the parameter in state is made with a shallow merge. So be carefull with\n * the parameter value set in action.\n *\n * @template TParameter Type of the parameter object for the data source.\n * @param key The data source key whose parameter should be updated.\n * @param parameter Partial parameter to merge into the existing parameter.\n * @param doNotUpdateValueOutdated Optional flag to prevent marking the value as outdated.\n */\nexport class NgssmUpdateDataSourceParameterAction<TParameter = unknown> extends NgssmDataSourceValueAction {\n constructor(\n key: string,\n public readonly parameter: Partial<TParameter>,\n public readonly doNotUpdateValueOutdated?: boolean\n ) {\n super(NgssmDataActionType.updateDataSourceParameter, key);\n }\n}\n","import { NgssmDataSourceValueAction } from './ngssm-data-source-value.action';\nimport { NgssmDataActionType } from './ngssm-data-action-type';\n\n/**\n * Action used to set the validity state of a data source parameter.\n *\n * This action updates the overall parameter validity for the specified data source.\n * Optionally a partial validity key can be provided to indicate which sub-field or\n * portion of the parameter the validity refers to (useful when validating parameter\n * objects field-by-field).\n *\n * If `partialValidityKey` is provided the action targets only that partial entry and\n * does not change the global `parameterIsValid` flag. If `clearPartialValidities` is\n * true the reducer handling this action should clear the parameterPartialValidity map\n * (remove all partial validity entries) when applying the global validity update.\n *\n * @param key The data source key this validity applies to.\n * @param isValid True when the parameter (or partial parameter) is valid, false otherwise.\n * @param partialValidityKey Optional identifier for partial validity (e.g. the parameter field name).\n * If set, the global validity is not modified.\n * @param clearPartialValidities If true, instructs reducers to clear existing partial validity entries\n * when updating overall validity. Useful to reset per-field validity after\n * a full-parameter validation step.\n */\nexport class NgssmSetDataSourceParameterValidityAction extends NgssmDataSourceValueAction {\n constructor(\n key: string,\n public readonly isValid: boolean,\n public readonly partialValidityKey?: string,\n public readonly clearPartialValidities?: boolean\n ) {\n super(NgssmDataActionType.setDataSourceParameterValidity, key);\n }\n}\n","import { EnvironmentProviders, InjectionToken, inject, makeEnvironmentProviders } from '@angular/core';\nimport { Observable } from 'rxjs';\n\nimport { State, Store } from 'ngssm-store';\nimport { NgssmLoadDataSourceValueAction } from '../actions';\n\n/**\n * Function signature for loading a data source value.\n * - state: the current global application state.\n * - dataSourceKey: the unique key of the data source being loaded.\n * - parameter: optional parameter passed to the loader.\n *\n * Must return an Observable that emits the requested data.\n */\nexport type NgssmDataLoading<TData = unknown, TParameter = unknown> = (\n state: State,\n dataSourceKey: string,\n parameter?: TParameter\n) => Observable<TData>;\n\n/**\n * Function signature for loading an additional property of a data source (e.g. row detail).\n * - state: the current global application state.\n * - dataSourceKey: the unique key of the data source.\n * - additionalProperty: the name of the additional property to load.\n *\n * Must return an Observable that emits the requested additional property data.\n */\nexport type NgssmAdditionalPropertyLoading<TData = unknown> = (\n state: State,\n dataSourceKey: string,\n additionalProperty: string\n) => Observable<TData>;\n\n/**\n * Describes a data source and its optional behaviours.\n *\n * - key: unique identifier for the data source.\n * - dataLifetimeInSeconds: optional TTL for cached data (seconds).\n * - dataLoadingFunc: required function that loads the main data.\n * - additionalPropertyLoadingFunc: optional function to load named additional properties independently.\n * - initialParameter: optional parameter used initially when registering the data source.\n * - initialParameterInvalid: flag indicating the initial parameter should be considered invalid.\n * - linkedToDataSource: if specified, this data source is reloaded when the target source is updated.\n * - linkedDataSources: list of other data sources to reload when this source is updated.\n * - dependsOnDataSource: optional dependency key; when loading this source, the dependency will be loaded first.\n */\nexport interface NgssmDataSource<TData = unknown, TParameter = unknown, TAdditionalProperty = unknown> {\n key: string;\n dataLifetimeInSeconds?: number;\n dataLoadingFunc: NgssmDataLoading<TData, TParameter>;\n additionalPropertyLoadingFunc?: NgssmAdditionalPropertyLoading<TAdditionalProperty>;\n initialParameter?: TParameter;\n initialParameterInvalid?: boolean;\n linkedToDataSource?: string;\n linkedDataSources?: string[];\n dependsOnDataSource?: string;\n}\n\n/**\n * Injection token used to register data sources via DI.\n * Provide one or several NgssmDataSource objects using this token (multi: true).\n */\nexport const NGSSM_DATA_SOURCE = new InjectionToken<NgssmDataSource>('NGSSM_DATA_SOURCE');\n\n/**\n * Options accepted when providing a data source via provideNgssmDataSource.\n * See individual properties for behaviour.\n */\nexport interface NgssmDataSourceProvideOptions<TParameter = unknown, TAdditionalProperty = unknown> {\n dataLifetimeInSeconds?: number;\n initialParameter?: TParameter;\n initialParameterInvalid?: boolean;\n additionalPropertyLoadingFunc?: NgssmAdditionalPropertyLoading<TAdditionalProperty>;\n linkedToDataSource?: string;\n linkedDataSources?: string[];\n dependsOnDataSource?: string;\n}\n\n/**\n * Helper function to register a data source in Angular's environment providers.\n * Use provideNgssmData() at app startup to pick up data sources registered via this helper.\n */\nexport const provideNgssmDataSource = <TData = unknown, TParameter = unknown, TAdditionalProperty = unknown>(\n key: string,\n loadingFunc: NgssmDataLoading<TData, TParameter>,\n options?: NgssmDataSourceProvideOptions<TParameter, TAdditionalProperty>\n): EnvironmentProviders => {\n return makeEnvironmentProviders([\n {\n provide: NGSSM_DATA_SOURCE,\n useFactory: () => {\n const dataSource: NgssmDataSource<TData, TParameter, TAdditionalProperty> = {\n key,\n dataLifetimeInSeconds: options?.dataLifetimeInSeconds,\n dataLoadingFunc: loadingFunc,\n additionalPropertyLoadingFunc: options?.additionalPropertyLoadingFunc\n };\n\n if (options?.initialParameter) {\n dataSource.initialParameter = options?.initialParameter;\n }\n\n if (options?.initialParameterInvalid) {\n dataSource.initialParameterInvalid = options?.initialParameterInvalid;\n }\n\n if (options?.linkedToDataSource) {\n dataSource.linkedToDataSource = options?.linkedToDataSource;\n }\n\n if (options?.linkedDataSources) {\n dataSource.linkedDataSources = options?.linkedDataSources;\n }\n\n if (options?.dependsOnDataSource) {\n dataSource.dependsOnDataSource = options?.dependsOnDataSource;\n }\n\n return dataSource;\n },\n multi: true\n }\n ]);\n};\n\n/**\n * Guard / initializer helper that dispatches a NgssmLoadDataSourceValueAction for the given key.\n * Returns a function suitable for use in Router canActivate (or app initializers) that always returns true.\n */\nexport const ngssmLoadDataSourceValue = (key: string, forceReload = false): (() => boolean) => {\n return () => {\n inject(Store).dispatchAction(new NgssmLoadDataSourceValueAction(key, { forceReload }));\n return true;\n };\n};\n","import { HttpErrorResponse } from '@angular/common/http';\nimport { DateTime } from 'luxon';\n\n/**\n * Enum describing the lifecycle status of a data source value.\n * - none: No value has been requested or initialized.\n * - notRegistered: The requested data source is not registered.\n * - loading: A load operation for the data source is currently in progress.\n * - loaded: The data source loaded successfully and a value is available.\n * - error: The last load attempt failed.\n */\nexport enum NgssmDataSourceValueStatus {\n none = 'none',\n notRegistered = 'notRegistered',\n loading = 'loading',\n loaded = 'loaded',\n error = 'error'\n}\n\n/**\n * Represents the status and optional metadata for an additional property of a data source.\n * Additional properties are values related to the main data source value that may be loaded independently\n * (for example, a row detail).\n *\n * @template TProperty Type of the additional property's value.\n * @property status Current load status of the additional property.\n * @property value Optional value of the additional property.\n * @property lastLoadingDate Optional timestamp of the last successful load (luxon DateTime).\n * @property httpErrorResponse Optional HTTP error returned during the last load attempt.\n */\nexport interface NgssmDataSourceAdditionalPropertyValue<TProperty = unknown> {\n status: NgssmDataSourceValueStatus;\n value?: TProperty;\n lastLoadingDate?: DateTime;\n httpErrorResponse?: HttpErrorResponse;\n}\n\n/**\n * Represents the stored value and metadata for a data source.\n *\n * @template TData Type of the data source value.\n * @template TParameter Type of the parameter used to load the data source.\n * @property status Current load status of the data source.\n * @property value Optional value returned by the data source loader.\n * @property parameter Optional parameter used when loading the data source.\n * @property lastLoadingDate Optional timestamp of the last successful load (luxon DateTime).\n * @property dataLifetimeInSeconds Optional TTL for cached data, in seconds.\n * @property additionalProperties Map of additional property values (see NgssmDataSourceAdditionalPropertyValue).\n * @property parameterIsValid Optional flag indicating if the current parameter is valid.\n * @property parameterPartialValidity Optional map storing partial validity of parameter sub-fields (e.g. { fieldA: true, fieldB: false }).\n * @property httpErrorResponse Optional HTTP error returned during the last load attempt.\n * @property valueOutdated Optional flag indicating that the parameter changed and the value is now outdated.\n */\nexport interface NgssmDataSourceValue<TData = unknown, TParameter = unknown> {\n status: NgssmDataSourceValueStatus;\n value?: TData;\n parameter?: TParameter;\n lastLoadingDate?: DateTime;\n dataLifetimeInSeconds?: number;\n additionalProperties: Record<string, NgssmDataSourceAdditionalPropertyValue>;\n parameterIsValid?: boolean;\n\n /**\n * Map storing partial validity information for the parameter.\n * Key is a parameter field name (or any identifier) and value is boolean validity.\n * Undefined when no partial validation data is present.\n */\n parameterPartialValidity?: Record<string, boolean>;\n\n httpErrorResponse?: HttpErrorResponse;\n\n // Parameter has been updated but not value\n valueOutdated?: boolean;\n}\n\n/**\n * Types and helper for automatic reload intervals of a data source value.\n * - NgssmDataSourceValueAutoReloadType: allowed string values for auto-reload selection.\n * - getNgssmDataSourceValueAutoReloadTypes: returns a list of label/value pairs usable for UI selects.\n */\nexport type NgssmDataSourceValueAutoReloadType = 'Off' | '1min' | '5min' | '15min';\nexport const getNgssmDataSourceValueAutoReloadTypes = (): { label: string; value: NgssmDataSourceValueAutoReloadType }[] => [\n { label: 'Off', value: 'Off' },\n { label: 'Every minute', value: '1min' },\n { label: 'Every 5 minutes', value: '5min' },\n { label: 'Every 15 minutes', value: '15min' }\n];\n\nexport const isNgssmDataSourceValueParameterValid = (dataSourceValue: NgssmDataSourceValue): boolean => {\n if (dataSourceValue.parameterPartialValidity) {\n let isValid = true;\n Object.values(dataSourceValue.parameterPartialValidity).forEach((isPartialValid) => {\n isValid = isValid && isPartialValid;\n });\n return isValid;\n }\n\n if (dataSourceValue.parameterIsValid === false) {\n return false;\n }\n\n return true;\n};\n","import update, { Spec } from 'immutability-helper';\n\nimport { Action, NgSsmFeatureState, State } from 'ngssm-store';\nimport { NgssmDataSource, NgssmDataSourceValue } from '../model';\n\nexport const selectNgssmDataState = (state: State): NgssmDataState => state[NgssmDataStateSpecification.featureStateKey] as NgssmDataState;\n\nexport const updateNgssmDataState = (state: State, command: Spec<NgssmDataState, never>): State =>\n update(state, {\n [NgssmDataStateSpecification.featureStateKey]: command\n });\n\nexport interface NgssmDataState {\n dataSourceValues: Record<string, NgssmDataSourceValue>;\n dataSources: Record<string, NgssmDataSource>;\n delayedActions: Record<string, Action>;\n}\n\n@NgSsmFeatureState({\n featureStateKey: NgssmDataStateSpecification.featureStateKey,\n initialState: NgssmDataStateSpecification.initialState\n})\nexport class NgssmDataStateSpecification {\n public static readonly featureStateKey = 'ngssm-data-state';\n public static readonly initialState: NgssmDataState = {\n dataSourceValues: {},\n dataSources: {},\n delayedActions: {}\n };\n}\n","import { Injectable } from '@angular/core';\n\nimport { Reducer, State, Action } from 'ngssm-store';\n\nimport {\n NgssmDataActionType,\n NgssmRegisterDataSourceAction,\n NgssmRegisterDataSourcesAction,\n NgssmUnregisterDataSourceAction\n} from '../actions';\nimport { NgssmDataSource, NgssmDataSourceValue, NgssmDataSourceValueStatus } from '../model';\nimport { selectNgssmDataState, updateNgssmDataState } from '../state';\n\n@Injectable()\nexport class DataSourcesRegistrationReducer implements Reducer {\n public readonly processedActions: string[] = [\n NgssmDataActionType.registerDataSources,\n NgssmDataActionType.registerDataSource,\n NgssmDataActionType.unregisterDataSource\n ];\n\n public updateState(state: State, action: Action): State {\n switch (action.type) {\n case NgssmDataActionType.registerDataSources: {\n const registerDataSourcesAction = action as NgssmRegisterDataSourcesAction;\n const dataSourceValues: Record<string, NgssmDataSourceValue> = {};\n const dataSources: Record<string, NgssmDataSource> = {};\n registerDataSourcesAction.dataSources.forEach((dataSource) => {\n if (selectNgssmDataState(state).dataSources[dataSource.key]) {\n return;\n }\n\n dataSourceValues[dataSource.key] = {\n status: NgssmDataSourceValueStatus.none,\n additionalProperties: {}\n };\n\n if (dataSource.dataLifetimeInSeconds) {\n dataSourceValues[dataSource.key].dataLifetimeInSeconds = dataSource.dataLifetimeInSeconds;\n }\n\n if (dataSource.initialParameter) {\n dataSourceValues[dataSource.key].parameter = dataSource.initialParameter;\n }\n\n if (dataSource.initialParameterInvalid) {\n dataSourceValues[dataSource.key].parameterIsValid = false;\n }\n\n dataSources[dataSource.key] = dataSource;\n });\n\n return updateNgssmDataState(state, {\n dataSourceValues: { $merge: dataSourceValues },\n dataSources: { $merge: dataSources }\n });\n }\n\n case NgssmDataActionType.registerDataSource: {\n const registerDataSourceAction = action as NgssmRegisterDataSourceAction;\n return this.updateState(state, new NgssmRegisterDataSourcesAction([registerDataSourceAction.dataSource]));\n }\n\n case NgssmDataActionType.unregisterDataSource: {\n const unregisterDataSource = action as NgssmUnregisterDataSourceAction;\n return updateNgssmDataState(state, {\n dataSourceValues: { $unset: [unregisterDataSource.dataSourceKey] },\n dataSources: { $unset: [unregisterDataSource.dataSourceKey] }\n });\n }\n }\n\n return state;\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { DateTime } from 'luxon';\n\nimport { Reducer, State, Action } from 'ngssm-store';\n\nimport { NgssmClearDataSourceValueAction, NgssmDataActionType, NgssmSetDataSourceValueAction } from '../actions';\nimport { selectNgssmDataState, updateNgssmDataState } from '../state';\nimport { NgssmDataSourceValueStatus } from '../model';\n\n@Injectable()\nexport class DataSourceValueReducer implements Reducer {\n public readonly processedActions: string[] = [NgssmDataActionType.setDataSourceValue, NgssmDataActionType.clearDataSourceValue];\n\n public updateState(state: State, action: Action): State {\n switch (action.type) {\n case NgssmDataActionType.setDataSourceValue: {\n const ngssmSetDataSourceValueAction = action as NgssmSetDataSourceValueAction;\n const dataSourceValue = selectNgssmDataState(state).dataSourceValues[ngssmSetDataSourceValueAction.key];\n if (!dataSourceValue) {\n break;\n }\n\n return updateNgssmDataState(state, {\n dataSourceValues: {\n [ngssmSetDataSourceValueAction.key]: {\n status: { $set: ngssmSetDataSourceValueAction.status },\n value: { $set: ngssmSetDataSourceValueAction.value },\n lastLoadingDate: { $set: DateTime.now() },\n httpErrorResponse: { $set: ngssmSetDataSourceValueAction.httpErrorResponse }\n // leave parameterPartialValidity as-is on value set (no change here)\n }\n }\n });\n }\n\n case NgssmDataActionType.clearDataSourceValue: {\n const ngssmClearDataSourceValueAction = action as NgssmClearDataSourceValueAction;\n let currentState = state;\n if (ngssmClearDataSourceValueAction.clearParameter) {\n currentState = updateNgssmDataState(state, {\n dataSourceValues: {\n [ngssmClearDataSourceValueAction.key]: {\n parameter: { $set: undefined },\n parameterIsValid: { $set: undefined },\n // clear partial validity when parameter is cleared\n parameterPartialValidity: { $set: undefined }\n }\n }\n });\n }\n\n return updateNgssmDataState(currentState, {\n dataSourceValues: {\n [ngssmClearDataSourceValueAction.key]: {\n status: { $set: NgssmDataSourceValueStatus.none },\n value: { $set: undefined },\n lastLoadingDate: { $set: undefined },\n additionalProperties: { $set: {} },\n httpErrorResponse: { $set: undefined }\n }\n }\n });\n }\n }\n\n return state;\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { DateTime } from 'luxon';\n\nimport { Reducer, State, Action } from 'ngssm-store';\n\nimport { NgssmDataActionType, NgssmLoadDataSourceValueAction } from '../actions';\nimport { selectNgssmDataState, updateNgssmDataState } from '../state';\nimport { NgssmDataSourceValueStatus } from '../model';\n\n@Injectable()\nexport class LoadDataSourceValueReducer implements Reducer {\n public readonly processedActions: string[] = [NgssmDataActionType.loadDataSourceValue];\n\n public updateState(state: State, action: Action): State {\n if (action.type !== NgssmDataActionType.loadDataSourceValue) {\n return state;\n }\n\n const loadDataSourceValue = action as NgssmLoadDataSourceValueAction;\n\n // If data source is not defined, return input state\n const dataSource = selectNgssmDataState(state).dataSources[loadDataSourceValue.key];\n if (!dataSource) {\n return state;\n }\n\n let currentState = state;\n\n // Check if source depends on another one\n if (dataSource.dependsOnDataSource) {\n const masterSourceValue = selectNgssmDataState(state).dataSourceValues[dataSource.dependsOnDataSource];\n if (masterSourceValue && masterSourceValue.status !== NgssmDataSourceValueStatus.loaded) {\n return updateNgssmDataState(state, {\n delayedActions: {\n [dataSource.dependsOnDataSource]: { $set: action }\n }\n });\n }\n\n if (selectNgssmDataState(state).delayedActions[dataSource.dependsOnDataSource] === action) {\n currentState = updateNgssmDataState(state, {\n delayedActions: { $unset: [dataSource.dependsOnDataSource] }\n });\n }\n }\n\n const dataSourceValue = selectNgssmDataState(state).dataSourceValues[loadDataSourceValue.key];\n if (!dataSourceValue) {\n return state;\n }\n\n let shouldReload = false;\n\n if (loadDataSourceValue.options?.parameter) {\n shouldReload = true;\n currentState = updateNgssmDataState(currentState, {\n dataSourceValues: {\n [loadDataSourceValue.key]: {\n parameter: { $set: loadDataSourceValue.options?.parameter.value }\n }\n }\n });\n }\n\n if (dataSourceValue.status === NgssmDataSourceValueStatus.loaded) {\n if (loadDataSourceValue.options?.forceReload === true || !dataSourceValue.dataLifetimeInSeconds || !dataSourceValue.lastLoadingDate) {\n shouldReload = true;\n } else {\n const dataLifetime = DateTime.now().diff(dataSourceValue.lastLoadingDate, 'second');\n if ((dataLifetime.toObject().seconds ?? 0) > dataSourceValue.dataLifetimeInSeconds) {\n shouldReload = true;\n }\n }\n } else {\n shouldReload = true;\n }\n\n if (dataSourceValue.parameterIsValid === false) {\n shouldReload = false;\n }\n\n if (shouldReload) {\n if (loadDataSourceValue.options?.keepAdditionalProperties !== true) {\n currentState = updateNgssmDataState(currentState, {\n dataSourceValues: {\n [loadDataSourceValue.key]: {\n additionalProperties: { $set: {} }\n }\n }\n });\n }\n\n if (loadDataSourceValue.options?.resetValue === true) {\n currentState = updateNgssmDataState(currentState, {\n dataSourceValues: {\n [loadDataSourceValue.key]: {\n value: { $set: undefined }\n }\n }\n });\n }\n\n return updateNgssmDataState(currentState, {\n dataSourceValues: {\n [loadDataSourceValue.key]: {\n status: { $set: NgssmDataSourceValueStatus.loading },\n valueOutdated: { $set: false }\n }\n }\n });\n }\n\n return state;\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { DateTime } from 'luxon';\n\nimport { Reducer, State, Action } from 'ngssm-store';\n\nimport {\n NgssmDataActionType,\n NgssmLoadDataSourceAdditionalPropertyValueAction,\n NgssmSetDataSourceAdditionalPropertyValueAction\n} from '../actions';\nimport { selectNgssmDataState, updateNgssmDataState } from '../state';\nimport { NgssmDataSourceValueStatus } from '../model';\n\n@Injectable()\nexport class DataSourceAdditionalPropertyValueReducer implements Reducer {\n public readonly processedActions: string[] = [\n NgssmDataActionType.loadDataSourceAdditionalPropertyValue,\n NgssmDataActionType.setDataSourceAdditionalPropertyValue\n ];\n\n public updateState(state: State, action: Action): State {\n switch (action.type) {\n case NgssmDataActionType.loadDataSourceAdditionalPropertyValue: {\n const ngssmLoadDataSourceAdditionalPropertyValueAction = action as NgssmLoadDataSourceAdditionalPropertyValueAction;\n const dataSourcePropertyValue =\n selectNgssmDataState(state).dataSourceValues[ngssmLoadDataSourceAdditionalPropertyValueAction.key]?.additionalProperties[\n ngssmLoadDataSourceAdditionalPropertyValueAction.property\n ];\n\n if (\n dataSourcePropertyValue?.status === NgssmDataSourceValueStatus.loaded &&\n ngssmLoadDataSourceAdditionalPropertyValueAction.forceReload !== true\n ) {\n break;\n }\n\n if (!dataSourcePropertyValue) {\n return updateNgssmDataState(state, {\n dataSourceValues: {\n [ngssmLoadDataSourceAdditionalPropertyValueAction.key]: {\n additionalProperties: {\n [ngssmLoadDataSourceAdditionalPropertyValueAction.property]: {\n $set: {\n status: NgssmDataSourceValueStatus.loading\n }\n }\n }\n }\n }\n });\n }\n\n return updateNgssmDataState(state, {\n dataSourceValues: {\n [ngssmLoadDataSourceAdditionalPropertyValueAction.key]: {\n additionalProperties: {\n [ngssmLoadDataSourceAdditionalPropertyValueAction.property]: {\n status: { $set: NgssmDataSourceValueStatus.loading }\n }\n }\n }\n }\n });\n }\n\n case NgssmDataActionType.setDataSourceAdditionalPropertyValue: {\n const ngssmSetDataSourceAdditionalPropertyValueAction = action as NgssmSetDataSourceAdditionalPropertyValueAction;\n return updateNgssmDataState(state, {\n dataSourceValues: {\n [ngssmSetDataSourceAdditionalPropertyValueAction.key]: {\n additionalProperties: {\n [ngssmSetDataSourceAdditionalPropertyValueAction.property]: {\n $set: {\n status: ngssmSetDataSourceAdditionalPropertyValueAction.status,\n value: ngssmSetDataSourceAdditionalPropertyValueAction.value,\n lastLoadingDate: DateTime.now(),\n httpErrorResponse: ngssmSetDataSourceAdditionalPropertyValueAction.httpErrorResponse\n }\n }\n }\n }\n }\n });\n }\n }\n\n return state;\n }\n}\n","import { State } from 'ngssm-store';\n\nimport {\n isNgssmDataSourceValueParameterValid,\n NgssmDataSourceAdditionalPropertyValue,\n NgssmDataSourceValue,\n NgssmDataSourceValueStatus\n} from './model';\nimport { selectNgssmDataState } from './state/ngssm-data.state';\n\nexport const selectNgssmDataSourceValue = <TDataType = unknown, TParameter = unknown>(\n state: State,\n key: string\n): NgssmDataSourceValue<TDataType, TParameter> => {\n return (selectNgssmDataState(state).dataSourceValues[key] ?? {\n status: NgssmDataSourceValueStatus.notRegistered\n }) as NgssmDataSourceValue<TDataType, TParameter>;\n};\n\nexport const selectNgssmDataSourceAdditionalPropertyValue = <TProperty = unknown>(\n state: State,\n key: string,\n property: string\n): NgssmDataSourceAdditionalPropertyValue<TProperty> => {\n return (selectNgssmDataState(state).dataSourceValues[key]?.additionalProperties[property] ?? {\n status: NgssmDataSourceValueStatus.notRegistered\n }) as NgssmDataSourceAdditionalPropertyValue<TProperty>;\n};\n\n/**\n * Returns true if the specified data source is currently loading, false otherwise.\n * @param state The global application state.\n * @param dataSourceKey The unique key of the data source.\n */\nexport const isNgssmDataSourceLoading = (state: State, dataSourceKey: string): boolean =>\n selectNgssmDataSourceValue(state, dataSourceKey)?.status === NgssmDataSourceValueStatus.loading;\n\n/**\n * Determines whether the parameter for the specified data source should be considered valid.\n *\n * Rules:\n * - If parameterIsValid is explicitly true or false on the data source value, that value is returned.\n * - Otherwise, if parameterPartialValidity map exists, the function returns true only if all\n * partial entries are true (logical AND).\n * - If no explicit validity information is present, the parameter is considered valid (returns true).\n *\n * @param state The global application state.\n * @param dataSourceKey The key of the data source to check.\n * @returns True when the parameter (or all partial parameter entries) is valid, false otherwise.\n */\nexport const isNgssmDataSourceParameterValid = (state: State, dataSourceKey: string): boolean => {\n const dataSource = selectNgssmDataSourceValue(state, dataSourceKey);\n if (!dataSource) {\n return true;\n }\n\n return isNgssmDataSourceValueParameterValid(dataSource);\n};\n\n/**\n * Throws an Error if the data source value for the given key does not exist in the state.\n *\n * This is a convenience guard used by callers that require the data source value to be present.\n * Use throwIfSourceValueDoesNotExist(state, key) to validate presence before accessing the value.\n *\n * @param state The global application state.\n * @param dataSourceKey The key of the data source to check.\n * @throws Error when the data source value is not present in the state.\n */\nexport const throwIfSourceValueDoesNotExist = (state: State, dataSourceKey?: string) => {\n if (!dataSourceKey) {\n return;\n }\n\n const dataSource = selectNgssmDataSourceValue(state, dataSourceKey);\n if (!dataSource || dataSource.status === NgssmDataSourceValueStatus.notRegistered) {\n throw new Error(`Datasource ${dataSourceKey} does not exists.`);\n }\n};\n","import { Injectable } from '@angular/core';\n\nimport update from 'immutability-helper';\n\nimport { Reducer, State, Action } from 'ngssm-store';\n\nimport {\n NgssmDataActionType,\n NgssmDataSourceValueAction,\n NgssmSetDataSourceParameterAction,\n NgssmSetDataSourceParameterValidityAction,\n NgssmUpdateDataSourceParameterAction\n} from '../actions';\nimport { updateNgssmDataState } from '../state';\nimport { selectNgssmDataSourceValue, throwIfSourceValueDoesNotExist } from '../selectors';\n\n@Injectable()\nexport class DataSourceParameterReducer implements Reducer {\n public readonly processedActions: string[] = [\n NgssmDataActionType.setDataSourceParameter,\n NgssmDataActionType.updateDataSourceParameter,\n NgssmDataActionType.setDataSourceParameterValidity\n ];\n\n public updateState(state: State, action: Action): State {\n throwIfSourceValueDoesNotExist(state, (action as NgssmDataSourceValueAction).key);\n\n switch (action.type) {\n case NgssmDataActionType.setDataSourceParameter: {\n const ngssmSetDataSourceParameterAction = action as NgssmSetDataSourceParameterAction;\n return updateNgssmDataState(state, {\n dataSourceValues: {\n [ngssmSetDataSourceParameterAction.key]: {\n parameter: { $set: ngssmSetDataSourceParameterAction.parameter },\n parameterIsValid: { $set: ngssmSetDataSourceParameterAction.parameterIsValid },\n valueOutdated: { $set: ngssmSetDataSourceParameterAction.doNotMarkParameterAsModified === true ? false : true }\n // leave parameterPartialValidity as-is on value set (no change here)\n }\n }\n });\n }\n\n case NgssmDataActionType.updateDataSourceParameter: {\n const ngssmUpdateDataSourceParameterAction = action as NgssmUpdateDataSourceParameterAction;\n const newParameter = update<object, never>(\n selectNgssmDataSourceValue(state, ngssmUpdateDataSourceParameterAction.key)?.parameter as object,\n {\n $merge: ngssmUpdateDataSourceParameterAction.parameter\n }\n );\n\n const updatedState = updateNgssmDataState(state, {\n dataSourceValues: {\n [ngssmUpdateDataSourceParameterAction.key]: {\n parameter: { $set: newParameter }\n }\n }\n });\n\n if (ngssmUpdateDataSourceParameterAction.doNotUpdateValueOutdated === true) {\n return updatedState;\n }\n\n return updateNgssmDataState(updatedState, {\n dataSourceValues: {\n [ngssmUpdateDataSourceParameterAction.key]: {\n valueOutdated: { $set: true }\n }\n }\n });\n }\n\n case NgssmDataActionType.setDataSourceParameterValidity: {\n const ngssmSetDataSourceParameterValidityAction = action as NgssmSetDataSourceParameterValidityAction;\n if (ngssmSetDataSourceParameterValidityAction.partialValidityKey) {\n return this.setPartialValidity(\n state,\n ngssmSetDataSourceParameterValidityAction.key,\n ngssmSetDataSourceParameterValidityAction.isValid,\n ngssmSetDataSourceParameterValidityAction.partialValidityKey\n );\n }\n\n return this.setGlobalValidity(\n state,\n ngssmSetDataSourceParameterValidityAction.key,\n ngssmSetDataSourceParameterValidityAction.isValid,\n ngssmSetDataSourceParameterValidityAction.clearPartialValidities\n );\n }\n }\n\n return state;\n }\n\n private setGlobalValidity(state: State, key: string, isValid: boolean, clearPartialValidities?: boolean): State {\n if (clearPartialValidities === true) {\n return updateNgssmDataState(state, {\n dataSourceValues: {\n [key]: {\n parameterIsValid: { $set: isValid },\n parameterPartialValidity: { $set: undefined }\n }\n }\n });\n }\n\n return updateNgssmDataState(state, {\n dataSourceValues: {\n [key]: {\n parameterIsValid: { $set: isValid }\n }\n }\n });\n }\n\n private setPartialValidity(state: State, key: string, isValid: boolean, partialKey: string): State {\n if (selectNgssmDataSourceValue(state, key)?.parameterPartialValidity) {\n return updateNgssmDataState(state, {\n dataSourceValues: {\n [key]: {\n parameterPartialValidity: {\n [partialKey]: { $set: isValid }\n }\n }\n }\n });\n }\n\n return updateNgssmDataState(state, {\n dataSourceValues: {\n [key]: {\n parameterPartialValidity: {\n $set: {\n [partialKey]: isValid\n }\n }\n }\n }\n });\n }\n}\n","import { EnvironmentInjector, inject, Injectable, runInInjectionContext } from '@angular/core';\n\nimport { Effect, State, Action, Logger, ActionDispatcher } from 'ngssm-store';\n\nimport {\n NgssmDataActionType,\n NgssmDataSourceValueAction,\n NgssmLoadDataSourceAdditionalPropertyValueAction,\n NgssmSetDataSourceAdditionalPropertyValueAction,\n NgssmSetDataSourceValueAction\n} from '../actions';\nimport { selectNgssmDataState } from '../state';\nimport { NgssmDataSourceValueStatus } from '../model';\n\n@Injectable()\nexport class DataLoadingEffect implements Effect {\n public readonly processedActions: string[] = [\n NgssmDataActionType.loadDataSourceValue,\n NgssmDataActionType.loadDataSourceAdditionalPropertyValue\n ];\n\n private readonly injector = inject(EnvironmentInjector);\n private readonly logger = inject(Logger);\n\n public processAction(actiondispatcher: ActionDispatcher, state: State, action: Action): void {\n const key = (action as NgssmDataSourceValueAction).key;\n const dataSource = selectNgssmDataState(state).dataSources[key];\n if (!dataSource) {\n this.logger.error(`No data source setup for key '${key}'`);\n return;\n }\n\n const dataSourceValue = selectNgssmDataState(state).dataSourceValues[key];\n\n switch (action.type) {\n case NgssmDataActionType.loadDataSourceValue: {\n if (dataSourceValue?.status !== NgssmDataSourceValueStatus.loading) {\n this.logger.information(\n `Data source value for '${key}' is not in '${NgssmDataSourceValueStatus.loading}' status: '${dataSourceValue?.status}'`\n );\n return;\n }\n\n runInInjectionContext(this.injector, () => {\n dataSource.dataLoadingFunc(state, key, dataSourceValue.parameter).subscribe({\n next: (value) =>\n actiondispatcher.dispatchAction(new NgssmSetDataSourceValueAction(key, NgssmDataSourceValueStatus.loaded, value)),\n error: (error) => {\n this.logger.error(`Unable to load data for '${key}'`, error);\n actiondispatcher.dispatchAction(new NgssmSetDataSourceValueAction(key, NgssmDataSourceValueStatus.error, undefined, error));\n }\n });\n });\n\n break;\n }\n\n case NgssmDataActionType.loadDataSourceAdditionalPropertyValue: {\n const ngssmLoadDataSourceAdditionalPropertyValueAction = action as NgssmLoadDataSourceAdditionalPropertyValueAction;\n const property = ngssmLoadDataSourceAdditionalPropertyValueAction.property;\n if (dataSourceValue.additionalProperties[property]?.status !== NgssmDataSourceValueStatus.loading) {\n this.logger.information(\n `Data source additional property value for '${key}' and property '${property}' is not in '${NgssmDataSourceValueStatus.loading}' status: '${dataSourceValue?.status}'`\n );\n return;\n }\n\n runInInjectionContext(this.injector, () => {\n dataSource.additionalPropertyLoadingFunc?.(state, key, property).subscribe({\n next: (value) =>\n actiondispatcher.dispatchAction(\n new NgssmSetDataSourceAdditionalPropertyValueAction(\n key,\n property,\n NgssmDataSourceValueStatus.loaded,\n value,\n ngssmLoadDataSourceAdditionalPropertyValueAction.postLoadingAction\n )\n ),\n error: (error) => {\n this.logger.error(`Unable to load data for '${key}' and property '${property}'`, error);\n actiondispatcher.dispatchAction(\n new NgssmSetDataSourceAdditionalPropertyValueAction(\n key,\n property,\n NgssmDataSourceValueStatus.error,\n undefined,\n ngssmLoadDataSourceAdditionalPropertyValueAction.postLoadingAction,\n error\n )\n );\n }\n });\n });\n\n break;\n }\n }\n }\n}\n","import { effect, EnvironmentInjector, inject, runInInjectionContext } from '@angular/core';\n\nimport { Logger, Store } from 'ngssm-store';\n\nimport {\n NgssmDataActionType,\n NgssmLoadDataSourceAdditionalPropertyValueAction,\n NgssmSetDataSourceAdditionalPropertyValueAction\n} from './actions';\nimport { NgssmDataSourceValueStatus } from './model';\nimport { selectNgssmDataSourceAdditionalPropertyValue } from './selectors';\n\nexport const postLoadingActionExecutorInitializer = async () => {\n const injector = inject(EnvironmentInjector);\n const store = inject(Store);\n const logger = inject(Logger);\n\n effect(() => {\n const action = store.processedAction();\n if (action.type === NgssmDataActionType.loadDataSourceAdditionalPropertyValue) {\n const ngssmLoadDataSourceAdditionalPropertyValueAction = action as NgssmLoadDataSourceAdditionalPropertyValueAction;\n if (!ngssmLoadDataSourceAdditionalPropertyValueAction.postLoadingAction) {\n return;\n }\n\n const isLoaded =\n selectNgssmDataSourceAdditionalPropertyValue(\n store.state(),\n ngssmLoadDataSourceAdditionalPropertyValueAction.key,\n ngssmLoadDataSourceAdditionalPropertyValueAction.property\n )?.status === NgssmDataSourceValueStatus.loaded;\n\n if (isLoaded) {\n logger.information(`[postLoadingActionExecutor] Executing post loading action for ${action.type}`);\n runInInjectionContext(injector, ngssmLoadDataSourceAdditionalPropertyValueAction.postLoadingAction);\n }\n\n return;\n }\n\n if (action.type === NgssmDataActionType.setDataSourceAdditionalPropertyValue) {\n const ngssmSetDataSourceAdditionalPropertyValueAction = action as NgssmSetDataSourceAdditionalPropertyValueAction;\n if (!ngssmSetDataSourceAdditionalPropertyValueAction.postLoadingAction) {\n return;\n }\n\n logger.information(`[postLoadingActionExecutor] Executing post loading action for ${action.type}`);\n runInInjectionContext(injector, ngssmSetDataSourceAdditionalPropertyValueAction.postLoadingAction);\n }\n });\n\n return true;\n};\n","import { effect, inject, untracked } from '@angular/core';\n\nimport { Logger, State, Store } from 'ngssm-store';\n\nimport { NgssmSetDataSourceValueAction, NgssmDataActionType, NgssmLoadDataSourceValueAction } from './actions';\nimport { selectNgssmDataState } from './state';\n\nexport const dataSourcesLinkerInitializer = async () => {\n const store = inject(Store);\n const logger = inject(Logger);\n\n effect(() => {\n const action = store.processedAction();\n if (action.type !== NgssmDataActionType.setDataSourceValue) {\n return;\n }\n\n const setDataSourceValueAction = action as NgssmSetDataSourceValueAction;\n const state = selectNgssmDataState(untracked<State>(() => store.state())).dataSources;\n\n const linkedKeys = new Set(state[setDataSourceValueAction.key]?.linkedDataSources ?? []);\n for (const linkedKey of Object.keys(state).filter((key) => state[key].linkedToDataSource === setDataSourceValueAction.key)) {\n logger.information(`Force reload of data source'${linkedKey}' linked to '${setDataSourceValueAction.key}'`);\n linkedKeys.add(linkedKey);\n }\n\n for (const linkedKey of linkedKeys) {\n store.dispatchAction(\n new NgssmLoadDataSourceValueAction(linkedKey, {\n forceReload: true\n })\n );\n }\n });\n\n return true;\n};\n","import { effect, inject, untracked } from '@angular/core';\n\nimport { EffectFunc, State, Action, Logger, Store } from 'ngssm-store';\n\nimport { NgssmDataActionType, NgssmLoadDataSourceValueAction, NgssmSetDataSourceValueAction } from './actions';\nimport { selectNgssmDataSourceValue } from './selectors';\nimport { NgssmDataSourceValueStatus } from './model';\nimport { selectNgssmDataState } from './state';\n\n/**\n * Effect function that handles loading a data source with a dependency.\n *\n * This effect checks if the requested data source has a dependency that is not yet loaded.\n * If the data source is not currently loading and has a dependency, it dispatches an action\n * to load the dependency data source first. If the data source does not have a dependency,\n * it logs an error message.\n *\n * @param state - The current application state.\n * @param action - The action triggering the effect, expected to be of type NgssmLoadDataSourceValueAction.\n * @returns void\n */\nexport const loadDataSourceWithDependencyEffect: EffectFunc = (state: State, action: Action) => {\n const ngssmLoadDataSourceValueAction = action as NgssmLoadDataSourceValueAction;\n const dataSourceValue = selectNgssmDataSourceValue(state, ngssmLoadDataSourceValueAction.key);\n\n // We only take into account source with a dependency not already loaded. In that case, the status must not be loading.\n if (dataSourceValue.status === NgssmDataSourceValueStatus.loading) {\n return;\n }\n\n const dataSource = selectNgssmDataState(state).dataSources[ngssmLoadDataSourceValueAction.key];\n\n const dependency = dataSource.dependsOnDataSource;\n if (!dependency) {\n // Date source is already loaded and has no dependency.\n // This is the usual case with data source with a lifetime not null and reloaded without being forced when a page is opened.\n return;\n }\n\n const store = inject(Store);\n store.dispatchAction(new NgssmLoadDataSourceValueAction(dependency));\n};\n\n/**\n * Effect initializer that listens for NgssmSetDataSourceValueAction and dispatches any delayed loading actions\n * for dependent data sources. This ensures that when a data source is set, any queued actions for sources\n * waiting on this dependency are executed.\n */\nexport const dependentDataSourceLoadInitializer = async () => {\n const store = inject(Store);\n const logger = inject(Logger);\n\n effect(() => {\n const action = store.processedAction();\n if (action.type !== NgssmDataActionType.setDataSourceValue) {\n return;\n }\n\n const setDataSourceValueAction = action as NgssmSetDataSourceValueAction;\n const state = untracked<State>(() => store.state());\n\n const storedAction = selectNgssmDataState(state).delayedActions[setDataSourceValueAction.key];\n if (storedAction) {\n logger.information(`Dispatching delayed loading action for source ${(storedAction as NgssmLoadDataSourceValueAction).key}`);\n store.dispatchAction(storedAction);\n }\n });\n};\n","import { EnvironmentProviders, makeEnvironmentProviders, inject, provideAppInitializer } from '@angular/core';\n\nimport { Store, provideEffectFunc, provideEffects, provideReducers } from 'ngssm-store';\n\nimport { NGSSM_DATA_SOURCE, NgssmDataSource } from './model';\nimport {\n DataSourceAdditionalPropertyValueReducer,\n DataSourceParameterReducer,\n DataSourceValueReducer,\n DataSourcesRegistrationReducer,\n LoadDataSourceValueReducer\n} from './reducers';\nimport { DataLoadingEffect } from './effects';\nimport { NgssmDataActionType, NgssmRegisterDataSourcesAction } from './actions';\nimport { postLoadingActionExecutorInitializer } from './post-loading-action-executor';\nimport { dataSourcesLinkerInitializer } from './data-sources-linker';\nimport { dependentDataSourceLoadInitializer, loadDataSourceWithDependencyEffect } from './data-source-with-dependency';\n\nconst initDataSourceValues = () => {\n const store = inject(Store);\n const dataSources = (inject(NGSSM_DATA_SOURCE, { optional: true }) as unknown as NgssmDataSource[]) ?? [];\n if (dataSources.length > 0) {\n store.dispatchAction(new NgssmRegisterDataSourcesAction(dataSources));\n }\n};\n\nexport const provideNgssmData = (): EnvironmentProviders => {\n return makeEnvironmentProviders([\n provideAppInitializer(initDataSourceValues),\n provideAppInitializer(postLoadingActionExecutorInitializer),\n provideAppInitializer(dataSourcesLinkerInitializer),\n provideAppInitializer(dependentDataSourceLoadInitializer),\n provideReducers(\n DataSourcesRegistrationReducer,\n DataSourceValueReducer,\n LoadDataSourceValueReducer,\n DataSourceAdditionalPropertyValueReducer,\n DataSourceParameterReducer\n ),\n provideEffects(DataLoadingEffect),\n provideEffectFunc(NgssmDataActionType.loadDataSourceValue, loadDataSourceWithDependencyEffect)\n ]);\n};\n","import { Pipe, PipeTransform } from '@angular/core';\n\nimport { State } from 'ngssm-store';\n\nimport { NgssmDataSourceValueStatus } from '../model';\nimport { selectNgssmDataSourceValue } from '../selectors';\n\n@Pipe({\n name: 'isNgssmDataSourceValueStatus'\n})\nexport class IsNgssmDataSourceValueStatusPipe implements PipeTransform {\n public transform(value: State, ...args: string[]): boolean {\n const key = args[0];\n const expectedStatuses = args.slice(1).map((a) => a as NgssmDataSourceValueStatus);\n const itemStatus = selectNgssmDataSourceValue(value, key).status;\n return expectedStatuses.includes(itemStatus);\n }\n}\n","import { Component, ChangeDetectionStrategy, input, OnDestroy } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { MatOption, MatSelect } from '@angular/material/select';\nimport { MatFormField, MatLabel } from '@angular/material/form-field';\n\nimport { getNgssmDataSourceValueAutoReloadTypes, NgssmDataSourceValueAutoReloadType } from '../../model';\n\n@Component({\n selector: 'ngssm-auto-reload',\n imports: [ReactiveFormsModule, MatFormField, MatLabel, MatSelect, MatOption],\n templateUrl: './ngssm-auto-reload.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class NgssmAutoReloadComponent implements OnDestroy {\n public readonly autoReloadAction = input<() => void>(() => {\n // nothing by default\n });\n\n protected readonly reloadTypes = getNgssmDataSourceValueAutoReloadTypes();\n protected readonly reloadTypeControl = new FormControl<NgssmDataSourceValueAutoReloadType>('Off');\n\n private timerId: number | undefined;\n\n constructor() {\n this.reloadTypeControl.valueChanges.subscribe((v) => {\n if (v === 'Off' && this.timerId) {\n clearInterval(this.timerId);\n this.timerId = undefined;\n return;\n }\n\n let period = 60000;\n switch (v) {\n case '5min':\n period = 5 * period;\n break;\n\n case '15min':\n period = 15 * period;\n break;\n }\n\n this.timerId = setInterval(this.autoReloadAction(), period) as unknown as number;\n });\n }\n\n public ngOnDestroy(): void {\n if (this.timerId) {\n clearInterval(this.timerId);\n this.timerId = undefined;\n }\n }\n}\n","<mat-form-field>\n <mat-label>Select auto reload period</mat-label>\n <mat-select [formControl]=\"reloadTypeControl\">\n @for (option of reloadTypes; track option.value){\n <mat-option [value]=\"option.value\">\n {{option.label}}\n </mat-option>\n }\n </mat-select>\n</mat-form-field>","import { Component, ChangeDetectionStrategy, signal, input, effect, inject } from '@angular/core';\nimport { NgClass } from '@angular/common';\nimport { MatTooltip } from '@angular/material/tooltip';\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\nimport { MatButton, MatIconButton } from '@angular/material/button';\nimport { MatIcon } from '@angular/material/icon';\n\nimport { DateTime } from 'luxon';\n\nimport { createSignal, Store } from 'ngssm-store';\n\nimport { selectNgssmDataState } from '../../state';\nimport { isNgssmDataSourceValueParameterValid, NgssmDataSourceValue, NgssmDataSourceValueStatus } from '../../model';\nimport { NgssmLoadDataSourceValueAction } from '../../actions';\nimport { NgssmAutoReloadComponent } from '../ngssm-auto-reload/ngssm-auto-reload.component';\n\n@Component({\n selector: 'ngssm-data-reload-button',\n imports: [NgClass, MatButton, MatIconButton, MatTooltip, MatIcon, MatProgressSpinner, NgssmAutoReloadComponent],\n templateUrl: './ngssm-data-reload-button.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class NgssmDataReloadButtonComponent {\n public readonly label = input<string | undefined>(undefined);\n public readonly keepAdditionalProperties = input(false);\n public readonly buttonIcon = input<string>('fa-solid fa-rotate-right');\n public readonly autoReloadEnabled = input(false);\n public readonly dataSourceKeys = input<string[]>([]);\n\n protected readonly loadInProgress = signal<boolean>(false);\n protected readonly buttonDisabled = signal<boolean>(true);\n protected readonly tooltipMessage = signal<string>('');\n protected readonly color = signal<string>('primary');\n\n private readonly store = inject(Store);\n private readonly dataSourceValues = createSignal<Record<string, NgssmDataSourceValue>>(\n (state) => selectNgssmDataState(state).dataSourceValues\n );\n\n constructor() {\n effect(() => {\n const values = this.dataSourceValues();\n const keys = this.dataSourceKeys();\n this.loadInProgress.set(keys.findIndex((v) => values[v]?.status === NgssmDataSourceValueStatus.loading) !== -1);\n let timestamp: DateTime | undefined;\n keys.forEach((key) => {\n const keyTimestamp = values[key]?.lastLoadingDate;\n if (keyTimestamp) {\n if (!timestamp || timestamp > keyTimestamp) {\n timestamp = keyTimestamp;\n }\n }\n });\n\n let tooltiMessage = 'Reload data.';\n if (timestamp) {\n tooltiMessage = [tooltiMessage, `Loaded at ${timestamp.toHTTP()}`].join('\\n');\n }\n this.tooltipMessage.set(tooltiMessage);\n\n if (this.loadInProgress()) {\n this.buttonDisabled.set(true);\n return;\n }\n\n const someHasAnInvalidParameter =\n keys.findIndex((key) => values[key] && isNgssmDataSourceValueParameterValid(values[key]) === false) !== -1;\n if (someHasAnInvalidParameter) {\n this.buttonDisabled.set(true);\n return;\n }\n\n this.buttonDisabled.set(keys.findIndex((v) => !!values[v]) === -1);\n\n const someHasAnOutdatedValue = keys.findIndex((key) => values[key]?.valueOutdated === true) !== -1;\n this.color.set(someHasAnOutdatedValue ? 'accent' : 'primary');\n });\n }\n\n protected readonly reloadAction = () => this.reload();\n\n protected reload(): void {\n const isDisabled = this.buttonDisabled();\n if (isDisabled) {\n return;\n }\n\n this.dataSourceKeys().forEach((key) =>\n this.store.dispatchAction(\n new NgssmLoadDataSourceValueAction(key, { forceReload: true, keepAdditionalProperties: this.keepAdditionalProperties() })\n )\n );\n }\n}\n","<div class=\"flex-row-center\">\n @if (label(); as buttonLabel) {\n <button\n mat-stroked-button\n [color]=\"color()\"\n class=\"mat-{{color()}}\"\n (click)=\"reload()\"\n [matTooltip]=\"tooltipMessage()\"\n [disabled]=\"buttonDisabled() === true\"\n id=\"reloadButton\">\n <div class=\"flex-row-center\">\n @if (loadInProgress()) {\n <mat-spinner [diameter]=\"24\" id=\"loadingSpinner\"></mat-spinner>\n } @else {\n <mat-icon [ngClass]=\"buttonIcon()\" [color]=\"color()\"></mat-icon>\n }\n\n <span style=\"width: 0.5rem\"></span>\n\n {{ buttonLabel }}\n </div>\n </button>\n } @else {\n <button\n mat-icon-button\n [color]=\"color()\"\n class=\"mat-{{color()}}\"\n (click)=\"reload()\"\n [matTooltip]=\"tooltipMessage()\"\n [disabled]=\"buttonDisabled() === true\"\n id=\"reloadButton\">\n @if (loadInProgress()) {\n <mat-spinner [diameter]=\"24\" id=\"loadingSpinner\"></mat-spinner>\n } @else {\n <mat-icon [ngClass]=\"buttonIcon()\" [color]=\"color()\"></mat-icon>\n }\n </button>\n }\n\n @if (autoReloadEnabled()) {\n <ngssm-auto-reload class=\"with-margin-left-8\" [autoReloadAction]=\"reloadAction\"></ngssm-auto-reload>\n }\n</div>\n","import { Directive, effect, inject, input, OnDestroy } from '@angular/core';\n\nimport { ACTION_DISPATCHER, ActionDispatcher } from 'ngssm-store';\n\nimport { NgssmDataSource } from '../model';\nimport { NgssmRegisterDataSourceAction, NgssmUnregisterDataSourceAction } from '../actions';\n\n@Directive({\n selector: '[ngssmScopedDataSource]'\n})\nexport class NgssmScopedDataSourceDirective implements OnDestroy {\n public readonly ngssmScopedDataSource = input.required<NgssmDataSource, NgssmDataSource>({\n transform: this.checkDataSoruce\n });\n\n private readonly actionDispatcher: ActionDispatcher = inject(ACTION_DISPATCHER);\n private isInitialized = false;\n\n constructor() {\n effect(() => {\n const dataSource = this.ngssmScopedDataSource();\n this.actionDispatcher.dispatchAction(new NgssmRegisterDataSourceAction(dataSource));\n });\n }\n\n public ngOnDestroy(): void {\n const key = this.ngssmScopedDataSource().key;\n if (key) {\n this.actionDispatcher.dispatchAction(new NgssmUnregisterDataSourceAction(key));\n }\n }\n\n private checkDataSoruce(value: NgssmDataSource): NgssmDataSource {\n if (this.isInitialized) {\n throw new Error('Data source is already set.');\n }\n\n this.isInitialized = true;\n\n return value;\n }\n}\n","import { computed, inject, Signal } from '@angular/core';\nimport { Store } from 'ngssm-store';\n\nimport { selectNgssmDataSourceValue } from './selectors';\n\nexport interface NgssmDataSourceSignal<T = unknown> {\n key: string;\n value: Signal<T>;\n}\n\nexport type NgssmDataSourceSignalType = 'value' | 'status' | 'parameter';\n\nexport interface NgssmDataSourceSignalOptions<T = unknown> {\n type?: NgssmDataSourceSignalType;\n defaultValue?: T;\n}\n\nexport const dataSourceToSignal = <T = unknown>(key: string, options?: NgssmDataSourceSignalOptions<T>): NgssmDataSourceSignal<T> => {\n const store = inject(Store);\n\n const usedOptions = options ?? { type: 'value' };\n if (!usedOptions.type) {\n usedOptions.type = 'value';\n }\n\n switch (usedOptions.type) {\n case 'status':\n return {\n key,\n value: computed(() => selectNgssmDataSourceValue(store.state(), key)?.status ?? options?.defaultValue) as Signal<T>\n };\n\n case 'value':\n return {\n key,\n value: computed(() => selectNgssmDataSourceValue<T>(store.state(), key)?.value ?? options?.defaultValue) as Signal<T>\n };\n\n case 'parameter':\n return {\n key,\n value: computed(() => selectNgssmDataSourceValue<T>(store.state(), key)?.parameter ?? options?.defaultValue) as Signal<T>\n };\n }\n};\n","import { Injector, effect, inject, runInInjectionContext } from '@angular/core';\n\nimport { Store } from 'ngssm-store';\n\nimport { NgssmDataSourceValueStatus } from './model';\nimport { NgssmDataActionType, NgssmSetDataSourceValueAction } from './actions';\n\n/**\n * Creates a runner function that executes a post-loading action when the specified data source's value is set.\n * The runner listens for NgssmSetDataSourceValueAction for the given dataSourceKey and invokes the provided postLoadingAction\n * with the new status. The effect is automatically destroyed after the action is processed.\n *\n * @param dataSourceKey The key of the data source to monitor.\n * @param postLoadingAction A callback to execute with the new NgssmDataSourceValueStatus. It is called in an injection context.\n * @returns A function that, when called, sets up the effect and runner.\n */\nexport const postNgssmDataSourceLoadingActionRunnerBuilder = (\n dataSourceKey: string,\n postLoadingAction: (status: NgssmDataSourceValueStatus) => void\n): (() => void) => {\n const injector = inject(Injector);\n return () => {\n runInInjectionContext(injector, () => {\n const store = inject(Store);\n const effectRef = effect(() => {\n const action = store.processedAction();\n if (action.type === NgssmDataActionType.setDataSourceValue) {\n const typedAction = action as NgssmSetDataSourceValueAction;\n if (typedAction.key === dataSourceKey) {\n runInInjectionContext(injector, () => postLoadingAction(typedAction.status));\n effectRef.destroy();\n }\n }\n });\n });\n };\n};\n","/*\n * Public API Surface of ngssm-data\n */\n\nexport * from './lib/ngssm-data/public-api';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngssm-data.mjs","sources":["../../../projects/ngssm-data/src/lib/ngssm-data/actions/ngssm-data-action-type.ts","../../../projects/ngssm-data/src/lib/ngssm-data/actions/ngssm-data-source-value.action.ts","../../../projects/ngssm-data/src/lib/ngssm-data/actions/ngssm-load-data-source-value.action.ts","../../../projects/ngssm-data/src/lib/ngssm-data/actions/ngssm-set-data-source-value.action.ts","../../../projects/ngssm-data/src/lib/ngssm-data/actions/ngssm-register-data-sources.action.ts","../../../projects/ngssm-data/src/lib/ngssm-data/actions/ngssm-clear-data-source-value.action.ts","../../../projects/ngssm-data/src/lib/ngssm-data/actions/ngssm-set-data-source-parameter.action.ts","../../../projects/ngssm-data/src/lib/ngssm-data/actions/ngssm-load-data-source-additional-property-value.action.ts","../../../projects/ngssm-data/src/lib/ngssm-data/actions/ngssm-set-data-source-additional-property-value.action.ts","../../../projects/ngssm-data/src/lib/ngssm-data/actions/ngssm-register-data-source.action.ts","../../../projects/ngssm-data/src/lib/ngssm-data/actions/ngssm-unregister-data-source.action.ts","../../../projects/ngssm-data/src/lib/ngssm-data/actions/ngssm-update-data-source-parameter.action.ts","../../../projects/ngssm-data/src/lib/ngssm-data/actions/ngssm-set-data-source-parameter-validity.action.ts","../../../projects/ngssm-data/src/lib/ngssm-data/model/ngssm-data-source.ts","../../../projects/ngssm-data/src/lib/ngssm-data/model/ngssm-data-source-value.ts","../../../projects/ngssm-data/src/lib/ngssm-data/state/ngssm-data.state.ts","../../../projects/ngssm-data/src/lib/ngssm-data/reducers/data-sources-registration.reducer.ts","../../../projects/ngssm-data/src/lib/ngssm-data/reducers/data-source-value.reducer.ts","../../../projects/ngssm-data/src/lib/ngssm-data/reducers/load-data-source-value.reducer.ts","../../../projects/ngssm-data/src/lib/ngssm-data/reducers/data-source-additional-property-value.reducer.ts","../../../projects/ngssm-data/src/lib/ngssm-data/selectors.ts","../../../projects/ngssm-data/src/lib/ngssm-data/reducers/data-source-parameter.reducer.ts","../../../projects/ngssm-data/src/lib/ngssm-data/effects/data-loading.effect.ts","../../../projects/ngssm-data/src/lib/ngssm-data/post-loading-action-executor.ts","../../../projects/ngssm-data/src/lib/ngssm-data/data-sources-linker.ts","../../../projects/ngssm-data/src/lib/ngssm-data/data-source-with-dependency.ts","../../../projects/ngssm-data/src/lib/ngssm-data/provide-ngssm-data.ts","../../../projects/ngssm-data/src/lib/ngssm-data/components/is-ngssm-data-source-value-status.pipe.ts","../../../projects/ngssm-data/src/lib/ngssm-data/components/ngssm-auto-reload/ngssm-auto-reload.component.ts","../../../projects/ngssm-data/src/lib/ngssm-data/components/ngssm-auto-reload/ngssm-auto-reload.component.html","../../../projects/ngssm-data/src/lib/ngssm-data/components/ngssm-data-reload-button/ngssm-data-reload-button.component.ts","../../../projects/ngssm-data/src/lib/ngssm-data/components/ngssm-data-reload-button/ngssm-data-reload-button.component.html","../../../projects/ngssm-data/src/lib/ngssm-data/components/ngssm-scoped-data-source.directive.ts","../../../projects/ngssm-data/src/lib/ngssm-data/data-source-signal.ts","../../../projects/ngssm-data/src/lib/ngssm-data/post-loading-helpers.ts","../../../projects/ngssm-data/src/public-api.ts","../../../projects/ngssm-data/src/ngssm-data.ts"],"sourcesContent":["export enum NgssmDataActionType {\n // Used by the library to initialize all the data sources provided by the application\n registerDataSources = '[NgssmDataActionType] registerDataSources',\n\n // Could be used by the application to register or unregister a data source.\n // This can be used, for example, to limit the lifetime of a data source to the lifetime of a component\n registerDataSource = '[NgssmDataActionType] registerDataSource',\n unregisterDataSource = '[NgssmDataActionType] unregisterDataSource',\n\n // Used to call the loading method to get the value for the data source\n loadDataSourceValue = '[NgssmDataActionType] loadDataSourceValue',\n\n // Update the parameter used by the loading method, if one is required\n setDataSourceParameter = '[NgssmDataActionType] setDataSourceParameter',\n\n // Used to partially update the parameter. Usefull when creating a search component with multiple search criteria.\n updateDataSourceParameter = '[NgssmDataActionType] updateDataSourceParameter',\n\n // Update only the validity of the parameter. Usefull in case of a partial update of the parameter.\n setDataSourceParameterValidity = '[NgssmDataActionType] setDataSourceParameterValidity',\n\n // Clear the stored value associated to a data source\n clearDataSourceValue = '[NgssmDataActionType] clearDataSourceValue',\n\n // Store the value for a given data source\n setDataSourceValue = '[NgssmDataActionType] setDataSourceValue',\n\n // Call the loading method to get the value for an additional property of the data source\n loadDataSourceAdditionalPropertyValue = '[NgssmDataActionType] loadDataSourceAdditionalPropertyValue',\n\n // Store the value for an additional property of the data source\n setDataSourceAdditionalPropertyValue = '[NgssmDataActionType] setDataSourceAdditionalPropertyValue'\n}\n","import { Action } from 'ngssm-store';\n\nexport class NgssmDataSourceValueAction implements Action {\n constructor(\n public readonly type: string,\n public readonly key: string\n ) {}\n}\n","import { NgssmDataSourceValueAction } from './ngssm-data-source-value.action';\nimport { NgssmDataActionType } from './ngssm-data-action-type';\nimport { NgssmLoadDataSourceOptions } from '../model';\n\nexport class NgssmLoadDataSourceValueAction<TParameter = unknown> extends NgssmDataSourceValueAction {\n constructor(\n key: string,\n public readonly options?: NgssmLoadDataSourceOptions<TParameter>\n ) {\n super(NgssmDataActionType.loadDataSourceValue, key);\n }\n}\n","import { HttpErrorResponse } from '@angular/common/http';\n\nimport { NgssmDataSourceValueAction } from './ngssm-data-source-value.action';\nimport { NgssmDataActionType } from './ngssm-data-action-type';\nimport { NgssmDataSourceValueStatus } from '../model';\n\nexport class NgssmSetDataSourceValueAction<TData = unknown> extends NgssmDataSourceValueAction {\n constructor(\n key: string,\n public readonly status: NgssmDataSourceValueStatus,\n public readonly value?: TData,\n public readonly httpErrorResponse?: HttpErrorResponse\n ) {\n super(NgssmDataActionType.setDataSourceValue, key);\n }\n}\n","import { Action } from 'ngssm-store';\n\nimport { NgssmDataActionType } from './ngssm-data-action-type';\nimport { NgssmDataSource } from '../model';\n\nexport class NgssmRegisterDataSourcesAction implements Action {\n public readonly type: string = NgssmDataActionType.registerDataSources;\n\n constructor(public readonly dataSources: NgssmDataSource[]) {}\n}\n","import { NgssmDataSourceValueAction } from './ngssm-data-source-value.action';\nimport { NgssmDataActionType } from './ngssm-data-action-type';\n\nexport class NgssmClearDataSourceValueAction extends NgssmDataSourceValueAction {\n constructor(\n key: string,\n public readonly clearParameter = false\n ) {\n super(NgssmDataActionType.clearDataSourceValue, key);\n }\n}\n","import { NgssmDataActionType } from './ngssm-data-action-type';\nimport { NgssmDataSourceValueAction } from './ngssm-data-source-value.action';\n\nexport class NgssmSetDataSourceParameterAction<TParameter = unknown> extends NgssmDataSourceValueAction {\n constructor(\n key: string,\n public readonly parameter?: TParameter,\n public readonly parameterIsValid?: boolean,\n public readonly doNotMarkParameterAsModified?: boolean\n ) {\n super(NgssmDataActionType.setDataSourceParameter, key);\n }\n}\n","import { NgssmDataSourceValueAction } from './ngssm-data-source-value.action';\nimport { NgssmDataActionType } from './ngssm-data-action-type';\n\nexport class NgssmLoadDataSourceAdditionalPropertyValueAction extends NgssmDataSourceValueAction {\n constructor(\n key: string,\n public readonly property: string,\n public readonly forceReload?: boolean,\n public readonly postLoadingAction?: () => void\n ) {\n super(NgssmDataActionType.loadDataSourceAdditionalPropertyValue, key);\n }\n}\n","import { HttpErrorResponse } from '@angular/common/http';\n\nimport { NgssmDataSourceValueAction } from './ngssm-data-source-value.action';\nimport { NgssmDataSourceValueStatus } from '../model';\nimport { NgssmDataActionType } from './ngssm-data-action-type';\n\nexport class NgssmSetDataSourceAdditionalPropertyValueAction<TProperty = unknown> extends NgssmDataSourceValueAction {\n constructor(\n key: string,\n public readonly property: string,\n public readonly status: NgssmDataSourceValueStatus,\n public readonly value?: TProperty,\n public readonly postLoadingAction?: () => void,\n public readonly httpErrorResponse?: HttpErrorResponse\n ) {\n super(NgssmDataActionType.setDataSourceAdditionalPropertyValue, key);\n }\n}\n","import { Action } from 'ngssm-store';\n\nimport { NgssmDataActionType } from './ngssm-data-action-type';\nimport { NgssmDataSource } from '../model';\n\nexport class NgssmRegisterDataSourceAction implements Action {\n public readonly type: string = NgssmDataActionType.registerDataSource;\n\n constructor(public readonly dataSource: NgssmDataSource) {}\n}\n","import { Action } from 'ngssm-store';\nimport { NgssmDataActionType } from './ngssm-data-action-type';\n\nexport class NgssmUnregisterDataSourceAction implements Action {\n public readonly type: string = NgssmDataActionType.unregisterDataSource;\n\n constructor(public readonly dataSourceKey: string) {}\n}\n","import { NgssmDataActionType } from './ngssm-data-action-type';\nimport { NgssmDataSourceValueAction } from './ngssm-data-source-value.action';\n\n/**\n * Action to update part (partial) of a data source parameter.\n *\n * This action carries a Partial<TParameter> that will be merged with the existing parameter\n * for the specified data source key. By default, updating the parameter will mark the data\n * source value as outdated so it can be reloaded; set doNotUpdateValueOutdated to true to\n * avoid changing the valueOutdated flag when dispatching this action.\n *\n * The update of the parameter in state is made with a shallow merge. So be carefull with\n * the parameter value set in action.\n *\n * @template TParameter Type of the parameter object for the data source.\n * @param key The data source key whose parameter should be updated.\n * @param parameter Partial parameter to merge into the existing parameter.\n * @param doNotUpdateValueOutdated Optional flag to prevent marking the value as outdated.\n */\nexport class NgssmUpdateDataSourceParameterAction<TParameter = unknown> extends NgssmDataSourceValueAction {\n constructor(\n key: string,\n public readonly parameter: Partial<TParameter>,\n public readonly doNotUpdateValueOutdated?: boolean\n ) {\n super(NgssmDataActionType.updateDataSourceParameter, key);\n }\n}\n","import { NgssmDataSourceValueAction } from './ngssm-data-source-value.action';\nimport { NgssmDataActionType } from './ngssm-data-action-type';\n\n/**\n * Action used to set the validity state of a data source parameter.\n *\n * This action updates the overall parameter validity for the specified data source.\n * Optionally a partial validity key can be provided to indicate which sub-field or\n * portion of the parameter the validity refers to (useful when validating parameter\n * objects field-by-field).\n *\n * If `partialValidityKey` is provided the action targets only that partial entry and\n * does not change the global `parameterIsValid` flag. If `clearPartialValidities` is\n * true the reducer handling this action should clear the parameterPartialValidity map\n * (remove all partial validity entries) when applying the global validity update.\n *\n * @param key The data source key this validity applies to.\n * @param isValid True when the parameter (or partial parameter) is valid, false otherwise.\n * @param partialValidityKey Optional identifier for partial validity (e.g. the parameter field name).\n * If set, the global validity is not modified.\n * @param clearPartialValidities If true, instructs reducers to clear existing partial validity entries\n * when updating overall validity. Useful to reset per-field validity after\n * a full-parameter validation step.\n */\nexport class NgssmSetDataSourceParameterValidityAction extends NgssmDataSourceValueAction {\n constructor(\n key: string,\n public readonly isValid: boolean,\n public readonly partialValidityKey?: string,\n public readonly clearPartialValidities?: boolean\n ) {\n super(NgssmDataActionType.setDataSourceParameterValidity, key);\n }\n}\n","import { EnvironmentProviders, InjectionToken, inject, makeEnvironmentProviders } from '@angular/core';\nimport { Observable } from 'rxjs';\n\nimport { State, Store } from 'ngssm-store';\nimport { NgssmLoadDataSourceValueAction } from '../actions';\n\n/**\n * Function signature for loading a data source value.\n * - state: the current global application state.\n * - dataSourceKey: the unique key of the data source being loaded.\n * - parameter: optional parameter passed to the loader.\n *\n * Must return an Observable that emits the requested data.\n */\nexport type NgssmDataLoading<TData = unknown, TParameter = unknown> = (\n state: State,\n dataSourceKey: string,\n parameter?: TParameter\n) => Observable<TData>;\n\n/**\n * Function signature for loading an additional property of a data source (e.g. row detail).\n * - state: the current global application state.\n * - dataSourceKey: the unique key of the data source.\n * - additionalProperty: the name of the additional property to load.\n *\n * Must return an Observable that emits the requested additional property data.\n */\nexport type NgssmAdditionalPropertyLoading<TData = unknown> = (\n state: State,\n dataSourceKey: string,\n additionalProperty: string\n) => Observable<TData>;\n\n/**\n * Callback invoked after data source loading succeeds.\n *\n * - state: current global application state\n * - dataSourceKey: source identifier\n * - parameter: parameter passed when loading\n * - value: loaded data\n */\nexport type NgssmDataSourceLoadSuccessCallback<TData = unknown, TParameter = unknown> = (\n state: State,\n dataSourceKey: string,\n parameter?: TParameter,\n value?: TData\n) => void;\n\n/**\n * Callback invoked after data source loading fails.\n *\n * - state: current global application state\n * - dataSourceKey: source identifier\n * - parameter: parameter passed when loading\n * - error: error returned by helper\n */\nexport type NgssmDataSourceLoadFailureCallback<TParameter = unknown> = (\n state: State,\n dataSourceKey: string,\n parameter?: TParameter,\n error?: unknown\n) => void;\n\n/**\n * Describes a data source and its optional behaviours.\n *\n * - key: unique identifier for the data source.\n * - dataLifetimeInSeconds: optional TTL for cached data (seconds).\n * - dataLoadingFunc: required function that loads the main data.\n * - additionalPropertyLoadingFunc: optional function to load named additional properties independently.\n * - initialParameter: optional parameter used initially when registering the data source.\n * - initialParameterInvalid: flag indicating the initial parameter should be considered invalid.\n * - linkedToDataSource: if specified, this data source is reloaded when the target source is updated.\n * - linkedDataSources: list of other data sources to reload when this source is updated.\n * - dependsOnDataSource: optional dependency key; when loading this source, the dependency will be loaded first.\n * - onLoaded: optional callback invoked after successful load (value is available).\n * - onLoadError: optional callback invoked after failed load (error is available).\n */\nexport interface NgssmDataSource<TData = unknown, TParameter = unknown, TAdditionalProperty = unknown> {\n key: string;\n dataLifetimeInSeconds?: number;\n dataLoadingFunc: NgssmDataLoading<TData, TParameter>;\n additionalPropertyLoadingFunc?: NgssmAdditionalPropertyLoading<TAdditionalProperty>;\n initialParameter?: TParameter;\n initialParameterInvalid?: boolean;\n linkedToDataSource?: string;\n linkedDataSources?: string[];\n dependsOnDataSource?: string;\n onLoaded?: NgssmDataSourceLoadSuccessCallback<TData, TParameter>;\n onLoadError?: NgssmDataSourceLoadFailureCallback<TParameter>;\n}\n\n/**\n * Injection token used to register data sources via DI.\n * Provide one or several NgssmDataSource objects using this token (multi: true).\n */\nexport const NGSSM_DATA_SOURCE = new InjectionToken<NgssmDataSource>('NGSSM_DATA_SOURCE');\n\n/**\n * Options accepted when providing a data source via provideNgssmDataSource.\n * See individual properties for behaviour.\n */\nexport interface NgssmDataSourceProvideOptions<TParameter = unknown, TAdditionalProperty = unknown> {\n dataLifetimeInSeconds?: number;\n initialParameter?: TParameter;\n initialParameterInvalid?: boolean;\n additionalPropertyLoadingFunc?: NgssmAdditionalPropertyLoading<TAdditionalProperty>;\n linkedToDataSource?: string;\n linkedDataSources?: string[];\n dependsOnDataSource?: string;\n onLoaded?: NgssmDataSourceLoadSuccessCallback<unknown, TParameter>;\n onLoadError?: NgssmDataSourceLoadFailureCallback<TParameter>;\n}\n\n/**\n * Helper function to register a data source in Angular's environment providers.\n * Use provideNgssmData() at app startup to pick up data sources registered via this helper.\n */\nexport const provideNgssmDataSource = <TData = unknown, TParameter = unknown, TAdditionalProperty = unknown>(\n key: string,\n loadingFunc: NgssmDataLoading<TData, TParameter>,\n options?: NgssmDataSourceProvideOptions<TParameter, TAdditionalProperty>\n): EnvironmentProviders => {\n return makeEnvironmentProviders([\n {\n provide: NGSSM_DATA_SOURCE,\n useFactory: () => {\n const dataSource: NgssmDataSource<TData, TParameter, TAdditionalProperty> = {\n key,\n dataLifetimeInSeconds: options?.dataLifetimeInSeconds,\n dataLoadingFunc: loadingFunc,\n additionalPropertyLoadingFunc: options?.additionalPropertyLoadingFunc,\n onLoaded: options?.onLoaded,\n onLoadError: options?.onLoadError\n };\n\n if (options?.initialParameter) {\n dataSource.initialParameter = options?.initialParameter;\n }\n\n if (options?.initialParameterInvalid) {\n dataSource.initialParameterInvalid = options?.initialParameterInvalid;\n }\n\n if (options?.linkedToDataSource) {\n dataSource.linkedToDataSource = options?.linkedToDataSource;\n }\n\n if (options?.linkedDataSources) {\n dataSource.linkedDataSources = options?.linkedDataSources;\n }\n\n if (options?.dependsOnDataSource) {\n dataSource.dependsOnDataSource = options?.dependsOnDataSource;\n }\n\n return dataSource;\n },\n multi: true\n }\n ]);\n};\n\n/**\n * Guard / initializer helper that dispatches a NgssmLoadDataSourceValueAction for the given key.\n * Returns a function suitable for use in Router canActivate (or app initializers) that always returns true.\n */\nexport const ngssmLoadDataSourceValue = (key: string, forceReload = false): (() => boolean) => {\n return () => {\n inject(Store).dispatchAction(new NgssmLoadDataSourceValueAction(key, { forceReload }));\n return true;\n };\n};\n","import { HttpErrorResponse } from '@angular/common/http';\nimport { DateTime } from 'luxon';\n\n/**\n * Enum describing the lifecycle status of a data source value.\n * - none: No value has been requested or initialized.\n * - notRegistered: The requested data source is not registered.\n * - loading: A load operation for the data source is currently in progress.\n * - loaded: The data source loaded successfully and a value is available.\n * - error: The last load attempt failed.\n */\nexport enum NgssmDataSourceValueStatus {\n none = 'none',\n notRegistered = 'notRegistered',\n loading = 'loading',\n loaded = 'loaded',\n error = 'error'\n}\n\n/**\n * Represents the status and optional metadata for an additional property of a data source.\n * Additional properties are values related to the main data source value that may be loaded independently\n * (for example, a row detail).\n *\n * @template TProperty Type of the additional property's value.\n * @property status Current load status of the additional property.\n * @property value Optional value of the additional property.\n * @property lastLoadingDate Optional timestamp of the last successful load (luxon DateTime).\n * @property httpErrorResponse Optional HTTP error returned during the last load attempt.\n */\nexport interface NgssmDataSourceAdditionalPropertyValue<TProperty = unknown> {\n status: NgssmDataSourceValueStatus;\n value?: TProperty;\n lastLoadingDate?: DateTime;\n httpErrorResponse?: HttpErrorResponse;\n}\n\n/**\n * Represents the stored value and metadata for a data source.\n *\n * @template TData Type of the data source value.\n * @template TParameter Type of the parameter used to load the data source.\n * @property status Current load status of the data source.\n * @property value Optional value returned by the data source loader.\n * @property parameter Optional parameter used when loading the data source.\n * @property lastLoadingDate Optional timestamp of the last successful load (luxon DateTime).\n * @property dataLifetimeInSeconds Optional TTL for cached data, in seconds.\n * @property additionalProperties Map of additional property values (see NgssmDataSourceAdditionalPropertyValue).\n * @property parameterIsValid Optional flag indicating if the current parameter is valid.\n * @property parameterPartialValidity Optional map storing partial validity of parameter sub-fields (e.g. { fieldA: true, fieldB: false }).\n * @property httpErrorResponse Optional HTTP error returned during the last load attempt.\n * @property valueOutdated Optional flag indicating that the parameter changed and the value is now outdated.\n */\nexport interface NgssmDataSourceValue<TData = unknown, TParameter = unknown> {\n status: NgssmDataSourceValueStatus;\n value?: TData;\n parameter?: TParameter;\n lastLoadingDate?: DateTime;\n dataLifetimeInSeconds?: number;\n additionalProperties: Record<string, NgssmDataSourceAdditionalPropertyValue>;\n parameterIsValid?: boolean;\n\n /**\n * Map storing partial validity information for the parameter.\n * Key is a parameter field name (or any identifier) and value is boolean validity.\n * Undefined when no partial validation data is present.\n */\n parameterPartialValidity?: Record<string, boolean>;\n\n httpErrorResponse?: HttpErrorResponse;\n\n // Parameter has been updated but not value\n valueOutdated?: boolean;\n}\n\n/**\n * Types and helper for automatic reload intervals of a data source value.\n * - NgssmDataSourceValueAutoReloadType: allowed string values for auto-reload selection.\n * - getNgssmDataSourceValueAutoReloadTypes: returns a list of label/value pairs usable for UI selects.\n */\nexport type NgssmDataSourceValueAutoReloadType = 'Off' | '1min' | '5min' | '15min';\nexport const getNgssmDataSourceValueAutoReloadTypes = (): { label: string; value: NgssmDataSourceValueAutoReloadType }[] => [\n { label: 'Off', value: 'Off' },\n { label: 'Every minute', value: '1min' },\n { label: 'Every 5 minutes', value: '5min' },\n { label: 'Every 15 minutes', value: '15min' }\n];\n\nexport const isNgssmDataSourceValueParameterValid = (dataSourceValue: NgssmDataSourceValue): boolean => {\n if (dataSourceValue.parameterPartialValidity) {\n let isValid = true;\n Object.values(dataSourceValue.parameterPartialValidity).forEach((isPartialValid) => {\n isValid = isValid && isPartialValid;\n });\n return isValid;\n }\n\n if (dataSourceValue.parameterIsValid === false) {\n return false;\n }\n\n return true;\n};\n","import update, { Spec } from 'immutability-helper';\n\nimport { Action, NgSsmFeatureState, State } from 'ngssm-store';\nimport { NgssmDataSource, NgssmDataSourceValue } from '../model';\n\nexport const selectNgssmDataState = (state: State): NgssmDataState => state[NgssmDataStateSpecification.featureStateKey] as NgssmDataState;\n\nexport const updateNgssmDataState = (state: State, command: Spec<NgssmDataState, never>): State =>\n update(state, {\n [NgssmDataStateSpecification.featureStateKey]: command\n });\n\nexport interface NgssmDataState {\n dataSourceValues: Record<string, NgssmDataSourceValue>;\n dataSources: Record<string, NgssmDataSource>;\n delayedActions: Record<string, Action>;\n}\n\n@NgSsmFeatureState({\n featureStateKey: NgssmDataStateSpecification.featureStateKey,\n initialState: NgssmDataStateSpecification.initialState\n})\nexport class NgssmDataStateSpecification {\n public static readonly featureStateKey = 'ngssm-data-state';\n public static readonly initialState: NgssmDataState = {\n dataSourceValues: {},\n dataSources: {},\n delayedActions: {}\n };\n}\n","import { Injectable } from '@angular/core';\n\nimport { Reducer, State, Action } from 'ngssm-store';\n\nimport {\n NgssmDataActionType,\n NgssmRegisterDataSourceAction,\n NgssmRegisterDataSourcesAction,\n NgssmUnregisterDataSourceAction\n} from '../actions';\nimport { NgssmDataSource, NgssmDataSourceValue, NgssmDataSourceValueStatus } from '../model';\nimport { selectNgssmDataState, updateNgssmDataState } from '../state';\n\n@Injectable()\nexport class DataSourcesRegistrationReducer implements Reducer {\n public readonly processedActions: string[] = [\n NgssmDataActionType.registerDataSources,\n NgssmDataActionType.registerDataSource,\n NgssmDataActionType.unregisterDataSource\n ];\n\n public updateState(state: State, action: Action): State {\n switch (action.type) {\n case NgssmDataActionType.registerDataSources: {\n const registerDataSourcesAction = action as NgssmRegisterDataSourcesAction;\n const dataSourceValues: Record<string, NgssmDataSourceValue> = {};\n const dataSources: Record<string, NgssmDataSource> = {};\n registerDataSourcesAction.dataSources.forEach((dataSource) => {\n if (selectNgssmDataState(state).dataSources[dataSource.key]) {\n return;\n }\n\n dataSourceValues[dataSource.key] = {\n status: NgssmDataSourceValueStatus.none,\n additionalProperties: {}\n };\n\n if (dataSource.dataLifetimeInSeconds) {\n dataSourceValues[dataSource.key].dataLifetimeInSeconds = dataSource.dataLifetimeInSeconds;\n }\n\n if (dataSource.initialParameter) {\n dataSourceValues[dataSource.key].parameter = dataSource.initialParameter;\n }\n\n if (dataSource.initialParameterInvalid) {\n dataSourceValues[dataSource.key].parameterIsValid = false;\n }\n\n dataSources[dataSource.key] = dataSource;\n });\n\n return updateNgssmDataState(state, {\n dataSourceValues: { $merge: dataSourceValues },\n dataSources: { $merge: dataSources }\n });\n }\n\n case NgssmDataActionType.registerDataSource: {\n const registerDataSourceAction = action as NgssmRegisterDataSourceAction;\n return this.updateState(state, new NgssmRegisterDataSourcesAction([registerDataSourceAction.dataSource]));\n }\n\n case NgssmDataActionType.unregisterDataSource: {\n const unregisterDataSource = action as NgssmUnregisterDataSourceAction;\n return updateNgssmDataState(state, {\n dataSourceValues: { $unset: [unregisterDataSource.dataSourceKey] },\n dataSources: { $unset: [unregisterDataSource.dataSourceKey] }\n });\n }\n }\n\n return state;\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { DateTime } from 'luxon';\n\nimport { Reducer, State, Action } from 'ngssm-store';\n\nimport { NgssmClearDataSourceValueAction, NgssmDataActionType, NgssmSetDataSourceValueAction } from '../actions';\nimport { selectNgssmDataState, updateNgssmDataState } from '../state';\nimport { NgssmDataSourceValueStatus } from '../model';\n\n@Injectable()\nexport class DataSourceValueReducer implements Reducer {\n public readonly processedActions: string[] = [NgssmDataActionType.setDataSourceValue, NgssmDataActionType.clearDataSourceValue];\n\n public updateState(state: State, action: Action): State {\n switch (action.type) {\n case NgssmDataActionType.setDataSourceValue: {\n const ngssmSetDataSourceValueAction = action as NgssmSetDataSourceValueAction;\n const dataSourceValue = selectNgssmDataState(state).dataSourceValues[ngssmSetDataSourceValueAction.key];\n if (!dataSourceValue) {\n break;\n }\n\n return updateNgssmDataState(state, {\n dataSourceValues: {\n [ngssmSetDataSourceValueAction.key]: {\n status: { $set: ngssmSetDataSourceValueAction.status },\n value: { $set: ngssmSetDataSourceValueAction.value },\n lastLoadingDate: { $set: DateTime.now() },\n httpErrorResponse: { $set: ngssmSetDataSourceValueAction.httpErrorResponse }\n // leave parameterPartialValidity as-is on value set (no change here)\n }\n }\n });\n }\n\n case NgssmDataActionType.clearDataSourceValue: {\n const ngssmClearDataSourceValueAction = action as NgssmClearDataSourceValueAction;\n let currentState = state;\n if (ngssmClearDataSourceValueAction.clearParameter) {\n currentState = updateNgssmDataState(state, {\n dataSourceValues: {\n [ngssmClearDataSourceValueAction.key]: {\n parameter: { $set: undefined },\n parameterIsValid: { $set: undefined },\n // clear partial validity when parameter is cleared\n parameterPartialValidity: { $set: undefined }\n }\n }\n });\n }\n\n return updateNgssmDataState(currentState, {\n dataSourceValues: {\n [ngssmClearDataSourceValueAction.key]: {\n status: { $set: NgssmDataSourceValueStatus.none },\n value: { $set: undefined },\n lastLoadingDate: { $set: undefined },\n additionalProperties: { $set: {} },\n httpErrorResponse: { $set: undefined }\n }\n }\n });\n }\n }\n\n return state;\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { DateTime } from 'luxon';\n\nimport { Reducer, State, Action } from 'ngssm-store';\n\nimport { NgssmDataActionType, NgssmLoadDataSourceValueAction } from '../actions';\nimport { selectNgssmDataState, updateNgssmDataState } from '../state';\nimport { NgssmDataSourceValueStatus } from '../model';\n\n@Injectable()\nexport class LoadDataSourceValueReducer implements Reducer {\n public readonly processedActions: string[] = [NgssmDataActionType.loadDataSourceValue];\n\n public updateState(state: State, action: Action): State {\n if (action.type !== NgssmDataActionType.loadDataSourceValue) {\n return state;\n }\n\n const loadDataSourceValue = action as NgssmLoadDataSourceValueAction;\n\n // If data source is not defined, return input state\n const dataSource = selectNgssmDataState(state).dataSources[loadDataSourceValue.key];\n if (!dataSource) {\n return state;\n }\n\n let currentState = state;\n\n // Check if source depends on another one\n if (dataSource.dependsOnDataSource) {\n const masterSourceValue = selectNgssmDataState(state).dataSourceValues[dataSource.dependsOnDataSource];\n if (masterSourceValue && masterSourceValue.status !== NgssmDataSourceValueStatus.loaded) {\n return updateNgssmDataState(state, {\n delayedActions: {\n [dataSource.dependsOnDataSource]: { $set: action }\n }\n });\n }\n\n if (selectNgssmDataState(state).delayedActions[dataSource.dependsOnDataSource] === action) {\n currentState = updateNgssmDataState(state, {\n delayedActions: { $unset: [dataSource.dependsOnDataSource] }\n });\n }\n }\n\n const dataSourceValue = selectNgssmDataState(state).dataSourceValues[loadDataSourceValue.key];\n if (!dataSourceValue) {\n return state;\n }\n\n let shouldReload = false;\n\n if (loadDataSourceValue.options?.parameter) {\n shouldReload = true;\n currentState = updateNgssmDataState(currentState, {\n dataSourceValues: {\n [loadDataSourceValue.key]: {\n parameter: { $set: loadDataSourceValue.options?.parameter.value }\n }\n }\n });\n }\n\n if (dataSourceValue.status === NgssmDataSourceValueStatus.loaded) {\n if (loadDataSourceValue.options?.forceReload === true || !dataSourceValue.dataLifetimeInSeconds || !dataSourceValue.lastLoadingDate) {\n shouldReload = true;\n } else {\n const dataLifetime = DateTime.now().diff(dataSourceValue.lastLoadingDate, 'second');\n if ((dataLifetime.toObject().seconds ?? 0) > dataSourceValue.dataLifetimeInSeconds) {\n shouldReload = true;\n }\n }\n } else {\n shouldReload = true;\n }\n\n if (dataSourceValue.parameterIsValid === false) {\n shouldReload = false;\n }\n\n if (shouldReload) {\n if (loadDataSourceValue.options?.keepAdditionalProperties !== true) {\n currentState = updateNgssmDataState(currentState, {\n dataSourceValues: {\n [loadDataSourceValue.key]: {\n additionalProperties: { $set: {} }\n }\n }\n });\n }\n\n if (loadDataSourceValue.options?.resetValue === true) {\n currentState = updateNgssmDataState(currentState, {\n dataSourceValues: {\n [loadDataSourceValue.key]: {\n value: { $set: undefined }\n }\n }\n });\n }\n\n return updateNgssmDataState(currentState, {\n dataSourceValues: {\n [loadDataSourceValue.key]: {\n status: { $set: NgssmDataSourceValueStatus.loading },\n valueOutdated: { $set: false }\n }\n }\n });\n }\n\n return state;\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { DateTime } from 'luxon';\n\nimport { Reducer, State, Action } from 'ngssm-store';\n\nimport {\n NgssmDataActionType,\n NgssmLoadDataSourceAdditionalPropertyValueAction,\n NgssmSetDataSourceAdditionalPropertyValueAction\n} from '../actions';\nimport { selectNgssmDataState, updateNgssmDataState } from '../state';\nimport { NgssmDataSourceValueStatus } from '../model';\n\n@Injectable()\nexport class DataSourceAdditionalPropertyValueReducer implements Reducer {\n public readonly processedActions: string[] = [\n NgssmDataActionType.loadDataSourceAdditionalPropertyValue,\n NgssmDataActionType.setDataSourceAdditionalPropertyValue\n ];\n\n public updateState(state: State, action: Action): State {\n switch (action.type) {\n case NgssmDataActionType.loadDataSourceAdditionalPropertyValue: {\n const ngssmLoadDataSourceAdditionalPropertyValueAction = action as NgssmLoadDataSourceAdditionalPropertyValueAction;\n const dataSourcePropertyValue =\n selectNgssmDataState(state).dataSourceValues[ngssmLoadDataSourceAdditionalPropertyValueAction.key]?.additionalProperties[\n ngssmLoadDataSourceAdditionalPropertyValueAction.property\n ];\n\n if (\n dataSourcePropertyValue?.status === NgssmDataSourceValueStatus.loaded &&\n ngssmLoadDataSourceAdditionalPropertyValueAction.forceReload !== true\n ) {\n break;\n }\n\n if (!dataSourcePropertyValue) {\n return updateNgssmDataState(state, {\n dataSourceValues: {\n [ngssmLoadDataSourceAdditionalPropertyValueAction.key]: {\n additionalProperties: {\n [ngssmLoadDataSourceAdditionalPropertyValueAction.property]: {\n $set: {\n status: NgssmDataSourceValueStatus.loading\n }\n }\n }\n }\n }\n });\n }\n\n return updateNgssmDataState(state, {\n dataSourceValues: {\n [ngssmLoadDataSourceAdditionalPropertyValueAction.key]: {\n additionalProperties: {\n [ngssmLoadDataSourceAdditionalPropertyValueAction.property]: {\n status: { $set: NgssmDataSourceValueStatus.loading }\n }\n }\n }\n }\n });\n }\n\n case NgssmDataActionType.setDataSourceAdditionalPropertyValue: {\n const ngssmSetDataSourceAdditionalPropertyValueAction = action as NgssmSetDataSourceAdditionalPropertyValueAction;\n return updateNgssmDataState(state, {\n dataSourceValues: {\n [ngssmSetDataSourceAdditionalPropertyValueAction.key]: {\n additionalProperties: {\n [ngssmSetDataSourceAdditionalPropertyValueAction.property]: {\n $set: {\n status: ngssmSetDataSourceAdditionalPropertyValueAction.status,\n value: ngssmSetDataSourceAdditionalPropertyValueAction.value,\n lastLoadingDate: DateTime.now(),\n httpErrorResponse: ngssmSetDataSourceAdditionalPropertyValueAction.httpErrorResponse\n }\n }\n }\n }\n }\n });\n }\n }\n\n return state;\n }\n}\n","import { State } from 'ngssm-store';\n\nimport {\n isNgssmDataSourceValueParameterValid,\n NgssmDataSourceAdditionalPropertyValue,\n NgssmDataSourceValue,\n NgssmDataSourceValueStatus\n} from './model';\nimport { selectNgssmDataState } from './state/ngssm-data.state';\n\nexport const selectNgssmDataSourceValue = <TDataType = unknown, TParameter = unknown>(\n state: State,\n key: string\n): NgssmDataSourceValue<TDataType, TParameter> => {\n return (selectNgssmDataState(state).dataSourceValues[key] ?? {\n status: NgssmDataSourceValueStatus.notRegistered\n }) as NgssmDataSourceValue<TDataType, TParameter>;\n};\n\nexport const selectNgssmDataSourceAdditionalPropertyValue = <TProperty = unknown>(\n state: State,\n key: string,\n property: string\n): NgssmDataSourceAdditionalPropertyValue<TProperty> => {\n return (selectNgssmDataState(state).dataSourceValues[key]?.additionalProperties[property] ?? {\n status: NgssmDataSourceValueStatus.notRegistered\n }) as NgssmDataSourceAdditionalPropertyValue<TProperty>;\n};\n\n/**\n * Returns true if the specified data source is currently loading, false otherwise.\n * @param state The global application state.\n * @param dataSourceKey The unique key of the data source.\n */\nexport const isNgssmDataSourceLoading = (state: State, dataSourceKey: string): boolean =>\n selectNgssmDataSourceValue(state, dataSourceKey)?.status === NgssmDataSourceValueStatus.loading;\n\n/**\n * Determines whether the parameter for the specified data source should be considered valid.\n *\n * Rules:\n * - If parameterIsValid is explicitly true or false on the data source value, that value is returned.\n * - Otherwise, if parameterPartialValidity map exists, the function returns true only if all\n * partial entries are true (logical AND).\n * - If no explicit validity information is present, the parameter is considered valid (returns true).\n *\n * @param state The global application state.\n * @param dataSourceKey The key of the data source to check.\n * @returns True when the parameter (or all partial parameter entries) is valid, false otherwise.\n */\nexport const isNgssmDataSourceParameterValid = (state: State, dataSourceKey: string): boolean => {\n const dataSource = selectNgssmDataSourceValue(state, dataSourceKey);\n if (!dataSource) {\n return true;\n }\n\n return isNgssmDataSourceValueParameterValid(dataSource);\n};\n\n/**\n * Throws an Error if the data source value for the given key does not exist in the state.\n *\n * This is a convenience guard used by callers that require the data source value to be present.\n * Use throwIfSourceValueDoesNotExist(state, key) to validate presence before accessing the value.\n *\n * @param state The global application state.\n * @param dataSourceKey The key of the data source to check.\n * @throws Error when the data source value is not present in the state.\n */\nexport const throwIfSourceValueDoesNotExist = (state: State, dataSourceKey?: string) => {\n if (!dataSourceKey) {\n return;\n }\n\n const dataSource = selectNgssmDataSourceValue(state, dataSourceKey);\n if (!dataSource || dataSource.status === NgssmDataSourceValueStatus.notRegistered) {\n throw new Error(`Datasource ${dataSourceKey} does not exists.`);\n }\n};\n","import { Injectable } from '@angular/core';\n\nimport update from 'immutability-helper';\n\nimport { Reducer, State, Action } from 'ngssm-store';\n\nimport {\n NgssmDataActionType,\n NgssmDataSourceValueAction,\n NgssmSetDataSourceParameterAction,\n NgssmSetDataSourceParameterValidityAction,\n NgssmUpdateDataSourceParameterAction\n} from '../actions';\nimport { updateNgssmDataState } from '../state';\nimport { selectNgssmDataSourceValue, throwIfSourceValueDoesNotExist } from '../selectors';\n\n@Injectable()\nexport class DataSourceParameterReducer implements Reducer {\n public readonly processedActions: string[] = [\n NgssmDataActionType.setDataSourceParameter,\n NgssmDataActionType.updateDataSourceParameter,\n NgssmDataActionType.setDataSourceParameterValidity\n ];\n\n public updateState(state: State, action: Action): State {\n throwIfSourceValueDoesNotExist(state, (action as NgssmDataSourceValueAction).key);\n\n switch (action.type) {\n case NgssmDataActionType.setDataSourceParameter: {\n const ngssmSetDataSourceParameterAction = action as NgssmSetDataSourceParameterAction;\n return updateNgssmDataState(state, {\n dataSourceValues: {\n [ngssmSetDataSourceParameterAction.key]: {\n parameter: { $set: ngssmSetDataSourceParameterAction.parameter },\n parameterIsValid: { $set: ngssmSetDataSourceParameterAction.parameterIsValid },\n valueOutdated: { $set: ngssmSetDataSourceParameterAction.doNotMarkParameterAsModified === true ? false : true }\n // leave parameterPartialValidity as-is on value set (no change here)\n }\n }\n });\n }\n\n case NgssmDataActionType.updateDataSourceParameter: {\n const ngssmUpdateDataSourceParameterAction = action as NgssmUpdateDataSourceParameterAction;\n const newParameter = update<object, never>(\n selectNgssmDataSourceValue(state, ngssmUpdateDataSourceParameterAction.key)?.parameter as object,\n {\n $merge: ngssmUpdateDataSourceParameterAction.parameter\n }\n );\n\n const updatedState = updateNgssmDataState(state, {\n dataSourceValues: {\n [ngssmUpdateDataSourceParameterAction.key]: {\n parameter: { $set: newParameter }\n }\n }\n });\n\n if (ngssmUpdateDataSourceParameterAction.doNotUpdateValueOutdated === true) {\n return updatedState;\n }\n\n return updateNgssmDataState(updatedState, {\n dataSourceValues: {\n [ngssmUpdateDataSourceParameterAction.key]: {\n valueOutdated: { $set: true }\n }\n }\n });\n }\n\n case NgssmDataActionType.setDataSourceParameterValidity: {\n const ngssmSetDataSourceParameterValidityAction = action as NgssmSetDataSourceParameterValidityAction;\n if (ngssmSetDataSourceParameterValidityAction.partialValidityKey) {\n return this.setPartialValidity(\n state,\n ngssmSetDataSourceParameterValidityAction.key,\n ngssmSetDataSourceParameterValidityAction.isValid,\n ngssmSetDataSourceParameterValidityAction.partialValidityKey\n );\n }\n\n return this.setGlobalValidity(\n state,\n ngssmSetDataSourceParameterValidityAction.key,\n ngssmSetDataSourceParameterValidityAction.isValid,\n ngssmSetDataSourceParameterValidityAction.clearPartialValidities\n );\n }\n }\n\n return state;\n }\n\n private setGlobalValidity(state: State, key: string, isValid: boolean, clearPartialValidities?: boolean): State {\n if (clearPartialValidities === true) {\n return updateNgssmDataState(state, {\n dataSourceValues: {\n [key]: {\n parameterIsValid: { $set: isValid },\n parameterPartialValidity: { $set: undefined }\n }\n }\n });\n }\n\n return updateNgssmDataState(state, {\n dataSourceValues: {\n [key]: {\n parameterIsValid: { $set: isValid }\n }\n }\n });\n }\n\n private setPartialValidity(state: State, key: string, isValid: boolean, partialKey: string): State {\n if (selectNgssmDataSourceValue(state, key)?.parameterPartialValidity) {\n return updateNgssmDataState(state, {\n dataSourceValues: {\n [key]: {\n parameterPartialValidity: {\n [partialKey]: { $set: isValid }\n }\n }\n }\n });\n }\n\n return updateNgssmDataState(state, {\n dataSourceValues: {\n [key]: {\n parameterPartialValidity: {\n $set: {\n [partialKey]: isValid\n }\n }\n }\n }\n });\n }\n}\n","import { EnvironmentInjector, inject, Injectable, runInInjectionContext } from '@angular/core';\n\nimport { Effect, State, Action, Logger, ActionDispatcher } from 'ngssm-store';\n\nimport {\n NgssmDataActionType,\n NgssmDataSourceValueAction,\n NgssmLoadDataSourceAdditionalPropertyValueAction,\n NgssmSetDataSourceAdditionalPropertyValueAction,\n NgssmSetDataSourceValueAction\n} from '../actions';\nimport { selectNgssmDataState } from '../state';\nimport { NgssmDataSourceValueStatus } from '../model';\n\n@Injectable()\nexport class DataLoadingEffect implements Effect {\n public readonly processedActions: string[] = [\n NgssmDataActionType.loadDataSourceValue,\n NgssmDataActionType.loadDataSourceAdditionalPropertyValue\n ];\n\n private readonly injector = inject(EnvironmentInjector);\n private readonly logger = inject(Logger);\n\n public processAction(actiondispatcher: ActionDispatcher, state: State, action: Action): void {\n const key = (action as NgssmDataSourceValueAction).key;\n const dataSource = selectNgssmDataState(state).dataSources[key];\n if (!dataSource) {\n this.logger.error(`No data source setup for key '${key}'`);\n return;\n }\n\n const dataSourceValue = selectNgssmDataState(state).dataSourceValues[key];\n\n switch (action.type) {\n case NgssmDataActionType.loadDataSourceValue: {\n if (dataSourceValue?.status !== NgssmDataSourceValueStatus.loading) {\n this.logger.information(\n `Data source value for '${key}' is not in '${NgssmDataSourceValueStatus.loading}' status: '${dataSourceValue?.status}'`\n );\n return;\n }\n\n runInInjectionContext(this.injector, () => {\n dataSource.dataLoadingFunc(state, key, dataSourceValue.parameter).subscribe({\n next: (value) => {\n if (dataSource.onLoaded) {\n try {\n runInInjectionContext(this.injector, () => {\n dataSource.onLoaded!(state, key, dataSourceValue.parameter, value);\n });\n } catch (callbackError) {\n this.logger.error(`Error in onLoaded callback for '${key}'`, callbackError as Error);\n }\n }\n actiondispatcher.dispatchAction(new NgssmSetDataSourceValueAction(key, NgssmDataSourceValueStatus.loaded, value));\n },\n error: (error) => {\n this.logger.error(`Unable to load data for '${key}'`, error);\n if (dataSource.onLoadError) {\n try {\n runInInjectionContext(this.injector, () => {\n dataSource.onLoadError!(state, key, dataSourceValue.parameter, error);\n });\n } catch (callbackError) {\n this.logger.error(`Error in onLoadError callback for '${key}'`, callbackError as Error);\n }\n }\n actiondispatcher.dispatchAction(new NgssmSetDataSourceValueAction(key, NgssmDataSourceValueStatus.error, undefined, error));\n }\n });\n });\n\n break;\n }\n\n case NgssmDataActionType.loadDataSourceAdditionalPropertyValue: {\n const ngssmLoadDataSourceAdditionalPropertyValueAction = action as NgssmLoadDataSourceAdditionalPropertyValueAction;\n const property = ngssmLoadDataSourceAdditionalPropertyValueAction.property;\n if (dataSourceValue.additionalProperties[property]?.status !== NgssmDataSourceValueStatus.loading) {\n this.logger.information(\n `Data source additional property value for '${key}' and property '${property}' is not in '${NgssmDataSourceValueStatus.loading}' status: '${dataSourceValue?.status}'`\n );\n return;\n }\n\n runInInjectionContext(this.injector, () => {\n dataSource.additionalPropertyLoadingFunc?.(state, key, property).subscribe({\n next: (value) =>\n actiondispatcher.dispatchAction(\n new NgssmSetDataSourceAdditionalPropertyValueAction(\n key,\n property,\n NgssmDataSourceValueStatus.loaded,\n value,\n ngssmLoadDataSourceAdditionalPropertyValueAction.postLoadingAction\n )\n ),\n error: (error) => {\n this.logger.error(`Unable to load data for '${key}' and property '${property}'`, error);\n actiondispatcher.dispatchAction(\n new NgssmSetDataSourceAdditionalPropertyValueAction(\n key,\n property,\n NgssmDataSourceValueStatus.error,\n undefined,\n ngssmLoadDataSourceAdditionalPropertyValueAction.postLoadingAction,\n error\n )\n );\n }\n });\n });\n\n break;\n }\n }\n }\n}\n","import { effect, EnvironmentInjector, inject, runInInjectionContext } from '@angular/core';\n\nimport { Logger, Store } from 'ngssm-store';\n\nimport {\n NgssmDataActionType,\n NgssmLoadDataSourceAdditionalPropertyValueAction,\n NgssmSetDataSourceAdditionalPropertyValueAction\n} from './actions';\nimport { NgssmDataSourceValueStatus } from './model';\nimport { selectNgssmDataSourceAdditionalPropertyValue } from './selectors';\n\nexport const postLoadingActionExecutorInitializer = async () => {\n const injector = inject(EnvironmentInjector);\n const store = inject(Store);\n const logger = inject(Logger);\n\n effect(() => {\n const action = store.processedAction();\n if (action.type === NgssmDataActionType.loadDataSourceAdditionalPropertyValue) {\n const ngssmLoadDataSourceAdditionalPropertyValueAction = action as NgssmLoadDataSourceAdditionalPropertyValueAction;\n if (!ngssmLoadDataSourceAdditionalPropertyValueAction.postLoadingAction) {\n return;\n }\n\n const isLoaded =\n selectNgssmDataSourceAdditionalPropertyValue(\n store.state(),\n ngssmLoadDataSourceAdditionalPropertyValueAction.key,\n ngssmLoadDataSourceAdditionalPropertyValueAction.property\n )?.status === NgssmDataSourceValueStatus.loaded;\n\n if (isLoaded) {\n logger.information(`[postLoadingActionExecutor] Executing post loading action for ${action.type}`);\n runInInjectionContext(injector, ngssmLoadDataSourceAdditionalPropertyValueAction.postLoadingAction);\n }\n\n return;\n }\n\n if (action.type === NgssmDataActionType.setDataSourceAdditionalPropertyValue) {\n const ngssmSetDataSourceAdditionalPropertyValueAction = action as NgssmSetDataSourceAdditionalPropertyValueAction;\n if (!ngssmSetDataSourceAdditionalPropertyValueAction.postLoadingAction) {\n return;\n }\n\n logger.information(`[postLoadingActionExecutor] Executing post loading action for ${action.type}`);\n runInInjectionContext(injector, ngssmSetDataSourceAdditionalPropertyValueAction.postLoadingAction);\n }\n });\n\n return true;\n};\n","import { effect, inject, untracked } from '@angular/core';\n\nimport { Logger, State, Store } from 'ngssm-store';\n\nimport { NgssmSetDataSourceValueAction, NgssmDataActionType, NgssmLoadDataSourceValueAction } from './actions';\nimport { selectNgssmDataState } from './state';\n\nexport const dataSourcesLinkerInitializer = async () => {\n const store = inject(Store);\n const logger = inject(Logger);\n\n effect(() => {\n const action = store.processedAction();\n if (action.type !== NgssmDataActionType.setDataSourceValue) {\n return;\n }\n\n const setDataSourceValueAction = action as NgssmSetDataSourceValueAction;\n const state = selectNgssmDataState(untracked<State>(() => store.state())).dataSources;\n\n const linkedKeys = new Set(state[setDataSourceValueAction.key]?.linkedDataSources ?? []);\n for (const linkedKey of Object.keys(state).filter((key) => state[key].linkedToDataSource === setDataSourceValueAction.key)) {\n logger.information(`Force reload of data source'${linkedKey}' linked to '${setDataSourceValueAction.key}'`);\n linkedKeys.add(linkedKey);\n }\n\n for (const linkedKey of linkedKeys) {\n store.dispatchAction(\n new NgssmLoadDataSourceValueAction(linkedKey, {\n forceReload: true\n })\n );\n }\n });\n\n return true;\n};\n","import { effect, inject, untracked } from '@angular/core';\n\nimport { EffectFunc, State, Action, Logger, Store } from 'ngssm-store';\n\nimport { NgssmDataActionType, NgssmLoadDataSourceValueAction, NgssmSetDataSourceValueAction } from './actions';\nimport { selectNgssmDataSourceValue } from './selectors';\nimport { NgssmDataSourceValueStatus } from './model';\nimport { selectNgssmDataState } from './state';\n\n/**\n * Effect function that handles loading a data source with a dependency.\n *\n * This effect checks if the requested data source has a dependency that is not yet loaded.\n * If the data source is not currently loading and has a dependency, it dispatches an action\n * to load the dependency data source first. If the data source does not have a dependency,\n * it logs an error message.\n *\n * @param state - The current application state.\n * @param action - The action triggering the effect, expected to be of type NgssmLoadDataSourceValueAction.\n * @returns void\n */\nexport const loadDataSourceWithDependencyEffect: EffectFunc = (state: State, action: Action) => {\n const ngssmLoadDataSourceValueAction = action as NgssmLoadDataSourceValueAction;\n const dataSourceValue = selectNgssmDataSourceValue(state, ngssmLoadDataSourceValueAction.key);\n\n // We only take into account source with a dependency not already loaded. In that case, the status must not be loading.\n if (dataSourceValue.status === NgssmDataSourceValueStatus.loading) {\n return;\n }\n\n const dataSource = selectNgssmDataState(state).dataSources[ngssmLoadDataSourceValueAction.key];\n\n const dependency = dataSource.dependsOnDataSource;\n if (!dependency) {\n // Date source is already loaded and has no dependency.\n // This is the usual case with data source with a lifetime not null and reloaded without being forced when a page is opened.\n return;\n }\n\n const store = inject(Store);\n store.dispatchAction(new NgssmLoadDataSourceValueAction(dependency));\n};\n\n/**\n * Effect initializer that listens for NgssmSetDataSourceValueAction and dispatches any delayed loading actions\n * for dependent data sources. This ensures that when a data source is set, any queued actions for sources\n * waiting on this dependency are executed.\n */\nexport const dependentDataSourceLoadInitializer = async () => {\n const store = inject(Store);\n const logger = inject(Logger);\n\n effect(() => {\n const action = store.processedAction();\n if (action.type !== NgssmDataActionType.setDataSourceValue) {\n return;\n }\n\n const setDataSourceValueAction = action as NgssmSetDataSourceValueAction;\n const state = untracked<State>(() => store.state());\n\n const storedAction = selectNgssmDataState(state).delayedActions[setDataSourceValueAction.key];\n if (storedAction) {\n logger.information(`Dispatching delayed loading action for source ${(storedAction as NgssmLoadDataSourceValueAction).key}`);\n store.dispatchAction(storedAction);\n }\n });\n};\n","import { EnvironmentProviders, makeEnvironmentProviders, inject, provideAppInitializer } from '@angular/core';\n\nimport { Store, provideEffectFunc, provideEffects, provideReducers } from 'ngssm-store';\n\nimport { NGSSM_DATA_SOURCE, NgssmDataSource } from './model';\nimport {\n DataSourceAdditionalPropertyValueReducer,\n DataSourceParameterReducer,\n DataSourceValueReducer,\n DataSourcesRegistrationReducer,\n LoadDataSourceValueReducer\n} from './reducers';\nimport { DataLoadingEffect } from './effects';\nimport { NgssmDataActionType, NgssmRegisterDataSourcesAction } from './actions';\nimport { postLoadingActionExecutorInitializer } from './post-loading-action-executor';\nimport { dataSourcesLinkerInitializer } from './data-sources-linker';\nimport { dependentDataSourceLoadInitializer, loadDataSourceWithDependencyEffect } from './data-source-with-dependency';\n\nconst initDataSourceValues = () => {\n const store = inject(Store);\n const dataSources = (inject(NGSSM_DATA_SOURCE, { optional: true }) as unknown as NgssmDataSource[]) ?? [];\n if (dataSources.length > 0) {\n store.dispatchAction(new NgssmRegisterDataSourcesAction(dataSources));\n }\n};\n\nexport const provideNgssmData = (): EnvironmentProviders => {\n return makeEnvironmentProviders([\n provideAppInitializer(initDataSourceValues),\n provideAppInitializer(postLoadingActionExecutorInitializer),\n provideAppInitializer(dataSourcesLinkerInitializer),\n provideAppInitializer(dependentDataSourceLoadInitializer),\n provideReducers(\n DataSourcesRegistrationReducer,\n DataSourceValueReducer,\n LoadDataSourceValueReducer,\n DataSourceAdditionalPropertyValueReducer,\n DataSourceParameterReducer\n ),\n provideEffects(DataLoadingEffect),\n provideEffectFunc(NgssmDataActionType.loadDataSourceValue, loadDataSourceWithDependencyEffect)\n ]);\n};\n","import { Pipe, PipeTransform } from '@angular/core';\n\nimport { State } from 'ngssm-store';\n\nimport { NgssmDataSourceValueStatus } from '../model';\nimport { selectNgssmDataSourceValue } from '../selectors';\n\n@Pipe({\n name: 'isNgssmDataSourceValueStatus'\n})\nexport class IsNgssmDataSourceValueStatusPipe implements PipeTransform {\n public transform(value: State, ...args: string[]): boolean {\n const key = args[0];\n const expectedStatuses = args.slice(1).map((a) => a as NgssmDataSourceValueStatus);\n const itemStatus = selectNgssmDataSourceValue(value, key).status;\n return expectedStatuses.includes(itemStatus);\n }\n}\n","import { Component, ChangeDetectionStrategy, input, OnDestroy } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { MatOption, MatSelect } from '@angular/material/select';\nimport { MatFormField, MatLabel } from '@angular/material/form-field';\n\nimport { getNgssmDataSourceValueAutoReloadTypes, NgssmDataSourceValueAutoReloadType } from '../../model';\n\n@Component({\n selector: 'ngssm-auto-reload',\n imports: [ReactiveFormsModule, MatFormField, MatLabel, MatSelect, MatOption],\n templateUrl: './ngssm-auto-reload.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class NgssmAutoReloadComponent implements OnDestroy {\n public readonly autoReloadAction = input<() => void>(() => {\n // nothing by default\n });\n\n protected readonly reloadTypes = getNgssmDataSourceValueAutoReloadTypes();\n protected readonly reloadTypeControl = new FormControl<NgssmDataSourceValueAutoReloadType>('Off');\n\n private timerId: number | undefined;\n\n constructor() {\n this.reloadTypeControl.valueChanges.subscribe((v) => {\n if (v === 'Off' && this.timerId) {\n clearInterval(this.timerId);\n this.timerId = undefined;\n return;\n }\n\n let period = 60000;\n switch (v) {\n case '5min':\n period = 5 * period;\n break;\n\n case '15min':\n period = 15 * period;\n break;\n }\n\n this.timerId = setInterval(this.autoReloadAction(), period) as unknown as number;\n });\n }\n\n public ngOnDestroy(): void {\n if (this.timerId) {\n clearInterval(this.timerId);\n this.timerId = undefined;\n }\n }\n}\n","<mat-form-field>\n <mat-label>Select auto reload period</mat-label>\n <mat-select [formControl]=\"reloadTypeControl\">\n @for (option of reloadTypes; track option.value){\n <mat-option [value]=\"option.value\">\n {{option.label}}\n </mat-option>\n }\n </mat-select>\n</mat-form-field>","import { Component, ChangeDetectionStrategy, signal, input, effect, inject } from '@angular/core';\nimport { NgClass } from '@angular/common';\nimport { MatTooltip } from '@angular/material/tooltip';\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\nimport { MatButton, MatIconButton } from '@angular/material/button';\nimport { MatIcon } from '@angular/material/icon';\n\nimport { DateTime } from 'luxon';\n\nimport { createSignal, Store } from 'ngssm-store';\n\nimport { selectNgssmDataState } from '../../state';\nimport { isNgssmDataSourceValueParameterValid, NgssmDataSourceValue, NgssmDataSourceValueStatus } from '../../model';\nimport { NgssmLoadDataSourceValueAction } from '../../actions';\nimport { NgssmAutoReloadComponent } from '../ngssm-auto-reload/ngssm-auto-reload.component';\n\n@Component({\n selector: 'ngssm-data-reload-button',\n imports: [NgClass, MatButton, MatIconButton, MatTooltip, MatIcon, MatProgressSpinner, NgssmAutoReloadComponent],\n templateUrl: './ngssm-data-reload-button.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class NgssmDataReloadButtonComponent {\n public readonly label = input<string | undefined>(undefined);\n public readonly keepAdditionalProperties = input(false);\n public readonly buttonIcon = input<string>('fa-solid fa-rotate-right');\n public readonly autoReloadEnabled = input(false);\n public readonly dataSourceKeys = input<string[]>([]);\n\n protected readonly loadInProgress = signal<boolean>(false);\n protected readonly buttonDisabled = signal<boolean>(true);\n protected readonly tooltipMessage = signal<string>('');\n protected readonly color = signal<string>('primary');\n\n private readonly store = inject(Store);\n private readonly dataSourceValues = createSignal<Record<string, NgssmDataSourceValue>>(\n (state) => selectNgssmDataState(state).dataSourceValues\n );\n\n constructor() {\n effect(() => {\n const values = this.dataSourceValues();\n const keys = this.dataSourceKeys();\n this.loadInProgress.set(keys.findIndex((v) => values[v]?.status === NgssmDataSourceValueStatus.loading) !== -1);\n let timestamp: DateTime | undefined;\n keys.forEach((key) => {\n const keyTimestamp = values[key]?.lastLoadingDate;\n if (keyTimestamp) {\n if (!timestamp || timestamp > keyTimestamp) {\n timestamp = keyTimestamp;\n }\n }\n });\n\n let tooltiMessage = 'Reload data.';\n if (timestamp) {\n tooltiMessage = [tooltiMessage, `Loaded at ${timestamp.toHTTP()}`].join('\\n');\n }\n this.tooltipMessage.set(tooltiMessage);\n\n if (this.loadInProgress()) {\n this.buttonDisabled.set(true);\n return;\n }\n\n const someHasAnInvalidParameter =\n keys.findIndex((key) => values[key] && isNgssmDataSourceValueParameterValid(values[key]) === false) !== -1;\n if (someHasAnInvalidParameter) {\n this.buttonDisabled.set(true);\n return;\n }\n\n this.buttonDisabled.set(keys.findIndex((v) => !!values[v]) === -1);\n\n const someHasAnOutdatedValue = keys.findIndex((key) => values[key]?.valueOutdated === true) !== -1;\n this.color.set(someHasAnOutdatedValue ? 'accent' : 'primary');\n });\n }\n\n protected readonly reloadAction = () => this.reload();\n\n protected reload(): void {\n const isDisabled = this.buttonDisabled();\n if (isDisabled) {\n return;\n }\n\n this.dataSourceKeys().forEach((key) =>\n this.store.dispatchAction(\n new NgssmLoadDataSourceValueAction(key, { forceReload: true, keepAdditionalProperties: this.keepAdditionalProperties() })\n )\n );\n }\n}\n","<div class=\"flex-row-center\">\n @if (label(); as buttonLabel) {\n <button\n mat-stroked-button\n [color]=\"color()\"\n class=\"mat-{{color()}}\"\n (click)=\"reload()\"\n [matTooltip]=\"tooltipMessage()\"\n [disabled]=\"buttonDisabled() === true\"\n id=\"reloadButton\">\n <div class=\"flex-row-center\">\n @if (loadInProgress()) {\n <mat-spinner [diameter]=\"24\" id=\"loadingSpinner\"></mat-spinner>\n } @else {\n <mat-icon [ngClass]=\"buttonIcon()\" [color]=\"color()\"></mat-icon>\n }\n\n <span style=\"width: 0.5rem\"></span>\n\n {{ buttonLabel }}\n </div>\n </button>\n } @else {\n <button\n mat-icon-button\n [color]=\"color()\"\n class=\"mat-{{color()}}\"\n (click)=\"reload()\"\n [matTooltip]=\"tooltipMessage()\"\n [disabled]=\"buttonDisabled() === true\"\n id=\"reloadButton\">\n @if (loadInProgress()) {\n <mat-spinner [diameter]=\"24\" id=\"loadingSpinner\"></mat-spinner>\n } @else {\n <mat-icon [ngClass]=\"buttonIcon()\" [color]=\"color()\"></mat-icon>\n }\n </button>\n }\n\n @if (autoReloadEnabled()) {\n <ngssm-auto-reload class=\"with-margin-left-8\" [autoReloadAction]=\"reloadAction\"></ngssm-auto-reload>\n }\n</div>\n","import { Directive, effect, inject, input, OnDestroy } from '@angular/core';\n\nimport { ACTION_DISPATCHER, ActionDispatcher } from 'ngssm-store';\n\nimport { NgssmDataSource } from '../model';\nimport { NgssmRegisterDataSourceAction, NgssmUnregisterDataSourceAction } from '../actions';\n\n@Directive({\n selector: '[ngssmScopedDataSource]'\n})\nexport class NgssmScopedDataSourceDirective implements OnDestroy {\n public readonly ngssmScopedDataSource = input.required<NgssmDataSource, NgssmDataSource>({\n transform: this.checkDataSoruce\n });\n\n private readonly actionDispatcher: ActionDispatcher = inject(ACTION_DISPATCHER);\n private isInitialized = false;\n\n constructor() {\n effect(() => {\n const dataSource = this.ngssmScopedDataSource();\n this.actionDispatcher.dispatchAction(new NgssmRegisterDataSourceAction(dataSource));\n });\n }\n\n public ngOnDestroy(): void {\n const key = this.ngssmScopedDataSource().key;\n if (key) {\n this.actionDispatcher.dispatchAction(new NgssmUnregisterDataSourceAction(key));\n }\n }\n\n private checkDataSoruce(value: NgssmDataSource): NgssmDataSource {\n if (this.isInitialized) {\n throw new Error('Data source is already set.');\n }\n\n this.isInitialized = true;\n\n return value;\n }\n}\n","import { computed, inject, Signal } from '@angular/core';\nimport { Store } from 'ngssm-store';\n\nimport { selectNgssmDataSourceValue } from './selectors';\n\nexport interface NgssmDataSourceSignal<T = unknown> {\n key: string;\n value: Signal<T>;\n}\n\nexport type NgssmDataSourceSignalType = 'value' | 'status' | 'parameter';\n\nexport interface NgssmDataSourceSignalOptions<T = unknown> {\n type?: NgssmDataSourceSignalType;\n defaultValue?: T;\n}\n\nexport const dataSourceToSignal = <T = unknown>(key: string, options?: NgssmDataSourceSignalOptions<T>): NgssmDataSourceSignal<T> => {\n const store = inject(Store);\n\n const usedOptions = options ?? { type: 'value' };\n if (!usedOptions.type) {\n usedOptions.type = 'value';\n }\n\n switch (usedOptions.type) {\n case 'status':\n return {\n key,\n value: computed(() => selectNgssmDataSourceValue(store.state(), key)?.status ?? options?.defaultValue) as Signal<T>\n };\n\n case 'value':\n return {\n key,\n value: computed(() => selectNgssmDataSourceValue<T>(store.state(), key)?.value ?? options?.defaultValue) as Signal<T>\n };\n\n case 'parameter':\n return {\n key,\n value: computed(() => selectNgssmDataSourceValue<T>(store.state(), key)?.parameter ?? options?.defaultValue) as Signal<T>\n };\n }\n};\n","import { Injector, effect, inject, runInInjectionContext } from '@angular/core';\n\nimport { Store } from 'ngssm-store';\n\nimport { NgssmDataSourceValueStatus } from './model';\nimport { NgssmDataActionType, NgssmSetDataSourceValueAction } from './actions';\n\n/**\n * Creates a runner function that executes a post-loading action when the specified data source's value is set.\n * The runner listens for NgssmSetDataSourceValueAction for the given dataSourceKey and invokes the provided postLoadingAction\n * with the new status. The effect is automatically destroyed after the action is processed.\n *\n * @param dataSourceKey The key of the data source to monitor.\n * @param postLoadingAction A callback to execute with the new NgssmDataSourceValueStatus. It is called in an injection context.\n * @returns A function that, when called, sets up the effect and runner.\n */\nexport const postNgssmDataSourceLoadingActionRunnerBuilder = (\n dataSourceKey: string,\n postLoadingAction: (status: NgssmDataSourceValueStatus) => void\n): (() => void) => {\n const injector = inject(Injector);\n return () => {\n runInInjectionContext(injector, () => {\n const store = inject(Store);\n const effectRef = effect(() => {\n const action = store.processedAction();\n if (action.type === NgssmDataActionType.setDataSourceValue) {\n const typedAction = action as NgssmSetDataSourceValueAction;\n if (typedAction.key === dataSourceKey) {\n runInInjectionContext(injector, () => postLoadingAction(typedAction.status));\n effectRef.destroy();\n }\n }\n });\n });\n };\n};\n","/*\n * Public API Surface of ngssm-data\n */\n\nexport * from './lib/ngssm-data/public-api';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngssm-data",
3
- "version": "21.1.3",
3
+ "version": "21.1.5",
4
4
  "description": "NgSsm - Library used to facilitate the management of data get from remote service or computed locally.",
5
5
  "author": "Lion Marc",
6
6
  "license": "MIT",
@@ -33,5 +33,6 @@
33
33
  "types": "./types/ngssm-data-testing.d.ts",
34
34
  "default": "./fesm2022/ngssm-data-testing.mjs"
35
35
  }
36
- }
36
+ },
37
+ "type": "module"
37
38
  }
@@ -47,6 +47,24 @@ type NgssmDataLoading<TData = unknown, TParameter = unknown> = (state: State, da
47
47
  * Must return an Observable that emits the requested additional property data.
48
48
  */
49
49
  type NgssmAdditionalPropertyLoading<TData = unknown> = (state: State, dataSourceKey: string, additionalProperty: string) => Observable<TData>;
50
+ /**
51
+ * Callback invoked after data source loading succeeds.
52
+ *
53
+ * - state: current global application state
54
+ * - dataSourceKey: source identifier
55
+ * - parameter: parameter passed when loading
56
+ * - value: loaded data
57
+ */
58
+ type NgssmDataSourceLoadSuccessCallback<TData = unknown, TParameter = unknown> = (state: State, dataSourceKey: string, parameter?: TParameter, value?: TData) => void;
59
+ /**
60
+ * Callback invoked after data source loading fails.
61
+ *
62
+ * - state: current global application state
63
+ * - dataSourceKey: source identifier
64
+ * - parameter: parameter passed when loading
65
+ * - error: error returned by helper
66
+ */
67
+ type NgssmDataSourceLoadFailureCallback<TParameter = unknown> = (state: State, dataSourceKey: string, parameter?: TParameter, error?: unknown) => void;
50
68
  /**
51
69
  * Describes a data source and its optional behaviours.
52
70
  *
@@ -59,6 +77,8 @@ type NgssmAdditionalPropertyLoading<TData = unknown> = (state: State, dataSource
59
77
  * - linkedToDataSource: if specified, this data source is reloaded when the target source is updated.
60
78
  * - linkedDataSources: list of other data sources to reload when this source is updated.
61
79
  * - dependsOnDataSource: optional dependency key; when loading this source, the dependency will be loaded first.
80
+ * - onLoaded: optional callback invoked after successful load (value is available).
81
+ * - onLoadError: optional callback invoked after failed load (error is available).
62
82
  */
63
83
  interface NgssmDataSource<TData = unknown, TParameter = unknown, TAdditionalProperty = unknown> {
64
84
  key: string;
@@ -70,6 +90,8 @@ interface NgssmDataSource<TData = unknown, TParameter = unknown, TAdditionalProp
70
90
  linkedToDataSource?: string;
71
91
  linkedDataSources?: string[];
72
92
  dependsOnDataSource?: string;
93
+ onLoaded?: NgssmDataSourceLoadSuccessCallback<TData, TParameter>;
94
+ onLoadError?: NgssmDataSourceLoadFailureCallback<TParameter>;
73
95
  }
74
96
  /**
75
97
  * Injection token used to register data sources via DI.
@@ -88,6 +110,8 @@ interface NgssmDataSourceProvideOptions<TParameter = unknown, TAdditionalPropert
88
110
  linkedToDataSource?: string;
89
111
  linkedDataSources?: string[];
90
112
  dependsOnDataSource?: string;
113
+ onLoaded?: NgssmDataSourceLoadSuccessCallback<unknown, TParameter>;
114
+ onLoadError?: NgssmDataSourceLoadFailureCallback<TParameter>;
91
115
  }
92
116
  /**
93
117
  * Helper function to register a data source in Angular's environment providers.
@@ -415,4 +439,4 @@ declare const postLoadingActionExecutorInitializer: () => Promise<boolean>;
415
439
  declare const postNgssmDataSourceLoadingActionRunnerBuilder: (dataSourceKey: string, postLoadingAction: (status: NgssmDataSourceValueStatus) => void) => (() => void);
416
440
 
417
441
  export { IsNgssmDataSourceValueStatusPipe, NGSSM_DATA_SOURCE, NgssmAutoReloadComponent, NgssmClearDataSourceValueAction, NgssmDataActionType, NgssmDataReloadButtonComponent, NgssmDataSourceValueAction, NgssmDataSourceValueStatus, NgssmDataStateSpecification, NgssmLoadDataSourceAdditionalPropertyValueAction, NgssmLoadDataSourceValueAction, NgssmRegisterDataSourceAction, NgssmRegisterDataSourcesAction, NgssmScopedDataSourceDirective, NgssmSetDataSourceAdditionalPropertyValueAction, NgssmSetDataSourceParameterAction, NgssmSetDataSourceParameterValidityAction, NgssmSetDataSourceValueAction, NgssmUnregisterDataSourceAction, NgssmUpdateDataSourceParameterAction, dataSourceToSignal, getNgssmDataSourceValueAutoReloadTypes, isNgssmDataSourceLoading, isNgssmDataSourceParameterValid, isNgssmDataSourceValueParameterValid, ngssmLoadDataSourceValue, postLoadingActionExecutorInitializer, postNgssmDataSourceLoadingActionRunnerBuilder, provideNgssmData, provideNgssmDataSource, selectNgssmDataSourceAdditionalPropertyValue, selectNgssmDataSourceValue, selectNgssmDataState, throwIfSourceValueDoesNotExist, updateNgssmDataState };
418
- export type { NgssmAdditionalPropertyLoading, NgssmDataLoading, NgssmDataSource, NgssmDataSourceAdditionalPropertyValue, NgssmDataSourceProvideOptions, NgssmDataSourceSignal, NgssmDataSourceSignalOptions, NgssmDataSourceSignalType, NgssmDataSourceValue, NgssmDataSourceValueAutoReloadType, NgssmDataState, NgssmLoadDataSourceOptions };
442
+ export type { NgssmAdditionalPropertyLoading, NgssmDataLoading, NgssmDataSource, NgssmDataSourceAdditionalPropertyValue, NgssmDataSourceLoadFailureCallback, NgssmDataSourceLoadSuccessCallback, NgssmDataSourceProvideOptions, NgssmDataSourceSignal, NgssmDataSourceSignalOptions, NgssmDataSourceSignalType, NgssmDataSourceValue, NgssmDataSourceValueAutoReloadType, NgssmDataState, NgssmLoadDataSourceOptions };