@elderbyte/ngx-starter 19.9.0 → 19.11.0

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.
@@ -81,7 +81,7 @@ import { MatTab } from '@angular/material/tabs';
81
81
  import { fetchEventSource, EventStreamContentType } from '@microsoft/fetch-event-source';
82
82
 
83
83
  class BytesFormat {
84
- static { this.units = ['bytes', 'KB', 'MB', 'GB', 'TB', 'PB']; }
84
+ static { this.units = ['bytes', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB']; }
85
85
  static format(bytes, precision = 2) {
86
86
  if (isNaN(parseFloat(String(bytes))) || !isFinite(bytes)) {
87
87
  return '?';
@@ -884,6 +884,9 @@ class DurationFormat {
884
884
  else if (milliseconds <= 999) {
885
885
  return this.formatNumber(milliseconds, 0) + ' ms';
886
886
  }
887
+ else {
888
+ return undefined; // TODO: Maybe add way to format 1000+ milliseconds also
889
+ }
887
890
  }
888
891
  formatNumber(value, precision) {
889
892
  return +value.toFixed(precision);
@@ -1839,13 +1842,11 @@ class Objects {
1839
1842
  return src;
1840
1843
  }
1841
1844
  try {
1842
- const json = JSON.stringify(src);
1843
- return JSON.parse(json);
1845
+ return JSON.parse(JSON.stringify(src));
1844
1846
  }
1845
1847
  catch (err) {
1846
- if (err instanceof Error) {
1847
- throw new Error('Failed to clone object! ' + err.message);
1848
- }
1848
+ const errorMessage = err instanceof Error ? err.message : 'unknown error';
1849
+ throw new Error(`Failed to clone object: ${errorMessage}`);
1849
1850
  }
1850
1851
  }
1851
1852
  /**
@@ -2071,7 +2072,7 @@ function coerceInterval(value) {
2071
2072
  return Interval.parse(value);
2072
2073
  }
2073
2074
  else {
2074
- this.logger.warn('Unsupported value that cant be converted to Interval: "' + value + '"');
2075
+ LoggerFactory.getLogger('static: coerceInterval').warn(`Unsupported value that cant be converted to Interval: "${value}"`);
2075
2076
  }
2076
2077
  }
2077
2078
  return undefined;
@@ -2085,7 +2086,7 @@ function coerceIntervalIsoStr(value) {
2085
2086
  return coerceInterval(value)?.toInstantString();
2086
2087
  }
2087
2088
  else {
2088
- this.logger.warn('Unsupported value that cant be converted to Iso Interval Str: "' + value + '"');
2089
+ LoggerFactory.getLogger('static: coerceIntervalIsoStr').warn(`Unsupported value that cant be converted to Iso Interval Str: "${value}"`);
2089
2090
  }
2090
2091
  }
2091
2092
  return undefined;
@@ -3560,7 +3561,7 @@ class IndexedEntities {
3560
3561
  updated.forEach((update) => {
3561
3562
  const id = this.getItemId(update);
3562
3563
  const index = this.indexById(id);
3563
- if (index != -1) {
3564
+ if (index !== -1) {
3564
3565
  newData[index] = update;
3565
3566
  anyUpdated = true;
3566
3567
  }
@@ -3611,9 +3612,10 @@ class IndexedEntities {
3611
3612
  getById(id) {
3612
3613
  const entities = this.entitiesSnapshot;
3613
3614
  const index = this.indexById(id);
3614
- if (index != -1) {
3615
+ if (index !== -1) {
3615
3616
  return entities[index];
3616
3617
  }
3618
+ return undefined;
3617
3619
  }
3618
3620
  notify() {
3619
3621
  this._entities$.next(this._entities$.getValue());
@@ -5919,6 +5921,7 @@ class DataSourceAdapter {
5919
5921
  .findAllContinuable(TokenChunkRequest.first(filters, sorts, limit))
5920
5922
  .pipe(map((page) => page.content));
5921
5923
  }
5924
+ throw new Error('Unsupported data source type');
5922
5925
  }
5923
5926
  }
5924
5927
 
@@ -8379,6 +8382,7 @@ class DataTransferBase {
8379
8382
  if (state.hasFailed) {
8380
8383
  throw state.error ? state.error : 'Completion Failed due unknown error!';
8381
8384
  }
8385
+ return false; // Default return for unexpected state
8382
8386
  }), first());
8383
8387
  }
8384
8388
  /**
@@ -9516,7 +9520,7 @@ class ElderThemeService {
9516
9520
  activateTheme(themeId) {
9517
9521
  const theme = this.findTheme(themeId);
9518
9522
  if (theme) {
9519
- this.logger.info('Activating theme ' + themeId);
9523
+ this.logger.debug('Activating theme ' + themeId);
9520
9524
  this._activeTheme$.next(theme);
9521
9525
  }
9522
9526
  else {
@@ -9724,7 +9728,7 @@ class ElderThemeToggleComponent {
9724
9728
  this.activeToggleTheme$ = combineLatest([
9725
9729
  this.themeService.defaultTheme$,
9726
9730
  this.themeService.activeTheme$,
9727
- ]).pipe(map(([defaultTheme, activeTheme]) => this.decideToggleTheme(defaultTheme, activeTheme)), tap((tt) => this.logger.info('Active toggle theme: ' + tt)));
9731
+ ]).pipe(map(([defaultTheme, activeTheme]) => this.decideToggleTheme(defaultTheme, activeTheme)), tap((tt) => this.logger.debug('Active toggle theme: ' + tt)));
9728
9732
  }
9729
9733
  /***************************************************************************
9730
9734
  * *
@@ -10451,7 +10455,7 @@ class FileSystemApi {
10451
10455
  * *
10452
10456
  **************************************************************************/
10453
10457
  static isGetAsFileSystemHandleSupported(transferItem) {
10454
- // @ts-ignore
10458
+ // @ts-expect-error - getAsFileSystemHandle is not yet in TypeScript's lib.dom.d.ts
10455
10459
  return transferItem.getAsFileSystemHandle !== undefined;
10456
10460
  }
10457
10461
  /**
@@ -10459,7 +10463,7 @@ class FileSystemApi {
10459
10463
  * or `drop` event. Otherwise, it will return null!
10460
10464
  */
10461
10465
  static getAsFileSystemHandle(transferItem) {
10462
- // @ts-ignore
10466
+ // @ts-expect-error - getAsFileSystemHandle is not yet in TypeScript's lib.dom.d.ts
10463
10467
  return from(transferItem.getAsFileSystemHandle());
10464
10468
  }
10465
10469
  /***************************************************************************
@@ -10471,14 +10475,16 @@ class FileSystemApi {
10471
10475
  return 'showOpenFilePicker' in window;
10472
10476
  }
10473
10477
  static openFilePicker(pickerOpts) {
10478
+ if (!FileSystemApi.isFileSystemSupported()) {
10479
+ return throwError(() => new Error('File System API is not supported in this browser'));
10480
+ }
10474
10481
  try {
10475
- // @ts-ignore
10482
+ // @ts-expect-error - showOpenFilePicker is not yet in TypeScript's lib.dom.d.ts
10476
10483
  return from(window.showOpenFilePicker(pickerOpts));
10477
10484
  }
10478
10485
  catch (e) {
10479
- if (e instanceof Error) {
10480
- return throwError(() => e);
10481
- }
10486
+ const errorMessage = e instanceof Error ? e.message : 'unknown error';
10487
+ return throwError(() => new Error(`Error occurred while opening file picker: ${errorMessage}`));
10482
10488
  }
10483
10489
  }
10484
10490
  /***************************************************************************
@@ -10491,13 +10497,12 @@ class FileSystemApi {
10491
10497
  }
10492
10498
  static openDirectoryPicker(pickerOpts) {
10493
10499
  try {
10494
- // @ts-ignore
10500
+ // @ts-expect-error - showDirectoryPicker is not yet in TypeScript's lib.dom.d.ts
10495
10501
  return from(window.showDirectoryPicker(pickerOpts));
10496
10502
  }
10497
10503
  catch (e) {
10498
- if (e instanceof Error) {
10499
- return throwError(() => e);
10500
- }
10504
+ const errorMessage = e instanceof Error ? e.message : 'unknown error';
10505
+ return throwError(() => new Error(`Error occurred while opening directory picker: ${errorMessage}`));
10501
10506
  }
10502
10507
  }
10503
10508
  /***************************************************************************
@@ -10525,7 +10530,7 @@ class FileSystemApi {
10525
10530
  }
10526
10531
  static async getHandlesFromDirectoryAsync(dirHandle) {
10527
10532
  const handles = [];
10528
- // @ts-ignore
10533
+ // @ts-expect-error - values() is not yet in TypeScript's lib.dom.d.ts
10529
10534
  for await (const handle of dirHandle.values()) {
10530
10535
  handles.push(handle);
10531
10536
  }
@@ -15440,12 +15445,14 @@ class ElderChipLabelDirective {
15440
15445
  this.themeColor = input(undefined, {
15441
15446
  alias: 'color',
15442
15447
  });
15448
+ this.chipSize = input('medium');
15443
15449
  this.cssClasses = computed(() => this.buildClassesString({
15444
15450
  themeColor: this.themeColor(),
15445
15451
  stateColor: this.stateColor(),
15446
15452
  levelColor: this.levelColor(),
15447
15453
  namedColor: this.namedColor(),
15448
15454
  }));
15455
+ this.sizeClass = computed(() => this.chipSize() === 'small' ? 'elder-chip-small' : '');
15449
15456
  }
15450
15457
  /***************************************************************************
15451
15458
  * *
@@ -15453,9 +15460,10 @@ class ElderChipLabelDirective {
15453
15460
  * *
15454
15461
  **************************************************************************/
15455
15462
  buildClassesString(colorSpec) {
15456
- return this.buildClasses(colorSpec)
15463
+ const colorClasses = this.buildClasses(colorSpec)
15457
15464
  .filter((cls) => !!cls)
15458
15465
  .join(' ');
15466
+ return (colorClasses + ' ' + this.sizeClass()).trim();
15459
15467
  }
15460
15468
  buildClasses(colorSpec) {
15461
15469
  return [this.baseClass, this.resolveColorClass(colorSpec) ?? 'none'];
@@ -15512,7 +15520,7 @@ class ElderChipLabelDirective {
15512
15520
  }
15513
15521
  }
15514
15522
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.7", ngImport: i0, type: ElderChipLabelDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
15515
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.2.7", type: ElderChipLabelDirective, isStandalone: true, selector: "[elderChipLabel]", inputs: { stateColor: { classPropertyName: "stateColor", publicName: "stateColor", isSignal: true, isRequired: false, transformFunction: null }, levelColor: { classPropertyName: "levelColor", publicName: "levelColor", isSignal: true, isRequired: false, transformFunction: null }, namedColor: { classPropertyName: "namedColor", publicName: "namedColor", isSignal: true, isRequired: false, transformFunction: null }, themeColor: { classPropertyName: "themeColor", publicName: "color", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "cssClasses()" } }, ngImport: i0 }); }
15523
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.2.7", type: ElderChipLabelDirective, isStandalone: true, selector: "[elderChipLabel]", inputs: { stateColor: { classPropertyName: "stateColor", publicName: "stateColor", isSignal: true, isRequired: false, transformFunction: null }, levelColor: { classPropertyName: "levelColor", publicName: "levelColor", isSignal: true, isRequired: false, transformFunction: null }, namedColor: { classPropertyName: "namedColor", publicName: "namedColor", isSignal: true, isRequired: false, transformFunction: null }, themeColor: { classPropertyName: "themeColor", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, chipSize: { classPropertyName: "chipSize", publicName: "chipSize", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "cssClasses()" } }, ngImport: i0 }); }
15516
15524
  }
15517
15525
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.7", ngImport: i0, type: ElderChipLabelDirective, decorators: [{
15518
15526
  type: Directive,
@@ -15640,7 +15648,7 @@ class ElderBadgeComponent {
15640
15648
  return this.chipAvatarTemplate$.getValue();
15641
15649
  }
15642
15650
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.7", ngImport: i0, type: ElderBadgeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
15643
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.7", type: ElderBadgeComponent, isStandalone: true, selector: "elder-badge", inputs: { appearance: "appearance", value: "value", colorSpec: "colorSpec", badgeColor: "badgeColor", avatarSpec: "avatarSpec", setCssClass: ["cssClass", "setCssClass"], chipTemplate: "chipTemplate", chipAvatarTemplate: "chipAvatarTemplate" }, queries: [{ propertyName: "chipTemplateQuery", first: true, predicate: ElderBadgeChipDirective, descendants: true, read: TemplateRef }, { propertyName: "chipAvatarTemplateQuery", first: true, predicate: ElderBadgeChipAvatarDirective, descendants: true, read: TemplateRef }], ngImport: i0, template: "<ng-container *ngIf=\"templates$ | async as templates\">\n <ng-container *ngIf=\"badgeModel$ | async as badgeModel\">\n <mat-chip\n elderChipLabel\n highlighted\n [color]=\"badgeModel.colorSpec?.theme\"\n [stateColor]=\"badgeModel.colorSpec?.state\"\n [levelColor]=\"badgeModel.colorSpec?.level\"\n [class]=\"'elder-badge fill ' + elementClass\"\n >\n <mat-chip-avatar clasS=\"elder-badge-avatar\" *ngIf=\"templates.avatar || badgeModel.showAvatar\">\n <ng-container\n *ngTemplateOutlet=\"\n templates.avatar || simpleAvatarTemplate;\n context: { $implicit: badgeModel }\n \"\n >\n </ng-container>\n </mat-chip-avatar>\n\n <ng-container\n *ngTemplateOutlet=\"templates.chip || simpleChipTemplate; context: { $implicit: badgeModel }\"\n >\n </ng-container>\n\n <ng-content></ng-content>\n </mat-chip>\n </ng-container>\n</ng-container>\n\n<ng-template #simpleChipTemplate let-badgeModel>\n <!--\n <span class=\"elder-chip-text\">{{badgeModel.value | elderTruncate:20}}</span>\n -->\n {{ badgeModel.value | elderTruncate: 20 }}\n</ng-template>\n\n<ng-template #simpleAvatarTemplate let-badgeModel>\n <mat-icon>{{ badgeModel.avatarSpec?.icon }}</mat-icon>\n</ng-template>\n", styles: [".elder-badge{position:absolute!important;width:unset!important;max-width:unset!important;--mdc-chip-container-shape-radius: 10px}.elder-badge.mat-mdc-standard-chip{height:auto}.elder-badge.mat-mdc-standard-chip .mdc-evolution-chip__text-label{font-size:var(--mat-badge-text-size, 12px);font-weight:var(--mat-badge-text-weight, 600)}.elder-badge .mdc-evolution-chip,.elder-badge .mdc-evolution-chip__cell,.elder-badge .mdc-evolution-chip__action{justify-content:center}.elder-badge.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:0;padding-right:0}.mat-badge-small .elder-badge.mat-badge-content{border-radius:16px;min-width:16px}.mat-badge-small.mat-badge-above .elder-badge.mat-badge-content{top:-7px!important}.mat-badge-small.mat-badge-overlap.mat-badge-after .elder-badge.mat-badge-content{right:-5px;transform:translate(100%)!important}.mat-badge-small.mat-badge-overlap.mat-badge-before .elder-badge.mat-badge-content{left:-5px;transform:translate(-100%)!important}.mat-badge-small .elder-badge.mat-mdc-standard-chip .mdc-evolution-chip__action--primary{padding:0 3px!important}.mat-badge-small .elder-badge.mat-badge-content{line-height:14px!important}.mat-badge-medium .elder-badge.mat-badge-content{border-radius:22px;min-width:22px}.mat-badge-medium.mat-badge-overlap.mat-badge-after .elder-badge.mat-badge-content{right:-5px;transform:translate(100%)!important}.mat-badge-medium.mat-badge-overlap.mat-badge-before .elder-badge.mat-badge-content{left:-5px;transform:translate(-100%)!important}.mat-badge-medium .elder-badge.mat-mdc-standard-chip .mdc-evolution-chip__action--primary{padding:0 6px!important}.mat-badge-medium .elder-badge.mat-badge-content{line-height:20px!important}.mat-badge-large .elder-badge.mat-badge-content{border-radius:28px;min-width:28px}.mat-badge-large.mat-badge-overlap.mat-badge-after .elder-badge.mat-badge-content{right:-5px;transform:translate(100%)!important}.mat-badge-large.mat-badge-overlap.mat-badge-before .elder-badge.mat-badge-content{left:-5px;transform:translate(-100%)!important}.mat-badge-large .elder-badge.mat-mdc-standard-chip .mdc-evolution-chip__action--primary{padding:0 6px!important}.mat-badge-large .elder-badge.mat-badge-content{line-height:26px!important}.elder-badge.mat-badge-content{transform:unset!important}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["role", "id", "aria-label", "aria-description", "value", "color", "removable", "highlighted", "disableRipple", "disabled"], outputs: ["removed", "destroyed"], exportAs: ["matChip"] }, { kind: "directive", type: ElderChipLabelDirective, selector: "[elderChipLabel]", inputs: ["stateColor", "levelColor", "namedColor", "color"] }, { kind: "directive", type: MatChipAvatar, selector: "mat-chip-avatar, [matChipAvatar]" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: ElderTruncatePipe, name: "elderTruncate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
15651
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.7", type: ElderBadgeComponent, isStandalone: true, selector: "elder-badge", inputs: { appearance: "appearance", value: "value", colorSpec: "colorSpec", badgeColor: "badgeColor", avatarSpec: "avatarSpec", setCssClass: ["cssClass", "setCssClass"], chipTemplate: "chipTemplate", chipAvatarTemplate: "chipAvatarTemplate" }, queries: [{ propertyName: "chipTemplateQuery", first: true, predicate: ElderBadgeChipDirective, descendants: true, read: TemplateRef }, { propertyName: "chipAvatarTemplateQuery", first: true, predicate: ElderBadgeChipAvatarDirective, descendants: true, read: TemplateRef }], ngImport: i0, template: "<ng-container *ngIf=\"templates$ | async as templates\">\n <ng-container *ngIf=\"badgeModel$ | async as badgeModel\">\n <mat-chip\n elderChipLabel\n highlighted\n [color]=\"badgeModel.colorSpec?.theme\"\n [stateColor]=\"badgeModel.colorSpec?.state\"\n [levelColor]=\"badgeModel.colorSpec?.level\"\n [class]=\"'elder-badge fill ' + elementClass\"\n >\n <mat-chip-avatar clasS=\"elder-badge-avatar\" *ngIf=\"templates.avatar || badgeModel.showAvatar\">\n <ng-container\n *ngTemplateOutlet=\"\n templates.avatar || simpleAvatarTemplate;\n context: { $implicit: badgeModel }\n \"\n >\n </ng-container>\n </mat-chip-avatar>\n\n <ng-container\n *ngTemplateOutlet=\"templates.chip || simpleChipTemplate; context: { $implicit: badgeModel }\"\n >\n </ng-container>\n\n <ng-content></ng-content>\n </mat-chip>\n </ng-container>\n</ng-container>\n\n<ng-template #simpleChipTemplate let-badgeModel>\n <!--\n <span class=\"elder-chip-text\">{{badgeModel.value | elderTruncate:20}}</span>\n -->\n {{ badgeModel.value | elderTruncate: 20 }}\n</ng-template>\n\n<ng-template #simpleAvatarTemplate let-badgeModel>\n <mat-icon>{{ badgeModel.avatarSpec?.icon }}</mat-icon>\n</ng-template>\n", styles: [".elder-badge{position:absolute!important;width:unset!important;max-width:unset!important;--mdc-chip-container-shape-radius: 10px}.elder-badge.mat-mdc-standard-chip{height:auto}.elder-badge.mat-mdc-standard-chip .mdc-evolution-chip__text-label{font-size:var(--mat-badge-text-size, 12px);font-weight:var(--mat-badge-text-weight, 600)}.elder-badge .mdc-evolution-chip,.elder-badge .mdc-evolution-chip__cell,.elder-badge .mdc-evolution-chip__action{justify-content:center}.elder-badge.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:0;padding-right:0}.mat-badge-small .elder-badge.mat-badge-content{border-radius:16px;min-width:16px}.mat-badge-small.mat-badge-above .elder-badge.mat-badge-content{top:-7px!important}.mat-badge-small.mat-badge-overlap.mat-badge-after .elder-badge.mat-badge-content{right:-5px;transform:translate(100%)!important}.mat-badge-small.mat-badge-overlap.mat-badge-before .elder-badge.mat-badge-content{left:-5px;transform:translate(-100%)!important}.mat-badge-small .elder-badge.mat-mdc-standard-chip .mdc-evolution-chip__action--primary{padding:0 3px!important}.mat-badge-small .elder-badge.mat-badge-content{line-height:14px!important}.mat-badge-medium .elder-badge.mat-badge-content{border-radius:22px;min-width:22px}.mat-badge-medium.mat-badge-overlap.mat-badge-after .elder-badge.mat-badge-content{right:-5px;transform:translate(100%)!important}.mat-badge-medium.mat-badge-overlap.mat-badge-before .elder-badge.mat-badge-content{left:-5px;transform:translate(-100%)!important}.mat-badge-medium .elder-badge.mat-mdc-standard-chip .mdc-evolution-chip__action--primary{padding:0 6px!important}.mat-badge-medium .elder-badge.mat-badge-content{line-height:20px!important}.mat-badge-large .elder-badge.mat-badge-content{border-radius:28px;min-width:28px}.mat-badge-large.mat-badge-overlap.mat-badge-after .elder-badge.mat-badge-content{right:-5px;transform:translate(100%)!important}.mat-badge-large.mat-badge-overlap.mat-badge-before .elder-badge.mat-badge-content{left:-5px;transform:translate(-100%)!important}.mat-badge-large .elder-badge.mat-mdc-standard-chip .mdc-evolution-chip__action--primary{padding:0 6px!important}.mat-badge-large .elder-badge.mat-badge-content{line-height:26px!important}.elder-badge.mat-badge-content{transform:unset!important}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["role", "id", "aria-label", "aria-description", "value", "color", "removable", "highlighted", "disableRipple", "disabled"], outputs: ["removed", "destroyed"], exportAs: ["matChip"] }, { kind: "directive", type: ElderChipLabelDirective, selector: "[elderChipLabel]", inputs: ["stateColor", "levelColor", "namedColor", "color", "chipSize"] }, { kind: "directive", type: MatChipAvatar, selector: "mat-chip-avatar, [matChipAvatar]" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: ElderTruncatePipe, name: "elderTruncate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
15644
15652
  }
15645
15653
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.7", ngImport: i0, type: ElderBadgeComponent, decorators: [{
15646
15654
  type: Component,
@@ -18663,12 +18671,7 @@ class ElderTabFocusTrapDirective {
18663
18671
  return Array.from(elements);
18664
18672
  }
18665
18673
  isFocusableByTab(element) {
18666
- if (this.isFocusable(element)) {
18667
- if (element.tabIndex === -1) {
18668
- return false;
18669
- }
18670
- return true;
18671
- }
18674
+ return this.isFocusable(element) && element.tabIndex !== -1;
18672
18675
  }
18673
18676
  isFocusable(element) {
18674
18677
  if (element) {
@@ -19275,7 +19278,7 @@ class ElderTableSortDirective {
19275
19278
  this.logger.warn('[elderTableSort] directive is no longer required. Use matSort on ElderTableComponent directly.');
19276
19279
  }
19277
19280
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.7", ngImport: i0, type: ElderTableSortDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
19278
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.7", type: ElderTableSortDirective, isStandalone: true, selector: "[elderTableSort]", ngImport: i0 }); }
19281
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.7", type: ElderTableSortDirective, isStandalone: true, selector: "[elderTableSort]", inputs: { elderTableSort: "elderTableSort" }, ngImport: i0 }); }
19279
19282
  }
19280
19283
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.7", ngImport: i0, type: ElderTableSortDirective, decorators: [{
19281
19284
  type: Directive,
@@ -19283,7 +19286,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.7", ngImpor
19283
19286
  selector: '[elderTableSort]',
19284
19287
  standalone: true,
19285
19288
  }]
19286
- }], ctorParameters: () => [] });
19289
+ }], ctorParameters: () => [], propDecorators: { elderTableSort: [{
19290
+ type: Input
19291
+ }] } });
19287
19292
 
