@acorex/modules 20.3.0-next.7 → 20.3.0-next.8
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/common/index.d.ts +1 -0
- package/data-management/index.d.ts +22 -3
- package/fesm2022/acorex-modules-common.mjs +97 -6
- package/fesm2022/acorex-modules-common.mjs.map +1 -1
- package/fesm2022/{acorex-modules-contact-management-emergency-contact.entity-D75qsDor.mjs → acorex-modules-contact-management-emergency-contact.entity-3vnkpSvv.mjs} +10 -9
- package/fesm2022/acorex-modules-contact-management-emergency-contact.entity-3vnkpSvv.mjs.map +1 -0
- package/fesm2022/acorex-modules-contact-management.mjs +1 -1
- package/fesm2022/acorex-modules-content-management.mjs +6 -0
- package/fesm2022/acorex-modules-content-management.mjs.map +1 -1
- package/fesm2022/acorex-modules-conversation.mjs +3 -3
- package/fesm2022/acorex-modules-conversation.mjs.map +1 -1
- package/fesm2022/acorex-modules-dashboard-management.mjs +11 -11
- package/fesm2022/acorex-modules-dashboard-management.mjs.map +1 -1
- package/fesm2022/acorex-modules-data-management.mjs +924 -8
- package/fesm2022/acorex-modules-data-management.mjs.map +1 -1
- package/fesm2022/{acorex-modules-document-management-acorex-modules-document-management-DhEDQZru.mjs → acorex-modules-document-management-acorex-modules-document-management-DUkSbCDD.mjs} +91 -58
- package/fesm2022/{acorex-modules-document-management-acorex-modules-document-management-DhEDQZru.mjs.map → acorex-modules-document-management-acorex-modules-document-management-DUkSbCDD.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-document-management-attachment-widget.component-Bx2Ps7uX.mjs → acorex-modules-document-management-attachment-widget.component-Ded4rmGD.mjs} +2 -2
- package/fesm2022/{acorex-modules-document-management-attachment-widget.component-Bx2Ps7uX.mjs.map → acorex-modules-document-management-attachment-widget.component-Ded4rmGD.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-document-management-create-folder-dialog.component-B26m8qWj.mjs → acorex-modules-document-management-create-folder-dialog.component-DdN8ilG4.mjs} +9 -9
- package/fesm2022/{acorex-modules-document-management-create-folder-dialog.component-B26m8qWj.mjs.map → acorex-modules-document-management-create-folder-dialog.component-DdN8ilG4.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-document-management-details-view.component-3DmulyK_.mjs → acorex-modules-document-management-details-view.component-DkeoYFvx.mjs} +2 -2
- package/fesm2022/{acorex-modules-document-management-details-view.component-3DmulyK_.mjs.map → acorex-modules-document-management-details-view.component-DkeoYFvx.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-document-management-document-signature-popup.component-DmR6gFdD.mjs → acorex-modules-document-management-document-signature-popup.component-DuPMRUTY.mjs} +2 -2
- package/fesm2022/{acorex-modules-document-management-document-signature-popup.component-DmR6gFdD.mjs.map → acorex-modules-document-management-document-signature-popup.component-DuPMRUTY.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-document-management-drive-choose.component-BNyPOrzl.mjs → acorex-modules-document-management-drive-choose.component-CKMMZHrc.mjs} +2 -2
- package/fesm2022/{acorex-modules-document-management-drive-choose.component-BNyPOrzl.mjs.map → acorex-modules-document-management-drive-choose.component-CKMMZHrc.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-document-management-drive.component-D5X_bI5D.mjs → acorex-modules-document-management-drive.component-Dh2hcCpJ.mjs} +2 -2
- package/fesm2022/{acorex-modules-document-management-drive.component-D5X_bI5D.mjs.map → acorex-modules-document-management-drive.component-Dh2hcCpJ.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-document-management-large-icons-view.component-AzDtXQqt.mjs → acorex-modules-document-management-large-icons-view.component-DGUbA3xa.mjs} +2 -2
- package/fesm2022/{acorex-modules-document-management-large-icons-view.component-AzDtXQqt.mjs.map → acorex-modules-document-management-large-icons-view.component-DGUbA3xa.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-document-management-large-tiles-view.component-DCG_v9JT.mjs → acorex-modules-document-management-large-tiles-view.component-Bt6Py82M.mjs} +2 -2
- package/fesm2022/{acorex-modules-document-management-large-tiles-view.component-DCG_v9JT.mjs.map → acorex-modules-document-management-large-tiles-view.component-Bt6Py82M.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-document-management-list-view.component-Cb2OVElN.mjs → acorex-modules-document-management-list-view.component-DQllDW_Q.mjs} +2 -2
- package/fesm2022/{acorex-modules-document-management-list-view.component-Cb2OVElN.mjs.map → acorex-modules-document-management-list-view.component-DQllDW_Q.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-document-management-meta-choose-popup.component-DsSo9G8S.mjs → acorex-modules-document-management-meta-choose-popup.component-BSYX7W79.mjs} +4 -4
- package/fesm2022/acorex-modules-document-management-meta-choose-popup.component-BSYX7W79.mjs.map +1 -0
- package/fesm2022/{acorex-modules-document-management-small-icons-view.component-EN4ttbvx.mjs → acorex-modules-document-management-small-icons-view.component-Umh8Z9qn.mjs} +2 -2
- package/fesm2022/{acorex-modules-document-management-small-icons-view.component-EN4ttbvx.mjs.map → acorex-modules-document-management-small-icons-view.component-Umh8Z9qn.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-document-management-small-tiles-view.component-C-HjbNwe.mjs → acorex-modules-document-management-small-tiles-view.component-CBgWWCdt.mjs} +2 -2
- package/fesm2022/{acorex-modules-document-management-small-tiles-view.component-C-HjbNwe.mjs.map → acorex-modules-document-management-small-tiles-view.component-CBgWWCdt.mjs.map} +1 -1
- package/fesm2022/acorex-modules-document-management.mjs +1 -1
- package/fesm2022/{acorex-modules-human-capital-management-acorex-modules-human-capital-management-BQ_KNd7M.mjs → acorex-modules-human-capital-management-acorex-modules-human-capital-management-CdAtMLlz.mjs} +93 -213
- package/fesm2022/acorex-modules-human-capital-management-acorex-modules-human-capital-management-CdAtMLlz.mjs.map +1 -0
- package/fesm2022/{acorex-modules-human-capital-management-employee-skill.entity-3wofaUXu.mjs → acorex-modules-human-capital-management-employee-skill.entity-BllN9Giu.mjs} +2 -2
- package/fesm2022/{acorex-modules-human-capital-management-employee-skill.entity-3wofaUXu.mjs.map → acorex-modules-human-capital-management-employee-skill.entity-BllN9Giu.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-human-capital-management-employee.entity-1fVathnk.mjs → acorex-modules-human-capital-management-employee.entity-CKofleq7.mjs} +2 -2
- package/fesm2022/{acorex-modules-human-capital-management-employee.entity-1fVathnk.mjs.map → acorex-modules-human-capital-management-employee.entity-CKofleq7.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-human-capital-management-employment-type.entity-BWrwli0P.mjs → acorex-modules-human-capital-management-employment-type.entity-DfrErkOs.mjs} +2 -2
- package/fesm2022/{acorex-modules-human-capital-management-employment-type.entity-BWrwli0P.mjs.map → acorex-modules-human-capital-management-employment-type.entity-DfrErkOs.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-human-capital-management-leave-request.entity-4ddc6R_K.mjs → acorex-modules-human-capital-management-leave-request.entity-Bz_4gE7D.mjs} +2 -2
- package/fesm2022/{acorex-modules-human-capital-management-leave-request.entity-4ddc6R_K.mjs.map → acorex-modules-human-capital-management-leave-request.entity-Bz_4gE7D.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-human-capital-management-leave-type.entity-DYYJVRju.mjs → acorex-modules-human-capital-management-leave-type.entity-CFqmKzkn.mjs} +2 -2
- package/fesm2022/{acorex-modules-human-capital-management-leave-type.entity-DYYJVRju.mjs.map → acorex-modules-human-capital-management-leave-type.entity-CFqmKzkn.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-human-capital-management-position-assignment.entity-DIqdhqk4.mjs → acorex-modules-human-capital-management-position-assignment.entity-BYqhKD95.mjs} +36 -4
- package/fesm2022/acorex-modules-human-capital-management-position-assignment.entity-BYqhKD95.mjs.map +1 -0
- package/fesm2022/{acorex-modules-human-capital-management-skill-level.entity-BN67pBaa.mjs → acorex-modules-human-capital-management-skill-level.entity-D4WoE6MR.mjs} +2 -2
- package/fesm2022/{acorex-modules-human-capital-management-skill-level.entity-BN67pBaa.mjs.map → acorex-modules-human-capital-management-skill-level.entity-D4WoE6MR.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-human-capital-management-skill.entity-D4CglCC7.mjs → acorex-modules-human-capital-management-skill.entity-DqUyAAgW.mjs} +2 -2
- package/fesm2022/{acorex-modules-human-capital-management-skill.entity-D4CglCC7.mjs.map → acorex-modules-human-capital-management-skill.entity-DqUyAAgW.mjs.map} +1 -1
- package/fesm2022/acorex-modules-human-capital-management.mjs +1 -1
- package/fesm2022/acorex-modules-notification-management.mjs +5 -5
- package/fesm2022/acorex-modules-notification-management.mjs.map +1 -1
- package/fesm2022/{acorex-modules-organization-management-org-chart.page-keZ4Gk7y.mjs → acorex-modules-organization-management-org-chart.page-Caboa2La.mjs} +75 -23
- package/fesm2022/acorex-modules-organization-management-org-chart.page-Caboa2La.mjs.map +1 -0
- package/fesm2022/acorex-modules-organization-management.mjs +5 -2
- package/fesm2022/acorex-modules-organization-management.mjs.map +1 -1
- package/fesm2022/acorex-modules-project-management-email-jsa.command-DS9XIlQ0.mjs +91 -0
- package/fesm2022/acorex-modules-project-management-email-jsa.command-DS9XIlQ0.mjs.map +1 -0
- package/fesm2022/acorex-modules-project-management-reassign-jsa.command-DbxxI3e3.mjs +88 -0
- package/fesm2022/acorex-modules-project-management-reassign-jsa.command-DbxxI3e3.mjs.map +1 -0
- package/fesm2022/acorex-modules-project-management-sign-jsa.command-cRf0DeTE.mjs +75 -0
- package/fesm2022/acorex-modules-project-management-sign-jsa.command-cRf0DeTE.mjs.map +1 -0
- package/fesm2022/acorex-modules-project-management.mjs +6 -6
- package/fesm2022/acorex-modules-report-management.mjs +4 -2
- package/fesm2022/acorex-modules-report-management.mjs.map +1 -1
- package/fesm2022/acorex-modules-security-management.mjs +347 -3
- package/fesm2022/acorex-modules-security-management.mjs.map +1 -1
- package/fesm2022/acorex-modules-task-management.mjs +18 -11
- package/fesm2022/acorex-modules-task-management.mjs.map +1 -1
- package/human-capital-management/index.d.ts +1 -1
- package/package.json +1 -1
- package/security-management/index.d.ts +42 -3
- package/fesm2022/acorex-modules-contact-management-emergency-contact.entity-D75qsDor.mjs.map +0 -1
- package/fesm2022/acorex-modules-document-management-meta-choose-popup.component-DsSo9G8S.mjs.map +0 -1
- package/fesm2022/acorex-modules-document-management-rename-node-dialog.component-B7gcoDDb.mjs +0 -101
- package/fesm2022/acorex-modules-document-management-rename-node-dialog.component-B7gcoDDb.mjs.map +0 -1
- package/fesm2022/acorex-modules-human-capital-management-acorex-modules-human-capital-management-BQ_KNd7M.mjs.map +0 -1
- package/fesm2022/acorex-modules-human-capital-management-position-assignment.entity-DIqdhqk4.mjs.map +0 -1
- package/fesm2022/acorex-modules-organization-management-org-chart.page-keZ4Gk7y.mjs.map +0 -1
- package/fesm2022/acorex-modules-project-management-email-jsa.command-BuT5Vj4Y.mjs +0 -115
- package/fesm2022/acorex-modules-project-management-email-jsa.command-BuT5Vj4Y.mjs.map +0 -1
- package/fesm2022/acorex-modules-project-management-reassign-jsa.command-B3OsacOq.mjs +0 -113
- package/fesm2022/acorex-modules-project-management-reassign-jsa.command-B3OsacOq.mjs.map +0 -1
- package/fesm2022/acorex-modules-project-management-sign-jsa.command-CJWg6Ntg.mjs +0 -77
- package/fesm2022/acorex-modules-project-management-sign-jsa.command-CJWg6Ntg.mjs.map +0 -1
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { inject, Injector, Injectable, computed, effect, HostBinding, ChangeDetectionStrategy, Component, NgModule, EventEmitter, signal, Output, Input } from '@angular/core';
|
|
2
|
+
import { inject, Injector, Injectable, computed, effect, HostBinding, ChangeDetectionStrategy, Component, NgModule, EventEmitter, signal, Output, Input, input, output, viewChild } from '@angular/core';
|
|
3
3
|
import { AXP_PERMISSION_DEFINITION_PROVIDER } from '@acorex/platform/auth';
|
|
4
4
|
import { AXPSearchCommandProvider, createAllQueryView, createQueryView, AXPEntityCommandScope, AXPEntityQueryType, AXP_MENU_PROVIDER, AXP_SETTING_DEFINITION_PROVIDER, AXP_SEARCH_PROVIDER } from '@acorex/platform/common';
|
|
5
|
-
import {
|
|
5
|
+
import { AXPDataSourceDefinitionProviderService, AXPDataGenerator, AXP_DATASOURCE_DEFINITION_PROVIDER, AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER } from '@acorex/platform/core';
|
|
6
|
+
import { AXPEntityService, AXMEntityCrudServiceImpl, ensureListActions, actionExists, AXP_ENTITY_ACTION_PLUGIN, AXP_ENTITY_DEFINITION_LOADER } from '@acorex/platform/layout/entity';
|
|
6
7
|
import * as i4 from '@acorex/platform/layout/builder';
|
|
7
|
-
import { AXPWidgetRegistryService, AXPWidgetsCatalog, AXP_WIDGETS_EDITOR_CATEGORY, AXPValueWidgetComponent, AXPLayoutBuilderModule, AXPWidgetGroupEnum } from '@acorex/platform/layout/builder';
|
|
8
|
+
import { AXPWidgetRegistryService, AXPWidgetsCatalog, AXP_WIDGETS_EDITOR_CATEGORY, AXPValueWidgetComponent, AXPLayoutBuilderModule, AXPWidgetGroupEnum, AXPPageStatus } from '@acorex/platform/layout/builder';
|
|
9
|
+
import { AXPQueryService } from '@acorex/platform/runtime';
|
|
8
10
|
import { AXDataSource } from '@acorex/cdk/common';
|
|
9
11
|
import { AXPWidgetsList } from '@acorex/modules/common';
|
|
10
|
-
import
|
|
11
|
-
import {
|
|
12
|
+
import * as i3$1 from '@acorex/core/translation';
|
|
13
|
+
import { AXTranslationService, AXTranslationModule } from '@acorex/core/translation';
|
|
12
14
|
import { AXP_NAME_PROPERTY, AXP_DATA_PATH_PROPERTY, AXP_DISABLED_PROPERTY, AXP_LABEL_PROPERTY, AXP_READONLY_PROPERTY } from '@acorex/platform/widgets';
|
|
13
15
|
import * as i2 from '@acorex/components/select-box';
|
|
14
16
|
import { AXSelectBoxModule } from '@acorex/components/select-box';
|
|
@@ -26,6 +28,9 @@ import { AXFormModule } from '@acorex/components/form';
|
|
|
26
28
|
import * as i5 from '@acorex/components/dropdown';
|
|
27
29
|
import { AXDropdownModule } from '@acorex/components/dropdown';
|
|
28
30
|
import { moveItemInArray, AXDragDirective, AXDragHandleDirective, AXDropListDirective } from '@acorex/cdk/drag-drop';
|
|
31
|
+
import { moveItemInArray as moveItemInArray$1, CdkDropList, CdkDrag, CdkDragHandle } from '@angular/cdk/drag-drop';
|
|
32
|
+
import { AXPDataSelectorService, AXPDynamicFormComponent } from '@acorex/platform/layout/components';
|
|
33
|
+
import { AXLabelModule } from '@acorex/components/label';
|
|
29
34
|
|
|
30
35
|
const config = {
|
|
31
36
|
i18n: 'data-management',
|
|
@@ -204,6 +209,32 @@ class AXMSearchCommandProvider extends AXPSearchCommandProvider {
|
|
|
204
209
|
}
|
|
205
210
|
}
|
|
206
211
|
|
|
212
|
+
/**
|
|
213
|
+
* Metadata Evaluator Scope Provider
|
|
214
|
+
*
|
|
215
|
+
* Provides expression evaluation capabilities for metadata operations:
|
|
216
|
+
* - Get category IDs from context/expressions
|
|
217
|
+
* - Retrieve metadata by category IDs
|
|
218
|
+
* - Access category metadata inheritance
|
|
219
|
+
*/
|
|
220
|
+
class AXMMetadataEvaluatorScopeProvider {
|
|
221
|
+
constructor() {
|
|
222
|
+
this.queryService = inject(AXPQueryService);
|
|
223
|
+
}
|
|
224
|
+
async provide(context) {
|
|
225
|
+
context.addScope('metadata', {
|
|
226
|
+
getByCategoryIds: async (entityName, categoryIds) => {
|
|
227
|
+
const ids = Array.isArray(categoryIds) ? categoryIds : [categoryIds];
|
|
228
|
+
const result = await this.queryService.fetch('DataManagement:Metadata:GetCategoryInheritance', {
|
|
229
|
+
entityName,
|
|
230
|
+
categoryId: ids[0]
|
|
231
|
+
});
|
|
232
|
+
return result;
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
207
238
|
//#region ---- Column Definition Widget ----
|
|
208
239
|
const AXM_COLUMN_DEF_WIDGET = [
|
|
209
240
|
{
|
|
@@ -3875,13 +3906,886 @@ class AXMDataSourceListDataSourceDefinition {
|
|
|
3875
3906
|
}
|
|
3876
3907
|
}
|
|
3877
3908
|
|
|
3909
|
+
const AXPMetaDataSelectorWidget = {
|
|
3910
|
+
name: 'meta-data-selector-editor',
|
|
3911
|
+
title: '@data-management:widgets.meta-data-selector.title',
|
|
3912
|
+
categories: AXP_WIDGETS_EDITOR_CATEGORY,
|
|
3913
|
+
groups: [AXPWidgetGroupEnum.EntityWidget],
|
|
3914
|
+
description: '@data-management:widgets.meta-data-selector.description',
|
|
3915
|
+
icon: 'fa-light fa-list-check',
|
|
3916
|
+
defaultFilterWidgetName: 'string-filter',
|
|
3917
|
+
type: 'editor',
|
|
3918
|
+
options: {
|
|
3919
|
+
needLabel: false,
|
|
3920
|
+
},
|
|
3921
|
+
properties: [
|
|
3922
|
+
AXP_NAME_PROPERTY,
|
|
3923
|
+
AXP_DATA_PATH_PROPERTY,
|
|
3924
|
+
],
|
|
3925
|
+
components: {
|
|
3926
|
+
view: {
|
|
3927
|
+
component: () => Promise.resolve().then(function () { return metaDataSelectorView_component; }).then((c) => c.AXPMetaDataSelectorWidgetViewComponent),
|
|
3928
|
+
},
|
|
3929
|
+
edit: {
|
|
3930
|
+
component: () => Promise.resolve().then(function () { return metaDataSelectorEdit_component; }).then((c) => c.AXPMetaDataSelectorWidgetEditComponent),
|
|
3931
|
+
},
|
|
3932
|
+
print: {
|
|
3933
|
+
component: () => Promise.resolve().then(function () { return metaDataSelectorEdit_component; }).then((c) => c.AXPMetaDataSelectorWidgetEditComponent),
|
|
3934
|
+
},
|
|
3935
|
+
},
|
|
3936
|
+
};
|
|
3937
|
+
|
|
3938
|
+
//#endregion
|
|
3939
|
+
class AXPMetaDataSelectorWidgetEditComponent extends AXPValueWidgetComponent {
|
|
3940
|
+
constructor() {
|
|
3941
|
+
super(...arguments);
|
|
3942
|
+
//#region ---- Services & Dependencies ----
|
|
3943
|
+
this.dataSelectorService = inject(AXPDataSelectorService);
|
|
3944
|
+
this.metaDataService = inject(AXMMetaDataDefinitionService);
|
|
3945
|
+
//#endregion
|
|
3946
|
+
//#region ---- Computed Properties ----
|
|
3947
|
+
/**
|
|
3948
|
+
* Check if the widget is in readonly mode
|
|
3949
|
+
*/
|
|
3950
|
+
this.readonly = computed(() => this.options()['readonly'], ...(ngDevMode ? [{ debugName: "readonly" }] : []));
|
|
3951
|
+
/**
|
|
3952
|
+
* Convert raw value to MetaDataSelectorItem format for display
|
|
3953
|
+
*/
|
|
3954
|
+
this.metaItems = computed(() => {
|
|
3955
|
+
const value = this.getValue();
|
|
3956
|
+
if (!Array.isArray(value)) {
|
|
3957
|
+
return [];
|
|
3958
|
+
}
|
|
3959
|
+
return value.map((item, index) => ({
|
|
3960
|
+
id: AXPDataGenerator.uuid(),
|
|
3961
|
+
name: item.name,
|
|
3962
|
+
title: item.title,
|
|
3963
|
+
description: item.description,
|
|
3964
|
+
interface: item.interface,
|
|
3965
|
+
configuration: {
|
|
3966
|
+
isRequired: item.configuration?.isRequired ?? false,
|
|
3967
|
+
placeholder: item.configuration?.placeholder || '',
|
|
3968
|
+
},
|
|
3969
|
+
status: item.status || 'active',
|
|
3970
|
+
order: item.order ?? index,
|
|
3971
|
+
...item
|
|
3972
|
+
}));
|
|
3973
|
+
}, ...(ngDevMode ? [{ debugName: "metaItems" }] : []));
|
|
3974
|
+
//#endregion
|
|
3975
|
+
//#region ---- Event Handlers ----
|
|
3976
|
+
/**
|
|
3977
|
+
* Effect to handle status changes
|
|
3978
|
+
*/
|
|
3979
|
+
this.#statusChanged = effect(() => {
|
|
3980
|
+
if (this.layoutService.status() === AXPPageStatus.Submitting) {
|
|
3981
|
+
const currentValue = this.getValue();
|
|
3982
|
+
if (Array.isArray(currentValue)) {
|
|
3983
|
+
const cleanedValue = currentValue
|
|
3984
|
+
.filter(item => item.status !== 'deleted')
|
|
3985
|
+
.map(item => {
|
|
3986
|
+
const { isNewlyAdded, ...rest } = item;
|
|
3987
|
+
return rest;
|
|
3988
|
+
});
|
|
3989
|
+
this.setValue(cleanedValue);
|
|
3990
|
+
}
|
|
3991
|
+
}
|
|
3992
|
+
}, ...(ngDevMode ? [{ debugName: "#statusChanged" }] : []));
|
|
3993
|
+
}
|
|
3994
|
+
//#endregion
|
|
3995
|
+
//#region ---- Event Handlers ----
|
|
3996
|
+
/**
|
|
3997
|
+
* Effect to handle status changes
|
|
3998
|
+
*/
|
|
3999
|
+
#statusChanged;
|
|
4000
|
+
/**
|
|
4001
|
+
* Handle adding a new metadata item
|
|
4002
|
+
*/
|
|
4003
|
+
async handleAddClick() {
|
|
4004
|
+
try {
|
|
4005
|
+
const dataSource = new AXDataSource({
|
|
4006
|
+
key: 'id',
|
|
4007
|
+
pageSize: 20,
|
|
4008
|
+
load: async (e) => {
|
|
4009
|
+
const metaDataItems = await this.metaDataService.query(e);
|
|
4010
|
+
return {
|
|
4011
|
+
items: metaDataItems.items,
|
|
4012
|
+
total: metaDataItems.total
|
|
4013
|
+
};
|
|
4014
|
+
}
|
|
4015
|
+
});
|
|
4016
|
+
// Open data selector
|
|
4017
|
+
const result = await this.dataSelectorService.open({
|
|
4018
|
+
title: '@data-management:meta-data-selector.select-items',
|
|
4019
|
+
dataSource: dataSource,
|
|
4020
|
+
columns: [
|
|
4021
|
+
{
|
|
4022
|
+
name: 'title',
|
|
4023
|
+
title: '@general:terms.title',
|
|
4024
|
+
visible: true,
|
|
4025
|
+
widget: {
|
|
4026
|
+
type: 'text-editor',
|
|
4027
|
+
options: {}
|
|
4028
|
+
}
|
|
4029
|
+
},
|
|
4030
|
+
{
|
|
4031
|
+
name: 'description',
|
|
4032
|
+
title: '@general:terms.description',
|
|
4033
|
+
visible: true,
|
|
4034
|
+
widget: {
|
|
4035
|
+
type: 'text-editor',
|
|
4036
|
+
options: {}
|
|
4037
|
+
}
|
|
4038
|
+
},
|
|
4039
|
+
],
|
|
4040
|
+
selectionMode: 'multiple',
|
|
4041
|
+
searchFields: ['title', 'description'],
|
|
4042
|
+
allowCreate: false
|
|
4043
|
+
});
|
|
4044
|
+
// Add selected items to the current value
|
|
4045
|
+
if (result?.items && result.items.length > 0) {
|
|
4046
|
+
const currentValue = this.getValue() || [];
|
|
4047
|
+
const newItems = result.items.map((item, index) => ({
|
|
4048
|
+
id: item.id,
|
|
4049
|
+
name: item.name,
|
|
4050
|
+
title: item.title,
|
|
4051
|
+
description: item.description,
|
|
4052
|
+
interface: item.interface,
|
|
4053
|
+
configuration: {},
|
|
4054
|
+
order: currentValue.length + index,
|
|
4055
|
+
isNewlyAdded: true, // Mark as newly added
|
|
4056
|
+
}));
|
|
4057
|
+
this.setValue([...currentValue, ...newItems]);
|
|
4058
|
+
}
|
|
4059
|
+
}
|
|
4060
|
+
catch (error) {
|
|
4061
|
+
console.error('Error loading meta-data:', error);
|
|
4062
|
+
}
|
|
4063
|
+
}
|
|
4064
|
+
/**
|
|
4065
|
+
* Handle removing a metadata item
|
|
4066
|
+
*/
|
|
4067
|
+
handleItemRemove(item) {
|
|
4068
|
+
this.removeMetaItem(item);
|
|
4069
|
+
}
|
|
4070
|
+
/**
|
|
4071
|
+
* Handle reverting a deleted metadata item
|
|
4072
|
+
*/
|
|
4073
|
+
handleItemRevert(item) {
|
|
4074
|
+
item.status = 'active';
|
|
4075
|
+
this.updateMetaItem(item);
|
|
4076
|
+
}
|
|
4077
|
+
/**
|
|
4078
|
+
* Handle editing a metadata item (Phase 2 - will use AXPDynamicDialogService)
|
|
4079
|
+
*/
|
|
4080
|
+
async handleItemEdit(item) {
|
|
4081
|
+
// TODO: Phase 2 - Implement property editor popup
|
|
4082
|
+
console.log('Edit item:', item);
|
|
4083
|
+
}
|
|
4084
|
+
/**
|
|
4085
|
+
* Handle drag and drop reordering
|
|
4086
|
+
*/
|
|
4087
|
+
handleDrop(event) {
|
|
4088
|
+
const currentValue = this.getValue() || [];
|
|
4089
|
+
moveItemInArray$1(currentValue, event.previousIndex, event.currentIndex);
|
|
4090
|
+
// Update order property
|
|
4091
|
+
const updatedItems = currentValue.map((item, index) => ({
|
|
4092
|
+
...item,
|
|
4093
|
+
order: index
|
|
4094
|
+
}));
|
|
4095
|
+
this.setValue(updatedItems);
|
|
4096
|
+
}
|
|
4097
|
+
//#endregion
|
|
4098
|
+
//#region ---- Utility Methods ----
|
|
4099
|
+
/**
|
|
4100
|
+
* Remove a metadata item (mark as deleted if active, remove if already deleted)
|
|
4101
|
+
*/
|
|
4102
|
+
removeMetaItem(item) {
|
|
4103
|
+
const currentValue = this.getValue() || [];
|
|
4104
|
+
// If item is newly added, always hard delete (remove completely)
|
|
4105
|
+
if (item.isNewlyAdded) {
|
|
4106
|
+
const updatedValue = currentValue.filter((meta) => meta.id !== item.id);
|
|
4107
|
+
this.setValue(updatedValue);
|
|
4108
|
+
return;
|
|
4109
|
+
}
|
|
4110
|
+
// For existing items (from database), use soft delete
|
|
4111
|
+
if (item.status === 'active') {
|
|
4112
|
+
// Mark as deleted instead of removing completely
|
|
4113
|
+
const updatedValue = currentValue.map((meta) => meta.id === item.id ? { ...meta, status: 'deleted' } : meta);
|
|
4114
|
+
this.setValue(updatedValue);
|
|
4115
|
+
}
|
|
4116
|
+
else {
|
|
4117
|
+
// Remove completely if already marked as deleted
|
|
4118
|
+
const updatedValue = currentValue.filter((meta) => meta.id !== item.id);
|
|
4119
|
+
this.setValue(updatedValue);
|
|
4120
|
+
}
|
|
4121
|
+
}
|
|
4122
|
+
/**
|
|
4123
|
+
* Update a specific metadata item
|
|
4124
|
+
*/
|
|
4125
|
+
updateMetaItem(item) {
|
|
4126
|
+
const currentValue = this.getValue() || [];
|
|
4127
|
+
const updatedValue = currentValue.map((meta) => meta.id === item.id ? { ...meta, ...item } : meta);
|
|
4128
|
+
this.setValue(updatedValue);
|
|
4129
|
+
}
|
|
4130
|
+
//#endregion
|
|
4131
|
+
//#region ---- Host Binding ----
|
|
4132
|
+
get __class() {
|
|
4133
|
+
const cls = {};
|
|
4134
|
+
cls[`ax-block`] = true;
|
|
4135
|
+
cls[`ax-border`] = true;
|
|
4136
|
+
cls[`ax-rounded-md`] = true;
|
|
4137
|
+
cls[`ax-lightest-surface`] = true;
|
|
4138
|
+
cls[`ax-flex-1`] = true;
|
|
4139
|
+
return cls;
|
|
4140
|
+
}
|
|
4141
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXPMetaDataSelectorWidgetEditComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
4142
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.8", type: AXPMetaDataSelectorWidgetEditComponent, isStandalone: true, selector: "axp-meta-data-selector-widget-edit", host: { properties: { "class": "this.__class" } }, usesInheritance: true, ngImport: i0, template: "<div class=\"axp-meta-data-selector-widget-edit\" *translate=\"let t\">\n @if (!readonly()) {\n <div class=\"__header\">\n <ax-button class=\"ax-sm\" [text]=\"t('@data-management:actions.add-meta-data') | async\" [color]=\"'primary'\"\n (onClick)=\"handleAddClick()\">\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-plus\"></ax-icon>\n </ax-prefix>\n </ax-button>\n </div>\n }\n <div class=\"__content\">\n @if (metaItems().length === 0) {\n <div class=\"__empty-state\">\n <ax-icon class=\"__icon\" icon=\"fa-light fa-list-check\"></ax-icon>\n <p class=\"__message\">{{ t('@data-management:meta-data-selector.no-items-selected') | async }}</p>\n </div>\n } @else {\n <div class=\"__items-list\" cdkDropList (cdkDropListDropped)=\"handleDrop($event)\">\n @for (item of metaItems(); track item.id) {\n <div class=\"__meta-data-selector-item\" [class.__deleted]=\"item.status === 'deleted'\" cdkDrag>\n <div class=\"__drag-handle\" cdkDragHandle>\n <ax-icon icon=\"fa-light fa-grip-vertical\"></ax-icon>\n </div>\n\n <div class=\"__item-content\">\n <div class=\"__item-header\">\n <h4 class=\"__item-title\">{{ item.title }}</h4>\n @if (item.configuration.isRequired) {\n <span class=\"__required-badge\">{{ t('@data-management:meta-data-selector.required') | async }}</span>\n }\n </div>\n @if (item.configuration.placeholder) {\n <p class=\"__placeholder-text\">\n {{ t('@data-management:meta-data-selector.placeholder') | async }}:\n {{ item.configuration.placeholder }}\n </p>\n }\n </div>\n\n @if (!readonly()) {\n <div class=\"__item-actions\">\n @if (item.status === 'deleted') {\n <ax-button class=\"ax-sm\" [look]=\"'blank'\" color=\"warning\" (onClick)=\"handleItemRevert(item)\">\n <ax-icon class=\"fa-light fa-rotate-left\"></ax-icon>\n </ax-button>\n } @else {\n <ax-button [look]=\"'blank'\" class=\"ax-sm\" color=\"accent3\" (onClick)=\"handleItemEdit(item)\">\n <ax-icon class=\"fa-light fa-pencil\"></ax-icon>\n </ax-button>\n\n <ax-button [look]=\"'blank'\" class=\"ax-sm\" color=\"danger\" (onClick)=\"handleItemRemove(item)\">\n <ax-icon class=\"fa-light fa-trash-can\"></ax-icon>\n </ax-button>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n</div>", styles: [".axp-meta-data-selector-widget-edit .__header{display:flex;justify-content:flex-end;border-bottom-width:1px;padding:.5rem}.axp-meta-data-selector-widget-edit .__content{padding:.5rem}.axp-meta-data-selector-widget-edit .__content .__empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding-top:2rem;padding-bottom:2rem;text-align:center}.axp-meta-data-selector-widget-edit .__content .__empty-state .__icon{margin-bottom:.75rem;font-size:1.875rem;line-height:2.25rem;opacity:.65}.axp-meta-data-selector-widget-edit .__content .__empty-state .__message{font-size:.875rem;line-height:1.25rem;opacity:.65}.axp-meta-data-selector-widget-edit .__content .__items-list>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.__meta-data-selector-item{display:flex;align-items:center;gap:.75rem;border-radius:.375rem;border-width:1px;padding:.75rem;cursor:move;-webkit-user-select:none;-moz-user-select:-moz-none;user-select:none;background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}.__meta-data-selector-item:hover{background-color:rgb(var(--ax-sys-color-light-surface));color:rgb(var(--ax-sys-color-on-light-surface));border-color:rgb(var(--ax-sys-color-border-light-surface))}.__meta-data-selector-item.__deleted{background-color:rgb(var(--ax-sys-color-danger-lightest-surface));color:rgb(var(--ax-sys-color-on-danger-lightest-surface));border-color:rgb(var(--ax-sys-color-border-danger-lightest-surface))}.__meta-data-selector-item .__drag-handle{display:flex;height:1.5rem;width:1.5rem;cursor:grab;align-items:center;justify-content:center}.__meta-data-selector-item .__drag-handle:active{cursor:grabbing}.__meta-data-selector-item .__item-content{flex:1 1 0%}.__meta-data-selector-item .__item-content .__item-header{margin-bottom:.25rem;display:flex;align-items:center;gap:.5rem}.__meta-data-selector-item .__item-content .__item-header .__item-title{font-size:.875rem;line-height:1.25rem;font-weight:500}.__meta-data-selector-item .__item-content .__item-header .__required-badge{display:inline-flex;align-items:center;border-radius:9999px;padding:.25rem .5rem;font-size:.75rem;line-height:1rem;font-weight:500;--tw-bg-opacity: 1;background-color:rgb(255 237 213 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(154 52 18 / var(--tw-text-opacity, 1))}.__meta-data-selector-item .__item-content .__placeholder-text{font-size:.75rem;line-height:1rem}.__meta-data-selector-item .__item-actions{display:flex;gap:.25rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i2$2.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: AXDecoratorModule }, { kind: "component", type: i3.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i3.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: AXDropdownModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i3$1.AXTranslatorDirective, selector: "[translate]" }, { kind: "directive", type:
|
|
4143
|
+
// CDK DragDrop modules
|
|
4144
|
+
CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
4145
|
+
}
|
|
4146
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXPMetaDataSelectorWidgetEditComponent, decorators: [{
|
|
4147
|
+
type: Component,
|
|
4148
|
+
args: [{ selector: 'axp-meta-data-selector-widget-edit', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
4149
|
+
CommonModule,
|
|
4150
|
+
AXButtonModule,
|
|
4151
|
+
AXDecoratorModule,
|
|
4152
|
+
AXDropdownModule,
|
|
4153
|
+
AXTranslationModule,
|
|
4154
|
+
// CDK DragDrop modules
|
|
4155
|
+
CdkDropList,
|
|
4156
|
+
CdkDrag,
|
|
4157
|
+
CdkDragHandle,
|
|
4158
|
+
], template: "<div class=\"axp-meta-data-selector-widget-edit\" *translate=\"let t\">\n @if (!readonly()) {\n <div class=\"__header\">\n <ax-button class=\"ax-sm\" [text]=\"t('@data-management:actions.add-meta-data') | async\" [color]=\"'primary'\"\n (onClick)=\"handleAddClick()\">\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-plus\"></ax-icon>\n </ax-prefix>\n </ax-button>\n </div>\n }\n <div class=\"__content\">\n @if (metaItems().length === 0) {\n <div class=\"__empty-state\">\n <ax-icon class=\"__icon\" icon=\"fa-light fa-list-check\"></ax-icon>\n <p class=\"__message\">{{ t('@data-management:meta-data-selector.no-items-selected') | async }}</p>\n </div>\n } @else {\n <div class=\"__items-list\" cdkDropList (cdkDropListDropped)=\"handleDrop($event)\">\n @for (item of metaItems(); track item.id) {\n <div class=\"__meta-data-selector-item\" [class.__deleted]=\"item.status === 'deleted'\" cdkDrag>\n <div class=\"__drag-handle\" cdkDragHandle>\n <ax-icon icon=\"fa-light fa-grip-vertical\"></ax-icon>\n </div>\n\n <div class=\"__item-content\">\n <div class=\"__item-header\">\n <h4 class=\"__item-title\">{{ item.title }}</h4>\n @if (item.configuration.isRequired) {\n <span class=\"__required-badge\">{{ t('@data-management:meta-data-selector.required') | async }}</span>\n }\n </div>\n @if (item.configuration.placeholder) {\n <p class=\"__placeholder-text\">\n {{ t('@data-management:meta-data-selector.placeholder') | async }}:\n {{ item.configuration.placeholder }}\n </p>\n }\n </div>\n\n @if (!readonly()) {\n <div class=\"__item-actions\">\n @if (item.status === 'deleted') {\n <ax-button class=\"ax-sm\" [look]=\"'blank'\" color=\"warning\" (onClick)=\"handleItemRevert(item)\">\n <ax-icon class=\"fa-light fa-rotate-left\"></ax-icon>\n </ax-button>\n } @else {\n <ax-button [look]=\"'blank'\" class=\"ax-sm\" color=\"accent3\" (onClick)=\"handleItemEdit(item)\">\n <ax-icon class=\"fa-light fa-pencil\"></ax-icon>\n </ax-button>\n\n <ax-button [look]=\"'blank'\" class=\"ax-sm\" color=\"danger\" (onClick)=\"handleItemRemove(item)\">\n <ax-icon class=\"fa-light fa-trash-can\"></ax-icon>\n </ax-button>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n</div>", styles: [".axp-meta-data-selector-widget-edit .__header{display:flex;justify-content:flex-end;border-bottom-width:1px;padding:.5rem}.axp-meta-data-selector-widget-edit .__content{padding:.5rem}.axp-meta-data-selector-widget-edit .__content .__empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding-top:2rem;padding-bottom:2rem;text-align:center}.axp-meta-data-selector-widget-edit .__content .__empty-state .__icon{margin-bottom:.75rem;font-size:1.875rem;line-height:2.25rem;opacity:.65}.axp-meta-data-selector-widget-edit .__content .__empty-state .__message{font-size:.875rem;line-height:1.25rem;opacity:.65}.axp-meta-data-selector-widget-edit .__content .__items-list>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.__meta-data-selector-item{display:flex;align-items:center;gap:.75rem;border-radius:.375rem;border-width:1px;padding:.75rem;cursor:move;-webkit-user-select:none;-moz-user-select:-moz-none;user-select:none;background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}.__meta-data-selector-item:hover{background-color:rgb(var(--ax-sys-color-light-surface));color:rgb(var(--ax-sys-color-on-light-surface));border-color:rgb(var(--ax-sys-color-border-light-surface))}.__meta-data-selector-item.__deleted{background-color:rgb(var(--ax-sys-color-danger-lightest-surface));color:rgb(var(--ax-sys-color-on-danger-lightest-surface));border-color:rgb(var(--ax-sys-color-border-danger-lightest-surface))}.__meta-data-selector-item .__drag-handle{display:flex;height:1.5rem;width:1.5rem;cursor:grab;align-items:center;justify-content:center}.__meta-data-selector-item .__drag-handle:active{cursor:grabbing}.__meta-data-selector-item .__item-content{flex:1 1 0%}.__meta-data-selector-item .__item-content .__item-header{margin-bottom:.25rem;display:flex;align-items:center;gap:.5rem}.__meta-data-selector-item .__item-content .__item-header .__item-title{font-size:.875rem;line-height:1.25rem;font-weight:500}.__meta-data-selector-item .__item-content .__item-header .__required-badge{display:inline-flex;align-items:center;border-radius:9999px;padding:.25rem .5rem;font-size:.75rem;line-height:1rem;font-weight:500;--tw-bg-opacity: 1;background-color:rgb(255 237 213 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(154 52 18 / var(--tw-text-opacity, 1))}.__meta-data-selector-item .__item-content .__placeholder-text{font-size:.75rem;line-height:1rem}.__meta-data-selector-item .__item-actions{display:flex;gap:.25rem}\n"] }]
|
|
4159
|
+
}], propDecorators: { __class: [{
|
|
4160
|
+
type: HostBinding,
|
|
4161
|
+
args: ['class']
|
|
4162
|
+
}] } });
|
|
4163
|
+
|
|
4164
|
+
var metaDataSelectorEdit_component = /*#__PURE__*/Object.freeze({
|
|
4165
|
+
__proto__: null,
|
|
4166
|
+
AXPMetaDataSelectorWidgetEditComponent: AXPMetaDataSelectorWidgetEditComponent
|
|
4167
|
+
});
|
|
4168
|
+
|
|
4169
|
+
class AXPMetaDataSelectorWidgetViewComponent extends AXPValueWidgetComponent {
|
|
4170
|
+
/**
|
|
4171
|
+
* Returns a comma-separated list of selected meta titles.
|
|
4172
|
+
* Extracting this logic into a getter keeps the template simple and
|
|
4173
|
+
* avoids using arrow functions, which are not allowed in Angular
|
|
4174
|
+
* interpolation expressions.
|
|
4175
|
+
*/
|
|
4176
|
+
get display() {
|
|
4177
|
+
const val = this.getValue();
|
|
4178
|
+
return Array.isArray(val) ? val.map((v) => v.title || v.text).join(', ') : '';
|
|
4179
|
+
}
|
|
4180
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXPMetaDataSelectorWidgetViewComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
4181
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.1.8", type: AXPMetaDataSelectorWidgetViewComponent, isStandalone: true, selector: "axp-meta-data-selector-widget-view", usesInheritance: true, ngImport: i0, template: `<span>{{ display }}</span>`, isInline: true, dependencies: [{ kind: "ngmodule", type: AXDecoratorModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
4182
|
+
}
|
|
4183
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXPMetaDataSelectorWidgetViewComponent, decorators: [{
|
|
4184
|
+
type: Component,
|
|
4185
|
+
args: [{
|
|
4186
|
+
selector: 'axp-meta-data-selector-widget-view',
|
|
4187
|
+
template: `<span>{{ display }}</span>`,
|
|
4188
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
4189
|
+
imports: [AXDecoratorModule],
|
|
4190
|
+
}]
|
|
4191
|
+
}] });
|
|
4192
|
+
|
|
4193
|
+
var metaDataSelectorView_component = /*#__PURE__*/Object.freeze({
|
|
4194
|
+
__proto__: null,
|
|
4195
|
+
AXPMetaDataSelectorWidgetViewComponent: AXPMetaDataSelectorWidgetViewComponent
|
|
4196
|
+
});
|
|
4197
|
+
|
|
4198
|
+
/**
|
|
4199
|
+
* meta-data-selector plugin
|
|
4200
|
+
* Notes:
|
|
4201
|
+
* - Always ensures a 'meta-data' group and single-view section
|
|
4202
|
+
* - Always ensures the property exists if missing
|
|
4203
|
+
* - Uses provided configuration options; others are fixed
|
|
4204
|
+
*/
|
|
4205
|
+
const metaDataSelectorPlugin = {
|
|
4206
|
+
name: 'meta-data-selector',
|
|
4207
|
+
order: 60,
|
|
4208
|
+
apply: (ctx, options) => {
|
|
4209
|
+
const opts = options ?? {};
|
|
4210
|
+
const field = opts.field && opts.field.trim().length > 0 ? opts.field : 'metaData';
|
|
4211
|
+
const displayTitle = opts.title && opts.title.trim().length > 0 ? opts.title : 'Meta Data';
|
|
4212
|
+
// Ensure group and section ids (unique per field)
|
|
4213
|
+
const sectionId = `meta-data-${field}`;
|
|
4214
|
+
const groupIdForProperty = `meta-data-${field}`;
|
|
4215
|
+
const existingGroups = ctx.groups.list() ?? [];
|
|
4216
|
+
if (!existingGroups.some((g) => g.id === groupIdForProperty)) {
|
|
4217
|
+
ctx.groups.add({ id: groupIdForProperty, title: displayTitle });
|
|
4218
|
+
}
|
|
4219
|
+
// Ensure property exists (using meta-data-selector-editor interface)
|
|
4220
|
+
const props = ctx.properties.list();
|
|
4221
|
+
if (!props.some((p) => p.name === field)) {
|
|
4222
|
+
ctx.properties.add({
|
|
4223
|
+
name: field,
|
|
4224
|
+
title: displayTitle,
|
|
4225
|
+
groupId: groupIdForProperty,
|
|
4226
|
+
schema: {
|
|
4227
|
+
dataType: 'string',
|
|
4228
|
+
interface: {
|
|
4229
|
+
type: 'meta-data-selector-editor',
|
|
4230
|
+
options: {
|
|
4231
|
+
allowMultiple: opts.allowMultiple ?? true,
|
|
4232
|
+
showRequired: opts.showRequired ?? true,
|
|
4233
|
+
showPlaceholder: opts.showPlaceholder ?? true,
|
|
4234
|
+
defaultConfiguration: opts.defaultConfiguration ?? {
|
|
4235
|
+
isRequired: false,
|
|
4236
|
+
placeholder: ''
|
|
4237
|
+
},
|
|
4238
|
+
},
|
|
4239
|
+
},
|
|
4240
|
+
},
|
|
4241
|
+
validations: [
|
|
4242
|
+
{
|
|
4243
|
+
rule: 'required',
|
|
4244
|
+
},
|
|
4245
|
+
],
|
|
4246
|
+
});
|
|
4247
|
+
}
|
|
4248
|
+
// Ensure column exists
|
|
4249
|
+
const cols = ctx.columns.list() ?? [];
|
|
4250
|
+
if (!cols?.some((c) => c.name === field)) {
|
|
4251
|
+
ctx.columns.add({ name: field });
|
|
4252
|
+
}
|
|
4253
|
+
// Ensure single view section and property layout exists
|
|
4254
|
+
const sectionOrder = 9;
|
|
4255
|
+
const colSpan = 12;
|
|
4256
|
+
ctx.interfaces.master.single.update((single) => {
|
|
4257
|
+
const next = single ?? { title: ctx.entity.title, sections: [], properties: [] };
|
|
4258
|
+
next.sections = next.sections ?? [];
|
|
4259
|
+
if (!next.sections.some((s) => s.id === sectionId)) {
|
|
4260
|
+
next.sections.push({ id: sectionId, title: displayTitle, order: 200 });
|
|
4261
|
+
}
|
|
4262
|
+
next.properties = next.properties ?? [];
|
|
4263
|
+
if (!next.properties.some((p) => p.name === field)) {
|
|
4264
|
+
next.properties.push({
|
|
4265
|
+
name: field,
|
|
4266
|
+
layout: {
|
|
4267
|
+
label: { visible: false },
|
|
4268
|
+
positions: { lg: { colSpan, order: sectionOrder } },
|
|
4269
|
+
},
|
|
4270
|
+
});
|
|
4271
|
+
}
|
|
4272
|
+
return next;
|
|
4273
|
+
});
|
|
4274
|
+
// Ensure create view includes the section and property layout
|
|
4275
|
+
ctx.interfaces.master.create.update((create) => {
|
|
4276
|
+
const next = create ?? { sections: [], properties: [] };
|
|
4277
|
+
next.sections = next.sections ?? [];
|
|
4278
|
+
if (!next.sections.some((s) => s.id === sectionId)) {
|
|
4279
|
+
next.sections.push({ id: sectionId, title: displayTitle });
|
|
4280
|
+
}
|
|
4281
|
+
next.properties = next.properties ?? [];
|
|
4282
|
+
if (!next.properties.some((p) => p.name === field)) {
|
|
4283
|
+
next.properties.push({
|
|
4284
|
+
name: field,
|
|
4285
|
+
layout: {
|
|
4286
|
+
label: { visible: false },
|
|
4287
|
+
positions: { lg: { colSpan, order: 7 } },
|
|
4288
|
+
},
|
|
4289
|
+
});
|
|
4290
|
+
}
|
|
4291
|
+
return next;
|
|
4292
|
+
});
|
|
4293
|
+
// Ensure update view includes the section and property layout
|
|
4294
|
+
ctx.interfaces.master.modify.update((modify) => {
|
|
4295
|
+
const next = modify ?? { sections: [], properties: [] };
|
|
4296
|
+
next.sections = next.sections ?? [];
|
|
4297
|
+
if (!next.sections.some((s) => s.id === sectionId)) {
|
|
4298
|
+
next.sections.push({ id: sectionId, title: displayTitle });
|
|
4299
|
+
}
|
|
4300
|
+
next.properties = next.properties ?? [];
|
|
4301
|
+
if (!next.properties.some((p) => p.name === field)) {
|
|
4302
|
+
next.properties.push({
|
|
4303
|
+
name: field,
|
|
4304
|
+
layout: {
|
|
4305
|
+
label: { visible: false },
|
|
4306
|
+
positions: { lg: { colSpan, order: 7 } },
|
|
4307
|
+
},
|
|
4308
|
+
});
|
|
4309
|
+
}
|
|
4310
|
+
return next;
|
|
4311
|
+
});
|
|
4312
|
+
// Ensure list action to open meta data selector popup exists
|
|
4313
|
+
ensureListActions(ctx);
|
|
4314
|
+
ctx.interfaces.update((i) => {
|
|
4315
|
+
const actions = i.master.list.actions;
|
|
4316
|
+
const cmdName = 'show-meta-data-selector-popup';
|
|
4317
|
+
const actionName = `meta-data-${field}`;
|
|
4318
|
+
if (!actionExists(actions, cmdName, actionName)) {
|
|
4319
|
+
actions.push({
|
|
4320
|
+
name: actionName,
|
|
4321
|
+
title: opts.titleKey ?? opts.label ?? '@data-management:actions.configure-meta-data',
|
|
4322
|
+
command: {
|
|
4323
|
+
name: cmdName,
|
|
4324
|
+
options: {
|
|
4325
|
+
id: '{{ context.eval("id") }}',
|
|
4326
|
+
metaData: `{{ context.eval("${field}") }}`,
|
|
4327
|
+
allowMultiple: opts.allowMultiple ?? true,
|
|
4328
|
+
showRequired: opts.showRequired ?? true,
|
|
4329
|
+
showPlaceholder: opts.showPlaceholder ?? true,
|
|
4330
|
+
key: field,
|
|
4331
|
+
defaultConfiguration: opts.defaultConfiguration ?? {
|
|
4332
|
+
isRequired: false,
|
|
4333
|
+
placeholder: ''
|
|
4334
|
+
},
|
|
4335
|
+
},
|
|
4336
|
+
},
|
|
4337
|
+
priority: 'secondary',
|
|
4338
|
+
type: 'configure',
|
|
4339
|
+
scope: AXPEntityCommandScope.Individual,
|
|
4340
|
+
});
|
|
4341
|
+
}
|
|
4342
|
+
return i;
|
|
4343
|
+
});
|
|
4344
|
+
// Stamp normalized config for middleware
|
|
4345
|
+
ctx.entity.extensions ??= {};
|
|
4346
|
+
ctx.entity.extensions.metaDataSelector ??= {};
|
|
4347
|
+
ctx.entity.extensions.metaDataSelector[field] = {
|
|
4348
|
+
title: displayTitle,
|
|
4349
|
+
allowMultiple: opts.allowMultiple ?? true,
|
|
4350
|
+
showRequired: opts.showRequired ?? true,
|
|
4351
|
+
showPlaceholder: opts.showPlaceholder ?? true,
|
|
4352
|
+
defaultConfiguration: opts.defaultConfiguration ?? {
|
|
4353
|
+
isRequired: false,
|
|
4354
|
+
placeholder: ''
|
|
4355
|
+
}
|
|
4356
|
+
};
|
|
4357
|
+
},
|
|
4358
|
+
};
|
|
4359
|
+
|
|
4360
|
+
const AXPMetaDataFormWidget = {
|
|
4361
|
+
name: 'meta-data-form-editor',
|
|
4362
|
+
title: '@data-management:widgets.meta-data-form.title',
|
|
4363
|
+
categories: AXP_WIDGETS_EDITOR_CATEGORY,
|
|
4364
|
+
groups: [AXPWidgetGroupEnum.EntityWidget],
|
|
4365
|
+
description: '@data-management:widgets.meta-data-form.description',
|
|
4366
|
+
icon: 'fa-light fa-list-check',
|
|
4367
|
+
defaultFilterWidgetName: 'string-filter',
|
|
4368
|
+
type: 'editor',
|
|
4369
|
+
options: {
|
|
4370
|
+
needLabel: false,
|
|
4371
|
+
},
|
|
4372
|
+
properties: [
|
|
4373
|
+
AXP_NAME_PROPERTY,
|
|
4374
|
+
AXP_DATA_PATH_PROPERTY,
|
|
4375
|
+
AXP_READONLY_PROPERTY,
|
|
4376
|
+
AXP_DISABLED_PROPERTY,
|
|
4377
|
+
],
|
|
4378
|
+
components: {
|
|
4379
|
+
view: {
|
|
4380
|
+
component: () => Promise.resolve().then(function () { return metaDataFormEdit_component; }).then((c) => c.AXPMetaDataFormWidgetEditComponent),
|
|
4381
|
+
},
|
|
4382
|
+
edit: {
|
|
4383
|
+
component: () => Promise.resolve().then(function () { return metaDataFormEdit_component; }).then((c) => c.AXPMetaDataFormWidgetEditComponent),
|
|
4384
|
+
},
|
|
4385
|
+
print: {
|
|
4386
|
+
component: () => Promise.resolve().then(function () { return metaDataFormEdit_component; }).then((c) => c.AXPMetaDataFormWidgetEditComponent),
|
|
4387
|
+
},
|
|
4388
|
+
},
|
|
4389
|
+
};
|
|
4390
|
+
|
|
4391
|
+
class AXPMetaDataFormWidgetEditComponent extends AXPValueWidgetComponent {
|
|
4392
|
+
constructor() {
|
|
4393
|
+
super(...arguments);
|
|
4394
|
+
//#region ---- Inputs ----
|
|
4395
|
+
/**
|
|
4396
|
+
* Array of metadata definitions to render as form fields
|
|
4397
|
+
*/
|
|
4398
|
+
this.definitions = computed(() => this.options()['definitions'] ?? [], ...(ngDevMode ? [{ debugName: "definitions" }] : []));
|
|
4399
|
+
/**
|
|
4400
|
+
* Form layout appearance (normal, compact, borderless)
|
|
4401
|
+
*/
|
|
4402
|
+
this.layoutLook = input('borderless', ...(ngDevMode ? [{ debugName: "layoutLook" }] : []));
|
|
4403
|
+
/**
|
|
4404
|
+
* Form layout direction (vertical, horizontal, grid)
|
|
4405
|
+
*/
|
|
4406
|
+
this.layoutDirection = input('vertical', ...(ngDevMode ? [{ debugName: "layoutDirection" }] : []));
|
|
4407
|
+
/**
|
|
4408
|
+
* Whether to group fields by category
|
|
4409
|
+
*/
|
|
4410
|
+
this.groupByCategory = input(false, ...(ngDevMode ? [{ debugName: "groupByCategory" }] : []));
|
|
4411
|
+
/**
|
|
4412
|
+
* Whether to show category headers
|
|
4413
|
+
*/
|
|
4414
|
+
this.showCategoryHeaders = input(false, ...(ngDevMode ? [{ debugName: "showCategoryHeaders" }] : []));
|
|
4415
|
+
//#endregion
|
|
4416
|
+
//#region ---- Outputs ----
|
|
4417
|
+
/**
|
|
4418
|
+
* Emitted when form context changes
|
|
4419
|
+
*/
|
|
4420
|
+
this.contextChange = output();
|
|
4421
|
+
/**
|
|
4422
|
+
* Emitted when form validity changes
|
|
4423
|
+
*/
|
|
4424
|
+
this.validityChange = output();
|
|
4425
|
+
//#endregion
|
|
4426
|
+
//#region ---- Properties ----
|
|
4427
|
+
this.dynamicForm = viewChild(AXPDynamicFormComponent, ...(ngDevMode ? [{ debugName: "dynamicForm" }] : []));
|
|
4428
|
+
//#endregion
|
|
4429
|
+
//#region ---- Properties ----
|
|
4430
|
+
/**
|
|
4431
|
+
* Form definition signal that only updates when structure actually changes
|
|
4432
|
+
*/
|
|
4433
|
+
this.formDefinition = signal({ groups: [] }, ...(ngDevMode ? [{ debugName: "formDefinition" }] : []));
|
|
4434
|
+
}
|
|
4435
|
+
//#endregion
|
|
4436
|
+
//#endregion
|
|
4437
|
+
//#region ---- Lifecycle Methods ----
|
|
4438
|
+
ngOnInit() {
|
|
4439
|
+
super.ngOnInit();
|
|
4440
|
+
this.initializeFormDefinition();
|
|
4441
|
+
}
|
|
4442
|
+
//#endregion
|
|
4443
|
+
//#region ---- Event Handlers ----
|
|
4444
|
+
/**
|
|
4445
|
+
* Handle context change from dynamic form
|
|
4446
|
+
*/
|
|
4447
|
+
onContextChange(context) {
|
|
4448
|
+
this.contextChange.emit(context);
|
|
4449
|
+
this.setValue(context);
|
|
4450
|
+
}
|
|
4451
|
+
/**
|
|
4452
|
+
* Handle validity change from dynamic form
|
|
4453
|
+
*/
|
|
4454
|
+
onValidityChange(isValid) {
|
|
4455
|
+
this.validityChange.emit(isValid);
|
|
4456
|
+
}
|
|
4457
|
+
//#endregion
|
|
4458
|
+
//#region ---- Private Methods ----
|
|
4459
|
+
/**
|
|
4460
|
+
* Initialize form definition based on current inputs
|
|
4461
|
+
*/
|
|
4462
|
+
initializeFormDefinition() {
|
|
4463
|
+
const metadataDefinitions = this.definitions();
|
|
4464
|
+
const groupByCategory = this.groupByCategory();
|
|
4465
|
+
const showCategoryHeaders = this.showCategoryHeaders();
|
|
4466
|
+
console.log('metadataDefinitions', metadataDefinitions);
|
|
4467
|
+
let newFormDefinition;
|
|
4468
|
+
if (groupByCategory) {
|
|
4469
|
+
newFormDefinition = this.convertMetadataToGroupedFormDefinition(metadataDefinitions, showCategoryHeaders);
|
|
4470
|
+
}
|
|
4471
|
+
else {
|
|
4472
|
+
newFormDefinition = this.convertMetadataToFlatFormDefinition(metadataDefinitions);
|
|
4473
|
+
}
|
|
4474
|
+
this.formDefinition.set(newFormDefinition);
|
|
4475
|
+
}
|
|
4476
|
+
/**
|
|
4477
|
+
* Convert metadata definitions to grouped form definition
|
|
4478
|
+
*/
|
|
4479
|
+
convertMetadataToGroupedFormDefinition(metadataDefinitions, showCategoryHeaders) {
|
|
4480
|
+
const groups = [];
|
|
4481
|
+
const categoryGroups = this.groupMetadataByCategory(metadataDefinitions);
|
|
4482
|
+
for (const [categoryTitle, metadataItems] of categoryGroups) {
|
|
4483
|
+
const parameters = metadataItems.map(item => this.convertMetadataToFieldDefinition(item));
|
|
4484
|
+
groups.push({
|
|
4485
|
+
name: this.sanitizeGroupName(categoryTitle),
|
|
4486
|
+
title: showCategoryHeaders ? categoryTitle : undefined,
|
|
4487
|
+
parameters
|
|
4488
|
+
});
|
|
4489
|
+
}
|
|
4490
|
+
return { groups };
|
|
4491
|
+
}
|
|
4492
|
+
/**
|
|
4493
|
+
* Convert metadata definitions to flat form definition (single group)
|
|
4494
|
+
*/
|
|
4495
|
+
convertMetadataToFlatFormDefinition(metadataDefinitions) {
|
|
4496
|
+
const parameters = metadataDefinitions.map(item => this.convertMetadataToFieldDefinition(item));
|
|
4497
|
+
return {
|
|
4498
|
+
groups: [{
|
|
4499
|
+
name: 'metadata-fields',
|
|
4500
|
+
title: undefined,
|
|
4501
|
+
parameters
|
|
4502
|
+
}]
|
|
4503
|
+
};
|
|
4504
|
+
}
|
|
4505
|
+
/**
|
|
4506
|
+
* Group metadata definitions by category
|
|
4507
|
+
*/
|
|
4508
|
+
groupMetadataByCategory(metadataDefinitions) {
|
|
4509
|
+
const categoryGroups = new Map();
|
|
4510
|
+
for (const metadata of metadataDefinitions) {
|
|
4511
|
+
// For now, put all metadata in "General" group since categories might not be available
|
|
4512
|
+
const generalGroup = categoryGroups.get('General') || [];
|
|
4513
|
+
generalGroup.push(metadata);
|
|
4514
|
+
categoryGroups.set('General', generalGroup);
|
|
4515
|
+
}
|
|
4516
|
+
return categoryGroups;
|
|
4517
|
+
}
|
|
4518
|
+
/**
|
|
4519
|
+
* Convert single metadata definition to field definition
|
|
4520
|
+
*/
|
|
4521
|
+
convertMetadataToFieldDefinition(metadata) {
|
|
4522
|
+
const interfaceConfig = this.parseInterfaceConfig(metadata.interface);
|
|
4523
|
+
return {
|
|
4524
|
+
path: metadata.name,
|
|
4525
|
+
title: metadata.title,
|
|
4526
|
+
description: undefined, // metadata.description not available in current interface
|
|
4527
|
+
widget: {
|
|
4528
|
+
type: interfaceConfig.type || 'text-editor',
|
|
4529
|
+
path: metadata.name,
|
|
4530
|
+
options: {
|
|
4531
|
+
...interfaceConfig.options,
|
|
4532
|
+
defaultValue: metadata.defaultValue,
|
|
4533
|
+
validations: this.parseValidations(metadata.interface)
|
|
4534
|
+
}
|
|
4535
|
+
}
|
|
4536
|
+
};
|
|
4537
|
+
}
|
|
4538
|
+
/**
|
|
4539
|
+
* Parse interface configuration from metadata
|
|
4540
|
+
*/
|
|
4541
|
+
parseInterfaceConfig(interfaceValue) {
|
|
4542
|
+
if (typeof interfaceValue === 'string') {
|
|
4543
|
+
try {
|
|
4544
|
+
return JSON.parse(interfaceValue || '{}');
|
|
4545
|
+
}
|
|
4546
|
+
catch (error) {
|
|
4547
|
+
console.warn('Failed to parse interface config:', interfaceValue, error);
|
|
4548
|
+
return {};
|
|
4549
|
+
}
|
|
4550
|
+
}
|
|
4551
|
+
return interfaceValue || {};
|
|
4552
|
+
}
|
|
4553
|
+
/**
|
|
4554
|
+
* Parse validations from interface configuration
|
|
4555
|
+
*/
|
|
4556
|
+
parseValidations(interfaceValue) {
|
|
4557
|
+
const config = this.parseInterfaceConfig(interfaceValue);
|
|
4558
|
+
return config.options?.validations || [];
|
|
4559
|
+
}
|
|
4560
|
+
/**
|
|
4561
|
+
* Sanitize group name for use as identifier
|
|
4562
|
+
*/
|
|
4563
|
+
sanitizeGroupName(name) {
|
|
4564
|
+
return name.toLowerCase().replace(/[^a-z0-9]/g, '-');
|
|
4565
|
+
}
|
|
4566
|
+
//#endregion
|
|
4567
|
+
//#region ---- Public Methods ----
|
|
4568
|
+
/**
|
|
4569
|
+
* Get the dynamic form component instance
|
|
4570
|
+
*/
|
|
4571
|
+
getDynamicForm() {
|
|
4572
|
+
return this.dynamicForm();
|
|
4573
|
+
}
|
|
4574
|
+
/**
|
|
4575
|
+
* Validate the form
|
|
4576
|
+
*/
|
|
4577
|
+
async validate() {
|
|
4578
|
+
const form = this.dynamicForm();
|
|
4579
|
+
if (form) {
|
|
4580
|
+
return await form.validate();
|
|
4581
|
+
}
|
|
4582
|
+
return false;
|
|
4583
|
+
}
|
|
4584
|
+
/**
|
|
4585
|
+
* Get current form context
|
|
4586
|
+
*/
|
|
4587
|
+
getContext() {
|
|
4588
|
+
const form = this.dynamicForm();
|
|
4589
|
+
return form ? form.getContext() : {};
|
|
4590
|
+
}
|
|
4591
|
+
/**
|
|
4592
|
+
* Update form context programmatically
|
|
4593
|
+
*/
|
|
4594
|
+
updateContext(context) {
|
|
4595
|
+
console.log('updateContext', context);
|
|
4596
|
+
const form = this.dynamicForm();
|
|
4597
|
+
if (form) {
|
|
4598
|
+
form.updateContext(context);
|
|
4599
|
+
}
|
|
4600
|
+
}
|
|
4601
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXPMetaDataFormWidgetEditComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
4602
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.1.8", type: AXPMetaDataFormWidgetEditComponent, isStandalone: true, selector: "axp-meta-data-form-widget-edit", inputs: { layoutLook: { classPropertyName: "layoutLook", publicName: "layoutLook", isSignal: true, isRequired: false, transformFunction: null }, layoutDirection: { classPropertyName: "layoutDirection", publicName: "layoutDirection", isSignal: true, isRequired: false, transformFunction: null }, groupByCategory: { classPropertyName: "groupByCategory", publicName: "groupByCategory", isSignal: true, isRequired: false, transformFunction: null }, showCategoryHeaders: { classPropertyName: "showCategoryHeaders", publicName: "showCategoryHeaders", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { contextChange: "contextChange", validityChange: "validityChange" }, viewQueries: [{ propertyName: "dynamicForm", first: true, predicate: AXPDynamicFormComponent, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: `
|
|
4603
|
+
<axp-dynamic-form
|
|
4604
|
+
[formDefinition]="formDefinition()"
|
|
4605
|
+
[context]="getValue()"
|
|
4606
|
+
[layoutLook]="layoutLook()"
|
|
4607
|
+
[layoutDirection]="layoutDirection()"
|
|
4608
|
+
(contextChange)="onContextChange($event)"
|
|
4609
|
+
(validityChange)="onValidityChange($event)">
|
|
4610
|
+
</axp-dynamic-form>
|
|
4611
|
+
`, isInline: true, dependencies: [{ kind: "component", type: AXPDynamicFormComponent, selector: "axp-dynamic-form", inputs: ["formDefinition", "context", "layoutLook", "layoutDirection", "layoutConfig"], outputs: ["contextChange", "contextInitiated", "validityChange"] }, { kind: "ngmodule", type: AXFormModule }, { kind: "ngmodule", type: AXLabelModule }, { kind: "ngmodule", type: AXPLayoutBuilderModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
4612
|
+
}
|
|
4613
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXPMetaDataFormWidgetEditComponent, decorators: [{
|
|
4614
|
+
type: Component,
|
|
4615
|
+
args: [{
|
|
4616
|
+
selector: 'axp-meta-data-form-widget-edit',
|
|
4617
|
+
template: `
|
|
4618
|
+
<axp-dynamic-form
|
|
4619
|
+
[formDefinition]="formDefinition()"
|
|
4620
|
+
[context]="getValue()"
|
|
4621
|
+
[layoutLook]="layoutLook()"
|
|
4622
|
+
[layoutDirection]="layoutDirection()"
|
|
4623
|
+
(contextChange)="onContextChange($event)"
|
|
4624
|
+
(validityChange)="onValidityChange($event)">
|
|
4625
|
+
</axp-dynamic-form>
|
|
4626
|
+
`,
|
|
4627
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
4628
|
+
imports: [AXPDynamicFormComponent, AXFormModule, AXLabelModule, AXPLayoutBuilderModule],
|
|
4629
|
+
}]
|
|
4630
|
+
}] });
|
|
4631
|
+
|
|
4632
|
+
var metaDataFormEdit_component = /*#__PURE__*/Object.freeze({
|
|
4633
|
+
__proto__: null,
|
|
4634
|
+
AXPMetaDataFormWidgetEditComponent: AXPMetaDataFormWidgetEditComponent
|
|
4635
|
+
});
|
|
4636
|
+
|
|
4637
|
+
/**
|
|
4638
|
+
* meta-data-form plugin
|
|
4639
|
+
* Notes:
|
|
4640
|
+
* - Always ensures a 'meta-data-form' group and single-view section
|
|
4641
|
+
* - Always ensures the property exists if missing
|
|
4642
|
+
* - Uses provided configuration options; others are fixed
|
|
4643
|
+
* - Requires path option to read meta-data form definition
|
|
4644
|
+
* - field defaults to 'metaDataForm', title defaults to 'Meta Data Form'
|
|
4645
|
+
*/
|
|
4646
|
+
const metaDataFormPlugin = {
|
|
4647
|
+
name: 'meta-data-form',
|
|
4648
|
+
order: 60,
|
|
4649
|
+
apply: (ctx, options) => {
|
|
4650
|
+
if (!options?.path || options.path.trim().length === 0) {
|
|
4651
|
+
throw new Error('meta-data-form plugin requires a path option to read meta-data form definition');
|
|
4652
|
+
}
|
|
4653
|
+
const field = options.field ?? 'metaDataForm';
|
|
4654
|
+
const displayTitle = options.title ?? 'Meta Data Form';
|
|
4655
|
+
// Ensure group and section ids (unique per field)
|
|
4656
|
+
const sectionId = `meta-data-form-${field}`;
|
|
4657
|
+
const groupIdForProperty = `meta-data-form-${field}`;
|
|
4658
|
+
const existingGroups = ctx.groups.list() ?? [];
|
|
4659
|
+
if (!existingGroups.some((g) => g.id === groupIdForProperty)) {
|
|
4660
|
+
ctx.groups.add({ id: groupIdForProperty, title: displayTitle });
|
|
4661
|
+
}
|
|
4662
|
+
// Ensure property exists (using meta-data-form-editor interface)
|
|
4663
|
+
const props = ctx.properties.list();
|
|
4664
|
+
if (!props.some((p) => p.name === field)) {
|
|
4665
|
+
ctx.properties.add({
|
|
4666
|
+
name: field,
|
|
4667
|
+
title: displayTitle,
|
|
4668
|
+
groupId: groupIdForProperty,
|
|
4669
|
+
schema: {
|
|
4670
|
+
dataType: 'string',
|
|
4671
|
+
interface: {
|
|
4672
|
+
type: 'meta-data-form-editor',
|
|
4673
|
+
options: {
|
|
4674
|
+
definitions: `{{ metadata.getByCategoryIds("${ctx.entity.module}.${ctx.entity.name}",context.eval('${options.path}')) }}`,
|
|
4675
|
+
},
|
|
4676
|
+
},
|
|
4677
|
+
},
|
|
4678
|
+
});
|
|
4679
|
+
}
|
|
4680
|
+
// Ensure column exists
|
|
4681
|
+
// const cols = ctx.columns.list() ?? [];
|
|
4682
|
+
// if (!cols?.some((c: any) => c.name === field)) {
|
|
4683
|
+
// ctx.columns.add({ name: field } as any);
|
|
4684
|
+
// }
|
|
4685
|
+
// Ensure single view section and property layout exists
|
|
4686
|
+
const sectionOrder = 9;
|
|
4687
|
+
const colSpan = 12;
|
|
4688
|
+
ctx.interfaces.master.single.update((single) => {
|
|
4689
|
+
const next = single ?? { title: ctx.entity.title, sections: [], properties: [] };
|
|
4690
|
+
next.sections = next.sections ?? [];
|
|
4691
|
+
if (!next.sections.some((s) => s.id === sectionId)) {
|
|
4692
|
+
next.sections.push({ id: sectionId, title: displayTitle, order: 200 });
|
|
4693
|
+
}
|
|
4694
|
+
next.properties = next.properties ?? [];
|
|
4695
|
+
if (!next.properties.some((p) => p.name === field)) {
|
|
4696
|
+
next.properties.push({
|
|
4697
|
+
name: field,
|
|
4698
|
+
layout: {
|
|
4699
|
+
label: { visible: false },
|
|
4700
|
+
positions: { lg: { colSpan, order: sectionOrder } },
|
|
4701
|
+
},
|
|
4702
|
+
});
|
|
4703
|
+
}
|
|
4704
|
+
return next;
|
|
4705
|
+
});
|
|
4706
|
+
// Ensure create view includes the section and property layout
|
|
4707
|
+
ctx.interfaces.master.create.update((create) => {
|
|
4708
|
+
const next = create ?? { sections: [], properties: [] };
|
|
4709
|
+
next.sections = next.sections ?? [];
|
|
4710
|
+
if (!next.sections.some((s) => s.id === sectionId)) {
|
|
4711
|
+
next.sections.push({ id: sectionId, title: displayTitle });
|
|
4712
|
+
}
|
|
4713
|
+
next.properties = next.properties ?? [];
|
|
4714
|
+
if (!next.properties.some((p) => p.name === field)) {
|
|
4715
|
+
next.properties.push({
|
|
4716
|
+
name: field,
|
|
4717
|
+
layout: {
|
|
4718
|
+
label: { visible: false },
|
|
4719
|
+
positions: { lg: { colSpan, order: 7 } },
|
|
4720
|
+
},
|
|
4721
|
+
});
|
|
4722
|
+
}
|
|
4723
|
+
return next;
|
|
4724
|
+
});
|
|
4725
|
+
// Ensure update view includes the section and property layout
|
|
4726
|
+
ctx.interfaces.master.modify.update((modify) => {
|
|
4727
|
+
const next = modify ?? { sections: [], properties: [] };
|
|
4728
|
+
next.sections = next.sections ?? [];
|
|
4729
|
+
if (!next.sections.some((s) => s.id === sectionId)) {
|
|
4730
|
+
next.sections.push({ id: sectionId, title: displayTitle });
|
|
4731
|
+
}
|
|
4732
|
+
next.properties = next.properties ?? [];
|
|
4733
|
+
if (!next.properties.some((p) => p.name === field)) {
|
|
4734
|
+
next.properties.push({
|
|
4735
|
+
name: field,
|
|
4736
|
+
layout: {
|
|
4737
|
+
label: { visible: false },
|
|
4738
|
+
positions: { lg: { colSpan, order: 7 } },
|
|
4739
|
+
},
|
|
4740
|
+
});
|
|
4741
|
+
}
|
|
4742
|
+
return next;
|
|
4743
|
+
});
|
|
4744
|
+
// Stamp normalized config for middleware
|
|
4745
|
+
ctx.entity.extensions ??= {};
|
|
4746
|
+
ctx.entity.extensions.metaDataForm ??= {};
|
|
4747
|
+
ctx.entity.extensions.metaDataForm[field] = {
|
|
4748
|
+
title: displayTitle,
|
|
4749
|
+
path: options.path,
|
|
4750
|
+
};
|
|
4751
|
+
},
|
|
4752
|
+
};
|
|
4753
|
+
|
|
4754
|
+
class AXMMetaDataFeatureModule {
|
|
4755
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXMMetaDataFeatureModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
4756
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.1.8", ngImport: i0, type: AXMMetaDataFeatureModule, imports: [i4.AXPLayoutBuilderModule] }); }
|
|
4757
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXMMetaDataFeatureModule, providers: [
|
|
4758
|
+
{ provide: AXP_ENTITY_ACTION_PLUGIN, multi: true, useValue: metaDataSelectorPlugin },
|
|
4759
|
+
{ provide: AXP_ENTITY_ACTION_PLUGIN, multi: true, useValue: metaDataFormPlugin },
|
|
4760
|
+
], imports: [AXPLayoutBuilderModule.forChild({
|
|
4761
|
+
widgets: [AXPMetaDataSelectorWidget, AXPMetaDataFormWidget],
|
|
4762
|
+
})] }); }
|
|
4763
|
+
}
|
|
4764
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXMMetaDataFeatureModule, decorators: [{
|
|
4765
|
+
type: NgModule,
|
|
4766
|
+
args: [{
|
|
4767
|
+
imports: [
|
|
4768
|
+
AXPLayoutBuilderModule.forChild({
|
|
4769
|
+
widgets: [AXPMetaDataSelectorWidget, AXPMetaDataFormWidget],
|
|
4770
|
+
}),
|
|
4771
|
+
],
|
|
4772
|
+
exports: [],
|
|
4773
|
+
declarations: [],
|
|
4774
|
+
providers: [
|
|
4775
|
+
{ provide: AXP_ENTITY_ACTION_PLUGIN, multi: true, useValue: metaDataSelectorPlugin },
|
|
4776
|
+
{ provide: AXP_ENTITY_ACTION_PLUGIN, multi: true, useValue: metaDataFormPlugin },
|
|
4777
|
+
],
|
|
4778
|
+
}]
|
|
4779
|
+
}] });
|
|
4780
|
+
|
|
3878
4781
|
class AXMDataManagementModule {
|
|
3879
4782
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXMDataManagementModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
3880
4783
|
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.1.8", ngImport: i0, type: AXMDataManagementModule, imports: [i4.AXPLayoutBuilderModule,
|
|
3881
4784
|
// Entity Modules
|
|
3882
4785
|
AXMQueryEntityModule,
|
|
3883
4786
|
AXMDataSourceEntityModule,
|
|
3884
|
-
AXMMetaDataDefinitionEntityModule
|
|
4787
|
+
AXMMetaDataDefinitionEntityModule,
|
|
4788
|
+
AXMMetaDataFeatureModule] }); }
|
|
3885
4789
|
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXMDataManagementModule, providers: [
|
|
3886
4790
|
{
|
|
3887
4791
|
provide: AXP_MENU_PROVIDER,
|
|
@@ -3913,13 +4817,19 @@ class AXMDataManagementModule {
|
|
|
3913
4817
|
useClass: AXMDataSourceListDataSourceDefinition,
|
|
3914
4818
|
multi: true,
|
|
3915
4819
|
},
|
|
4820
|
+
{
|
|
4821
|
+
provide: AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,
|
|
4822
|
+
useClass: AXMMetadataEvaluatorScopeProvider,
|
|
4823
|
+
multi: true,
|
|
4824
|
+
},
|
|
3916
4825
|
], imports: [AXPLayoutBuilderModule.forChild({
|
|
3917
4826
|
widgets: [AXPQueryBuilderWidget, AXMColumnFilterSelectorWidget],
|
|
3918
4827
|
}),
|
|
3919
4828
|
// Entity Modules
|
|
3920
4829
|
AXMQueryEntityModule,
|
|
3921
4830
|
AXMDataSourceEntityModule,
|
|
3922
|
-
AXMMetaDataDefinitionEntityModule
|
|
4831
|
+
AXMMetaDataDefinitionEntityModule,
|
|
4832
|
+
AXMMetaDataFeatureModule] }); }
|
|
3923
4833
|
}
|
|
3924
4834
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXMDataManagementModule, decorators: [{
|
|
3925
4835
|
type: NgModule,
|
|
@@ -3932,6 +4842,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImpor
|
|
|
3932
4842
|
AXMQueryEntityModule,
|
|
3933
4843
|
AXMDataSourceEntityModule,
|
|
3934
4844
|
AXMMetaDataDefinitionEntityModule,
|
|
4845
|
+
AXMMetaDataFeatureModule
|
|
3935
4846
|
],
|
|
3936
4847
|
exports: [],
|
|
3937
4848
|
declarations: [],
|
|
@@ -3966,6 +4877,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImpor
|
|
|
3966
4877
|
useClass: AXMDataSourceListDataSourceDefinition,
|
|
3967
4878
|
multi: true,
|
|
3968
4879
|
},
|
|
4880
|
+
{
|
|
4881
|
+
provide: AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,
|
|
4882
|
+
useClass: AXMMetadataEvaluatorScopeProvider,
|
|
4883
|
+
multi: true,
|
|
4884
|
+
},
|
|
3969
4885
|
]
|
|
3970
4886
|
}]
|
|
3971
4887
|
}] });
|
|
@@ -3974,5 +4890,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImpor
|
|
|
3974
4890
|
* Generated bundle index. Do not edit.
|
|
3975
4891
|
*/
|
|
3976
4892
|
|
|
3977
|
-
export { AXMColumnFilterSelectorWidget, AXMColumnFilterSelectorWidgetColumnComponent, AXMColumnFilterSelectorWidgetEditComponent, AXMColumnFilterSelectorWidgetFilterComponent, AXMColumnFilterSelectorWidgetPrintComponent, AXMColumnFilterSelectorWidgetViewComponent, AXMDataManagementModule, AXMDataSourceEntityModule, AXMDataSourceOutputType, AXMDataSourceService, AXMDataSourceServiceImpl, AXMDataSourceType, AXMEntityProvider, AXMMenuProvider, AXMMetaDataDefinitionEntityModule, AXMMetaDataDefinitionService, AXMPMetaDataDefinitionServiceImpl, AXMQueryEntityModule, AXMQueryService, AXMQueryServiceImpl, AXMSearchCommandProvider, AXMSettingProvider, AXM_COLUMN_DEF_WIDGET, AXM_FILTER_DEF_WIDGET, AXPQueryBuilderWidget, AXPQueryBuilderWidgetColumnComponent, AXPQueryBuilderWidgetDesignerComponent, AXPQueryBuilderWidgetEditComponent, AXPQueryBuilderWidgetViewComponent, RootConfig, dataSourceEntityFactory, metaDataDefinitionFactory, queryFactory };
|
|
4893
|
+
export { AXMColumnFilterSelectorWidget, AXMColumnFilterSelectorWidgetColumnComponent, AXMColumnFilterSelectorWidgetEditComponent, AXMColumnFilterSelectorWidgetFilterComponent, AXMColumnFilterSelectorWidgetPrintComponent, AXMColumnFilterSelectorWidgetViewComponent, AXMDataManagementModule, AXMDataSourceEntityModule, AXMDataSourceOutputType, AXMDataSourceService, AXMDataSourceServiceImpl, AXMDataSourceType, AXMEntityProvider, AXMMenuProvider, AXMMetaDataDefinitionEntityModule, AXMMetaDataDefinitionService, AXMMetaDataFeatureModule, AXMMetadataEvaluatorScopeProvider, AXMPMetaDataDefinitionServiceImpl, AXMQueryEntityModule, AXMQueryService, AXMQueryServiceImpl, AXMSearchCommandProvider, AXMSettingProvider, AXM_COLUMN_DEF_WIDGET, AXM_FILTER_DEF_WIDGET, AXPQueryBuilderWidget, AXPQueryBuilderWidgetColumnComponent, AXPQueryBuilderWidgetDesignerComponent, AXPQueryBuilderWidgetEditComponent, AXPQueryBuilderWidgetViewComponent, RootConfig, dataSourceEntityFactory, metaDataDefinitionFactory, queryFactory };
|
|
3978
4894
|
//# sourceMappingURL=acorex-modules-data-management.mjs.map
|