@acorex-platform/framework-client 2.0.0-next.13 → 2.0.0-next.14

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.
Files changed (47) hide show
  1. package/fesm2022/{acorex-platform-framework-client-common-common-settings.provider-Cyr1DaiD.mjs → acorex-platform-framework-client-common-common-settings.provider-ChU2tvyt.mjs} +2 -19
  2. package/fesm2022/{acorex-platform-framework-client-common-common-settings.provider-Cyr1DaiD.mjs.map → acorex-platform-framework-client-common-common-settings.provider-ChU2tvyt.mjs.map} +1 -1
  3. package/fesm2022/acorex-platform-framework-client-common.mjs +26 -126
  4. package/fesm2022/acorex-platform-framework-client-common.mjs.map +1 -1
  5. package/fesm2022/acorex-platform-framework-client-layout-components.mjs +98 -221
  6. package/fesm2022/acorex-platform-framework-client-layout-components.mjs.map +1 -1
  7. package/fesm2022/{acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-D2kZxLOh.mjs → acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-BukN_67G.mjs} +83 -35
  8. package/fesm2022/{acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-D2kZxLOh.mjs.map → acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-BukN_67G.mjs.map} +1 -1
  9. package/fesm2022/{acorex-platform-framework-client-layout-entity-attachments-page.component-BManmr01.mjs → acorex-platform-framework-client-layout-entity-attachments-page.component-BbUuuGOT.mjs} +2 -2
  10. package/fesm2022/{acorex-platform-framework-client-layout-entity-attachments-page.component-BManmr01.mjs.map → acorex-platform-framework-client-layout-entity-attachments-page.component-BbUuuGOT.mjs.map} +1 -1
  11. package/fesm2022/{acorex-platform-framework-client-layout-entity-bulk-entity.command-B8XsnrnO.mjs → acorex-platform-framework-client-layout-entity-bulk-entity.command-B2flk4OK.mjs} +2 -2
  12. package/fesm2022/{acorex-platform-framework-client-layout-entity-bulk-entity.command-B8XsnrnO.mjs.map → acorex-platform-framework-client-layout-entity-bulk-entity.command-B2flk4OK.mjs.map} +1 -1
  13. package/fesm2022/{acorex-platform-framework-client-layout-entity-file-list-popup.component-DGZVS11E.mjs → acorex-platform-framework-client-layout-entity-file-list-popup.component-og7hv1xh.mjs} +2 -2
  14. package/fesm2022/{acorex-platform-framework-client-layout-entity-file-list-popup.component-DGZVS11E.mjs.map → acorex-platform-framework-client-layout-entity-file-list-popup.component-og7hv1xh.mjs.map} +1 -1
  15. package/fesm2022/{acorex-platform-framework-client-layout-entity-gallery-page.component-Be348QCj.mjs → acorex-platform-framework-client-layout-entity-gallery-page.component-BorqAr7O.mjs} +2 -2
  16. package/fesm2022/{acorex-platform-framework-client-layout-entity-gallery-page.component-Be348QCj.mjs.map → acorex-platform-framework-client-layout-entity-gallery-page.component-BorqAr7O.mjs.map} +1 -1
  17. package/fesm2022/acorex-platform-framework-client-layout-entity.mjs +1 -1
  18. package/fesm2022/acorex-platform-framework-client-layout-views.mjs +10 -59
  19. package/fesm2022/acorex-platform-framework-client-layout-views.mjs.map +1 -1
  20. package/fesm2022/acorex-platform-framework-client-layout-widget-core.mjs +158 -42
  21. package/fesm2022/acorex-platform-framework-client-layout-widget-core.mjs.map +1 -1
  22. package/fesm2022/{acorex-platform-framework-client-layout-widgets-acorex-platform-framework-client-layout-widgets-M8SZFPQx.mjs → acorex-platform-framework-client-layout-widgets-acorex-platform-framework-client-layout-widgets-CzhP4_OE.mjs} +5 -13
  23. package/fesm2022/acorex-platform-framework-client-layout-widgets-acorex-platform-framework-client-layout-widgets-CzhP4_OE.mjs.map +1 -0
  24. package/fesm2022/{acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-DsLgZbZA.mjs → acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-BIl416zF.mjs} +2 -2
  25. package/fesm2022/{acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-DsLgZbZA.mjs.map → acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-BIl416zF.mjs.map} +1 -1
  26. package/fesm2022/{acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-Vpz3itLZ.mjs → acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-DK8XXQuT.mjs} +2 -2
  27. package/fesm2022/{acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-Vpz3itLZ.mjs.map → acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-DK8XXQuT.mjs.map} +1 -1
  28. package/fesm2022/acorex-platform-framework-client-layout-widgets.mjs +1 -1
  29. package/fesm2022/acorex-platform-framework-client-realtime.mjs +7 -49
  30. package/fesm2022/acorex-platform-framework-client-realtime.mjs.map +1 -1
  31. package/fesm2022/acorex-platform-framework-client-themes-default.mjs +7 -14
  32. package/fesm2022/acorex-platform-framework-client-themes-default.mjs.map +1 -1
  33. package/i18n/en-AU/general.json +4 -16
  34. package/i18n/en-AU/layout.json +1 -2
  35. package/i18n/en-US/general.json +4 -16
  36. package/i18n/en-US/layout.json +1 -2
  37. package/i18n/fa-IR/general.json +4 -16
  38. package/i18n/fa-IR/layout.json +1 -2
  39. package/package.json +2 -2
  40. package/types/acorex-platform-framework-client-common.d.ts +5 -40
  41. package/types/acorex-platform-framework-client-layout-components.d.ts +3 -9
  42. package/types/acorex-platform-framework-client-layout-entity.d.ts +50 -2
  43. package/types/acorex-platform-framework-client-layout-views.d.ts +0 -15
  44. package/types/acorex-platform-framework-client-layout-widget-core.d.ts +11 -11
  45. package/types/acorex-platform-framework-client-layout-widgets.d.ts +0 -12
  46. package/types/acorex-platform-framework-client-realtime.d.ts +0 -5
  47. package/fesm2022/acorex-platform-framework-client-layout-widgets-acorex-platform-framework-client-layout-widgets-M8SZFPQx.mjs.map +0 -1
@@ -14,12 +14,12 @@ import * as i4$3 from '@acorex/core/format';
14
14
  import { AXFormatService, AXFormatModule } from '@acorex/core/format';
15
15
  import { AXPLayoutRendererComponent, AXPDialogOpener, AXPLayoutBuilderService, resolveLayoutBuilderDialogResult } from '@acorex-platform/framework-client/layout/builder';
16
16
  import * as i1 from '@angular/common';