19288
19293
  /**
19289
19294
  * This directive is meant to be placed on table cells containing numbers.
@@ -19906,6 +19911,7 @@ class ElderTileComponent {
19906
19911
  if (currentSelection && currentSelection.length > 0) {
19907
19912
  return true;
19908
19913
  }
19914
+ return false;
19909
19915
  }
19910
19916
  bringToView() {
19911
19917
  const element = this.elderTileRef().nativeElement;
@@ -20298,7 +20304,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.7", ngImpor
20298
20304
  ElderCompositeSortComponent,
20299
20305
  ElderCompositeSortDcDirective,
20300
20306
  ElderTileComponent,
20301
- NgClass,
20302
20307
  ElderContinuatorComponent,
20303
20308
  ResizeObserverDirective,
20304
20309
  ], template: "<!-- eslint-disable @angular-eslint/template/interactive-supports-focus -->\n<!-- eslint-disable @angular-eslint/template/click-events-have-key-events -->\n<div class=\"full elder-grid-component\">\n @if (dc(); as dc) {\n <!-- Grid Browser -->\n <div\n class=\"layout-col full elder-grid-container\"\n [elderDataContextSelection]=\"dc\"\n #dataSelection=\"elderDataContextSelection\"\n [elderDataContextSelectionModel]=\"selectionModel\"\n >\n <!-- Toolbar Row -->\n @if (toolbarVisible()) {\n <div class=\"layout-row place-start-center flex-none elder-grid-toolbar\">\n @if (selectionVisible) {\n <div class=\"layout-col flex-none px-sm\">\n <elder-selection-master-checkbox class=\"flex-none\"></elder-selection-master-checkbox>\n </div>\n }\n\n <!-- Toolbar -->\n @if (toolbarTemplate) {\n <ng-template\n *ngTemplateOutlet=\"toolbarTemplate; context: { $implicit: this }\"\n ></ng-template>\n }\n\n @if (availableCompositeSorts && availableCompositeSorts.length > 0) {\n <elder-composite-sort\n class=\"flex-none\"\n [availableSorts]=\"availableCompositeSorts\"\n [translationPrefix]=\"sortTranslationPrefix\"\n [elderCompositeSortDc]=\"dc\"\n >\n </elder-composite-sort>\n }\n </div>\n\n <mat-divider></mat-divider>\n }\n\n <elder-data-context-state-indicator class=\"flex-none\" [dataContext]=\"dc\">\n </elder-data-context-state-indicator>\n\n <!-- [cdkDropListSortingDisabled]=\"true\" -->\n <!-- cdkDropList -->\n <cdk-virtual-scroll-viewport\n class=\"layout-col flex elder-grid-browser\"\n id=\"{{ scrollContainerId }}\"\n [itemSize]=\"itemHeight()\"\n [minBufferPx]=\"itemHeight() * 2\"\n [maxBufferPx]=\"itemHeight() * 3\"\n #virtualScrollViewPort\n elderInfiniteScroll\n [eventThrottle]=\"200\"\n [offsetFactor]=\"2\"\n [ignoreScrollEvent]=\"dcStatus()?.loading\"\n [containerId]=\"scrollContainerId\"\n [listenToHost]=\"false\"\n (closeToEnd)=\"requestMoreDataZoned($event)\"\n (elderResizeObserver)=\"containerDimensions$.next($event)\"\n >\n <!-- (scrolling)=\"onScrolling($event)\" -->\n\n <div\n *cdkVirtualFor=\"\n let gridRow of dataRows$;\n trackBy: TrackGridRowByIdFn;\n templateCacheSize: 50\n \"\n class=\"elder-grid-tile-row\"\n [style.height]=\"itemHeight() + 'px'\"\n [style.--elder-grid-column-count]=\"activeColumnCount()\"\n >\n @for (tile of gridRow.cells; track trackCellId($index, tile)) {\n <!-- Tile Cell -->\n @if (isTileVisible(tile)) {\n <elder-tile\n class=\"elder-grid-tile\"\n [value]=\"tile\"\n [selectionEnabled]=\"selectionVisible\"\n [selectionModel]=\"selectionModel\"\n [outlined]=\"tileOutlined()\"\n (click)=\"onItemClick(tile)\"\n (dblclick)=\"onItemDoubleClick(tile)\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n tileTemplate || simpleTileTemplate;\n context: { $implicit: tile }\n \"\n ></ng-container>\n </elder-tile>\n } @else {\n <div class=\"elder-grid-tile-hidden\"></div>\n }\n }\n </div>\n </cdk-virtual-scroll-viewport>\n\n <mat-progress-bar\n class=\"flex-none\"\n [mode]=\"dcStatus()?.loading ? 'indeterminate' : 'determinate'\"\n [color]=\"dcStatus()?.hasError ? 'warn' : 'primary'\"\n >\n </mat-progress-bar>\n\n <!-- Footer -->\n @if (footerVisible()) {\n <div class=\"layout-row place-end-center gap-md flex-none elder-grid-footer\">\n <!-- Continuable -->\n @if (isContinuable) {\n <elder-continuator\n [loadedCount]=\"viewData()?.length\"\n [total]=\"total()\"\n [canLoadMore]=\"canLoadMore()\"\n [chunkSizeOptions]=\"pageSizeOptions()\"\n [chunkSize]=\"currentChunkSize()\"\n (loadMoreRequested)=\"dataSnapshot.loadMore()\"\n ></elder-continuator>\n } @else if (isActivePaged) {\n @if (currentPage(); as page) {\n <mat-paginator\n class=\"flex-none\"\n [length]=\"total()\"\n [pageIndex]=\"page?.index\"\n [pageSize]=\"page?.size\"\n [pageSizeOptions]=\"pageSizeOptions()\"\n >\n </mat-paginator>\n }\n } @else {\n <span class=\"mat-caption noselect pr-md\" style=\"color: var(--md-sys-color-outline)\">\n {{ viewData()?.length }}\n </span>\n }\n </div>\n }\n </div>\n }\n</div>\n\n<ng-template #simpleTileTemplate let-tile>\n @if (tile) {\n <div class=\"layout-col place-center-center flex\" style=\"background-color: lightblue\">\n <p class=\"noselect\">Tile: {{ tile }}</p>\n </div>\n }\n</ng-template>\n", styles: [".elder-grid-tile{width:100%;height:100%;cursor:pointer;overflow:hidden}.elder-grid-tile-row{display:grid;align-items:start;justify-items:start;overflow:hidden;--elder-grid-column-count: 1;padding:8px 16px;grid-template-columns:repeat(var(--elder-grid-column-count),minmax(0,1fr));column-gap:16px}.elder-grid-tile-row:first-child{padding-top:16px}.elder-grid-tile-hidden{flex:0 1 100%;margin:8px;width:100%;height:100%}.elder-grid-container{background-color:var(--elder-grid-background-color)}.elder-grid-flat{border:var(--elder-border-light)}.elder-grid-toolbar{min-height:44px}.elder-grid-footer{min-height:var(--elder-data-element-footer-height)}\n"] }]
@@ -22787,10 +22792,8 @@ class ElderSelectBase extends ElderFormFieldControlBase {
22787
22792
  return this.dataSourceOrThrow().getId(entity);
22788
22793
  }
22789
22794
  catch (e) {
22790
- if (e instanceof Error) {
22791
- throw new Error('Failed to extract id from entity since no dataSource is available! Caused by ' +
22792
- e?.message);
22793
- }
22795
+ const errorMessage = e instanceof Error ? e.message : 'unknown';
22796
+ throw new Error(`Failed to extract id from entity since no dataSource is available! Caused by ${errorMessage}`);
22794
22797
  }
22795
22798
  }
22796
22799
  /***************************************************************************
@@ -25666,7 +25669,7 @@ class ElderMultiSelectChipsComponent extends ElderMultiSelectBase {
25666
25669
  provide: ELDER_SELECT_BASE,
25667
25670
  useExisting: forwardRef(() => ElderMultiSelectChipsComponent),
25668
25671
  },
25669
- ], queries: [{ propertyName: "_customChipInput", first: true, predicate: MatFormFieldControl, descendants: true }, { propertyName: "chipTemplateQuery", first: true, predicate: ElderSelectChipDirective, descendants: true, read: TemplateRef }, { propertyName: "chipAvatarTemplateQuery", first: true, predicate: ElderSelectChipAvatarDirective, descendants: true, read: TemplateRef }, { propertyName: "customInputTemplateQuery", first: true, predicate: ElderSelectCustomInputDirective, descendants: true, read: TemplateRef }], viewQueries: [{ propertyName: "_chipInput", first: true, predicate: ElderSelectComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"elder-flex-control\" [matTooltip]=\"state()?.error\">\n <mat-chip-set\n #chips\n [class.mat-mdc-chip-set-stacked]=\"stacked\"\n cdkDropList\n [cdkDropListOrientation]=\"stacked ? 'vertical' : 'horizontal'\"\n (cdkDropListDropped)=\"drop($event)\"\n [cdkDropListDisabled]=\"!allowSorting\"\n >\n @if (icon) {\n <div class=\"elder-input-prefix-icon-container flex-none\">\n <mat-icon\n disabled\n class=\"elder-prefix-icon elder-mdc-control-icon elder-icon-small noselect\"\n [class.loading]=\"state()?.loading\"\n >\n {{ icon }}\n </mat-icon>\n </div>\n }\n\n @for (chipModel of selectChips(); track chipModel.id) {\n <mat-chip-row\n elderChipLabel\n highlighted\n class=\"noselect clickable-chip\"\n [value]=\"resolveChipValue(chipModel.value)\"\n [color]=\"chipModel.colorSpec?.themeColor\"\n [levelColor]=\"chipModel.colorSpec?.levelColor\"\n [stateColor]=\"chipModel.colorSpec?.stateColor\"\n [namedColor]=\"chipModel.colorSpec?.namedColor\"\n [removable]=\"chipModel.removable\"\n (keydown)=\"onChipKeyDown($event, chipModel.value)\"\n (click)=\"onCurrentClicked(chipModel.value)\"\n cdkDrag\n [cdkDragData]=\"chipModel.value\"\n [cdkDragDisabled]=\"!allowSorting\"\n >\n @if (templates()?.avatar && !chipModel.avatarSpec?.hide) {\n <mat-chip-avatar [class.chip-avatar-xl]=\"chipModel.avatarSpec?.large\">\n <ng-container *ngTemplateOutlet=\"templates().avatar; context: { $implicit: chipModel }\">\n </ng-container>\n </mat-chip-avatar>\n }\n\n <ng-container\n *ngTemplateOutlet=\"\n templates()?.chip || simpleChipTemplate;\n context: { $implicit: chipModel }\n \"\n >\n </ng-container>\n\n @if (chipModel.trailingSpec?.icon; as trailingIcon) {\n <mat-icon\n matChipTrailingIcon\n class=\"elder-trailing-icon\"\n [fontSet]=\"chipModel.trailingSpec?.iconFontSet\"\n >{{ trailingIcon }}</mat-icon\n >\n }\n\n @if (chipModel.removable) {\n <mat-icon matChipRemove (click)=\"onClickRemoveChip($event, chipModel.value)\">\n cancel\n </mat-icon>\n }\n </mat-chip-row>\n }\n\n <div class=\"layout-row place-start-center elder-chip-input\">\n <!-- [matChipInputFor]=\"chips\" -->\n <ng-container *ngTemplateOutlet=\"templates()?.input || selectInput\"> </ng-container>\n\n @if (selectionPopup) {\n <button\n mat-icon-button\n type=\"button\"\n class=\"elder-control-icon-button elder-browse-icon\"\n [disabled]=\"isLocked\"\n (click)=\"openSelectionPopup($event)\"\n aria-label=\"Search\"\n elderStopEventPropagation\n tabIndex=\"-1\"\n >\n <mat-icon class=\"elder-mdc-control-icon\">search</mat-icon>\n </button>\n }\n </div>\n </mat-chip-set>\n</div>\n\n<ng-template #selectInput>\n <!-- mat-mdc-chip-input -->\n <elder-select\n autocomplete\n elderClearSelect\n class=\"elder-chip-input-select flex\"\n [data]=\"dataContextS()\"\n [disabled]=\"!!disabled\"\n [required]=\"!!required\"\n [readonly]=\"!!readonly\"\n [placeholder]=\"placeholderS()\"\n (entityUpdated)=\"appendEntity($event)\"\n [displayPropertyResolver]=\"displayPropertyResolverS()\"\n [valueTemplate]=\"valueTemplate\"\n [queryFilter]=\"queryFilter\"\n [filters]=\"filters\"\n [sorts]=\"sorts\"\n [isOptionDisabledFn]=\"isOptionDisabledInternalFn\"\n [isOptionHiddenFn]=\"isOptionHiddenInternalFn\"\n ></elder-select>\n</ng-template>\n\n<ng-template #simpleChipTemplate let-chipModel>\n <span class=\"elder-chip-text\">{{ chipModel.displayText | elderTruncate: 20 }}</span>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: MatChipSet, selector: "mat-chip-set", inputs: ["disabled", "role", "tabIndex"] }, { kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "directive", type: ElderChipLabelDirective, selector: "[elderChipLabel]", inputs: ["stateColor", "levelColor", "namedColor", "color"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: MatChipAvatar, selector: "mat-chip-avatar, [matChipAvatar]" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: MatChipTrailingIcon, selector: "mat-chip-trailing-icon, [matChipTrailingIcon]" }, { kind: "directive", type: MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: ElderStopEventPropagationDirective, selector: "[elderStopEventPropagation]" }, { kind: "component", type: ElderSelectComponent, selector: "elder-select", inputs: ["nullDisplay", "autocomplete", "allowNull", "entity", "entityId"], outputs: ["entityIdChange", "entityIdUpdated", "entityChange", "entityUpdated", "entity"] }, { kind: "directive", type: ElderClearSelectDirective, selector: "[elderClearSelect]" }, { kind: "pipe", type: ElderTruncatePipe, name: "elderTruncate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25672
+ ], queries: [{ propertyName: "_customChipInput", first: true, predicate: MatFormFieldControl, descendants: true }, { propertyName: "chipTemplateQuery", first: true, predicate: ElderSelectChipDirective, descendants: true, read: TemplateRef }, { propertyName: "chipAvatarTemplateQuery", first: true, predicate: ElderSelectChipAvatarDirective, descendants: true, read: TemplateRef }, { propertyName: "customInputTemplateQuery", first: true, predicate: ElderSelectCustomInputDirective, descendants: true, read: TemplateRef }], viewQueries: [{ propertyName: "_chipInput", first: true, predicate: ElderSelectComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"elder-flex-control\" [matTooltip]=\"state()?.error\">\n <mat-chip-set\n #chips\n [class.mat-mdc-chip-set-stacked]=\"stacked\"\n cdkDropList\n [cdkDropListOrientation]=\"stacked ? 'vertical' : 'horizontal'\"\n (cdkDropListDropped)=\"drop($event)\"\n [cdkDropListDisabled]=\"!allowSorting\"\n >\n @if (icon) {\n <div class=\"elder-input-prefix-icon-container flex-none\">\n <mat-icon\n disabled\n class=\"elder-prefix-icon elder-mdc-control-icon elder-icon-small noselect\"\n [class.loading]=\"state()?.loading\"\n >\n {{ icon }}\n </mat-icon>\n </div>\n }\n\n @for (chipModel of selectChips(); track chipModel.id) {\n <mat-chip-row\n elderChipLabel\n highlighted\n class=\"noselect clickable-chip\"\n [value]=\"resolveChipValue(chipModel.value)\"\n [color]=\"chipModel.colorSpec?.themeColor\"\n [levelColor]=\"chipModel.colorSpec?.levelColor\"\n [stateColor]=\"chipModel.colorSpec?.stateColor\"\n [namedColor]=\"chipModel.colorSpec?.namedColor\"\n [removable]=\"chipModel.removable\"\n (keydown)=\"onChipKeyDown($event, chipModel.value)\"\n (click)=\"onCurrentClicked(chipModel.value)\"\n cdkDrag\n [cdkDragData]=\"chipModel.value\"\n [cdkDragDisabled]=\"!allowSorting\"\n >\n @if (templates()?.avatar && !chipModel.avatarSpec?.hide) {\n <mat-chip-avatar [class.chip-avatar-xl]=\"chipModel.avatarSpec?.large\">\n <ng-container *ngTemplateOutlet=\"templates().avatar; context: { $implicit: chipModel }\">\n </ng-container>\n </mat-chip-avatar>\n }\n\n <ng-container\n *ngTemplateOutlet=\"\n templates()?.chip || simpleChipTemplate;\n context: { $implicit: chipModel }\n \"\n >\n </ng-container>\n\n @if (chipModel.trailingSpec?.icon; as trailingIcon) {\n <mat-icon\n matChipTrailingIcon\n class=\"elder-trailing-icon\"\n [fontSet]=\"chipModel.trailingSpec?.iconFontSet\"\n >{{ trailingIcon }}</mat-icon\n >\n }\n\n @if (chipModel.removable) {\n <mat-icon matChipRemove (click)=\"onClickRemoveChip($event, chipModel.value)\">\n cancel\n </mat-icon>\n }\n </mat-chip-row>\n }\n\n <div class=\"layout-row place-start-center elder-chip-input\">\n <!-- [matChipInputFor]=\"chips\" -->\n <ng-container *ngTemplateOutlet=\"templates()?.input || selectInput\"> </ng-container>\n\n @if (selectionPopup) {\n <button\n mat-icon-button\n type=\"button\"\n class=\"elder-control-icon-button elder-browse-icon\"\n [disabled]=\"isLocked\"\n (click)=\"openSelectionPopup($event)\"\n aria-label=\"Search\"\n elderStopEventPropagation\n tabIndex=\"-1\"\n >\n <mat-icon class=\"elder-mdc-control-icon\">search</mat-icon>\n </button>\n }\n </div>\n </mat-chip-set>\n</div>\n\n<ng-template #selectInput>\n <!-- mat-mdc-chip-input -->\n <elder-select\n autocomplete\n elderClearSelect\n class=\"elder-chip-input-select flex\"\n [data]=\"dataContextS()\"\n [disabled]=\"!!disabled\"\n [required]=\"!!required\"\n [readonly]=\"!!readonly\"\n [placeholder]=\"placeholderS()\"\n (entityUpdated)=\"appendEntity($event)\"\n [displayPropertyResolver]=\"displayPropertyResolverS()\"\n [valueTemplate]=\"valueTemplate\"\n [queryFilter]=\"queryFilter\"\n [filters]=\"filters\"\n [sorts]=\"sorts\"\n [isOptionDisabledFn]=\"isOptionDisabledInternalFn\"\n [isOptionHiddenFn]=\"isOptionHiddenInternalFn\"\n ></elder-select>\n</ng-template>\n\n<ng-template #simpleChipTemplate let-chipModel>\n <span class=\"elder-chip-text\">{{ chipModel.displayText | elderTruncate: 20 }}</span>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: MatChipSet, selector: "mat-chip-set", inputs: ["disabled", "role", "tabIndex"] }, { kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "directive", type: ElderChipLabelDirective, selector: "[elderChipLabel]", inputs: ["stateColor", "levelColor", "namedColor", "color", "chipSize"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: MatChipAvatar, selector: "mat-chip-avatar, [matChipAvatar]" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: MatChipTrailingIcon, selector: "mat-chip-trailing-icon, [matChipTrailingIcon]" }, { kind: "directive", type: MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: ElderStopEventPropagationDirective, selector: "[elderStopEventPropagation]" }, { kind: "component", type: ElderSelectComponent, selector: "elder-select", inputs: ["nullDisplay", "autocomplete", "allowNull", "entity", "entityId"], outputs: ["entityIdChange", "entityIdUpdated", "entityChange", "entityUpdated", "entity"] }, { kind: "directive", type: ElderClearSelectDirective, selector: "[elderClearSelect]" }, { kind: "pipe", type: ElderTruncatePipe, name: "elderTruncate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25670
25673
  }
25671
25674
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.7", ngImport: i0, type: ElderMultiSelectChipsComponent, decorators: [{
25672
25675
  type: Component,
@@ -26250,7 +26253,7 @@ class ElderMultiSelectChipOptionsComponent extends ElderMultiSelectBase {
26250
26253
  provide: ELDER_SELECT_BASE,
26251
26254
  useExisting: forwardRef(() => ElderMultiSelectChipOptionsComponent),
26252
26255
  },
26253
- ], queries: [{ propertyName: "chipTemplateQuery", first: true, predicate: ElderSelectChipDirective, descendants: true, read: TemplateRef }, { propertyName: "chipAvatarTemplateQuery", first: true, predicate: ElderSelectChipAvatarDirective, descendants: true, read: TemplateRef }], viewQueries: [{ propertyName: "_listBox", first: true, predicate: MatChipListbox, descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"elder-flex-control\" [matTooltip]=\"state()?.error\">\n <mat-chip-listbox #chips [class.mat-mdc-chip-set-stacked]=\"stacked\" [multiple]=\"multiple\">\n @if (state(); as state) {\n @if (icon) {\n <div class=\"elder-input-prefix-icon-container flex-none\">\n <mat-icon\n disabled\n class=\"elder-prefix-icon elder-mdc-control-icon elder-icon-small noselect\"\n [class.loading]=\"state.loading\"\n >\n {{ icon }}\n </mat-icon>\n </div>\n }\n }\n\n <ng-content></ng-content>\n\n @for (chipModel of selectChips(); track chipModel.id) {\n <mat-chip-option\n class=\"noselect\"\n [value]=\"resolveChipValue(chipModel.value)\"\n elderChipLabel\n [levelColor]=\"chipModel.colorSpec?.levelColor\"\n [stateColor]=\"chipModel.colorSpec?.stateColor\"\n [namedColor]=\"chipModel.colorSpec?.namedColor\"\n [color]=\"chipModel.colorSpec?.themeColor\"\n [selectable]=\"!chipModel.locked\"\n [disabled]=\"chipModel.locked\"\n [selected]=\"chipModel.selected\"\n (selectionChange)=\"selectionChanged($event, chipModel.value)\"\n >\n @if (templates()?.avatar && !chipModel.avatarSpec?.hide) {\n <mat-chip-avatar [class.chip-avatar-xl]=\"chipModel.avatarSpec?.large\">\n <ng-container *ngTemplateOutlet=\"templates().avatar; context: { $implicit: chipModel }\">\n </ng-container>\n </mat-chip-avatar>\n }\n\n <ng-container\n *ngTemplateOutlet=\"\n templates()?.chip || simpleChipTemplate;\n context: { $implicit: chipModel }\n \"\n >\n </ng-container>\n\n @if (chipModel.trailingSpec?.icon) {\n <mat-icon\n matChipTrailingIcon\n class=\"elder-trailing-icon\"\n [fontSet]=\"chipModel.trailingSpec?.iconFontSet\"\n >{{ chipModel.trailingSpec?.icon }}\n </mat-icon>\n }\n </mat-chip-option>\n }\n\n <div class=\"layout-row place-start-center elder-chip-input\">\n @if (selectionPopup) {\n <button\n mat-icon-button\n type=\"button\"\n class=\"elder-control-icon-button elder-browse-icon\"\n [disabled]=\"isLocked\"\n (click)=\"openSelectionPopup($event)\"\n aria-label=\"Search\"\n elderStopEventPropagation\n tabIndex=\"-1\"\n >\n <mat-icon class=\"elder-mdc-control-icon\">search</mat-icon>\n </button>\n }\n </div>\n </mat-chip-listbox>\n</div>\n\n<ng-template #simpleChipTemplate let-chipModel>\n <span class=\"elder-chip-text\">{{ chipModel.displayText | elderTruncate: 20 }}</span>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: MatChipListbox, selector: "mat-chip-listbox", inputs: ["multiple", "aria-orientation", "selectable", "compareWith", "required", "hideSingleSelectionIndicator", "value"], outputs: ["change"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatChipOption, selector: "mat-basic-chip-option, [mat-basic-chip-option], mat-chip-option, [mat-chip-option]", inputs: ["selectable", "selected"], outputs: ["selectionChange"] }, { kind: "directive", type: ElderChipLabelDirective, selector: "[elderChipLabel]", inputs: ["stateColor", "levelColor", "namedColor", "color"] }, { kind: "directive", type: MatChipAvatar, selector: "mat-chip-avatar, [matChipAvatar]" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: MatChipTrailingIcon, selector: "mat-chip-trailing-icon, [matChipTrailingIcon]" }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: ElderStopEventPropagationDirective, selector: "[elderStopEventPropagation]" }, { kind: "pipe", type: ElderTruncatePipe, name: "elderTruncate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26256
+ ], queries: [{ propertyName: "chipTemplateQuery", first: true, predicate: ElderSelectChipDirective, descendants: true, read: TemplateRef }, { propertyName: "chipAvatarTemplateQuery", first: true, predicate: ElderSelectChipAvatarDirective, descendants: true, read: TemplateRef }], viewQueries: [{ propertyName: "_listBox", first: true, predicate: MatChipListbox, descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"elder-flex-control\" [matTooltip]=\"state()?.error\">\n <mat-chip-listbox #chips [class.mat-mdc-chip-set-stacked]=\"stacked\" [multiple]=\"multiple\">\n @if (state(); as state) {\n @if (icon) {\n <div class=\"elder-input-prefix-icon-container flex-none\">\n <mat-icon\n disabled\n class=\"elder-prefix-icon elder-mdc-control-icon elder-icon-small noselect\"\n [class.loading]=\"state.loading\"\n >\n {{ icon }}\n </mat-icon>\n </div>\n }\n }\n\n <ng-content></ng-content>\n\n @for (chipModel of selectChips(); track chipModel.id) {\n <mat-chip-option\n class=\"noselect\"\n [value]=\"resolveChipValue(chipModel.value)\"\n elderChipLabel\n [levelColor]=\"chipModel.colorSpec?.levelColor\"\n [stateColor]=\"chipModel.colorSpec?.stateColor\"\n [namedColor]=\"chipModel.colorSpec?.namedColor\"\n [color]=\"chipModel.colorSpec?.themeColor\"\n [selectable]=\"!chipModel.locked\"\n [disabled]=\"chipModel.locked\"\n [selected]=\"chipModel.selected\"\n (selectionChange)=\"selectionChanged($event, chipModel.value)\"\n >\n @if (templates()?.avatar && !chipModel.avatarSpec?.hide) {\n <mat-chip-avatar [class.chip-avatar-xl]=\"chipModel.avatarSpec?.large\">\n <ng-container *ngTemplateOutlet=\"templates().avatar; context: { $implicit: chipModel }\">\n </ng-container>\n </mat-chip-avatar>\n }\n\n <ng-container\n *ngTemplateOutlet=\"\n templates()?.chip || simpleChipTemplate;\n context: { $implicit: chipModel }\n \"\n >\n </ng-container>\n\n @if (chipModel.trailingSpec?.icon) {\n <mat-icon\n matChipTrailingIcon\n class=\"elder-trailing-icon\"\n [fontSet]=\"chipModel.trailingSpec?.iconFontSet\"\n >{{ chipModel.trailingSpec?.icon }}\n </mat-icon>\n }\n </mat-chip-option>\n }\n\n <div class=\"layout-row place-start-center elder-chip-input\">\n @if (selectionPopup) {\n <button\n mat-icon-button\n type=\"button\"\n class=\"elder-control-icon-button elder-browse-icon\"\n [disabled]=\"isLocked\"\n (click)=\"openSelectionPopup($event)\"\n aria-label=\"Search\"\n elderStopEventPropagation\n tabIndex=\"-1\"\n >\n <mat-icon class=\"elder-mdc-control-icon\">search</mat-icon>\n </button>\n }\n </div>\n </mat-chip-listbox>\n</div>\n\n<ng-template #simpleChipTemplate let-chipModel>\n <span class=\"elder-chip-text\">{{ chipModel.displayText | elderTruncate: 20 }}</span>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: MatChipListbox, selector: "mat-chip-listbox", inputs: ["multiple", "aria-orientation", "selectable", "compareWith", "required", "hideSingleSelectionIndicator", "value"], outputs: ["change"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatChipOption, selector: "mat-basic-chip-option, [mat-basic-chip-option], mat-chip-option, [mat-chip-option]", inputs: ["selectable", "selected"], outputs: ["selectionChange"] }, { kind: "directive", type: ElderChipLabelDirective, selector: "[elderChipLabel]", inputs: ["stateColor", "levelColor", "namedColor", "color", "chipSize"] }, { kind: "directive", type: MatChipAvatar, selector: "mat-chip-avatar, [matChipAvatar]" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: MatChipTrailingIcon, selector: "mat-chip-trailing-icon, [matChipTrailingIcon]" }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: ElderStopEventPropagationDirective, selector: "[elderStopEventPropagation]" }, { kind: "pipe", type: ElderTruncatePipe, name: "elderTruncate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26254
26257
  }
26255
26258
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.7", ngImport: i0, type: ElderMultiSelectChipOptionsComponent, decorators: [{
26256
26259
  type: Component,
@@ -29676,6 +29679,7 @@ class ElderLocalDateInputComponent extends ElderFormFieldControlBase {
29676
29679
  }
29677
29680
  catch (err) {
29678
29681
  this.logger.warn('Failed to apply value to dateValue: ' + value, err);
29682
+ return undefined;
29679
29683
  }
29680
29684
  }
29681
29685
  mapIgnoreErrorObservable(date, conversionFn) {
@@ -31622,6 +31626,7 @@ class ElderOverlayComponent {
31622
31626
  if (!this.attached) {
31623
31627
  return this.attachOverlay();
31624
31628
  }
31629
+ return undefined;
31625
31630
  }
31626
31631
  /**
31627
31632
  * Hide this overlay
@@ -37620,7 +37625,7 @@ class ReactiveFetchEventSource {
37620
37625
  */
