@acorex/platform 21.0.0-next.12 → 21.0.0-next.13

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.
@@ -26,6 +26,11 @@ class AXPFileListPopupComponent extends AXBasePageComponent {
26
26
  this.fileEditable = input(true, ...(ngDevMode ? [{ debugName: "fileEditable" }] : []));
27
27
  this.accept = input('*', ...(ngDevMode ? [{ debugName: "accept" }] : []));
28
28
  this.maxFileSize = input(1024 * 1024 * 100, ...(ngDevMode ? [{ debugName: "maxFileSize" }] : []));
29
+ /** Same as widget plugins (e.g. document) so hooks/actions run in popup too. */
30
+ this.plugins = input([], ...(ngDevMode ? [{ debugName: "plugins" }] : []));
31
+ this.excludePlugins = input([], ...(ngDevMode ? [{ debugName: "excludePlugins" }] : []));
32
+ /** When true, file edit dialog shows name, title and description fields. Default false. */
33
+ this.enableTitleDescription = input(false, ...(ngDevMode ? [{ debugName: "enableTitleDescription" }] : []));
29
34
  //#endregion
30
35
  //#region ---- Computed Properties ----
31
36
  this.mode = computed(() => this.readOnly() ? 'view' : 'edit', ...(ngDevMode ? [{ debugName: "mode" }] : []));
@@ -42,6 +47,9 @@ class AXPFileListPopupComponent extends AXBasePageComponent {
42
47
  accept: this.accept(),
43
48
  maxFileSize: this.maxFileSize(),
44
49
  fileEditable: this.fileEditable(),
50
+ plugins: this.plugins(),
51
+ excludePlugins: this.excludePlugins(),
52
+ enableTitleDescription: this.enableTitleDescription(),
45
53
  },
46
54
  }), ...(ngDevMode ? [{ debugName: "node" }] : []));
47
55
  }
@@ -110,7 +118,7 @@ class AXPFileListPopupComponent extends AXBasePageComponent {
110
118
  });
111
119
  }
112
120
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPFileListPopupComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
113
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: AXPFileListPopupComponent, isStandalone: true, selector: "ng-component", inputs: { files: { classPropertyName: "files", publicName: "files", isSignal: true, isRequired: false, transformFunction: null }, readOnly: { classPropertyName: "readOnly", publicName: "readOnly", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, fileEditable: { classPropertyName: "fileEditable", publicName: "fileEditable", isSignal: true, isRequired: false, transformFunction: null }, accept: { classPropertyName: "accept", publicName: "accept", isSignal: true, isRequired: false, transformFunction: null }, maxFileSize: { classPropertyName: "maxFileSize", publicName: "maxFileSize", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: "<div class=\"ax-p-2\">\n <axp-widgets-container [context]=\"context()\" (onContextChanged)=\"onContextChanged($event)\">\n <ng-container axp-widget-renderer [node]=\"node()\" [mode]=\"mode()\"></ng-container>\n </axp-widgets-container>\n</div>\n<ax-footer>\n <ax-suffix>\n @if (readOnly()) {\n <ax-button [text]=\"'@general:actions.close.title' | translate | async\" (click)=\"close()\"></ax-button>\n } @else {\n <ax-button [text]=\"'@general:actions.discard.title' | translate | async\" (click)=\"close()\"></ax-button>\n <ax-button\n [text]=\"'@general:actions.apply.title' | translate | async\"\n (click)=\"apply()\"\n [color]=\"'primary'\"\n ></ax-button>\n }\n </ax-suffix>\n</ax-footer>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type:
121
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: AXPFileListPopupComponent, isStandalone: true, selector: "ng-component", inputs: { files: { classPropertyName: "files", publicName: "files", isSignal: true, isRequired: false, transformFunction: null }, readOnly: { classPropertyName: "readOnly", publicName: "readOnly", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, fileEditable: { classPropertyName: "fileEditable", publicName: "fileEditable", isSignal: true, isRequired: false, transformFunction: null }, accept: { classPropertyName: "accept", publicName: "accept", isSignal: true, isRequired: false, transformFunction: null }, maxFileSize: { classPropertyName: "maxFileSize", publicName: "maxFileSize", isSignal: true, isRequired: false, transformFunction: null }, plugins: { classPropertyName: "plugins", publicName: "plugins", isSignal: true, isRequired: false, transformFunction: null }, excludePlugins: { classPropertyName: "excludePlugins", publicName: "excludePlugins", isSignal: true, isRequired: false, transformFunction: null }, enableTitleDescription: { classPropertyName: "enableTitleDescription", publicName: "enableTitleDescription", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: "<div class=\"ax-p-2\">\n <axp-widgets-container [context]=\"context()\" (onContextChanged)=\"onContextChanged($event)\">\n <ng-container axp-widget-renderer [node]=\"node()\" [mode]=\"mode()\"></ng-container>\n </axp-widgets-container>\n</div>\n<ax-footer>\n <ax-suffix>\n @if (readOnly()) {\n <ax-button [text]=\"'@general:actions.close.title' | translate | async\" (click)=\"close()\"></ax-button>\n } @else {\n <ax-button [text]=\"'@general:actions.discard.title' | translate | async\" (click)=\"close()\"></ax-button>\n <ax-button\n [text]=\"'@general:actions.apply.title' | translate | async\"\n (click)=\"apply()\"\n [color]=\"'primary'\"\n ></ax-button>\n }\n </ax-suffix>\n</ax-footer>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type:
114
122
  //
115
123
  AXLabelModule }, { kind: "ngmodule", type: AXCheckBoxModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type:
116
124
  //
@@ -129,7 +137,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
129
137
  //
130
138
  AXPWidgetCoreModule
131
139
  ], template: "<div class=\"ax-p-2\">\n <axp-widgets-container [context]=\"context()\" (onContextChanged)=\"onContextChanged($event)\">\n <ng-container axp-widget-renderer [node]=\"node()\" [mode]=\"mode()\"></ng-container>\n </axp-widgets-container>\n</div>\n<ax-footer>\n <ax-suffix>\n @if (readOnly()) {\n <ax-button [text]=\"'@general:actions.close.title' | translate | async\" (click)=\"close()\"></ax-button>\n } @else {\n <ax-button [text]=\"'@general:actions.discard.title' | translate | async\" (click)=\"close()\"></ax-button>\n <ax-button\n [text]=\"'@general:actions.apply.title' | translate | async\"\n (click)=\"apply()\"\n [color]=\"'primary'\"\n ></ax-button>\n }\n </ax-suffix>\n</ax-footer>\n" }]
132
- }], propDecorators: { files: [{ type: i0.Input, args: [{ isSignal: true, alias: "files", required: false }] }], readOnly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readOnly", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], fileEditable: [{ type: i0.Input, args: [{ isSignal: true, alias: "fileEditable", required: false }] }], accept: [{ type: i0.Input, args: [{ isSignal: true, alias: "accept", required: false }] }], maxFileSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxFileSize", required: false }] }] } });
140
+ }], propDecorators: { files: [{ type: i0.Input, args: [{ isSignal: true, alias: "files", required: false }] }], readOnly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readOnly", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], fileEditable: [{ type: i0.Input, args: [{ isSignal: true, alias: "fileEditable", required: false }] }], accept: [{ type: i0.Input, args: [{ isSignal: true, alias: "accept", required: false }] }], maxFileSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxFileSize", required: false }] }], plugins: [{ type: i0.Input, args: [{ isSignal: true, alias: "plugins", required: false }] }], excludePlugins: [{ type: i0.Input, args: [{ isSignal: true, alias: "excludePlugins", required: false }] }], enableTitleDescription: [{ type: i0.Input, args: [{ isSignal: true, alias: "enableTitleDescription", required: false }] }] } });
133
141
 
134
142
  export { AXPFileListPopupComponent };