17
- import { CommonModule, NgTemplateOutlet, AsyncPipe, isPlatformBrowser, DOCUMENT, NgComponentOutlet } from '@angular/common';
17
+ import { CommonModule, NgTemplateOutlet, AsyncPipe, isPlatformBrowser, NgComponentOutlet, DOCUMENT } from '@angular/common';
18
18
  import * as i0 from '@angular/core';
19
19
  import { inject, input, signal, effect, ViewEncapsulation, ChangeDetectionStrategy, Component, output, computed, linkedSignal, InjectionToken, Injector, Injectable, Directive, viewChild, contentChild, ElementRef, afterNextRender, model, EventEmitter, forwardRef, ViewChild, Output, Input, untracked, DestroyRef, PLATFORM_ID, createComponent, EnvironmentInjector, runInInjectionContext, ApplicationRef, makeEnvironmentProviders, viewChildren, ViewChildren, TemplateRef, contentChildren } from '@angular/core';
20
20
  import { AXAccordionCdkModule } from '@acorex/cdk/accordion';
21
21
  import { AXTagModule } from '@acorex/components/tag';
22
- import { AXPSettingsService, AXPStateMessageComponent, openSystemFileDialog, AXPFileChooserSettings, normalizeStoredImageRef, extractFileExtension, AXPFileStorageService, AXPFileTypeProviderService, resolveFileTypeDisplay, AXPCommonSettings, coerceAXPSettingRawValueByKind, AXPFilterOperatorMiddlewareService, ALL_DEFAULT_OPERATORS, withDefaultMultiLanguageOnWidgetProperty, AXPDefaultMultiLanguageConfigService, resolveSearchableText, isStoredImageFileId, resolveStoredImageDisplayUrl, AXPUserStatusFeatureService } from '@acorex-platform/framework-client/common';
22
+ import { AXPSettingsService, AXPStateMessageComponent, AXPFileChooserSettings, normalizeStoredImageRef, extractFileExtension, AXPFileStorageService, AXPFileTypeProviderService, resolveFileTypeDisplay, AXPCommonSettings, coerceAXPSettingRawValueByKind, AXPFilterOperatorMiddlewareService, ALL_DEFAULT_OPERATORS, withDefaultMultiLanguageOnWidgetProperty, AXPDefaultMultiLanguageConfigService, resolveSearchableText, isStoredImageFileId, resolveStoredImageDisplayUrl } from '@acorex-platform/framework-client/common';
23
23
  export { AXPFileChooserSettings, AXPStateMessageComponent } from '@acorex-platform/framework-client/common';
24
24
  import * as i1$1 from '@acorex/components/avatar';
25
25
  import { AXAvatarModule } from '@acorex/components/avatar';
@@ -65,8 +65,8 @@ import { AXPopupService } from '@acorex/components/popup';
65
65
  import { moveItemInArray as moveItemInArray$1, AXDragDirective, AXDragHandleDirective, AXDropListDirective } from '@acorex/cdk/drag-drop';
66
66
  import { normalizeEntityListUserStylingRules, AXP_ENTITY_LIST_RECORD_STYLING_TARGET, createEntityListStylingCondition, isEntityListRecordStylingTarget, resolveEntityListFilterQueryField, resolveEntityListFilterContextField, isCustomQueryView } from '@acorex-platform/framework-shared/entity';
67
67
  import { AXLookupComponent } from '@acorex/components/lookup';
68
- import { AXToastService } from '@acorex/components/toast';
69
68
  import { DomSanitizer } from '@angular/platform-browser';
69
+ import { AXToastService } from '@acorex/components/toast';
70
70
  import { getFileExtension, AXFileService } from '@acorex/core/file';
71
71
  import { AXDialogService } from '@acorex/components/dialog';
72
72
  import { resolveFileViewerFileType, AXFileViewerContainerComponent, AXFileViewerService, AXFileViewerGalleryService } from '@acorex/components/file-viewer';
@@ -4264,6 +4264,36 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
4264
4264
  args: [{ providedIn: 'root' }]
4265
4265
  }] });
4266
4266
 
4267
+ //#region ---- Rejection notifications ----
4268
+ async function notifyFileAcceptRejections(rejected, deps) {
4269
+ if (rejected.length === 0) {
4270
+ return;
4271
+ }
4272
+ const { translateService, toastService, maxFileSize } = deps;
4273
+ const errorTitle = await translateService.translateAsync('@general:messages.error.title');
4274
+ const typeRejections = rejected.filter((entry) => entry.reason === 'type');
4275
+ const sizeRejections = rejected.filter((entry) => entry.reason === 'size');
4276
+ if (typeRejections.length === 1) {
4277
+ const content = await translateService.translateAsync('@general:widgets.file-uploader.validation.file-type-not-allowed', { params: { fileName: typeRejections[0].file.name } });
4278
+ toastService.show({ color: 'danger', title: errorTitle, content });
4279
+ return;
4280
+ }
4281
+ if (typeRejections.length > 1) {
4282
+ const content = await translateService.translateAsync('@general:widgets.file-uploader.validation.file-type-not-allowed-summary', { params: { count: typeRejections.length } });
4283
+ toastService.show({ color: 'danger', title: errorTitle, content });
4284
+ return;
4285
+ }
4286
+ if (sizeRejections.length === 1) {
4287
+ const maxMb = Math.round((maxFileSize / (1024 * 1024)) * 10) / 10;
4288
+ const content = await translateService.translateAsync('@general:widgets.file-uploader.validation.file-size-exceeds-limit', { params: { fileName: sizeRejections[0].file.name, maxSizeMb: maxMb } });
4289
+ toastService.show({ color: 'danger', title: errorTitle, content });
4290
+ return;
4291
+ }
4292
+ const content = await translateService.translateAsync('@general:widgets.file-uploader.validation.files-rejected-summary', { params: { count: rejected.length } });
4293
+ toastService.show({ color: 'danger', title: errorTitle, content });
4294
+ }
4295
+ //#endregion
4296
+
4267
4297
  //#endregion
4268
4298
  //#region ---- Validation ----