37621
37626
  streamEventsOfType(eventTypeRaw) {
37622
37627
  const eventType = this.eventTypeOrDefault(eventTypeRaw);
37623
- return this.streamEvents().pipe(filter((e) => e.event == eventType));
37628
+ return this.streamEvents().pipe(filter((e) => e.event === eventType));
37624
37629
  }
37625
37630
  /**
37626
37631
  * Get an event stream for all events no matter their type.
@@ -37699,7 +37704,6 @@ class ReactiveFetchEventSource {
37699
37704
  ', state: ' +
37700
37705
  response.status, response);
37701
37706
  this.updateState(ReactiveEventSourceState.OPEN);
37702
- return; // everything's good
37703
37707
  }
37704
37708
  else if (response.status >= 400 && response.status < 500 && response.status !== 429) {
37705
37709
  // client-side errors are usually non-retriable:
@@ -37711,6 +37715,7 @@ class ReactiveFetchEventSource {
37711
37715
  this.updateState(ReactiveEventSourceState.ERROR);
37712
37716
  this.tryReconnect();
37713
37717
  }
37718
+ return undefined; // TODO: Return a promise?
37714
37719
  }
37715
37720
  handleOnError(err) {
37716
37721
  this.updateState(ReactiveEventSourceState.ERROR);