135
- //# sourceMappingURL=acorex-platform-layout-widgets-file-list-popup.component-BfV3spe3.mjs.map
143
+ //# sourceMappingURL=acorex-platform-layout-widgets-file-list-popup.component-CChaPy_w.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-platform-layout-widgets-file-list-popup.component-CChaPy_w.mjs","sources":["../tmp-esm2022/layout/widgets/lib/widgets/advance/file-uploader/file-list-popup/file-list-popup.component.js"],"sourcesContent":["import { AXButtonModule } from '@acorex/components/button';\nimport { AXCheckBoxModule } from '@acorex/components/check-box';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXLabelModule } from '@acorex/components/label';\nimport { AXBasePageComponent } from '@acorex/components/page';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { Component, computed, inject, input, linkedSignal } from '@angular/core';\nimport { AXPWidgetCoreModule } from '@acorex/platform/layout/widget-core';\nimport { AXPFileStorageService } from '@acorex/platform/common';\nimport * as i0 from \"@angular/core\";\nimport * as i1 from \"@acorex/components/decorators\";\nimport * as i2 from \"@acorex/components/button\";\nimport * as i3 from \"@acorex/platform/layout/widget-core\";\nimport * as i4 from \"@angular/common\";\nimport * as i5 from \"@acorex/core/translation\";\nexport class AXPFileListPopupComponent extends AXBasePageComponent {\n constructor() {\n super(...arguments);\n this.fileService = inject(AXPFileStorageService);\n //#region ---- Component Properties ----\n this.files = input([], ...(ngDevMode ? [{ debugName: \"files\" }] : []));\n this.readOnly = input(false, ...(ngDevMode ? [{ debugName: \"readOnly\" }] : []));\n this.multiple = input(false, ...(ngDevMode ? [{ debugName: \"multiple\" }] : []));\n this.fileEditable = input(true, ...(ngDevMode ? [{ debugName: \"fileEditable\" }] : []));\n this.accept = input('*', ...(ngDevMode ? [{ debugName: \"accept\" }] : []));\n this.maxFileSize = input(1024 * 1024 * 100, ...(ngDevMode ? [{ debugName: \"maxFileSize\" }] : []));\n /** Same as widget plugins (e.g. document) so hooks/actions run in popup too. */\n this.plugins = input([], ...(ngDevMode ? [{ debugName: \"plugins\" }] : []));\n this.excludePlugins = input([], ...(ngDevMode ? [{ debugName: \"excludePlugins\" }] : []));\n /** When true, file edit dialog shows name, title and description fields. Default false. */\n this.enableTitleDescription = input(false, ...(ngDevMode ? [{ debugName: \"enableTitleDescription\" }] : []));\n //#endregion\n //#region ---- Computed Properties ----\n this.mode = computed(() => this.readOnly() ? 'view' : 'edit', ...(ngDevMode ? [{ debugName: \"mode\" }] : []));\n //#endregion\n //#region ---- Context & Node Management ----\n this.context = linkedSignal(() => ({}), ...(ngDevMode ? [{ debugName: \"context\" }] : []));\n this.node = computed(() => ({\n type: 'file-uploader',\n path: 'files',\n defaultValue: Array.isArray(this.files()) && typeof this.files()[0] !== 'string' ? this.files() : [],\n options: {\n readOnly: this.readOnly(),\n multiple: this.multiple(),\n accept: this.accept(),\n maxFileSize: this.maxFileSize(),\n fileEditable: this.fileEditable(),\n plugins: this.plugins(),\n excludePlugins: this.excludePlugins(),\n enableTitleDescription: this.enableTitleDescription(),\n },\n }), ...(ngDevMode ? [{ debugName: \"node\" }] : []));\n }\n onContextChanged(event) {\n this.context.set(event.data);\n }\n //#endregion\n //#region ---- Lifecycle Methods ----\n async ngOnInit() {\n if (Array.isArray(this.files()) && typeof this.files()[0] === 'string') {\n this.isLoading = true;\n // Convert string file IDs to AXPFileListItem objects using batch API\n const prefixedIds = this.files();\n const actualIds = prefixedIds.map((id) => this.removeFilePrefix(id));\n let fileItems = [];\n try {\n const infos = await this.fileService.findMany(actualIds);\n const infoMap = new Map(infos.map((i) => [i.fileId, i]));\n fileItems = prefixedIds.map((prefixedId) => {\n const actualId = this.removeFilePrefix(prefixedId);\n const info = infoMap.get(actualId);\n if (info) {\n return {\n id: info.fileId,\n name: info.name || '',\n size: info.size,\n status: 'uploaded',\n source: {\n kind: 'fileId',\n value: info.fileId,\n },\n };\n }\n return {\n id: actualId,\n name: 'Unknown File',\n size: 0,\n status: 'deleted',\n source: { kind: 'none', value: '' },\n };\n });\n }\n catch (error) {\n console.error('Failed to get file infos', error);\n fileItems = prefixedIds.map((prefixedId) => ({\n id: this.removeFilePrefix(prefixedId),\n name: 'Unknown File',\n size: 0,\n status: 'deleted',\n source: { kind: 'none', value: '' },\n }));\n }\n this.isLoading = false;\n // Update the context with the converted file items\n this.context.set({ files: fileItems });\n }\n }\n removeFilePrefix(fileId) {\n return fileId.startsWith('file:') ? fileId.substring(5) : fileId;\n }\n //#endregion\n //#region ---- UI Handlers ----\n apply() {\n this.close({\n data: this.context(),\n });\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.16\", ngImport: i0, type: AXPFileListPopupComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }\n static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"20.3.16\", type: AXPFileListPopupComponent, isStandalone: true, selector: \"ng-component\", inputs: { files: { classPropertyName: \"files\", publicName: \"files\", isSignal: true, isRequired: false, transformFunction: null }, readOnly: { classPropertyName: \"readOnly\", publicName: \"readOnly\", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: \"multiple\", publicName: \"multiple\", isSignal: true, isRequired: false, transformFunction: null }, fileEditable: { classPropertyName: \"fileEditable\", publicName: \"fileEditable\", isSignal: true, isRequired: false, transformFunction: null }, accept: { classPropertyName: \"accept\", publicName: \"accept\", isSignal: true, isRequired: false, transformFunction: null }, maxFileSize: { classPropertyName: \"maxFileSize\", publicName: \"maxFileSize\", isSignal: true, isRequired: false, transformFunction: null }, plugins: { classPropertyName: \"plugins\", publicName: \"plugins\", isSignal: true, isRequired: false, transformFunction: null }, excludePlugins: { classPropertyName: \"excludePlugins\", publicName: \"excludePlugins\", isSignal: true, isRequired: false, transformFunction: null }, enableTitleDescription: { classPropertyName: \"enableTitleDescription\", publicName: \"enableTitleDescription\", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: \"<div class=\\\"ax-p-2\\\">\\n <axp-widgets-container [context]=\\\"context()\\\" (onContextChanged)=\\\"onContextChanged($event)\\\">\\n <ng-container axp-widget-renderer [node]=\\\"node()\\\" [mode]=\\\"mode()\\\"></ng-container>\\n </axp-widgets-container>\\n</div>\\n<ax-footer>\\n <ax-suffix>\\n @if (readOnly()) {\\n <ax-button [text]=\\\"'@general:actions.close.title' | translate | async\\\" (click)=\\\"close()\\\"></ax-button>\\n } @else {\\n <ax-button [text]=\\\"'@general:actions.discard.title' | translate | async\\\" (click)=\\\"close()\\\"></ax-button>\\n <ax-button\\n [text]=\\\"'@general:actions.apply.title' | translate | async\\\"\\n (click)=\\\"apply()\\\"\\n [color]=\\\"'primary'\\\"\\n ></ax-button>\\n }\\n </ax-suffix>\\n</ax-footer>\\n\", dependencies: [{ kind: \"ngmodule\", type: CommonModule }, { kind: \"ngmodule\", type: \n //\n AXLabelModule }, { kind: \"ngmodule\", type: AXCheckBoxModule }, { kind: \"ngmodule\", type: AXDecoratorModule }, { kind: \"component\", type: i1.AXDecoratorGenericComponent, selector: \"ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay\" }, { kind: \"ngmodule\", type: AXButtonModule }, { kind: \"component\", type: i2.AXButtonComponent, selector: \"ax-button\", inputs: [\"disabled\", \"size\", \"tabIndex\", \"color\", \"look\", \"text\", \"toggleable\", \"selected\", \"iconOnly\", \"type\", \"loadingText\"], outputs: [\"onBlur\", \"onFocus\", \"onClick\", \"selectedChange\", \"toggleableChange\", \"lookChange\", \"colorChange\", \"disabledChange\", \"loadingTextChange\"] }, { kind: \"ngmodule\", type: AXTranslationModule }, { kind: \"ngmodule\", type: \n //\n AXPWidgetCoreModule }, { kind: \"component\", type: i3.AXPWidgetContainerComponent, selector: \"axp-widgets-container\", inputs: [\"context\", \"functions\"], outputs: [\"onContextChanged\"] }, { kind: \"directive\", type: i3.AXPWidgetRendererDirective, selector: \"[axp-widget-renderer]\", inputs: [\"parentNode\", \"index\", \"mode\", \"node\"], outputs: [\"onOptionsChanged\", \"onValueChanged\", \"onLoad\"], exportAs: [\"widgetRenderer\"] }, { kind: \"pipe\", type: i4.AsyncPipe, name: \"async\" }, { kind: \"pipe\", type: i5.AXTranslatorPipe, name: \"translate\" }] }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.16\", ngImport: i0, type: AXPFileListPopupComponent, decorators: [{\n type: Component,\n args: [{ imports: [\n CommonModule,\n //\n AXLabelModule,\n AXCheckBoxModule,\n AXDecoratorModule,\n AXButtonModule,\n AXTranslationModule,\n //\n AXPWidgetCoreModule\n ], template: \"<div class=\\\"ax-p-2\\\">\\n <axp-widgets-container [context]=\\\"context()\\\" (onContextChanged)=\\\"onContextChanged($event)\\\">\\n <ng-container axp-widget-renderer [node]=\\\"node()\\\" [mode]=\\\"mode()\\\"></ng-container>\\n </axp-widgets-container>\\n</div>\\n<ax-footer>\\n <ax-suffix>\\n @if (readOnly()) {\\n <ax-button [text]=\\\"'@general:actions.close.title' | translate | async\\\" (click)=\\\"close()\\\"></ax-button>\\n } @else {\\n <ax-button [text]=\\\"'@general:actions.discard.title' | translate | async\\\" (click)=\\\"close()\\\"></ax-button>\\n <ax-button\\n [text]=\\\"'@general:actions.apply.title' | translate | async\\\"\\n (click)=\\\"apply()\\\"\\n [color]=\\\"'primary'\\\"\\n ></ax-button>\\n }\\n </ax-suffix>\\n</ax-footer>\\n\" }]\n }], propDecorators: { files: [{ type: i0.Input, args: [{ isSignal: true, alias: \"files\", required: false }] }], readOnly: [{ type: i0.Input, args: [{ isSignal: true, alias: \"readOnly\", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: \"multiple\", required: false }] }], fileEditable: [{ type: i0.Input, args: [{ isSignal: true, alias: \"fileEditable\", required: false }] }], accept: [{ type: i0.Input, args: [{ isSignal: true, alias: \"accept\", required: false }] }], maxFileSize: [{ type: i0.Input, args: [{ isSignal: true, alias: \"maxFileSize\", required: false }] }], plugins: [{ type: i0.Input, args: [{ isSignal: true, alias: \"plugins\", required: false }] }], excludePlugins: [{ type: i0.Input, args: [{ isSignal: true, alias: \"excludePlugins\", required: false }] }], enableTitleDescription: [{ type: i0.Input, args: [{ isSignal: true, alias: \"enableTitleDescription\", required: false }] }] } });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1saXN0LXBvcHVwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcGxhdGZvcm0vbGF5b3V0L3dpZGdldHMvc3JjL2xpYi93aWRnZXRzL2FkdmFuY2UvZmlsZS11cGxvYWRlci9maWxlLWxpc3QtcG9wdXAvZmlsZS1saXN0LXBvcHVwLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcGxhdGZvcm0vbGF5b3V0L3dpZGdldHMvc3JjL2xpYi93aWRnZXRzL2FkdmFuY2UvZmlsZS11cGxvYWRlci9maWxlLWxpc3QtcG9wdXAvZmlsZS1saXN0LXBvcHVwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFL0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxtQkFBbUIsRUFBa0QsTUFBTSxxQ0FBcUMsQ0FBQztBQUMxSCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7Ozs7OztBQWdCaEUsTUFBTSxPQUFP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QkFDRixtQkFBbUI7OzRGQUlWLHlCQUF5QjtrQkFkckMsU0FBUzs4QkFDQzt3QkFDUCxZQUFZO3dCQUNaLEVBQUU7d0JBQ0YsYUFBYTt3QkFDYixnQkFBZ0I7d0JBQ2hCLGlCQUFpQjt3QkFDakIsY0FBYzt3QkFDZCxtQkFBbUI7d0JBQ25CLEVBQUU7d0JBQ0YsbUJBQW1CO3FCQUNwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFYQnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFjb3JleC9jb21wb25lbnRzL2J1dHRvbic7XG5pbXBvcnQgeyBBWENoZWNrQm94TW9kdWxlIH0gZnJvbSAnQGFjb3JleC9jb21wb25lbnRzL2NoZWNrLWJveCc7XG5pbXBvcnQgeyBBWERlY29yYXRvck1vZHVsZSB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cy9kZWNvcmF0b3JzJztcbmltcG9ydCB7IEFYTGFiZWxNb2R1bGUgfSBmcm9tICdAYWNvcmV4L2NvbXBvbmVudHMvbGFiZWwnO1xuaW1wb3J0IHsgQVhCYXNlUGFnZUNvbXBvbmVudCB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cy9wYWdlJztcbmltcG9ydCB7IEFYVHJhbnNsYXRpb25Nb2R1bGUgfSBmcm9tICdAYWNvcmV4L2NvcmUvdHJhbnNsYXRpb24nO1xuaW1wb3J0IHsgQVhQRmlsZUxpc3RJdGVtIH0gZnJvbSAnQGFjb3JleC9wbGF0Zm9ybS9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIGNvbXB1dGVkLCBpbmplY3QsIGlucHV0LCBsaW5rZWRTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFYUFdpZGdldENvcmVNb2R1bGUsIEFYUFdpZGdldENvcmVDb250ZXh0Q2hhbmdlRXZlbnQsIEFYUFdpZGdldE5vZGUgfSBmcm9tICdAYWNvcmV4L3BsYXRmb3JtL2xheW91dC93aWRnZXQtY29yZSc7XG5pbXBvcnQgeyBBWFBGaWxlU3RvcmFnZVNlcnZpY2UgfSBmcm9tICdAYWNvcmV4L3BsYXRmb3JtL2NvbW1vbic7XG5cbkBDb21wb25lbnQoe1xuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIC8vXG4gICAgQVhMYWJlbE1vZHVsZSxcbiAgICBBWENoZWNrQm94TW9kdWxlLFxuICAgIEFYRGVjb3JhdG9yTW9kdWxlLFxuICAgIEFYQnV0dG9uTW9kdWxlLFxuICAgIEFYVHJhbnNsYXRpb25Nb2R1bGUsXG4gICAgLy9cbiAgICBBWFBXaWRnZXRDb3JlTW9kdWxlXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9maWxlLWxpc3QtcG9wdXAuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBBWFBGaWxlTGlzdFBvcHVwQ29tcG9uZW50IGV4dGVuZHMgQVhCYXNlUGFnZUNvbXBvbmVudCB7XG5cbiAgcHJpdmF0ZSBmaWxlU2VydmljZSA9IGluamVjdChBWFBGaWxlU3RvcmFnZVNlcnZpY2UpO1xuXG4gIC8vI3JlZ2lvbiAtLS0tICAgQ29tcG9uZW50IFByb3BlcnRpZXMgICAtLS0tXG5cbiAgZmlsZXMgPSBpbnB1dDxBWFBGaWxlTGlzdEl0ZW1bXSB8IHN0cmluZ1tdPihbXSk7XG4gIHJlYWRPbmx5ID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICBtdWx0aXBsZSA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgZmlsZUVkaXRhYmxlID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG4gIGFjY2VwdCA9IGlucHV0PHN0cmluZz4oJyonKTtcbiAgbWF4RmlsZVNpemUgPSBpbnB1dDxudW1iZXI+KDEwMjQgKiAxMDI0ICogMTAwKTtcbiAgLyoqIFNhbWUgYXMgd2lkZ2V0IHBsdWdpbnMgKGUuZy4gZG9jdW1lbnQpIHNvIGhvb2tzL2FjdGlvbnMgcnVuIGluIHBvcHVwIHRvby4gKi9cbiAgcGx1Z2lucyA9IGlucHV0PHsgbmFtZTogc3RyaW5nOyBvcHRpb25zPzogdW5rbm93biB9W10+KFtdKTtcbiAgZXhjbHVkZVBsdWdpbnMgPSBpbnB1dDxzdHJpbmdbXT4oW10pO1xuICAvKiogV2hlbiB0cnVlLCBmaWxlIGVkaXQgZGlhbG9nIHNob3dzIG5hbWUsIHRpdGxlIGFuZCBkZXNjcmlwdGlvbiBmaWVsZHMuIERlZmF1bHQgZmFsc2UuICovXG4gIGVuYWJsZVRpdGxlRGVzY3JpcHRpb24gPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIC0tLS0gICBDb21wdXRlZCBQcm9wZXJ0aWVzICAgLS0tLVxuXG4gIHByb3RlY3RlZCBtb2RlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5yZWFkT25seSgpID8gJ3ZpZXcnIDogJ2VkaXQnKTtcblxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gLS0tLSAgIENvbnRleHQgJiBOb2RlIE1hbmFnZW1lbnQgICAtLS0tXG5cbiAgcHJvdGVjdGVkIGNvbnRleHQgPSBsaW5rZWRTaWduYWw8e30+KCgpID0+ICh7XG4gIH0pKTtcblxuICBwcm90ZWN0ZWQgb25Db250ZXh0Q2hhbmdlZChldmVudDogQVhQV2lkZ2V0Q29yZUNvbnRleHRDaGFuZ2VFdmVudCkge1xuICAgIHRoaXMuY29udGV4dC5zZXQoZXZlbnQuZGF0YSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbm9kZSA9IGNvbXB1dGVkPEFYUFdpZGdldE5vZGU+KCgpID0+ICh7XG4gICAgdHlwZTogJ2ZpbGUtdXBsb2FkZXInLFxuICAgIHBhdGg6ICdmaWxlcycsXG4gICAgZGVmYXVsdFZhbHVlOiBBcnJheS5pc0FycmF5KHRoaXMuZmlsZXMoKSkgJiYgdHlwZW9mIHRoaXMuZmlsZXMoKVswXSAhPT0gJ3N0cmluZycgPyB0aGlzLmZpbGVzKCkgOiBbXSxcbiAgICBvcHRpb25zOiB7XG4gICAgICByZWFkT25seTogdGhpcy5yZWFkT25seSgpLFxuICAgICAgbXVsdGlwbGU6IHRoaXMubXVsdGlwbGUoKSxcbiAgICAgIGFjY2VwdDogdGhpcy5hY2NlcHQoKSxcbiAgICAgIG1heEZpbGVTaXplOiB0aGlzLm1heEZpbGVTaXplKCksXG4gICAgICBmaWxlRWRpdGFibGU6IHRoaXMuZmlsZUVkaXRhYmxlKCksXG4gICAgICBwbHVnaW5zOiB0aGlzLnBsdWdpbnMoKSxcbiAgICAgIGV4Y2x1ZGVQbHVnaW5zOiB0aGlzLmV4Y2x1ZGVQbHVnaW5zKCksXG4gICAgICBlbmFibGVUaXRsZURlc2NyaXB0aW9uOiB0aGlzLmVuYWJsZVRpdGxlRGVzY3JpcHRpb24oKSxcbiAgICB9LFxuICB9KSk7XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIC0tLS0gICBMaWZlY3ljbGUgTWV0aG9kcyAgIC0tLS1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYoQXJyYXkuaXNBcnJheSh0aGlzLmZpbGVzKCkpICYmIHR5cGVvZiB0aGlzLmZpbGVzKClbMF0gPT09ICdzdHJpbmcnKXtcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgICAgIC8vIENvbnZlcnQgc3RyaW5nIGZpbGUgSURzIHRvIEFYUEZpbGVMaXN0SXRlbSBvYmplY3RzIHVzaW5nIGJhdGNoIEFQSVxuICAgICAgY29uc3QgcHJlZml4ZWRJZHMgPSB0aGlzLmZpbGVzKCkgYXMgc3RyaW5nW107XG4gICAgICBjb25zdCBhY3R1YWxJZHMgPSBwcmVmaXhlZElkcy5tYXAoKGlkKSA9PiB0aGlzLnJlbW92ZUZpbGVQcmVmaXgoaWQpKTtcbiAgICAgIGxldCBmaWxlSXRlbXM6IEFYUEZpbGVMaXN0SXRlbVtdID0gW107XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBpbmZvcyA9IGF3YWl0IHRoaXMuZmlsZVNlcnZpY2UuZmluZE1hbnkoYWN0dWFsSWRzKTtcbiAgICAgICAgY29uc3QgaW5mb01hcCA9IG5ldyBNYXAoaW5mb3MubWFwKChpKSA9PiBbaS5maWxlSWQsIGldKSk7XG4gICAgICAgIGZpbGVJdGVtcyA9IHByZWZpeGVkSWRzLm1hcCgocHJlZml4ZWRJZCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGFjdHVhbElkID0gdGhpcy5yZW1vdmVGaWxlUHJlZml4KHByZWZpeGVkSWQpO1xuICAgICAgICAgIGNvbnN0IGluZm8gPSBpbmZvTWFwLmdldChhY3R1YWxJZCk7XG4gICAgICAgICAgaWYgKGluZm8pIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGlkOiBpbmZvLmZpbGVJZCxcbiAgICAgICAgICAgICAgbmFtZTogaW5mby5uYW1lIHx8ICcnLFxuICAgICAgICAgICAgICBzaXplOiBpbmZvLnNpemUsXG4gICAgICAgICAgICAgIHN0YXR1czogJ3VwbG9hZGVkJyxcbiAgICAgICAgICAgICAgc291cmNlOiB7XG4gICAgICAgICAgICAgICAga2luZDogJ2ZpbGVJZCcsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGluZm8uZmlsZUlkLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSBhcyBBWFBGaWxlTGlzdEl0ZW07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogYWN0dWFsSWQsXG4gICAgICAgICAgICBuYW1lOiAnVW5rbm93biBGaWxlJyxcbiAgICAgICAgICAgIHNpemU6IDAsXG4gICAgICAgICAgICBzdGF0dXM6ICdkZWxldGVkJyxcbiAgICAgICAgICAgIHNvdXJjZTogeyBraW5kOiAnbm9uZScsIHZhbHVlOiAnJyB9LFxuICAgICAgICAgIH0gYXMgQVhQRmlsZUxpc3RJdGVtO1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBnZXQgZmlsZSBpbmZvcycsIGVycm9yKTtcbiAgICAgICAgZmlsZUl0ZW1zID0gcHJlZml4ZWRJZHMubWFwKChwcmVmaXhlZElkKSA9PiAoe1xuICAgICAgICAgIGlkOiB0aGlzLnJlbW92ZUZpbGVQcmVmaXgocHJlZml4ZWRJZCksXG4gICAgICAgICAgbmFtZTogJ1Vua25vd24gRmlsZScsXG4gICAgICAgICAgc2l6ZTogMCxcbiAgICAgICAgICBzdGF0dXM6ICdkZWxldGVkJyxcbiAgICAgICAgICBzb3VyY2U6IHsga2luZDogJ25vbmUnLCB2YWx1ZTogJycgfSxcbiAgICAgICAgfSBhcyBBWFBGaWxlTGlzdEl0ZW0pKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgIC8vIFVwZGF0ZSB0aGUgY29udGV4dCB3aXRoIHRoZSBjb252ZXJ0ZWQgZmlsZSBpdGVtc1xuICAgICAgdGhpcy5jb250ZXh0LnNldCh7IGZpbGVzOiBmaWxlSXRlbXMgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHJlbW92ZUZpbGVQcmVmaXgoZmlsZUlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBmaWxlSWQuc3RhcnRzV2l0aCgnZmlsZTonKSA/IGZpbGVJZC5zdWJzdHJpbmcoNSkgOiBmaWxlSWQ7XG4gIH1cblxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gLS0tLSAgIFVJIEhhbmRsZXJzICAgLS0tLVxuXG4gIGFwcGx5KCkge1xuICAgIHRoaXMuY2xvc2Uoe1xuICAgICAgZGF0YTogdGhpcy5jb250ZXh0KCksXG4gICAgfSk7XG4gIH1cblxuICAvLyNlbmRyZWdpb25cblxufVxuIiwiPGRpdiBjbGFzcz1cImF4LXAtMlwiPlxuICA8YXhwLXdpZGdldHMtY29udGFpbmVyIFtjb250ZXh0XT1cImNvbnRleHQoKVwiIChvbkNvbnRleHRDaGFuZ2VkKT1cIm9uQ29udGV4dENoYW5nZWQoJGV2ZW50KVwiPlxuICAgIDxuZy1jb250YWluZXIgYXhwLXdpZGdldC1yZW5kZXJlciBbbm9kZV09XCJub2RlKClcIiBbbW9kZV09XCJtb2RlKClcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9heHAtd2lkZ2V0cy1jb250YWluZXI+XG48L2Rpdj5cbjxheC1mb290ZXI+XG4gIDxheC1zdWZmaXg+XG4gICAgQGlmIChyZWFkT25seSgpKSB7XG4gICAgICA8YXgtYnV0dG9uIFt0ZXh0XT1cIidAZ2VuZXJhbDphY3Rpb25zLmNsb3NlLnRpdGxlJyB8IHRyYW5zbGF0ZSB8IGFzeW5jXCIgKGNsaWNrKT1cImNsb3NlKClcIj48L2F4LWJ1dHRvbj5cbiAgICB9IEBlbHNlIHtcbiAgICAgIDxheC1idXR0b24gW3RleHRdPVwiJ0BnZW5lcmFsOmFjdGlvbnMuZGlzY2FyZC50aXRsZScgfCB0cmFuc2xhdGUgfCBhc3luY1wiIChjbGljayk9XCJjbG9zZSgpXCI+PC9heC1idXR0b24+XG4gICAgICA8YXgtYnV0dG9uXG4gICAgICAgIFt0ZXh0XT1cIidAZ2VuZXJhbDphY3Rpb25zLmFwcGx5LnRpdGxlJyB8IHRyYW5zbGF0ZSB8IGFzeW5jXCJcbiAgICAgICAgKGNsaWNrKT1cImFwcGx5KClcIlxuICAgICAgICBbY29sb3JdPVwiJ3ByaW1hcnknXCJcbiAgICAgID48L2F4LWJ1dHRvbj5cbiAgICB9XG4gIDwvYXgtc3VmZml4PlxuPC9heC1mb290ZXI+XG4iXX0="],"names":["i1","i2","i3","i4"],"mappings":";;;;;;;;;;;;;;;;;AAgBO,MAAM,yBAAyB,SAAS,mBAAmB,CAAC;AACnE,IAAI,WAAW,GAAG;AAClB,QAAQ,KAAK,CAAC,GAAG,SAAS,CAAC;AAC3B,QAAQ,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,qBAAqB,CAAC;AACxD;AACA,QAAQ,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,EAAE,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAC9E,QAAQ,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACvF,QAAQ,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACvF,QAAQ,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAC9F,QAAQ,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACjF,QAAQ,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,IAAI,GAAG,IAAI,GAAG,GAAG,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACzG;AACA,QAAQ,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,EAAE,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAClF,QAAQ,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,EAAE,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAChG;AACA,QAAQ,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,wBAAwB,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACnH;AACA;AACA,QAAQ,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,GAAG,MAAM,GAAG,MAAM,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACpH;AACA;AACA,QAAQ,IAAI,CAAC,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACjG,QAAQ,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,OAAO;AACpC,YAAY,IAAI,EAAE,eAAe;AACjC,YAAY,IAAI,EAAE,OAAO;AACzB,YAAY,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE;AAChH,YAAY,OAAO,EAAE;AACrB,gBAAgB,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;AACzC,gBAAgB,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;AACzC,gBAAgB,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;AACrC,gBAAgB,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE;AAC/C,gBAAgB,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE;AACjD,gBAAgB,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;AACvC,gBAAgB,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE;AACrD,gBAAgB,sBAAsB,EAAE,IAAI,CAAC,sBAAsB,EAAE;AACrE,aAAa;AACb,SAAS,CAAC,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAC1D,IAAI;AACJ,IAAI,gBAAgB,CAAC,KAAK,EAAE;AAC5B,QAAQ,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;AACpC,IAAI;AACJ;AACA;AACA,IAAI,MAAM,QAAQ,GAAG;AACrB,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;AAChF,YAAY,IAAI,CAAC,SAAS,GAAG,IAAI;AACjC;AACA,YAAY,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,EAAE;AAC5C,YAAY,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;AAChF,YAAY,IAAI,SAAS,GAAG,EAAE;AAC9B,YAAY,IAAI;AAChB,gBAAgB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC;AACxE,gBAAgB,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;AACxE,gBAAgB,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,KAAK;AAC5D,oBAAoB,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC;AACtE,oBAAoB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;AACtD,oBAAoB,IAAI,IAAI,EAAE;AAC9B,wBAAwB,OAAO;AAC/B,4BAA4B,EAAE,EAAE,IAAI,CAAC,MAAM;AAC3C,4BAA4B,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;AACjD,4BAA4B,IAAI,EAAE,IAAI,CAAC,IAAI;AAC3C,4BAA4B,MAAM,EAAE,UAAU;AAC9C,4BAA4B,MAAM,EAAE;AACpC,gCAAgC,IAAI,EAAE,QAAQ;AAC9C,gCAAgC,KAAK,EAAE,IAAI,CAAC,MAAM;AAClD,6BAA6B;AAC7B,yBAAyB;AACzB,oBAAoB;AACpB,oBAAoB,OAAO;AAC3B,wBAAwB,EAAE,EAAE,QAAQ;AACpC,wBAAwB,IAAI,EAAE,cAAc;AAC5C,wBAAwB,IAAI,EAAE,CAAC;AAC/B,wBAAwB,MAAM,EAAE,SAAS;AACzC,wBAAwB,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;AAC3D,qBAAqB;AACrB,gBAAgB,CAAC,CAAC;AAClB,YAAY;AACZ,YAAY,OAAO,KAAK,EAAE;AAC1B,gBAAgB,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC;AAChE,gBAAgB,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,MAAM;AAC7D,oBAAoB,EAAE,EAAE,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC;AACzD,oBAAoB,IAAI,EAAE,cAAc;AACxC,oBAAoB,IAAI,EAAE,CAAC;AAC3B,oBAAoB,MAAM,EAAE,SAAS;AACrC,oBAAoB,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;AACvD,iBAAiB,CAAC,CAAC;AACnB,YAAY;AACZ,YAAY,IAAI,CAAC,SAAS,GAAG,KAAK;AAClC;AACA,YAAY,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAClD,QAAQ;AACR,IAAI;AACJ,IAAI,gBAAgB,CAAC,MAAM,EAAE;AAC7B,QAAQ,OAAO,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,MAAM;AACxE,IAAI;AACJ;AACA;AACA,IAAI,KAAK,GAAG;AACZ,QAAQ,IAAI,CAAC,KAAK,CAAC;AACnB,YAAY,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE;AAChC,SAAS,CAAC;AACV,IAAI;AACJ,IAAI,SAAS,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,yBAAyB,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC,CAAC;AAC9L,IAAI,SAAS,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,oBAAoB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,yBAAyB,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,iBAAiB,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,iBAAiB,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,iBAAiB,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,YAAY,EAAE,EAAE,iBAAiB,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,iBAAiB,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,EAAE,iBAAiB,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,iBAAiB,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,cAAc,EAAE,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,UAAU,EAAE,gBAAgB,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,sBAAsB,EAAE,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,UAAU,EAAE,wBAAwB,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,kvBAAkvB,EAAE,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI;AACpvE;AACA,gBAAgB,aAAa,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAEA,EAAE,CAAC,2BAA2B,EAAE,QAAQ,EAAE,8IAA8I,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAEC,EAAE,CAAC,iBAAiB,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,mBAAmB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,mBAAmB,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI;AACzyB;AACA,gBAAgB,mBAAmB,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAEC,IAAE,CAAC,2BAA2B,EAAE,QAAQ,EAAE,uBAAuB,EAAE,MAAM,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAEA,IAAE,CAAC,0BAA0B,EAAE,QAAQ,EAAE,uBAAuB,EAAE,MAAM,EAAE,CAAC,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,kBAAkB,EAAE,gBAAgB,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAEC,IAAE,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,gBAAgB,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;AACziB;AACA,EAAE,CAAC,wBAAwB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,yBAAyB,EAAE,UAAU,EAAE,CAAC;AACpI,YAAY,IAAI,EAAE,SAAS;AAC3B,YAAY,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE;AAC9B,wBAAwB,YAAY;AACpC;AACA,wBAAwB,aAAa;AACrC,wBAAwB,gBAAgB;AACxC,wBAAwB,iBAAiB;AACzC,wBAAwB,cAAc;AACtC,wBAAwB,mBAAmB;AAC3C;AACA,wBAAwB;AACxB,qBAAqB,EAAE,QAAQ,EAAE,kvBAAkvB,EAAE;AACrxB,SAAS,CAAC,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,sBAAsB,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,wBAAwB,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;;;;"}
@@ -10289,7 +10289,7 @@ class AXPEditFileUploaderCommand {
10289
10289
  async execute(input) {
10290
10290
  try {
10291
10291
  // Show dialog to edit file details
10292
- const updatedFile = await this.showEditDialog(input.file, input.plugins ?? [], input.excludePlugins ?? []);
10292
+ const updatedFile = await this.showEditDialog(input.file, input.plugins ?? [], input.excludePlugins ?? [], input.enableTitleDescription ?? false);
10293
10293
  return {
10294
10294
  success: true,
10295
10295
  data: updatedFile
@@ -10306,10 +10306,14 @@ class AXPEditFileUploaderCommand {
10306
10306
  }
10307
10307
  //#endregion
10308
10308
  //#region ---- Dialog Logic ----
10309
- async showEditDialog(file, plugins, excludePlugins) {
10309
+ async showEditDialog(file, plugins, excludePlugins, enableTitleDescription) {
10310
10310
  const title = await this.translationService.translateAsync('@general:widgets.file-uploader.edit-dialog.title');
10311
- const renameLabel = await this.translationService.translateAsync('@general:actions.rename.title');
10312
- const renamePlaceholder = await this.translationService.translateAsync('@general:actions.rename.title');
10311
+ const nameLabel = enableTitleDescription
10312
+ ? await this.translationService.translateAsync('@general:terms.common.name')
10313
+ : await this.translationService.translateAsync('@general:actions.rename.title');
10314
+ const namePlaceholder = await this.translationService.translateAsync('@general:actions.rename.title');
10315
+ const titleLabel = await this.translationService.translateAsync('@general:terms.common.title');
10316
+ const descriptionLabel = await this.translationService.translateAsync('@general:terms.common.description');
10313
10317
  const submitLabel = await this.translationService.translateAsync('@general:actions.submit.title');
10314
10318
  // Hooks: parameter insertion points
10315
10319
  const beforeRenamePayload = await this.hooks.runAsync(FileUploaderWebhookKeys.EditDialog.Params.BeforeRename, {
@@ -10353,22 +10357,44 @@ class AXPEditFileUploaderCommand {
10353
10357
  .setGap('16px');
10354
10358
  // Add items before rename
10355
10359
  this.buildFormFields(formFlex, beforeRenamePayload?.items ?? []);
10356
- // Rename field
10357
- formFlex.formField(renameLabel, field => {
10360
+ // Name field (label "Name" when enableTitleDescription, else "Rename")
10361
+ formFlex.formField(nameLabel, field => {
10358
10362
  field.path('name');
10359
10363
  field.textBox({
10360
- placeholder: renamePlaceholder,
10364
+ placeholder: namePlaceholder,
10361
10365
  validations: [
10362
10366
  { rule: 'maxLength', options: { value: 256 } }
10363
10367
  ]
10364
10368
  });
10365
10369
  });
10370
+ // Title and description fields when enableTitleDescription is true
10371
+ if (enableTitleDescription) {
10372
+ formFlex.formField(titleLabel, field => {
10373
+ field.path('title');
10374
+ field.textBox({
10375
+ placeholder: titleLabel,
10376
+ validations: [
10377
+ { rule: 'maxLength', options: { value: 256 } }
10378
+ ]
10379
+ });
10380
+ });
10381
+ formFlex.formField(descriptionLabel, field => {
10382
+ field.path('description');
10383
+ field.largeTextBox({
10384
+ placeholder: descriptionLabel,
10385
+ validations: [
10386
+ { rule: 'maxLength', options: { value: 1024 } }
10387
+ ]
10388
+ });
10389
+ });
10390
+ }
10366
10391
  // Add items after rename
10367
10392
  this.buildFormFields(formFlex, afterRenamePayload?.items ?? []);
10368
10393
  });
10369
10394
  // Add groups after form
10370
10395
  this.buildGroups(contentBuilder, groupsAfterPayload?.groups ?? []);
10371
10396
  })
10397
+ .setCloseButton(true)
10372
10398
  .setActions(actions => {
10373
10399
  actions.custom({
10374
10400
  title: submitLabel,
@@ -10555,6 +10581,8 @@ class AXPFileListComponent {
10555
10581
  this.onRename = output();
10556
10582
  this.readonly = input(false, ...(ngDevMode ? [{ debugName: "readonly" }] : []));
10557
10583
  this.fileEditable = input(true, ...(ngDevMode ? [{ debugName: "fileEditable" }] : []));
10584
+ /** When true, edit dialog shows name, title and description fields. Default false. */
10585
+ this.enableTitleDescription = input(false, ...(ngDevMode ? [{ debugName: "enableTitleDescription" }] : []));
10558
10586
  this.multiple = input(true, ...(ngDevMode ? [{ debugName: "multiple" }] : []));
10559
10587
  this.files = input([], ...(ngDevMode ? [{ debugName: "files" }] : []));
10560
10588
  // Plugin context (passed from parent widget)
@@ -10870,6 +10898,7 @@ class AXPFileListComponent {
10870
10898
  file,
10871
10899
  plugins: this.plugins() ?? [],
10872
10900
  excludePlugins: this.excludePlugins() ?? [],
10901
+ enableTitleDescription: this.enableTitleDescription(),
10873
10902
  });
10874
10903
  if (!commandResult?.success || !commandResult.data) {
10875
10904
  return;
@@ -10911,7 +10940,7 @@ class AXPFileListComponent {
10911
10940
  return action.color ?? 'primary';
10912
10941
  }
10913
10942
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPFileListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
10914
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: AXPFileListComponent, isStandalone: true, selector: "axp-file-list", inputs: { readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, fileEditable: { classPropertyName: "fileEditable", publicName: "fileEditable", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, files: { classPropertyName: "files", publicName: "files", isSignal: true, isRequired: false, transformFunction: null }, plugins: { classPropertyName: "plugins", publicName: "plugins", isSignal: true, isRequired: false, transformFunction: null }, excludePlugins: { classPropertyName: "excludePlugins", publicName: "excludePlugins", isSignal: true, isRequired: false, transformFunction: null }, capabilities: { classPropertyName: "capabilities", publicName: "capabilities", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onRemove: "onRemove", onRevert: "onRevert", onRename: "onRename" }, providers: [], ngImport: i0, template: "@for (file of displayFiles(); track $index) {\n <div\n class=\"__item\"\n [ngClass]=\"{ '--removed': file.status === 'deleted', '--attached': file.status === 'attached' }\"\n >\n <div class=\"__icon\">\n <i class=\"fa-fw {{ getFileInfo(file.name).icon }} fa-solid\"></i>\n </div>\n <div class=\"__name\">{{ file.name }}</div>\n <div class=\"__actions\">\n @if (file.status === 'deleted' && multiple()) {\n <!-- Revert button - only show when multiple is true -->\n <ax-button [look]=\"'blank'\" class=\"ax-sm\" color=\"warning\" (onClick)=\"handleFileRevert($event,file)\">\n <ax-icon class=\"fa-light fa-rotate-left\"></ax-icon>\n </ax-button>\n } @else if (file.status !== 'deleted') {\n <!-- All actions from hooks (including default actions) -->\n @if (!readonly() || (readonly() && file.status === 'attached')) {\n @for (action of actionsFor(file, $index); track action.id ?? action.textKey ?? action.text ?? $index) {\n <ax-button\n [look]=\"'blank'\"\n class=\"ax-sm\"\n [color]=\"getActionColor(action)\"\n (onClick)=\"runAction(action)\"\n >\n @if (action.icon) {\n <ax-icon class=\"{{ action.icon }}\"></ax-icon>\n }\n </ax-button>\n }\n }\n }\n </div>\n </div>\n} @empty {\n <div class=\"__empty-state\">\n <axp-state-message\n icon=\"fa-light fa-folder-open\"\n [title]=\"'@general:widgets.file-uploader.empty-state.title'\"\n [description]=\"'@general:widgets.file-uploader.empty-state.description'\"\n >\n </axp-state-message>\n </div>\n}\n", styles: [":host{display:flex;width:100%;flex-direction:column;gap:.125rem;padding-top:.5rem;padding-bottom:.5rem}:host .__item{display:flex;cursor:pointer;align-items:center;gap:.75rem;border-left-width:4px;border-color:transparent;padding:.5rem}:host .__item:hover{background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}:host .__item.--removed{--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-danger-500),var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-danger-50),var(--tw-bg-opacity, 1))}:host .__item.--attached{--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-success-500),var(--tw-border-opacity, 1));animation:attached-flash 1s ease-out forwards}:host .__item .__icon{width:1.5rem;flex-shrink:0}:host .__item .__name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:start;font-size:.875rem;line-height:1.25rem;font-weight:500}:host .__item .__actions{margin-left:auto;display:flex}@keyframes attached-flash{0%{background-color:rgb(var(--ax-sys-color-success-50))}to{background-color:transparent}}.__empty-state{cursor:pointer;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s;animation-duration:.2s}.__empty-state:hover{opacity:.8}\n"], dependencies: [{ kind: "ngmodule", type:
10943
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: AXPFileListComponent, isStandalone: true, selector: "axp-file-list", inputs: { readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, fileEditable: { classPropertyName: "fileEditable", publicName: "fileEditable", isSignal: true, isRequired: false, transformFunction: null }, enableTitleDescription: { classPropertyName: "enableTitleDescription", publicName: "enableTitleDescription", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, files: { classPropertyName: "files", publicName: "files", isSignal: true, isRequired: false, transformFunction: null }, plugins: { classPropertyName: "plugins", publicName: "plugins", isSignal: true, isRequired: false, transformFunction: null }, excludePlugins: { classPropertyName: "excludePlugins", publicName: "excludePlugins", isSignal: true, isRequired: false, transformFunction: null }, capabilities: { classPropertyName: "capabilities", publicName: "capabilities", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onRemove: "onRemove", onRevert: "onRevert", onRename: "onRename" }, providers: [], ngImport: i0, template: "@for (file of displayFiles(); track $index) {\n <div\n class=\"__item\"\n [ngClass]=\"{ '--removed': file.status === 'deleted', '--attached': file.status === 'attached' }\"\n >\n <div class=\"__icon\">\n <i class=\"fa-fw {{ getFileInfo(file.name).icon }} fa-solid\"></i>\n </div>\n <div class=\"__name\">{{ file.name }}</div>\n <div class=\"__actions\">\n @if (file.status === 'deleted' && multiple()) {\n <!-- Revert button - only show when multiple is true -->\n <ax-button [look]=\"'blank'\" class=\"ax-sm\" color=\"warning\" (onClick)=\"handleFileRevert($event,file)\">\n <ax-icon class=\"fa-light fa-rotate-left\"></ax-icon>\n </ax-button>\n } @else if (file.status !== 'deleted') {\n <!-- All actions from hooks (including default actions) -->\n @if (!readonly() || (readonly() && file.status === 'attached')) {\n @for (action of actionsFor(file, $index); track action.id ?? action.textKey ?? action.text ?? $index) {\n <ax-button\n [look]=\"'blank'\"\n class=\"ax-sm\"\n [color]=\"getActionColor(action)\"\n (onClick)=\"runAction(action)\"\n >\n @if (action.icon) {\n <ax-icon class=\"{{ action.icon }}\"></ax-icon>\n }\n </ax-button>\n }\n }\n }\n </div>\n </div>\n} @empty {\n <div class=\"__empty-state\">\n <axp-state-message\n icon=\"fa-light fa-folder-open\"\n [title]=\"'@general:widgets.file-uploader.empty-state.title'\"\n [description]=\"'@general:widgets.file-uploader.empty-state.description'\"\n >\n </axp-state-message>\n </div>\n}\n", styles: [":host{display:flex;width:100%;flex-direction:column;gap:.125rem;padding-top:.5rem;padding-bottom:.5rem}:host .__item{display:flex;cursor:pointer;align-items:center;gap:.75rem;border-left-width:4px;border-color:transparent;padding:.5rem}:host .__item:hover{background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}:host .__item.--removed{--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-danger-500),var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-danger-50),var(--tw-bg-opacity, 1))}:host .__item.--attached{--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-success-500),var(--tw-border-opacity, 1));animation:attached-flash 1s ease-out forwards}:host .__item .__icon{width:1.5rem;flex-shrink:0}:host .__item .__name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:start;font-size:.875rem;line-height:1.25rem;font-weight:500}:host .__item .__actions{margin-left:auto;display:flex}@keyframes attached-flash{0%{background-color:rgb(var(--ax-sys-color-success-50))}to{background-color:transparent}}.__empty-state{cursor:pointer;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s;animation-duration:.2s}.__empty-state:hover{opacity:.8}\n"], dependencies: [{ kind: "ngmodule", type:
10915
10944
  // Angular
10916
10945
  CommonModule }, { kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type:
10917
10946
  // ACoreX
@@ -10935,7 +10964,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
10935
10964
  // Platform
10936
10965
  AXPStateMessageComponent,
10937
10966
  ], providers: [], template: "@for (file of displayFiles(); track $index) {\n <div\n class=\"__item\"\n [ngClass]=\"{ '--removed': file.status === 'deleted', '--attached': file.status === 'attached' }\"\n >\n <div class=\"__icon\">\n <i class=\"fa-fw {{ getFileInfo(file.name).icon }} fa-solid\"></i>\n </div>\n <div class=\"__name\">{{ file.name }}</div>\n <div class=\"__actions\">\n @if (file.status === 'deleted' && multiple()) {\n <!-- Revert button - only show when multiple is true -->\n <ax-button [look]=\"'blank'\" class=\"ax-sm\" color=\"warning\" (onClick)=\"handleFileRevert($event,file)\">\n <ax-icon class=\"fa-light fa-rotate-left\"></ax-icon>\n </ax-button>\n } @else if (file.status !== 'deleted') {\n <!-- All actions from hooks (including default actions) -->\n @if (!readonly() || (readonly() && file.status === 'attached')) {\n @for (action of actionsFor(file, $index); track action.id ?? action.textKey ?? action.text ?? $index) {\n <ax-button\n [look]=\"'blank'\"\n class=\"ax-sm\"\n [color]=\"getActionColor(action)\"\n (onClick)=\"runAction(action)\"\n >\n @if (action.icon) {\n <ax-icon class=\"{{ action.icon }}\"></ax-icon>\n }\n </ax-button>\n }\n }\n }\n </div>\n </div>\n} @empty {\n <div class=\"__empty-state\">\n <axp-state-message\n icon=\"fa-light fa-folder-open\"\n [title]=\"'@general:widgets.file-uploader.empty-state.title'\"\n [description]=\"'@general:widgets.file-uploader.empty-state.description'\"\n >\n </axp-state-message>\n </div>\n}\n", styles: [":host{display:flex;width:100%;flex-direction:column;gap:.125rem;padding-top:.5rem;padding-bottom:.5rem}:host .__item{display:flex;cursor:pointer;align-items:center;gap:.75rem;border-left-width:4px;border-color:transparent;padding:.5rem}:host .__item:hover{background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}:host .__item.--removed{--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-danger-500),var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-danger-50),var(--tw-bg-opacity, 1))}:host .__item.--attached{--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-success-500),var(--tw-border-opacity, 1));animation:attached-flash 1s ease-out forwards}:host .__item .__icon{width:1.5rem;flex-shrink:0}:host .__item .__name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:start;font-size:.875rem;line-height:1.25rem;font-weight:500}:host .__item .__actions{margin-left:auto;display:flex}@keyframes attached-flash{0%{background-color:rgb(var(--ax-sys-color-success-50))}to{background-color:transparent}}.__empty-state{cursor:pointer;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s;animation-duration:.2s}.__empty-state:hover{opacity:.8}\n"] }]
10938
- }], propDecorators: { onRemove: [{ type: i0.Output, args: ["onRemove"] }], onRevert: [{ type: i0.Output, args: ["onRevert"] }], onRename: [{ type: i0.Output, args: ["onRename"] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], fileEditable: [{ type: i0.Input, args: [{ isSignal: true, alias: "fileEditable", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], files: [{ type: i0.Input, args: [{ isSignal: true, alias: "files", required: false }] }], plugins: [{ type: i0.Input, args: [{ isSignal: true, alias: "plugins", required: false }] }], excludePlugins: [{ type: i0.Input, args: [{ isSignal: true, alias: "excludePlugins", required: false }] }], capabilities: [{ type: i0.Input, args: [{ isSignal: true, alias: "capabilities", required: false }] }] } });
10967
+ }], propDecorators: { onRemove: [{ type: i0.Output, args: ["onRemove"] }], onRevert: [{ type: i0.Output, args: ["onRevert"] }], onRename: [{ type: i0.Output, args: ["onRename"] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], fileEditable: [{ type: i0.Input, args: [{ isSignal: true, alias: "fileEditable", required: false }] }], enableTitleDescription: [{ type: i0.Input, args: [{ isSignal: true, alias: "enableTitleDescription", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], files: [{ type: i0.Input, args: [{ isSignal: true, alias: "files", required: false }] }], plugins: [{ type: i0.Input, args: [{ isSignal: true, alias: "plugins", required: false }] }], excludePlugins: [{ type: i0.Input, args: [{ isSignal: true, alias: "excludePlugins", required: false }] }], capabilities: [{ type: i0.Input, args: [{ isSignal: true, alias: "capabilities", required: false }] }] } });
10939
10968
 
10940
10969
  class AXPFileUploaderWidgetService {
10941
10970
  constructor() {
@@ -10950,11 +10979,14 @@ class AXPFileUploaderWidgetService {
10950
10979
  accept: '*',
10951
10980
  fileEditable: true,
10952
10981
  maxFileSize: 1024 * 1024 * 10,
10982
+ plugins: [],
10983
+ excludePlugins: [],
10984
+ enableTitleDescription: false,
10953
10985
  };
10954
10986
  options = { ...defaultOptions, ...options };
10955
- const component = await import('./acorex-platform-layout-widgets-file-list-popup.component-BfV3spe3.mjs').then(m => m.AXPFileListPopupComponent);
10987
+ const component = await import('./acorex-platform-layout-widgets-file-list-popup.component-CChaPy_w.mjs').then((m) => m.AXPFileListPopupComponent);
10956
10988
  const result = await this.popupService.open(component, {
10957
- title: (await this.translate.translateAsync('@document-management:terms.common.file')),
10989
+ title: await this.translate.translateAsync('@document-management:terms.common.file'),
10958
10990
  data: {
10959
10991
  files: signal(options.files),
10960
10992
  readOnly: signal(options.readOnly),
@@ -10962,6 +10994,9 @@ class AXPFileUploaderWidgetService {
10962
10994
  accept: signal(options.accept),
10963
10995
  maxFileSize: signal(options.maxFileSize),
10964
10996
  fileEditable: signal(options.fileEditable ?? true),
10997
+ plugins: options.plugins ?? [],
10998
+ excludePlugins: options.excludePlugins ?? [],
10999
+ enableTitleDescription: signal(options.enableTitleDescription ?? false),
10965
11000
  },
10966
11001
  });
10967
11002
  return result?.data?.data?.files;
@@ -11037,6 +11072,7 @@ class AXPFileUploaderWidgetEditComponent extends AXPValueWidgetComponent {
11037
11072
  }
11038
11073
  return this.options()['fileEditable'];
11039
11074
  }, ...(ngDevMode ? [{ debugName: "fileEditable" }] : []));
11075
+ this.enableTitleDescription = computed(() => this.options()['enableTitleDescription'] ?? false, ...(ngDevMode ? [{ debugName: "enableTitleDescription" }] : []));
11040
11076
  this.readonly = computed(() => this.options()['readonly'], ...(ngDevMode ? [{ debugName: "readonly" }] : []));
11041
11077
  this.maxFileSize = computed(() => this.options()['maxFileSize'], ...(ngDevMode ? [{ debugName: "maxFileSize" }] : []));
11042
11078
  // Drag and drop state
@@ -11255,6 +11291,7 @@ class AXPFileUploaderWidgetEditComponent extends AXPValueWidgetComponent {
11255
11291
  [files]="files()"
11256
11292
  [readonly]="readonly()"
11257
11293
  [fileEditable]="fileEditable()"
11294
+ [enableTitleDescription]="enableTitleDescription()"
11258
11295
  [plugins]="plugins()"
11259
11296
  [excludePlugins]="excludePlugins()"
11260
11297
  [capabilities]="capabilities"
@@ -11264,7 +11301,7 @@ class AXPFileUploaderWidgetEditComponent extends AXPValueWidgetComponent {
11264
11301
  (onRename)="handleFileRename($event)"
11265
11302
  ></axp-file-list>
11266
11303
  </div>
11267
- `, isInline: true, styles: [".__drag-over{background-color:rgba(var(--ax-sys-color-primary-50),.1);border:2px dashed rgb(var(--ax-sys-color-primary-500));border-radius:.375rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: i1.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i1.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items", "closeParentOnClick", "lockOnLoading"], outputs: ["onItemClick"] }, { kind: "directive", type: AXUploaderZoneDirective, selector: "[axUploaderZone]", inputs: ["multiple", "accept", "overlayTemplate", "disableBrowse", "disableDragDrop"], outputs: ["fileChange", "onChanged", "dragEnter", "dragLeave", "dragOver", "onFileUploadComplete", "onFilesUploadComplete"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "ngmodule", type: AXDropdownModule }, { kind: "component", type: i5$2.AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "placement", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXPComponentSlotModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i5.AXTranslatorDirective, selector: "[translate]" }, { kind: "component", type: AXPFileListComponent, selector: "axp-file-list", inputs: ["readonly", "fileEditable", "multiple", "files", "plugins", "excludePlugins", "capabilities"], outputs: ["onRemove", "onRevert", "onRename"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
11304
+ `, isInline: true, styles: [".__drag-over{background-color:rgba(var(--ax-sys-color-primary-50),.1);border:2px dashed rgb(var(--ax-sys-color-primary-500));border-radius:.375rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: i1.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i1.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items", "closeParentOnClick", "lockOnLoading"], outputs: ["onItemClick"] }, { kind: "directive", type: AXUploaderZoneDirective, selector: "[axUploaderZone]", inputs: ["multiple", "accept", "overlayTemplate", "disableBrowse", "disableDragDrop"], outputs: ["fileChange", "onChanged", "dragEnter", "dragLeave", "dragOver", "onFileUploadComplete", "onFilesUploadComplete"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "ngmodule", type: AXDropdownModule }, { kind: "component", type: i5$2.AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "placement", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXPComponentSlotModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i5.AXTranslatorDirective, selector: "[translate]" }, { kind: "component", type: AXPFileListComponent, selector: "axp-file-list", inputs: ["readonly", "fileEditable", "enableTitleDescription", "multiple", "files", "plugins", "excludePlugins", "capabilities"], outputs: ["onRemove", "onRevert", "onRename"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
11268
11305
  }
11269
11306
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPFileUploaderWidgetEditComponent, decorators: [{
11270
11307
  type: Component,
@@ -11306,6 +11343,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
11306
11343
  [files]="files()"
11307
11344
  [readonly]="readonly()"
11308
11345
  [fileEditable]="fileEditable()"
11346
+ [enableTitleDescription]="enableTitleDescription()"
11309
11347
  [plugins]="plugins()"
11310
11348
  [excludePlugins]="excludePlugins()"
11311
11349
  [capabilities]="capabilities"
@@ -11353,7 +11391,7 @@ class AXPFileUploaderWidgetViewComponent extends AXPValueWidgetComponent {
11353
11391
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPFileUploaderWidgetViewComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
11354
11392
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: AXPFileUploaderWidgetViewComponent, isStandalone: true, selector: "axp-file-uploader-widget-view", host: { properties: { "class": "this.__class" } }, usesInheritance: true, ngImport: i0, template: `
11355
11393
  <axp-file-list [files]="files()" [readonly]="true"></axp-file-list>
11356
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "ngmodule", type: AXUploaderModule }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type: AXPFileListComponent, selector: "axp-file-list", inputs: ["readonly", "fileEditable", "multiple", "files", "plugins", "excludePlugins", "capabilities"], outputs: ["onRemove", "onRevert", "onRename"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
11394
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "ngmodule", type: AXUploaderModule }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type: AXPFileListComponent, selector: "axp-file-list", inputs: ["readonly", "fileEditable", "enableTitleDescription", "multiple", "files", "plugins", "excludePlugins", "capabilities"], outputs: ["onRemove", "onRevert", "onRename"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
11357
11395
  }
11358
11396
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPFileUploaderWidgetViewComponent, decorators: [{
11359
11397
  type: Component,
@@ -11412,6 +11450,12 @@ const AXPFileUploaderWidget = {
11412
11450
  path: 'options.fileEditable',
11413
11451
  group: AXP_BEHAVIOR_PROPERTY_GROUP,
11414
11452
  }),
11453
+ createBooleanProperty({
11454
+ name: 'enableTitleDescription',
11455
+ title: 'Enable Title & Description',
11456
+ path: 'options.enableTitleDescription',
11457
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
11458
+ }),
11415
11459
  createNumberProperty({
11416
11460
  name: 'maxFileSize',
11417
11461
  title: 'Max File Size (bytes)',
@@ -11460,6 +11504,8 @@ class AXPGalleryWidgetEditComponent extends AXPValueWidgetComponent {
11460
11504
  this.loadingDialog = inject(AXLoadingDialogService);
11461
11505
  this.translationService = inject(AXTranslationService);
11462
11506
  this.gallery = viewChild('c', ...(ngDevMode ? [{ debugName: "gallery" }] : []));
11507
+ /** Object URLs created for blobs/binary; revoked on destroy for memory safety. */
11508
+ this.objectUrls = new Set();
11463
11509
  /**
11464
11510
  * Convert AXPFileListItem[] to AXMediaViewerData[] for display in media viewer.
11465
11511
  * Uses lazy-loading callbacks for URL resolution.
@@ -11622,15 +11668,28 @@ class AXPGalleryWidgetEditComponent extends AXPValueWidgetComponent {
11622
11668
  * Resolve the URL for a file item.
11623
11669
  * Returns a promise that resolves to the file URL.
11624
11670
  */
11671
+ /**
11672
+ * Register an object URL for later revocation on destroy (memory safety).
11673
+ */
11674
+ trackObjectUrl(url) {
11675
+ if (url.startsWith('blob:')) {
11676
+ this.objectUrls.add(url);
11677
+ }
11678
+ return url;
11679
+ }
11625
11680
  async resolveFileUrl(file) {
11626
11681
  // Blob source - create object URL
11627
11682
  if (file.source?.kind === 'blob' && file.source.value instanceof Blob) {
11628
- return URL.createObjectURL(file.source.value);
11683
+ return this.trackObjectUrl(URL.createObjectURL(file.source.value));
11629
11684
  }
11630
11685
  // File ID source - fetch from storage service
11631
11686
  if (file.source?.kind === 'fileId' && typeof file.source.value === 'string') {
11632
11687
  const fileInfo = await this.fileStorageService.getInfo(file.source.value);
11633
- return fileInfo?.url ?? '';
11688
+ if (fileInfo?.url)
11689
+ return fileInfo.url;
11690
+ if (fileInfo?.binary)
11691
+ return this.trackObjectUrl(URL.createObjectURL(fileInfo.binary));
11692
+ return '';
11634
11693
  }
11635
11694
  // URL source - return directly
11636
11695
  if (file.source?.kind === 'url' && typeof file.source.value === 'string') {
@@ -11645,10 +11704,20 @@ class AXPGalleryWidgetEditComponent extends AXPValueWidgetComponent {
11645
11704
  }
11646
11705
  // Assume it's a file ID - fetch from storage service
11647
11706
  const fileInfo = await this.fileStorageService.getInfo(value);
11648
- return fileInfo?.url ?? '';
11707
+ if (fileInfo?.url)
11708
+ return fileInfo.url;
11709
+ if (fileInfo?.binary)
11710
+ return this.trackObjectUrl(URL.createObjectURL(fileInfo.binary));
11711
+ return '';
11649
11712
  }
11650
11713
  return '';
11651
11714
  }
11715
+ ngOnDestroy() {
11716
+ for (const url of this.objectUrls) {
11717
+ URL.revokeObjectURL(url);
11718
+ }
11719
+ this.objectUrls.clear();
11720
+ }
11652
11721
  /**
11653
11722
  * Process files from various sources (file picker, drag-drop, etc.)
11654
11723
  * This method is called by drag-and-drop handler