4269
4299
  function isUnrestrictedFileAccept(accept) {
@@ -4448,36 +4478,6 @@ function matchesCategoryByExtension(fileName, category) {
4448
4478
  }
4449
4479
  //#endregion
4450
4480
 
4451
- //#region ---- Rejection notifications ----
4452
- async function notifyFileAcceptRejections(rejected, deps) {
4453
- if (rejected.length === 0) {
4454
- return;
4455
- }
4456
- const { translateService, toastService, maxFileSize } = deps;
4457
- const errorTitle = await translateService.translateAsync('@general:messages.generic.error.title');
4458
- const typeRejections = rejected.filter((entry) => entry.reason === 'type');
4459
- const sizeRejections = rejected.filter((entry) => entry.reason === 'size');
4460
- if (typeRejections.length === 1) {
4461
- const content = await translateService.translateAsync('@general:widgets.file-uploader.validation.file-type-not-allowed', { params: { fileName: typeRejections[0].file.name } });
4462
- toastService.show({ color: 'danger', title: errorTitle, content });
4463
- }
4464
- else if (typeRejections.length > 1) {
4465
- const content = await translateService.translateAsync('@general:widgets.file-uploader.validation.file-type-not-allowed-summary', { params: { count: typeRejections.length } });
4466
- toastService.show({ color: 'danger', title: errorTitle, content });
4467
- }
4468
- if (sizeRejections.length === 1) {
4469
- const maxSize = formatMaxFileSizeForDisplay(maxFileSize);
4470
- const content = await translateService.translateAsync('@general:widgets.file-uploader.validation.file-size-exceeds-limit', { params: { fileName: sizeRejections[0].file.name, maxSize } });
4471
- toastService.show({ color: 'danger', title: errorTitle, content });
4472
- return;
4473
- }
4474
- if (sizeRejections.length > 1) {
4475
- const content = await translateService.translateAsync('@general:widgets.file-uploader.validation.files-rejected-summary', { params: { count: sizeRejections.length } });
4476
- toastService.show({ color: 'danger', title: errorTitle, content });
4477
- }
4478
- }
4479
- //#endregion
4480
-
4481
4481
  //#region ---- Accept resolution ----
4482
4482
  const ZIP_ACCEPT_TOKENS = '.zip,application/zip';
4483
4483
  /**
@@ -4503,8 +4503,7 @@ function resolveFileChooserAccept(accept, promptZipOnMultiple) {
4503
4503
  //#endregion
4504
4504
 
4505
4505
  //#region ---- Chooser result validation ----
4506
- /** Blob-backed chooser item as a {@link File}. Drive and file-id items return undefined. */
4507
- function resolveChooserItemFile(item) {
4506
+ function fileFromListItem(item) {
4508
4507
  const source = item.source;
4509
4508
  if (source?.kind !== 'blob' || source.value == null) {
4510
4509
  return undefined;
@@ -4513,8 +4512,7 @@ function resolveChooserItemFile(item) {
4513
4512
  return source.value;
4514
4513
  }
4515
4514
  if (source.value instanceof Blob) {
4516
- const name = item.name?.trim() || 'file';
4517
- return new File([source.value], name, {
4515
+ return new File([source.value], item.name, {
4518
4516
  type: source.value.type ?? '',
4519
4517
  });
4520
4518
  }
@@ -4527,38 +4525,30 @@ function validateFileChooserItems(items, options) {
4527
4525
  const accept = options['accept'];
4528
4526
  const maxFileSize = defaultTo(options['maxFileSize'], 0);
4529
4527
  const passthrough = [];
4530
- const blobEntries = [];
4528
+ const blobItems = [];
4529
+ const blobFiles = [];
4531
4530
  for (const item of items) {
4532
- const file = resolveChooserItemFile(item);
4531
+ const file = fileFromListItem(item);
4533
4532
  if (file) {
4534
- blobEntries.push({ item, file });
4533
+ blobItems.push(item);
4534
+ blobFiles.push(file);
4535
4535
  continue;
4536
4536
  }
4537
4537
  passthrough.push(item);
4538
4538
  }
4539
- const namedAccepted = [];
4540
- const namedRejected = [];
4541
- for (const item of passthrough) {
4542
- const placeholder = new File([], item.name ?? 'file', { type: '' });
4543
- const typeOk = isUnrestrictedFileAccept(accept) || fileNameMatchesAccept(item.name ?? '', accept);
4544
- if (!typeOk) {
4545
- namedRejected.push({ file: placeholder, reason: 'type' });
4546
- continue;
4547
- }
4548
- if (maxFileSize > 0 && (item.size ?? 0) > maxFileSize) {
4549
- namedRejected.push({ file: placeholder, reason: 'size' });
4550
- continue;
4551
- }
4552
- namedAccepted.push(item);
4553
- }
4554
- if (!blobEntries.length) {
4539
+ const namedAccepted = passthrough.filter((item) => isUnrestrictedFileAccept(accept) || fileNameMatchesAccept(item.name ?? '', accept));
4540
+ const namedRejected = passthrough
4541
+ .filter((item) => !namedAccepted.includes(item))
4542
+ .map((item) => ({
4543
+ file: new File([], item.name ?? 'file', { type: '' }),
4544
+ reason: 'type',
4545
+ }));
4546
+ if (!blobFiles.length) {
4555
4547
  return { accepted: namedAccepted, rejected: namedRejected };
4556
4548
  }
4557
- const { accepted, rejected } = filterFilesByAcceptAndMaxSize(blobEntries.map((entry) => entry.file), accept, maxFileSize);
4549
+ const { accepted, rejected } = filterFilesByAcceptAndMaxSize(blobFiles, accept, maxFileSize);
4558
4550
  const acceptedSet = new Set(accepted);
4559
- const acceptedItems = blobEntries
4560
- .filter((entry) => acceptedSet.has(entry.file))
4561
- .map((entry) => entry.item);
4551
+ const acceptedItems = blobItems.filter((item) => acceptedSet.has(fileFromListItem(item)));
4562
4552
  return {
4563
4553
  accepted: [...namedAccepted, ...acceptedItems],
4564
4554
  rejected: [...namedRejected, ...rejected],
@@ -4574,7 +4564,9 @@ const AXPFileChooserHookKeys = {
4574
4564
 
4575
4565
  //#region ---- File chooser tokens ----
4576
4566
  /**
4567
+
4577
4568
  * Multi token for file chooser providers (system disk, drive, external systems).
4569
+
4578
4570
  */
4579
4571
  const AXP_FILE_CHOOSER_PROVIDERS = new InjectionToken('AXP_FILE_CHOOSER_PROVIDERS');
4580
4572
  //#endregion
@@ -4586,37 +4578,14 @@ const AXP_SYSTEM_FILE_CHOOSER_PROVIDER = {
4586
4578
  order: 1,
4587
4579
  choose: async (context) => {
4588
4580
  const fileService = inject(AXFileService);
4589
- const documentRef = inject(DOCUMENT);
4590
- const translateService = inject(AXTranslationService);
4591
- const toastService = inject(AXToastService);
4592
4581
  const multiple = Boolean(context.options['multiple']);
4593
4582
  const fileType = context.options['fileType'];
4594
- const acceptOption = context.options['accept'];
4595
- const maxFileSizeOption = context.options['maxFileSize'];
4596
- const maxFileSize = typeof maxFileSizeOption === 'number' ? maxFileSizeOption : 0;
4597
- const accept = fileType
4598
- ? (acceptOption ?? (await fileService.getAcceptAttribute(fileType)))
4599
- : (acceptOption ?? '');
4600
- const picked = await openSystemFileDialog(documentRef, { accept, multiple });
4601
- if (!picked.length) {
4602
- return undefined;
4603
- }
4604
- let files = picked;
4605
- if (fileType) {
4606
- const validation = await fileService.validateMany(picked, fileType);
4607
- files = validation.accepted;
4608
- if (validation.rejected.length > 0) {
4609
- const rejected = validation.rejected.map((entry) => ({
4610
- file: entry.file,
4611
- reason: catalogRejectionReason(entry.errors, maxFileSize),
4612
- }));
4613
- await notifyFileAcceptRejections(rejected, {
4614
- translateService,
4615
- toastService,
4616
- maxFileSize,
4617
- });
4618
- }
4619
- }
4583
+ const accept = context.options['accept'];
4584
+ const files = await fileService.choose({
4585
+ fileType,
4586
+ accept,
4587
+ multiple,
4588
+ });
4620
4589
  if (!files.length) {
4621
4590
  return undefined;
4622
4591
  }
@@ -4633,13 +4602,9 @@ const AXP_SYSTEM_FILE_CHOOSER_PROVIDER = {
4633
4602
  if (!multiple) {
4634
4603
  return next.slice(0, 1);
4635
4604
  }
4636
- return [...(context.items ?? []), ...next];
4605
+ return [...context.items, ...next];
4637
4606
  },
4638
4607
  };
4639
- function catalogRejectionReason(errors, maxFileSize) {
4640
- const failedForSize = errors.some((error) => (error.rule ?? '').toLowerCase().includes('size'));
4641
- return failedForSize && maxFileSize > 0 ? 'size' : 'type';
4642
- }
4643
4608
  //#endregion
4644
4609
 
4645
4610
  //#region ---- File chooser platform settings ----
@@ -4995,18 +4960,13 @@ class AXPFileChooserService {
4995
4960
  if (!items?.length) {
4996
4961
  return items;
4997
4962
  }
4998
- const previousItems = new Set(context.items ?? []);
4999
- const incoming = items.filter((item) => !previousItems.has(item));
5000
- if (incoming.length === 0) {
5001
- return items;
5002
- }
5003
4963
  const maxFileSize = defaultTo(context.options['maxFileSize'], 0);
5004
4964
  const promptZipOnMultiple = (await this.settingsService.get(AXPFileChooserSettings.PromptZipOnMultiple)) ?? false;
5005
4965
  const validationOptions = {
5006
4966
  ...context.options,
5007
4967
  accept: resolveFileChooserAccept(context.options['accept'], promptZipOnMultiple),
5008
4968
  };
5009
- const { accepted, rejected } = validateFileChooserItems(incoming, validationOptions);
4969
+ const { accepted, rejected } = validateFileChooserItems(items, validationOptions);
5010
4970
  if (rejected.length > 0) {
5011
4971
  await notifyFileAcceptRejections(rejected, {
5012
4972
  translateService: this.translateService,
@@ -5014,14 +4974,7 @@ class AXPFileChooserService {
5014
4974
  maxFileSize,
5015
4975
  });
5016
4976
  }
5017
- if (accepted.length === 0) {
5018
- return undefined;
5019
- }
5020
- if (previousItems.size === 0) {
5021
- return accepted;
5022
- }
5023
- const acceptedIncoming = new Set(accepted);
5024
- return items.filter((item) => previousItems.has(item) || acceptedIncoming.has(item));
4977
+ return accepted.length > 0 ? accepted : undefined;
5025
4978
  }
5026
4979
  async runAfterChosenHook(providerKey, context, items) {
5027
4980
  if (!items?.length) {
@@ -5051,8 +5004,6 @@ class AXPFileChooserDirective {
5051
5004
  constructor() {
5052
5005
  //#region ---- Services & Dependencies ----
5053
5006
  this.chooserService = inject(AXPFileChooserService);
5054
- this.toastService = inject(AXToastService);
5055
- this.translateService = inject(AXTranslationService);
5056
5007
  this.elementRef = inject(ElementRef);
5057
5008
  this.envInjector = inject(EnvironmentInjector);
5058
5009
  this.appRef = inject(ApplicationRef);
@@ -5113,16 +5064,10 @@ class AXPFileChooserDirective {
5113
5064
  ...this.context(),
5114
5065
  items: this.items(),
5115
5066
  });
5116
- if (result?.length) {
5067
+ if (result) {
5117
5068
  this.items.set(result);
5118
5069
  }
5119
5070
  }
5120
- catch (error) {
5121
- console.error('[AXPFileChooserDirective] choose failed', error);
5122
- const title = await this.translateService.translateAsync('@general:messages.generic.error.title');
5123
- const content = await this.translateService.translateAsync('@layout:components.file-chooser.messages.choose-failed');
5124
- this.toastService.show({ color: 'danger', title, content });
5125
- }
5126
5071
  finally {
5127
5072
  this.busy.set(false);
5128
5073
  }
@@ -5156,38 +5101,30 @@ async function compressImageFile(file, quality = 0.7, maxDimension = 1920) {
5156
5101
  if (!file.type.startsWith('image/') || file.type === 'image/svg+xml') {
5157
5102
  return file;
5158
5103
  }
5159
- let bitmap;
5160
- try {
5161
- bitmap = await createImageBitmap(file);
5162
- const longestSide = Math.max(bitmap.width, bitmap.height);
5163
- const scale = longestSide > 0 ? Math.min(1, maxDimension / longestSide) : 1;
5164
- const width = Math.max(1, Math.round(bitmap.width * scale));
5165
- const height = Math.max(1, Math.round(bitmap.height * scale));
5166
- const canvas = document.createElement('canvas');
5167
- canvas.width = width;
5168
- canvas.height = height;
5169
- const context = canvas.getContext('2d');
5170
- if (!context) {
5171
- return file;
5172
- }
5173
- context.drawImage(bitmap, 0, 0, width, height);
5174
- const mimeType = file.type === 'image/png' ? 'image/png' : 'image/jpeg';
5175
- const blob = await new Promise((resolve) => {
5176
- canvas.toBlob(resolve, mimeType, quality);
5177
- });
5178
- if (!blob || blob.size >= file.size) {
5179
- return file;
5180
- }
5181
- const extension = mimeType === 'image/png' ? 'png' : 'jpg';
5182
- const baseName = file.name.includes('.') ? file.name.slice(0, file.name.lastIndexOf('.')) : file.name;
5183
- return new File([blob], `${baseName}.${extension}`, { type: mimeType, lastModified: Date.now() });
5184
- }
5185
- catch {
5104
+ const bitmap = await createImageBitmap(file);
5105
+ const scale = Math.min(1, maxDimension / Math.max(bitmap.width, bitmap.height));
5106
+ const width = Math.max(1, Math.round(bitmap.width * scale));
5107
+ const height = Math.max(1, Math.round(bitmap.height * scale));
5108
+ const canvas = document.createElement('canvas');
5109
+ canvas.width = width;
5110
+ canvas.height = height;
5111
+ const context = canvas.getContext('2d');
5112
+ if (!context) {
5113
+ bitmap.close();
5186
5114
  return file;
5187
5115
  }
5188
- finally {
5189
- bitmap?.close();
5116
+ context.drawImage(bitmap, 0, 0, width, height);
5117
+ bitmap.close();
5118
+ const mimeType = file.type === 'image/png' ? 'image/png' : 'image/jpeg';
5119
+ const blob = await new Promise((resolve) => {
5120
+ canvas.toBlob(resolve, mimeType, quality);
5121
+ });
5122
+ if (!blob || blob.size >= file.size) {
5123
+ return file;
5190
5124
  }
5125
+ const extension = mimeType === 'image/png' ? 'png' : 'jpg';
5126
+ const baseName = file.name.includes('.') ? file.name.slice(0, file.name.lastIndexOf('.')) : file.name;
5127
+ return new File([blob], `${baseName}.${extension}`, { type: mimeType, lastModified: Date.now() });
5191
5128
  }
5192
5129
  /**
5193
5130
  * Builds a store-only ZIP archive (no compression) from the given files.
@@ -5199,10 +5136,9 @@ async function createZipArchive(files, archiveName = 'archive.zip') {
5199
5136
  })));
5200
5137
  const chunks = [];
5201
5138
  const centralDirectory = [];
5202
- const usedNames = new Set();
5203
5139
  let offset = 0;
5204
5140
  for (const entry of entries) {
5205
- const nameBytes = new TextEncoder().encode(uniqueZipEntryName(entry.name, usedNames));
5141
+ const nameBytes = new TextEncoder().encode(entry.name);
5206
5142
  const crc = crc32(entry.data);
5207
5143
  const localHeader = buildLocalFileHeader(nameBytes, entry.data.length, crc);
5208
5144
  chunks.push(localHeader, nameBytes, entry.data);
@@ -5221,32 +5157,10 @@ async function createZipArchive(files, archiveName = 'archive.zip') {
5221
5157
  }
5222
5158
  return new File([archive], archiveName, { type: 'application/zip', lastModified: Date.now() });
5223
5159
  }
5224
- const ZIP_VERSION_NEEDED = 20;
5225
- const ZIP_UTF8_FLAG = 0x0800;
5226
- function uniqueZipEntryName(name, used) {
5227
- const baseName = name || 'file';
5228
- if (!used.has(baseName)) {
5229
- used.add(baseName);
5230
- return baseName;
5231
- }
5232
- const dot = baseName.lastIndexOf('.');
5233
- const stem = dot > 0 ? baseName.slice(0, dot) : baseName;
5234
- const extension = dot > 0 ? baseName.slice(dot) : '';
5235
- let index = 2;
5236
- let candidate = `${stem} (${index})${extension}`;
5237
- while (used.has(candidate)) {
5238
- index += 1;
5239
- candidate = `${stem} (${index})${extension}`;
5240
- }
5241
- used.add(candidate);
5242
- return candidate;
5243
- }
5244
5160
  function buildLocalFileHeader(nameBytes, size, crc) {
5245
5161
  const header = new Uint8Array(30);
5246
5162
  const view = new DataView(header.buffer);
5247
5163
  view.setUint32(0, 0x04034b50, true);
5248
- view.setUint16(4, ZIP_VERSION_NEEDED, true);
5249
- view.setUint16(6, ZIP_UTF8_FLAG, true);
5250
5164
  view.setUint16(8, 0, true);
5251
5165
  view.setUint16(10, 0, true);
5252
5166
  view.setUint32(14, crc, true);
@@ -5260,9 +5174,6 @@ function buildCentralDirectoryHeader(nameBytes, size, crc, offset) {
5260
5174
  const header = new Uint8Array(46);
5261
5175
  const view = new DataView(header.buffer);
5262
5176
  view.setUint32(0, 0x02014b50, true);
5263
- view.setUint16(4, ZIP_VERSION_NEEDED, true);
5264
- view.setUint16(6, ZIP_VERSION_NEEDED, true);
5265
- view.setUint16(8, ZIP_UTF8_FLAG, true);
5266
5177
  view.setUint16(10, 0, true);
5267
5178
  view.setUint16(12, 0, true);
5268
5179
  view.setUint32(16, crc, true);
@@ -5872,44 +5783,21 @@ const AXP_SYSTEM_FILE_UPLOADER_PROVIDER = {
5872
5783
  icon: 'fa-light fa-file-arrow-up',
5873
5784
  order: 1,
5874
5785
  upload: async (context) => {
5875
- const fileStorage = inject(AXPFileStorageService);
5876
- const translateService = inject(AXTranslationService);
5877
- const toastService = inject(AXToastService);
5878
5786
  const multiple = Boolean(context.options['multiple']);
5879
- const maxFileSizeOption = context.options['maxFileSize'];
5880
- // Omitted maxFileSize keeps the historical 10 MB cap. Zero or negative means no limit.
5881
- const maxFileSize = typeof maxFileSizeOption === 'number' ? maxFileSizeOption : 10 * 1024 * 1024;
5787
+ const maxFileSize = defaultTo(context.options['maxFileSize'], 10 * 1024 * 1024);
5882
5788
  const refId = defaultTo(context.options['refId'], 'temp');
5883
5789
  const refType = defaultTo(context.options['refType'], 'file-uploader');
5884
5790
  const category = defaultTo(context.options['category'], 'attachment');
5885
- const chosen = Array.isArray(context.chosen) ? context.chosen : [];
5886
- const rejected = [];
5887
- const uploadable = [];
5888
- for (const item of chosen) {
5889
- const file = resolveChooserItemFile(item);
5890
- if (!file) {
5891
- continue;
5892
- }
5893
- const comparableSize = Math.max(item.size ?? 0, file.size);
5894
- if (maxFileSize > 0 && comparableSize > maxFileSize) {
5895
- rejected.push({ file, reason: 'size' });
5896
- continue;
5897
- }
5898
- uploadable.push({ item, file });
5899
- }
5900
- if (rejected.length > 0) {
5901
- await notifyFileAcceptRejections(rejected, {
5902
- translateService,
5903
- toastService,
5904
- maxFileSize,
5905
- });
5906
- }
5907
- const queue = multiple ? uploadable : uploadable.slice(0, 1);
5908
- if (queue.length === 0) {
5791
+ const chosen = context.chosen.filter((item) => (item.size ?? 0) <= maxFileSize &&
5792
+ item.source?.kind === 'blob' &&
5793
+ item.source.value instanceof File);
5794
+ if (isEmpty(chosen)) {
5909
5795
  return undefined;
5910
5796
  }
5797
+ const fileStorage = inject(AXPFileStorageService);
5911
5798
  const uploaded = [];
5912
- for (const { item, file } of queue) {
5799
+ for (const item of chosen) {
5800
+ const file = item.source.value;
5913
5801
  const info = await fileStorage.save({
5914
5802
  file,
5915
5803
  name: item.name,
@@ -5932,7 +5820,7 @@ const AXP_SYSTEM_FILE_UPLOADER_PROVIDER = {
5932
5820
  if (!multiple) {
5933
5821
  return uploaded.slice(0, 1);
5934
5822
  }
5935
- return [...(context.items ?? []), ...uploaded];
5823
+ return [...context.items, ...uploaded];
5936
5824
  },
5937
5825
  };
5938
5826
  //#endregion
@@ -6010,8 +5898,6 @@ class AXPFileUploaderDirective {
6010
5898
  constructor() {
6011
5899
  //#region ---- Services & Dependencies ----
6012
5900
  this.uploaderService = inject(AXPFileUploaderService);
6013
- this.toastService = inject(AXToastService);
6014
- this.translateService = inject(AXTranslationService);
6015
5901
  this.elementRef = inject(ElementRef);
6016
5902
  this.envInjector = inject(EnvironmentInjector);
6017
5903
  this.appRef = inject(ApplicationRef);
@@ -6076,12 +5962,6 @@ class AXPFileUploaderDirective {
6076
5962
  this.uploaded.set(result);
6077
5963
  }
6078
5964
  }
6079
- catch (error) {
6080
- console.error('[AXPFileUploaderDirective] upload failed', error);
6081
- const title = await this.translateService.translateAsync('@general:messages.generic.error.title');
6082
- const content = await this.translateService.translateAsync('@general:widgets.file-uploader.messages.upload-failed');
6083
- this.toastService.show({ color: 'danger', title, content });
6084
- }
6085
5965
  finally {
6086
5966
  this.busy.set(false);
6087
5967
  }
@@ -15354,7 +15234,6 @@ class AXPUserAvatarComponent {
15354
15234
  this.sessionService = inject(AXPSessionService);
15355
15235
  this.fileStorage = inject(AXPFileStorageService);
15356
15236
  this.presenceService = inject(AXPUserPresenceService, { optional: true });
15357
- this.userStatus = inject(AXPUserStatusFeatureService);
15358
15237
  this.resolveGeneration = 0;
15359
15238
  this.lastResolvedRef = null;
15360
15239
  this.userInfo = signal(null, /* @ts-ignore */
@@ -15402,14 +15281,13 @@ class AXPUserAvatarComponent {
15402
15281
  ...(ngDevMode ? [{ debugName: "isAway" }] : /* istanbul ignore next */ []));
15403
15282
  this.isBusy = computed(() => this.presenceStatus() === 'busy', /* @ts-ignore */
15404
15283
  ...(ngDevMode ? [{ debugName: "isBusy" }] : /* istanbul ignore next */ []));
15405
- this.showPresenceDot = computed(() => this.userStatus.enabled() &&
15406
- this.showPresence() &&
15284
+ this.showPresenceDot = computed(() => this.showPresence() &&
15407
15285
  isWatchablePresenceUserId(String(this.userId() ?? '')) &&
15408
15286
  this.presenceStatus() !== null, /* @ts-ignore */
15409
15287
  ...(ngDevMode ? [{ debugName: "showPresenceDot" }] : /* istanbul ignore next */ []));
15410
15288
  effect((onCleanup) => {
15411
15289
  const id = String(this.userId() ?? '').trim();
15412
- const showPresence = this.showPresence() && this.userStatus.enabled();
15290
+ const showPresence = this.showPresence();
15413
15291
  void this.displayName();
15414
15292
  void this.displayAvatar();
15415
15293
  if (!id) {
@@ -15675,7 +15553,6 @@ class AXPUserCardComponent {
15675
15553
  //#region ----- Services & Dependencies -----
15676
15554
  this.avatarService = inject(AXPUserAvatarService);
15677
15555
  this.presenceService = inject(AXPUserPresenceService, { optional: true });
15678
- this.userStatus = inject(AXPUserStatusFeatureService);
15679
15556
  this.formatService = inject(AXFormatService);
15680
15557
  this.settingsService = inject(AXPSettingsService);
15681
15558
  this.translation = inject(AXTranslationService);
@@ -15732,7 +15609,7 @@ class AXPUserCardComponent {
15732
15609
  }
15733
15610
  }, /* @ts-ignore */
15734
15611
  ...(ngDevMode ? [{ debugName: "presenceLabelKey" }] : /* istanbul ignore next */ []));
15735
- this.showPresence = computed(() => this.userStatus.enabled() && isWatchablePresenceUserId(this.userId()), /* @ts-ignore */
15612
+ this.showPresence = computed(() => isWatchablePresenceUserId(this.userId()), /* @ts-ignore */
15736
15613
  ...(ngDevMode ? [{ debugName: "showPresence" }] : /* istanbul ignore next */ []));
15737
15614
  this.tooltipDisabled = computed(() => !this.tooltipText(), /* @ts-ignore */
15738
15615
  ...(ngDevMode ? [{ debugName: "tooltipDisabled" }] : /* istanbul ignore next */ []));
@@ -15760,7 +15637,7 @@ class AXPUserCardComponent {
15760
15637
  this.subscriptions.add(this.avatarService.getUserInfo$(userId).subscribe((data) => {
15761
15638
  this.identity.set(data);
15762
15639
  }));
15763
- if (this.userStatus.enabled() && this.presenceService && isWatchablePresenceUserId(userId)) {
15640
+ if (this.presenceService && isWatchablePresenceUserId(userId)) {
15764
15641
  this.presenceService.watch(userId);
15765
15642
  this.watchedUserId = userId;
15766
15643
  this.presence.set(this.presenceService.get(userId) ?? { userId, status: 'offline' });
@@ -17142,5 +17019,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
17142
17019
  * Generated bundle index. Do not edit.
17143
17020
  */
17144
17021
 
17145
- export { AXPActivityLogComponent, AXPAvatarComponent, AXPCategoryTreeComponent, AXPColorChooserComponent, AXPColorPalettePickerComponent, AXPColumnItemListComponent, AXPCompareViewComponent, AXPConditionBuilderComponent, AXPConditionBuilderConditionComponent, AXPDataSelectorComponent, AXPDataSelectorService, AXPDragDropListComponent, AXPEntityListStylingDialogService, AXPEntityListStylingPopupComponent, AXPExpressionFieldDefinitions, AXPFileChooserCompressImagesHook, AXPFileChooserDirective, AXPFileChooserHookKeys, AXPFileChooserService, AXPFileChooserZipFilesHook, AXPFileUploaderDirective, AXPFileUploaderHookKeys, AXPFileUploaderService, AXPFileViewerComponent, AXPFileViewerFallbackContentComponent, AXPFileViewerService, AXPImageEditorPopupComponent, AXPImageEditorService, AXPInfiniteScrollDirective, AXPItemConfiguratorComponent, AXPLayoutFloatingZoomBarComponent, AXPLayoutSideDetailPanelComponent, AXPLayoutSideDetailPanelSectionDirective, AXPLocalDataSourceEditorDialogService, AXPMarkdownTemplateDirective, AXPMarkdownViewerComponent, AXPMenuBadgeHelper, AXPMenuCustomizerComponent, AXPMenuCustomizerService, AXPOutcomeResultsViewerComponent, AXPPageComponentRegistryService, AXPPreloadFiltersComponent, AXPPropertyViewerComponent, AXPPropertyViewerPopupComponent, AXPPropertyViewerService, AXPQueryColumnsComponent, AXPQueryFiltersComponent, AXPQuerySortsComponent, AXPQueryViewSaveButtonComponent, AXPQueryViewSaveDialogService, AXPQueryViewTabsComponent, AXPQueryViewsComponent, AXPRepeaterRowsLayoutComponent, AXPResourceAppointmentBoardProvider, AXPResourceAppointmentComponent, AXPResourceAppointmentService, AXPSectionItemsBuilderComponent, AXPSignatureEditorService, AXPSpreadsheetComponent, AXPStandardSectionItemsBuilderComponent, AXPStopwatchComponent, AXPTableColumnsEditorComponent, AXPTableColumnsEditorPopupComponent, AXPTableColumnsEditorService, AXPTableDataEditorComponent, AXPTableDataEditorPopupComponent, AXPTableDataEditorService, AXPTaskBadgeDirective, AXPTaskBadgeProvider, AXPTaskBadgeService, AXPTemplateViewerComponent, AXPTemplateViewerService, AXPTextCommandColumnComponent, AXPThemeLayoutActionsComponent, AXPThemeLayoutBlockComponent, AXPThemeLayoutContainerComponent, AXPThemeLayoutEndSideComponent, AXPThemeLayoutFooterComponent, AXPThemeLayoutHeaderComponent, AXPThemeLayoutListComponent, AXPThemeLayoutListItemComponent, AXPThemeLayoutListItemsGroupComponent, AXPThemeLayoutPageHeaderComponent, AXPThemeLayoutPagePrimaryActionsComponent, AXPThemeLayoutPageSecondaryActionsComponent, AXPThemeLayoutSectionComponent, AXPThemeLayoutStartSideComponent, AXPThemeLayoutToolbarComponent, AXPUserAvatarComponent, AXPUserAvatarService, AXPUserCardComponent, AXPUserCardDirective, AXPUserCardService, AXPVirtualKeypadComponent, AXPWidgetFieldConfiguratorComponent, AXPWidgetItemComponent, AXPWidgetPropertyViewerComponent, AXPWidgetPropertyViewerPopupComponent, AXPWidgetPropertyViewerService, AXP_EXPRESSION_LOGIC_DEFINITIONS, AXP_EXPRESSION_OPERATION_DEFINITIONS, AXP_FILE_CHOOSER_DEFAULT_ZIP_ARCHIVE_NAME, AXP_FILE_CHOOSER_HOOK_PROVIDERS, AXP_FILE_CHOOSER_OPTION_KEYS, AXP_FILE_CHOOSER_PROVIDERS, AXP_FILE_UPLOADER_PROVIDERS, AXP_IMAGE_FILE_CHOOSER_ACCEPT, AXP_INFINITE_SCROLL_DEFAULT_ROOT_MARGIN, AXP_MENU_CUSTOMIZER_SERVICE, AXP_PAGE_COMPONENT_PROVIDER, AXP_PAGE_LAYOUT_ELEMENT_ID, AXP_PROFILE_PHOTO_GRAVATAR_SOURCE_KEY, AXP_RESOURCE_APPOINTMENT_PROVIDER, AXP_SIGNATURE_PROVIDER, AXP_SPREADSHEET_COLUMN_WIDGET_TYPES, AXP_SYSTEM_FILE_CHOOSER_PROVIDER, AXP_SYSTEM_FILE_UPLOADER_PROVIDER, AXP_TASK_BADGE_PROVIDERS, AXP_USER_AVATAR_PROVIDER, PROPERTY_VIEWER_EXPRESSION_EDITOR_MIN_LINES, SPREADSHEET_COLUMN_NAME_PATH, SPREADSHEET_COLUMN_TITLE_PATH, STANDARD_SECTION_ITEMS_SECTION_TABS, USER_CARD_HOVER_OPEN_DELAY_MS, USER_CARD_ITEMS_HOOK, USER_CARD_ITEMS_SKELETON_DELAY_MS, asSpreadsheetColumnTitle, buildEntityListStylingRulesLayout, buildFileChooserOptions, buildGravatarAvatarUrl, buildPropertyViewerInitialContextFromProperties, buildPropertyViewerTabsFromProperties, buildTableColumnsEditorLayout, compressImageFile, createAttachedFileProviderMenu, createZipArchive, fetchGravatarImageFile, fileListItemToFileViewerItem, fileListItemToImageFile, fileMatchesAccept, fileNameMatchesAccept, filterFileProvidersByContext, filterFilesByAcceptAndMaxSize, formatAcceptForDisplay, formatMaxFileSizeForDisplay, getFieldDefinitions, getLogicDefinition, getOperationDefinition, isPropertyBindingExpressionFormValue, isUnrestrictedFileAccept, mapFileListToViewerItems, md5Hex, mergeInfiniteScrollPage, mergeObjectsReplacingArrays, normalizeFileViewerBoundValue, normalizeSpreadsheetColumnName, notifyFileAcceptRejections, observeInfiniteScroll, pickImageFileViaFileChooser, pickProfilePhotoImageFile, preparePropertyForViewer, preparePropertyViewerTabs, provideFileChooserHooks, readSpreadsheetColumnIdentity, readSpreadsheetColumnWidth, registerFieldDefinitions, resolveChooserItemFile, resolveExcludedFileProviderKeys, resolveFileChooserAccept, resolveFileChooserExtension, resolveFileListItemUrl, resolveFileUploaderEmptyStateDescription, resolveInfiniteScrollRoot, sortUserCardActions, sortUserCardRows, spreadsheetColumnIdentityProperties, toSpreadsheetColumnWidget, validateFileChooserItems, visibleUserCardActions, withValidationsOnEditorNode };
17022
+ export { AXPActivityLogComponent, AXPAvatarComponent, AXPCategoryTreeComponent, AXPColorChooserComponent, AXPColorPalettePickerComponent, AXPColumnItemListComponent, AXPCompareViewComponent, AXPConditionBuilderComponent, AXPConditionBuilderConditionComponent, AXPDataSelectorComponent, AXPDataSelectorService, AXPDragDropListComponent, AXPEntityListStylingDialogService, AXPEntityListStylingPopupComponent, AXPExpressionFieldDefinitions, AXPFileChooserCompressImagesHook, AXPFileChooserDirective, AXPFileChooserHookKeys, AXPFileChooserService, AXPFileChooserZipFilesHook, AXPFileUploaderDirective, AXPFileUploaderHookKeys, AXPFileUploaderService, AXPFileViewerComponent, AXPFileViewerFallbackContentComponent, AXPFileViewerService, AXPImageEditorPopupComponent, AXPImageEditorService, AXPInfiniteScrollDirective, AXPItemConfiguratorComponent, AXPLayoutFloatingZoomBarComponent, AXPLayoutSideDetailPanelComponent, AXPLayoutSideDetailPanelSectionDirective, AXPLocalDataSourceEditorDialogService, AXPMarkdownTemplateDirective, AXPMarkdownViewerComponent, AXPMenuBadgeHelper, AXPMenuCustomizerComponent, AXPMenuCustomizerService, AXPOutcomeResultsViewerComponent, AXPPageComponentRegistryService, AXPPreloadFiltersComponent, AXPPropertyViewerComponent, AXPPropertyViewerPopupComponent, AXPPropertyViewerService, AXPQueryColumnsComponent, AXPQueryFiltersComponent, AXPQuerySortsComponent, AXPQueryViewSaveButtonComponent, AXPQueryViewSaveDialogService, AXPQueryViewTabsComponent, AXPQueryViewsComponent, AXPRepeaterRowsLayoutComponent, AXPResourceAppointmentBoardProvider, AXPResourceAppointmentComponent, AXPResourceAppointmentService, AXPSectionItemsBuilderComponent, AXPSignatureEditorService, AXPSpreadsheetComponent, AXPStandardSectionItemsBuilderComponent, AXPStopwatchComponent, AXPTableColumnsEditorComponent, AXPTableColumnsEditorPopupComponent, AXPTableColumnsEditorService, AXPTableDataEditorComponent, AXPTableDataEditorPopupComponent, AXPTableDataEditorService, AXPTaskBadgeDirective, AXPTaskBadgeProvider, AXPTaskBadgeService, AXPTemplateViewerComponent, AXPTemplateViewerService, AXPTextCommandColumnComponent, AXPThemeLayoutActionsComponent, AXPThemeLayoutBlockComponent, AXPThemeLayoutContainerComponent, AXPThemeLayoutEndSideComponent, AXPThemeLayoutFooterComponent, AXPThemeLayoutHeaderComponent, AXPThemeLayoutListComponent, AXPThemeLayoutListItemComponent, AXPThemeLayoutListItemsGroupComponent, AXPThemeLayoutPageHeaderComponent, AXPThemeLayoutPagePrimaryActionsComponent, AXPThemeLayoutPageSecondaryActionsComponent, AXPThemeLayoutSectionComponent, AXPThemeLayoutStartSideComponent, AXPThemeLayoutToolbarComponent, AXPUserAvatarComponent, AXPUserAvatarService, AXPUserCardComponent, AXPUserCardDirective, AXPUserCardService, AXPVirtualKeypadComponent, AXPWidgetFieldConfiguratorComponent, AXPWidgetItemComponent, AXPWidgetPropertyViewerComponent, AXPWidgetPropertyViewerPopupComponent, AXPWidgetPropertyViewerService, AXP_EXPRESSION_LOGIC_DEFINITIONS, AXP_EXPRESSION_OPERATION_DEFINITIONS, AXP_FILE_CHOOSER_DEFAULT_ZIP_ARCHIVE_NAME, AXP_FILE_CHOOSER_HOOK_PROVIDERS, AXP_FILE_CHOOSER_OPTION_KEYS, AXP_FILE_CHOOSER_PROVIDERS, AXP_FILE_UPLOADER_PROVIDERS, AXP_IMAGE_FILE_CHOOSER_ACCEPT, AXP_INFINITE_SCROLL_DEFAULT_ROOT_MARGIN, AXP_MENU_CUSTOMIZER_SERVICE, AXP_PAGE_COMPONENT_PROVIDER, AXP_PAGE_LAYOUT_ELEMENT_ID, AXP_PROFILE_PHOTO_GRAVATAR_SOURCE_KEY, AXP_RESOURCE_APPOINTMENT_PROVIDER, AXP_SIGNATURE_PROVIDER, AXP_SPREADSHEET_COLUMN_WIDGET_TYPES, AXP_SYSTEM_FILE_CHOOSER_PROVIDER, AXP_SYSTEM_FILE_UPLOADER_PROVIDER, AXP_TASK_BADGE_PROVIDERS, AXP_USER_AVATAR_PROVIDER, PROPERTY_VIEWER_EXPRESSION_EDITOR_MIN_LINES, SPREADSHEET_COLUMN_NAME_PATH, SPREADSHEET_COLUMN_TITLE_PATH, STANDARD_SECTION_ITEMS_SECTION_TABS, USER_CARD_HOVER_OPEN_DELAY_MS, USER_CARD_ITEMS_HOOK, USER_CARD_ITEMS_SKELETON_DELAY_MS, asSpreadsheetColumnTitle, buildEntityListStylingRulesLayout, buildFileChooserOptions, buildGravatarAvatarUrl, buildPropertyViewerInitialContextFromProperties, buildPropertyViewerTabsFromProperties, buildTableColumnsEditorLayout, compressImageFile, createAttachedFileProviderMenu, createZipArchive, fetchGravatarImageFile, fileListItemToFileViewerItem, fileListItemToImageFile, fileMatchesAccept, fileNameMatchesAccept, filterFileProvidersByContext, filterFilesByAcceptAndMaxSize, formatAcceptForDisplay, formatMaxFileSizeForDisplay, getFieldDefinitions, getLogicDefinition, getOperationDefinition, isPropertyBindingExpressionFormValue, isUnrestrictedFileAccept, mapFileListToViewerItems, md5Hex, mergeInfiniteScrollPage, mergeObjectsReplacingArrays, normalizeFileViewerBoundValue, normalizeSpreadsheetColumnName, notifyFileAcceptRejections, observeInfiniteScroll, pickImageFileViaFileChooser, pickProfilePhotoImageFile, preparePropertyForViewer, preparePropertyViewerTabs, provideFileChooserHooks, readSpreadsheetColumnIdentity, readSpreadsheetColumnWidth, registerFieldDefinitions, resolveExcludedFileProviderKeys, resolveFileChooserAccept, resolveFileChooserExtension, resolveFileListItemUrl, resolveFileUploaderEmptyStateDescription, resolveInfiniteScrollRoot, sortUserCardActions, sortUserCardRows, spreadsheetColumnIdentityProperties, toSpreadsheetColumnWidget, validateFileChooserItems, visibleUserCardActions, withValidationsOnEditorNode };
17146
17023
  //# sourceMappingURL=acorex-platform-framework-client-layout-components.mjs.map