@acorex/platform 21.0.0-next.34 → 21.0.0-next.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/acorex-platform-common.mjs +19 -1
- package/fesm2022/acorex-platform-common.mjs.map +1 -1
- package/fesm2022/acorex-platform-core.mjs +11 -172
- package/fesm2022/acorex-platform-core.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-builder.mjs +7 -8
- package/fesm2022/acorex-platform-layout-builder.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-components.mjs +39 -29
- package/fesm2022/acorex-platform-layout-components.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-designer.mjs +8 -9
- package/fesm2022/acorex-platform-layout-designer.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-entity.mjs +468 -255
- package/fesm2022/acorex-platform-layout-entity.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-views.mjs +171 -86
- package/fesm2022/acorex-platform-layout-views.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-widget-core.mjs +36 -13
- package/fesm2022/acorex-platform-layout-widget-core.mjs.map +1 -1
- package/fesm2022/{acorex-platform-layout-widgets-file-list-popup.component-9uCkMxcc.mjs → acorex-platform-layout-widgets-file-list-popup.component-CDYAGBku.mjs} +5 -60
- package/fesm2022/acorex-platform-layout-widgets-file-list-popup.component-CDYAGBku.mjs.map +1 -0
- package/fesm2022/acorex-platform-layout-widgets.mjs +101 -128
- package/fesm2022/acorex-platform-layout-widgets.mjs.map +1 -1
- package/fesm2022/acorex-platform-themes-default.mjs +16 -4
- package/fesm2022/acorex-platform-themes-default.mjs.map +1 -1
- package/fesm2022/acorex-platform-workflow.mjs +25 -5
- package/fesm2022/acorex-platform-workflow.mjs.map +1 -1
- package/package.json +1 -1
- package/types/acorex-platform-common.d.ts +11 -6
- package/types/acorex-platform-core.d.ts +56 -101
- package/types/acorex-platform-layout-builder.d.ts +0 -1
- package/types/acorex-platform-layout-components.d.ts +4 -3
- package/types/acorex-platform-layout-designer.d.ts +1 -1
- package/types/acorex-platform-layout-entity.d.ts +36 -30
- package/types/acorex-platform-layout-views.d.ts +31 -29
- package/types/acorex-platform-layout-widget-core.d.ts +30 -14
- package/types/acorex-platform-layout-widgets.d.ts +17 -11
- package/types/acorex-platform-themes-default.d.ts +1 -0
- package/types/acorex-platform-workflow.d.ts +28 -51
- package/fesm2022/acorex-platform-layout-widgets-file-list-popup.component-9uCkMxcc.mjs.map +0 -1
|
@@ -10,16 +10,15 @@ import { AXTranslationModule } from '@acorex/core/translation';
|
|
|
10
10
|
import * as i1$2 from '@angular/common';
|
|
11
11
|
import { CommonModule } from '@angular/common';
|
|
12
12
|
import * as i0 from '@angular/core';
|
|
13
|
-
import {
|
|
13
|
+
import { input, computed, linkedSignal, Component } from '@angular/core';
|
|
14
14
|
import * as i1$1 from '@acorex/platform/layout/widget-core';
|
|
15
15
|
import { AXPWidgetCoreModule } from '@acorex/platform/layout/widget-core';
|
|
16
|
-
import { AXPFileStorageService } from '@acorex/platform/common';
|
|
17
16
|
|
|
18
17
|
class AXPFileListPopupComponent extends AXBasePageComponent {
|
|
19
18
|
constructor() {
|
|
20
19
|
super(...arguments);
|
|
21
|
-
this.fileService = inject(AXPFileStorageService);
|
|
22
20
|
//#region ---- Component Properties ----
|
|
21
|
+
/** Hydrated file rows only; storage prefixes are resolved in entity/mock middleware before UI. */
|
|
23
22
|
this.files = input([], ...(ngDevMode ? [{ debugName: "files" }] : /* istanbul ignore next */ []));
|
|
24
23
|
/**
|
|
25
24
|
* When true, same as file-uploader `options.readonly` (no add/upload, list actions download-only).
|
|
@@ -50,7 +49,7 @@ class AXPFileListPopupComponent extends AXBasePageComponent {
|
|
|
50
49
|
this.node = computed(() => ({
|
|
51
50
|
type: 'file-uploader',
|
|
52
51
|
path: 'files',
|
|
53
|
-
defaultValue: Array.isArray(this.files())
|
|
52
|
+
defaultValue: Array.isArray(this.files()) ? this.files() : [],
|
|
54
53
|
options: {
|
|
55
54
|
readonly: this.isReadonly(),
|
|
56
55
|
multiple: this.multiple(),
|
|
@@ -72,60 +71,6 @@ class AXPFileListPopupComponent extends AXBasePageComponent {
|
|
|
72
71
|
return typeof value === 'function' ? value() : (value ?? fallback);
|
|
73
72
|
}
|
|
74
73
|
//#endregion
|
|
75
|
-
//#region ---- Lifecycle Methods ----
|
|
76
|
-
async ngOnInit() {
|
|
77
|
-
if (Array.isArray(this.files()) && typeof this.files()[0] === 'string') {
|
|
78
|
-
this.isLoading = true;
|
|
79
|
-
// Convert string file IDs to AXPFileListItem objects using batch API
|
|
80
|
-
const prefixedIds = this.files();
|
|
81
|
-
const actualIds = prefixedIds.map((id) => this.removeFilePrefix(id));
|
|
82
|
-
let fileItems = [];
|
|
83
|
-
try {
|
|
84
|
-
const infos = await this.fileService.findMany(actualIds);
|
|
85
|
-
const infoMap = new Map(infos.map((i) => [i.fileId, i]));
|
|
86
|
-
fileItems = prefixedIds.map((prefixedId) => {
|
|
87
|
-
const actualId = this.removeFilePrefix(prefixedId);
|
|
88
|
-
const info = infoMap.get(actualId);
|
|
89
|
-
if (info) {
|
|
90
|
-
return {
|
|
91
|
-
id: info.fileId,
|
|
92
|
-
name: info.name || '',
|
|
93
|
-
size: info.size,
|
|
94
|
-
status: 'uploaded',
|
|
95
|
-
source: {
|
|
96
|
-
kind: 'fileId',
|
|
97
|
-
value: info.fileId,
|
|
98
|
-
},
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
return {
|
|
102
|
-
id: actualId,
|
|
103
|
-
name: 'Unknown File',
|
|
104
|
-
size: 0,
|
|
105
|
-
status: 'deleted',
|
|
106
|
-
source: { kind: 'none', value: '' },
|
|
107
|
-
};
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
catch (error) {
|
|
111
|
-
console.error('Failed to get file infos', error);
|
|
112
|
-
fileItems = prefixedIds.map((prefixedId) => ({
|
|
113
|
-
id: this.removeFilePrefix(prefixedId),
|
|
114
|
-
name: 'Unknown File',
|
|
115
|
-
size: 0,
|
|
116
|
-
status: 'deleted',
|
|
117
|
-
source: { kind: 'none', value: '' },
|
|
118
|
-
}));
|
|
119
|
-
}
|
|
120
|
-
this.isLoading = false;
|
|
121
|
-
// Update the context with the converted file items
|
|
122
|
-
this.context.set({ files: fileItems });
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
removeFilePrefix(fileId) {
|
|
126
|
-
return fileId.startsWith('file:') ? fileId.substring(5) : fileId;
|
|
127
|
-
}
|
|
128
|
-
//#endregion
|
|
129
74
|
//#region ---- UI Handlers ----
|
|
130
75
|
apply() {
|
|
131
76
|
this.close({
|
|
@@ -150,9 +95,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
150
95
|
AXButtonModule,
|
|
151
96
|
AXTranslationModule,
|
|
152
97
|
//
|
|
153
|
-
AXPWidgetCoreModule
|
|
98
|
+
AXPWidgetCoreModule,
|
|
154
99
|
], 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 (isReadonly()) {\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" }]
|
|
155
100
|
}], propDecorators: { files: [{ type: i0.Input, args: [{ isSignal: true, alias: "files", required: false }] }], isReadonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "isReadonly", 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 }] }], showEditDialogAfterSelect: [{ type: i0.Input, args: [{ isSignal: true, alias: "showEditDialogAfterSelect", required: false }] }] } });
|
|
156
101
|
|
|
157
102
|
export { AXPFileListPopupComponent };
|
|
158
|
-
//# sourceMappingURL=acorex-platform-layout-widgets-file-list-popup.component-
|
|
103
|
+
//# sourceMappingURL=acorex-platform-layout-widgets-file-list-popup.component-CDYAGBku.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-layout-widgets-file-list-popup.component-CDYAGBku.mjs","sources":["../../../../libs/platform/layout/widgets/src/lib/widgets/advance/file-uploader/file-list-popup/file-list-popup.component.ts","../../../../libs/platform/layout/widgets/src/lib/widgets/advance/file-uploader/file-list-popup/file-list-popup.component.html"],"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 { AXPContextChangeEvent, AXPFileListItem } from '@acorex/platform/core';\nimport { CommonModule } from '@angular/common';\nimport { Component, computed, input, linkedSignal } from '@angular/core';\nimport { AXPWidgetCoreModule, AXPWidgetNode } from '@acorex/platform/layout/widget-core';\n\n@Component({\n imports: [\n CommonModule,\n //\n AXLabelModule,\n AXCheckBoxModule,\n AXDecoratorModule,\n AXButtonModule,\n AXTranslationModule,\n //\n AXPWidgetCoreModule,\n ],\n templateUrl: './file-list-popup.component.html',\n})\nexport class AXPFileListPopupComponent extends AXBasePageComponent {\n //#region ---- Component Properties ----\n\n /** Hydrated file rows only; storage prefixes are resolved in entity/mock middleware before UI. */\n files = input<AXPFileListItem[]>([]);\n /**\n * When true, same as file-uploader `options.readonly` (no add/upload, list actions download-only).\n * Use property name `isReadonly` in popup `data` so host/popup binding resolves the input.\n */\n isReadonly = input<boolean>(false);\n multiple = input<boolean>(false);\n fileEditable = input<boolean>(true);\n accept = input<string>('*');\n maxFileSize = input<number>(1024 * 1024 * 100);\n /** Same as widget plugins (e.g. document) so hooks/actions run in popup too. */\n plugins = input<{ name: string; options?: unknown }[]>([]);\n excludePlugins = input<string[]>([]);\n /** When true, file edit dialog shows name, title and description fields. Default false. */\n enableTitleDescription = input<boolean>(false);\n /** When true, show edit dialog (name/title/description + plugin hooks) after file select. Default false. */\n showEditDialogAfterSelect = input<boolean>(false);\n\n //#endregion\n\n //#region ---- Computed Properties ----\n\n /**\n * Always render the edit widget so `options` (readonly, plugins, enableTitleDescription, …) match the entity form.\n * Readonly behavior comes from `node.options.readonly`, not from view mode.\n */\n protected mode = computed(() => 'edit' as const);\n\n //#endregion\n\n //#region ---- Context & Node Management ----\n\n protected context = linkedSignal<{}>(() => ({}));\n\n protected onContextChanged(event: AXPContextChangeEvent) {\n this.context.set(event.data);\n }\n\n /** Resolves input that may be a signal (input()) or a raw value when popup injects data. */\n private resolveInput<T>(value: (() => T) | T, fallback: T): T {\n return typeof value === 'function' ? (value as () => T)() : (value ?? fallback);\n }\n\n protected node = computed<AXPWidgetNode>(() => ({\n type: 'file-uploader',\n path: 'files',\n defaultValue: Array.isArray(this.files()) ? this.files() : [],\n options: {\n readonly: this.isReadonly(),\n multiple: this.multiple(),\n accept: this.accept(),\n maxFileSize: this.maxFileSize(),\n fileEditable: this.fileEditable(),\n plugins: this.resolveInput(this.plugins, []),\n excludePlugins: this.resolveInput(this.excludePlugins, []),\n enableTitleDescription: this.enableTitleDescription(),\n showEditDialogAfterSelect: this.resolveInput(this.showEditDialogAfterSelect(), false),\n },\n }));\n\n //#endregion\n\n //#region ---- UI Handlers ----\n\n apply() {\n this.close({\n data: this.context(),\n });\n }\n\n //#endregion\n}\n","<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 (isReadonly()) {\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"],"names":["i1","i3","i4","i5"],"mappings":"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"}
|