@nocobase/client-v2 2.2.0-alpha.1 → 2.2.0-alpha.3
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/es/PluginSettingsManager.d.ts +33 -0
- package/es/RouteRepository.d.ts +21 -6
- package/es/components/category-tabs/SortableCategoryTabs.d.ts +55 -0
- package/es/components/category-tabs/index.d.ts +9 -0
- package/es/components/form/JsonTextArea.d.ts +2 -1
- package/es/components/form/TypedVariableInput.d.ts +22 -4
- package/es/components/form/VariableJsonTextArea.d.ts +19 -0
- package/es/components/form/filter/CollectionFilterItem.d.ts +11 -1
- package/es/components/form/filter/index.d.ts +2 -0
- package/es/components/form/index.d.ts +1 -0
- package/es/components/index.d.ts +2 -0
- package/es/flow/actions/afterSuccess.d.ts +8 -1
- package/es/flow/actions/index.d.ts +1 -1
- package/es/flow/admin-shell/admin-layout/AdminLayoutEntryGuard.d.ts +2 -0
- package/es/flow/admin-shell/admin-layout/AdminLayoutMenuFlowUtils.d.ts +2 -1
- package/es/flow/admin-shell/admin-layout/AdminLayoutMenuModels.d.ts +2 -0
- package/es/flow/admin-shell/admin-layout/AdminLayoutMenuUtils.d.ts +3 -2
- package/es/flow/admin-shell/admin-layout/AdminLayoutSlotModels.d.ts +5 -0
- package/es/flow/admin-shell/admin-layout/resolveAdminRouteRuntimeTarget.d.ts +6 -0
- package/es/flow/components/FieldAssignRulesEditor.d.ts +3 -1
- package/es/flow/components/FieldAssignValueInput.d.ts +2 -0
- package/es/flow/index.d.ts +1 -0
- package/es/flow/models/base/GridModel.d.ts +1 -1
- package/es/flow/models/blocks/filter-form/FilterFormBlockModel.d.ts +5 -0
- package/es/flow/models/blocks/form/FormBlockModel.d.ts +4 -0
- package/es/flow/models/blocks/form/submitHandler.d.ts +1 -1
- package/es/flow/models/blocks/form/value-runtime/rules.d.ts +21 -0
- package/es/flow/models/blocks/form/value-runtime/runtime.d.ts +30 -0
- package/es/flow/models/blocks/form/value-runtime/types.d.ts +2 -2
- package/es/flow/models/blocks/js-block/JSBlock.d.ts +1 -0
- package/es/flow/models/blocks/table/TableActionsColumnModel.d.ts +1 -0
- package/es/flow/models/blocks/table/TableBlockModel.d.ts +1 -0
- package/es/flow/models/blocks/table/dragSort/dragSortHooks.d.ts +1 -1
- package/es/flow/models/blocks/table/dragSort/dragSortSettings.d.ts +2 -1
- package/es/flow/models/blocks/table/dragSort/dragSortUtils.d.ts +6 -4
- package/es/flow/models/fields/AssociationFieldModel/RecordSelectFieldModel.d.ts +2 -0
- package/es/flow/models/fields/AssociationFieldModel/SubTableFieldModel/SubTableColumnModel.d.ts +6 -0
- package/es/flow/resolveViewParamsToViewList.d.ts +1 -1
- package/es/flow/utils/dataScopeRowSnapshot.d.ts +59 -0
- package/es/flow/utils/dateTimeDisplayProps.d.ts +49 -0
- package/es/flow/utils/formValueDeps.d.ts +32 -0
- package/es/flow-compat/FieldValidation.d.ts +2 -1
- package/es/index.d.ts +2 -1
- package/es/index.mjs +233 -137
- package/lib/index.js +234 -138
- package/package.json +7 -7
- package/src/PluginSettingsManager.ts +53 -0
- package/src/RouteRepository.ts +126 -24
- package/src/__tests__/PluginSettingsManager.test.ts +13 -0
- package/src/__tests__/RouteRepository.test.ts +216 -0
- package/src/__tests__/browserChecker.test.ts +61 -0
- package/src/__tests__/exports.test.ts +16 -0
- package/src/__tests__/nocobase-buildin-plugin-auth.test.tsx +199 -0
- package/src/__tests__/plugin-manager.test.tsx +44 -2
- package/src/__tests__/settings-center.test.tsx +40 -1
- package/src/collection-manager/field-configure.ts +1 -1
- package/src/collection-manager/interfaces/id.ts +1 -1
- package/src/collection-manager/interfaces/m2m.tsx +2 -2
- package/src/collection-manager/interfaces/m2o.tsx +2 -2
- package/src/collection-manager/interfaces/nanoid.ts +1 -1
- package/src/collection-manager/interfaces/o2m.tsx +2 -2
- package/src/collection-manager/interfaces/obo.tsx +2 -2
- package/src/collection-manager/interfaces/oho.tsx +2 -2
- package/src/collection-manager/interfaces/properties/index.ts +2 -2
- package/src/collection-manager/interfaces/uuid.ts +1 -1
- package/src/components/AppComponents.tsx +19 -3
- package/src/components/README.md +7 -1
- package/src/components/README.zh-CN.md +6 -1
- package/src/components/category-tabs/SortableCategoryTabs.tsx +210 -0
- package/src/components/category-tabs/index.ts +10 -0
- package/src/components/form/JsonTextArea.tsx +21 -11
- package/src/components/form/TypedVariableInput.tsx +416 -93
- package/src/components/form/VariableJsonTextArea.tsx +175 -0
- package/src/components/form/__tests__/JsonTextArea.test.tsx +43 -0
- package/src/components/form/__tests__/TypedVariableInput.test.tsx +268 -9
- package/src/components/form/__tests__/VariableJsonTextArea.test.tsx +86 -0
- package/src/components/form/filter/CollectionFilterItem.tsx +32 -7
- package/src/components/form/filter/__tests__/CollectionFilterItem.test.tsx +38 -0
- package/src/components/form/filter/index.ts +2 -0
- package/src/components/form/index.tsx +1 -0
- package/src/components/index.ts +2 -0
- package/src/flow/__tests__/FlowRoute.test.tsx +443 -5
- package/src/flow/__tests__/getKey.test.ts +7 -0
- package/src/flow/__tests__/resolveViewParamsToViewList.test.ts +34 -0
- package/src/flow/actions/__tests__/afterSuccess.test.ts +73 -0
- package/src/flow/actions/__tests__/dataScopeFilter.test.ts +58 -0
- package/src/flow/actions/__tests__/dataScopeFormValueClear.test.ts +1022 -0
- package/src/flow/actions/__tests__/fieldLinkageRules.scopeDepth.test.ts +150 -1
- package/src/flow/actions/__tests__/linkageAssignField.legacy.test.ts +135 -0
- package/src/flow/actions/__tests__/linkageRules.hiddenSync.restore.test.ts +19 -5
- package/src/flow/actions/__tests__/linkageRules.subFormSetFieldProps.test.ts +92 -0
- package/src/flow/actions/__tests__/openView.defineProps.route.test.tsx +104 -0
- package/src/flow/actions/__tests__/subFormFieldLinkageRules.inputArgs.test.ts +2 -2
- package/src/flow/actions/afterSuccess.tsx +142 -3
- package/src/flow/actions/customVariable.tsx +1 -2
- package/src/flow/actions/dataScopeFilter.ts +10 -0
- package/src/flow/actions/dateTimeFormat.tsx +42 -28
- package/src/flow/actions/index.ts +1 -1
- package/src/flow/actions/linkageRules.tsx +123 -35
- package/src/flow/actions/linkageRulesFormValueRefresh.ts +22 -130
- package/src/flow/actions/openView.tsx +38 -4
- package/src/flow/actions/runjs.tsx +2 -14
- package/src/flow/actions/validation.tsx +62 -30
- package/src/flow/admin-shell/BaseLayoutModel.tsx +25 -3
- package/src/flow/admin-shell/BaseLayoutRouteCoordinator.ts +5 -2
- package/src/flow/admin-shell/__tests__/AdminLayoutRouteCoordinator.test.ts +13 -0
- package/src/flow/admin-shell/admin-layout/AdminLayoutComponent.tsx +34 -10
- package/src/flow/admin-shell/admin-layout/AdminLayoutEntryGuard.test.tsx +310 -0
- package/src/flow/admin-shell/admin-layout/AdminLayoutEntryGuard.tsx +44 -8
- package/src/flow/admin-shell/admin-layout/AdminLayoutMenuFlowUtils.ts +5 -3
- package/src/flow/admin-shell/admin-layout/AdminLayoutMenuModels.tsx +61 -9
- package/src/flow/admin-shell/admin-layout/AdminLayoutMenuUtils.tsx +71 -8
- package/src/flow/admin-shell/admin-layout/AdminLayoutModel.tsx +1 -1
- package/src/flow/admin-shell/admin-layout/AdminLayoutSlotModels.tsx +23 -9
- package/src/flow/admin-shell/admin-layout/HelpLite.tsx +1 -3
- package/src/flow/admin-shell/admin-layout/__tests__/AdminLayoutComponent.test.tsx +188 -0
- package/src/flow/admin-shell/admin-layout/__tests__/AdminLayoutMenuModels.test.ts +99 -0
- package/src/flow/admin-shell/admin-layout/__tests__/AdminLayoutModel.test.tsx +82 -0
- package/src/flow/admin-shell/admin-layout/__tests__/TopbarActionsBar.test.tsx +166 -2
- package/src/flow/admin-shell/admin-layout/resolveAdminRouteRuntimeTarget.test.ts +20 -0
- package/src/flow/admin-shell/admin-layout/resolveAdminRouteRuntimeTarget.ts +33 -5
- package/src/flow/components/DefaultValue.tsx +1 -2
- package/src/flow/components/DynamicFlowsIcon.tsx +447 -126
- package/src/flow/components/FieldAssignRulesEditor.tsx +128 -21
- package/src/flow/components/FieldAssignValueInput.tsx +10 -5
- package/src/flow/components/FlowRoute.tsx +56 -11
- package/src/flow/components/__tests__/DynamicFlowsIcon.test.tsx +148 -2
- package/src/flow/components/__tests__/FieldAssignRulesEditor.test.tsx +508 -4
- package/src/flow/components/__tests__/fieldAssignOptions.test.ts +151 -3
- package/src/flow/components/code-editor/__tests__/useCodeRunner.test.tsx +2 -17
- package/src/flow/components/code-editor/hooks/useCodeRunner.ts +2 -14
- package/src/flow/components/code-editor/runjsDiagnostics.ts +8 -45
- package/src/flow/components/fieldAssignOptions.ts +155 -27
- package/src/flow/flows/editMarkdownFlow.tsx +1 -1
- package/src/flow/getViewDiffAndUpdateHidden.tsx +1 -0
- package/src/flow/index.ts +2 -1
- package/src/flow/internal/utils/operatorSchemaHelper.ts +15 -1
- package/src/flow/models/actions/JSActionModel.tsx +2 -7
- package/src/flow/models/actions/JSCollectionActionModel.tsx +2 -7
- package/src/flow/models/actions/JSItemActionModel.tsx +2 -7
- package/src/flow/models/actions/JSRecordActionModel.tsx +2 -7
- package/src/flow/models/base/ActionModel.tsx +12 -1
- package/src/flow/models/base/ActionModelCore.tsx +6 -4
- package/src/flow/models/base/GridModel.tsx +38 -7
- package/src/flow/models/base/PageModel/PageModel.tsx +4 -1
- package/src/flow/models/base/PageModel/__tests__/PageModel.test.ts +28 -4
- package/src/flow/models/base/__tests__/ActionModel.test.ts +83 -0
- package/src/flow/models/base/__tests__/ActionModelCore.render.test.tsx +37 -0
- package/src/flow/models/base/__tests__/GridModel.dragSnapshotContainer.test.ts +239 -1
- package/src/flow/models/base/__tests__/transformRowsToSingleColumn.test.ts +48 -0
- package/src/flow/models/blocks/filter-form/FilterFormBlockModel.tsx +31 -3
- package/src/flow/models/blocks/filter-form/FilterFormJSActionModel.tsx +2 -7
- package/src/flow/models/blocks/filter-form/__tests__/defaultValues.wiring.test.ts +77 -0
- package/src/flow/models/blocks/filter-form/fields/FilterFormCustomFieldModel.tsx +1 -1
- package/src/flow/models/blocks/filter-manager/flow-actions/__tests__/customizeFilterRender.test.tsx +56 -1
- package/src/flow/models/blocks/form/EditFormModel.tsx +1 -0
- package/src/flow/models/blocks/form/FormActionModel.tsx +1 -1
- package/src/flow/models/blocks/form/FormBlockModel.tsx +7 -0
- package/src/flow/models/blocks/form/JSFormActionModel.tsx +2 -7
- package/src/flow/models/blocks/form/__tests__/FormBlockModel.test.tsx +17 -0
- package/src/flow/models/blocks/form/__tests__/submitHandler.test.ts +54 -1
- package/src/flow/models/blocks/form/submitHandler.ts +17 -3
- package/src/flow/models/blocks/form/value-runtime/__tests__/runtime.test.ts +940 -75
- package/src/flow/models/blocks/form/value-runtime/rules.ts +445 -13
- package/src/flow/models/blocks/form/value-runtime/runtime.ts +348 -13
- package/src/flow/models/blocks/form/value-runtime/types.ts +2 -2
- package/src/flow/models/blocks/js-block/JSBlock.tsx +225 -9
- package/src/flow/models/blocks/js-block/__tests__/JSBlockModel.test.tsx +150 -0
- package/src/flow/models/blocks/table/JSColumnModel.tsx +1 -9
- package/src/flow/models/blocks/table/TableActionsColumnModel.tsx +36 -13
- package/src/flow/models/blocks/table/TableBlockModel.tsx +38 -17
- package/src/flow/models/blocks/table/TableColumnModel.tsx +36 -3
- package/src/flow/models/blocks/table/__tests__/TableActionsColumnModel.test.tsx +111 -1
- package/src/flow/models/blocks/table/__tests__/TableBlockModel.dragSort.test.ts +127 -0
- package/src/flow/models/blocks/table/__tests__/TableBlockModel.mobileSettingsButtons.test.tsx +78 -0
- package/src/flow/models/blocks/table/__tests__/TableBlockModel.rowSelection.test.tsx +1 -0
- package/src/flow/models/blocks/table/__tests__/TableColumnModel.test.tsx +159 -1
- package/src/flow/models/blocks/table/dragSort/dragSortHooks.tsx +28 -17
- package/src/flow/models/blocks/table/dragSort/dragSortSettings.ts +13 -6
- package/src/flow/models/blocks/table/dragSort/dragSortUtils.ts +15 -2
- package/src/flow/models/fields/AssociationFieldModel/AssociationFieldModel.tsx +1 -1
- package/src/flow/models/fields/AssociationFieldModel/PopupSubTableFieldModel/PopupSubTableFieldModel.tsx +29 -6
- package/src/flow/models/fields/AssociationFieldModel/RecordSelectFieldModel.tsx +16 -4
- package/src/flow/models/fields/AssociationFieldModel/SubTableFieldModel/SubTableColumnModel.tsx +141 -19
- package/src/flow/models/fields/AssociationFieldModel/SubTableFieldModel/SubTableField.tsx +13 -1
- package/src/flow/models/fields/AssociationFieldModel/SubTableFieldModel/__tests__/SubTableColumnModel.rowRecord.test.ts +197 -0
- package/src/flow/models/fields/AssociationFieldModel/SubTableFieldModel/__tests__/SubTableFieldModel.reset.test.ts +180 -0
- package/src/flow/models/fields/AssociationFieldModel/SubTableFieldModel/index.tsx +6 -4
- package/src/flow/models/fields/AssociationFieldModel/__tests__/AssociationFieldModel.updateAssociation.test.ts +72 -0
- package/src/flow/models/fields/AssociationFieldModel/__tests__/RecordPickerFieldModel.itemContext.test.ts +23 -0
- package/src/flow/models/fields/ClickableFieldModel.tsx +5 -0
- package/src/flow/models/fields/DisplayDateTimeFieldModel.tsx +29 -1
- package/src/flow/models/fields/InputFieldModel.tsx +40 -2
- package/src/flow/models/fields/JSEditableFieldModel.tsx +2 -11
- package/src/flow/models/fields/JSFieldModel.tsx +2 -7
- package/src/flow/models/fields/JSItemModel.tsx +2 -14
- package/src/flow/models/fields/SelectFieldModel.tsx +6 -4
- package/src/flow/models/fields/TextareaFieldModel.tsx +49 -3
- package/src/flow/models/fields/__tests__/DisplayDateTimeFieldModel.test.tsx +96 -0
- package/src/flow/models/fields/__tests__/InputFieldModel.test.tsx +117 -1
- package/src/flow/models/fields/__tests__/SelectFieldModel.test.tsx +43 -0
- package/src/flow/models/fields/__tests__/TextareaFieldModel.test.tsx +100 -0
- package/src/flow/models/topbar/TopbarActionModel.tsx +93 -10
- package/src/flow/resolveViewParamsToViewList.tsx +11 -3
- package/src/flow/utils/__tests__/dateTimeFormat.test.ts +258 -0
- package/src/flow/utils/dataScopeFormValueClear.ts +218 -81
- package/src/flow/utils/dataScopeRowSnapshot.ts +616 -0
- package/src/flow/utils/dateTimeDisplayProps.ts +135 -0
- package/src/flow/utils/formValueDeps.ts +170 -0
- package/src/flow-compat/FieldValidation.tsx +122 -60
- package/src/flow-compat/Popover.tsx +43 -4
- package/src/flow-compat/__tests__/Popover.test.tsx +34 -0
- package/src/index.ts +8 -1
- package/src/layout-manager/__tests__/LayoutRoute.test.tsx +41 -1
- package/src/nocobase-buildin-plugin/index.tsx +44 -14
- package/src/settings-center/AdminSettingsLayout.tsx +10 -2
- package/src/settings-center/SystemSettingsPage.tsx +1 -2
- package/src/settings-center/plugin-manager/PluginCard.tsx +2 -2
- package/src/settings-center/plugin-manager/index.tsx +3 -0
- package/src/settings-center/utils.tsx +0 -6
|
@@ -49,12 +49,12 @@ export function resolveViewParamsToViewList(
|
|
|
49
49
|
return viewItems;
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
-
export function updateViewListHidden(viewItems: ViewItem[]) {
|
|
52
|
+
export function updateViewListHidden(viewItems: ViewItem[], isMobileLayout = false) {
|
|
53
53
|
// Calculate hidden values based on view types and positions
|
|
54
54
|
let hasEmbedAfter = false;
|
|
55
55
|
for (let i = viewItems.length - 1; i >= 0; i--) {
|
|
56
56
|
const viewItem = viewItems[i];
|
|
57
|
-
const viewType = getViewType(viewItem);
|
|
57
|
+
const viewType = getViewType(viewItem, isMobileLayout);
|
|
58
58
|
|
|
59
59
|
if (viewType === 'embed' && !hasEmbedAfter) {
|
|
60
60
|
hasEmbedAfter = true;
|
|
@@ -65,15 +65,23 @@ export function updateViewListHidden(viewItems: ViewItem[]) {
|
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
-
function getViewType(viewItem: ViewItem): string {
|
|
68
|
+
function getViewType(viewItem: ViewItem, isMobileLayout = false): string {
|
|
69
69
|
if (viewItem.model instanceof RouteModel) {
|
|
70
70
|
return 'embed';
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
+
if (isMobileLayout && viewItem.index > 0) {
|
|
74
|
+
return 'embed';
|
|
75
|
+
}
|
|
76
|
+
|
|
73
77
|
if (!viewItem.model) {
|
|
74
78
|
return 'drawer';
|
|
75
79
|
}
|
|
76
80
|
|
|
81
|
+
if (viewItem.params.openViewRouteState?.mode) {
|
|
82
|
+
return viewItem.params.openViewRouteState.mode;
|
|
83
|
+
}
|
|
84
|
+
|
|
77
85
|
const params = viewItem.model.getStepParams('popupSettings', 'openView');
|
|
78
86
|
return params?.mode || 'drawer';
|
|
79
87
|
}
|
|
@@ -48,6 +48,264 @@ describe('dateTimeFormat', () => {
|
|
|
48
48
|
});
|
|
49
49
|
});
|
|
50
50
|
|
|
51
|
+
it('uses the association title field when deciding the format schema', () => {
|
|
52
|
+
const ctx = {
|
|
53
|
+
model: {
|
|
54
|
+
props: {
|
|
55
|
+
titleField: 'shipmentsTime',
|
|
56
|
+
},
|
|
57
|
+
context: {
|
|
58
|
+
collectionField: {
|
|
59
|
+
type: 'belongsTo',
|
|
60
|
+
targetCollection: {
|
|
61
|
+
getField: (name) =>
|
|
62
|
+
name === 'shipmentsTime'
|
|
63
|
+
? {
|
|
64
|
+
type: 'time',
|
|
65
|
+
interface: 'time',
|
|
66
|
+
}
|
|
67
|
+
: null,
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
expect(Object.keys(dateTimeFormat.uiSchema(ctx))).toEqual(['timeFormat']);
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it('saves association title time field format as a time format', () => {
|
|
78
|
+
const setProps = vi.fn();
|
|
79
|
+
const ctx = {
|
|
80
|
+
model: {
|
|
81
|
+
props: {
|
|
82
|
+
titleField: 'shipmentsTime',
|
|
83
|
+
},
|
|
84
|
+
context: {
|
|
85
|
+
collectionField: {
|
|
86
|
+
type: 'belongsTo',
|
|
87
|
+
targetCollection: {
|
|
88
|
+
getField: (name) =>
|
|
89
|
+
name === 'shipmentsTime'
|
|
90
|
+
? {
|
|
91
|
+
type: 'time',
|
|
92
|
+
interface: 'time',
|
|
93
|
+
}
|
|
94
|
+
: null,
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
setProps,
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
dateTimeFormat.handler(ctx, { timeFormat: 'hh:mm:ss a' });
|
|
103
|
+
|
|
104
|
+
expect(setProps).toHaveBeenCalledWith({
|
|
105
|
+
timeFormat: 'hh:mm:ss a',
|
|
106
|
+
format: 'hh:mm:ss a',
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it('applies and persists date time format params when settings are saved', async () => {
|
|
111
|
+
const setProps = vi.fn();
|
|
112
|
+
const save = vi.fn();
|
|
113
|
+
const ctx = {
|
|
114
|
+
model: {
|
|
115
|
+
props: {
|
|
116
|
+
titleField: 'shipmentsDatetime',
|
|
117
|
+
},
|
|
118
|
+
context: {
|
|
119
|
+
collectionField: {
|
|
120
|
+
type: 'belongsTo',
|
|
121
|
+
targetCollection: {
|
|
122
|
+
getField: (name) =>
|
|
123
|
+
name === 'shipmentsDatetime'
|
|
124
|
+
? {
|
|
125
|
+
type: 'datetime',
|
|
126
|
+
interface: 'datetime',
|
|
127
|
+
}
|
|
128
|
+
: null,
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
setProps,
|
|
133
|
+
save,
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
await dateTimeFormat.beforeParamsSave(ctx, {
|
|
138
|
+
picker: 'date',
|
|
139
|
+
dateFormat: 'YYYY-MM-DD',
|
|
140
|
+
showTime: true,
|
|
141
|
+
timeFormat: 'hh:mm:ss a',
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
expect(setProps).toHaveBeenCalledWith({
|
|
145
|
+
picker: 'date',
|
|
146
|
+
dateFormat: 'YYYY-MM-DD',
|
|
147
|
+
showTime: true,
|
|
148
|
+
timeFormat: 'hh:mm:ss a',
|
|
149
|
+
format: 'YYYY-MM-DD hh:mm:ss a',
|
|
150
|
+
});
|
|
151
|
+
expect(save).toHaveBeenCalled();
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
it('syncs table association column props when title date time format settings are saved', async () => {
|
|
155
|
+
const setProps = vi.fn();
|
|
156
|
+
const save = vi.fn();
|
|
157
|
+
const setParentProps = vi.fn();
|
|
158
|
+
const model = {
|
|
159
|
+
props: {
|
|
160
|
+
titleField: 'shipmentsDatetime',
|
|
161
|
+
},
|
|
162
|
+
context: {
|
|
163
|
+
collectionField: {
|
|
164
|
+
type: 'belongsTo',
|
|
165
|
+
targetCollection: {
|
|
166
|
+
getField: (name) =>
|
|
167
|
+
name === 'shipmentsDatetime'
|
|
168
|
+
? {
|
|
169
|
+
type: 'datetime',
|
|
170
|
+
interface: 'datetime',
|
|
171
|
+
}
|
|
172
|
+
: null,
|
|
173
|
+
},
|
|
174
|
+
},
|
|
175
|
+
},
|
|
176
|
+
setProps,
|
|
177
|
+
save,
|
|
178
|
+
parent: {
|
|
179
|
+
use: 'TableColumnModel',
|
|
180
|
+
collectionField: {
|
|
181
|
+
isAssociationField: () => true,
|
|
182
|
+
},
|
|
183
|
+
setProps: setParentProps,
|
|
184
|
+
},
|
|
185
|
+
};
|
|
186
|
+
model.parent['subModels'] = {
|
|
187
|
+
field: model,
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
await dateTimeFormat.beforeParamsSave(
|
|
191
|
+
{ model },
|
|
192
|
+
{
|
|
193
|
+
picker: 'date',
|
|
194
|
+
dateFormat: 'YYYY-MM-DD',
|
|
195
|
+
showTime: true,
|
|
196
|
+
timeFormat: 'hh:mm:ss a',
|
|
197
|
+
},
|
|
198
|
+
);
|
|
199
|
+
|
|
200
|
+
expect(setParentProps).toHaveBeenCalledWith({
|
|
201
|
+
picker: 'date',
|
|
202
|
+
dateFormat: 'YYYY-MM-DD',
|
|
203
|
+
showTime: true,
|
|
204
|
+
timeFormat: 'hh:mm:ss a',
|
|
205
|
+
format: 'YYYY-MM-DD hh:mm:ss a',
|
|
206
|
+
});
|
|
207
|
+
expect(save).toHaveBeenCalled();
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
it('hides time format for association title date-only fields', () => {
|
|
211
|
+
const ctx = {
|
|
212
|
+
model: {
|
|
213
|
+
props: {
|
|
214
|
+
titleField: 'shipmentsDateOnly',
|
|
215
|
+
showTime: true,
|
|
216
|
+
},
|
|
217
|
+
context: {
|
|
218
|
+
collectionField: {
|
|
219
|
+
type: 'belongsTo',
|
|
220
|
+
targetCollection: {
|
|
221
|
+
getField: (name) =>
|
|
222
|
+
name === 'shipmentsDateOnly'
|
|
223
|
+
? {
|
|
224
|
+
type: 'dateOnly',
|
|
225
|
+
interface: 'date',
|
|
226
|
+
getComponentProps: () => ({
|
|
227
|
+
dateOnly: true,
|
|
228
|
+
showTime: false,
|
|
229
|
+
}),
|
|
230
|
+
}
|
|
231
|
+
: null,
|
|
232
|
+
},
|
|
233
|
+
},
|
|
234
|
+
},
|
|
235
|
+
},
|
|
236
|
+
};
|
|
237
|
+
const schema = dateTimeFormat.uiSchema(ctx);
|
|
238
|
+
const timeFormatField: any = schema.timeFormat;
|
|
239
|
+
const showTimeField: any = schema.showTime;
|
|
240
|
+
const timeFormatState = {
|
|
241
|
+
hidden: false,
|
|
242
|
+
form: {
|
|
243
|
+
values: {
|
|
244
|
+
picker: 'date',
|
|
245
|
+
showTime: true,
|
|
246
|
+
},
|
|
247
|
+
},
|
|
248
|
+
};
|
|
249
|
+
const showTimeState = {
|
|
250
|
+
hidden: false,
|
|
251
|
+
value: true,
|
|
252
|
+
form: {
|
|
253
|
+
values: {
|
|
254
|
+
picker: 'date',
|
|
255
|
+
},
|
|
256
|
+
},
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
timeFormatField['x-reactions'][0](timeFormatState);
|
|
260
|
+
showTimeField['x-reactions'][1](showTimeState);
|
|
261
|
+
|
|
262
|
+
expect(timeFormatState.hidden).toBe(true);
|
|
263
|
+
expect(showTimeState.hidden).toBe(true);
|
|
264
|
+
expect(showTimeState.value).toBe(false);
|
|
265
|
+
expect(dateTimeFormat.defaultParams(ctx)).toMatchObject({
|
|
266
|
+
showTime: false,
|
|
267
|
+
});
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
it('saves association title date-only field format without time even when params contain showTime', () => {
|
|
271
|
+
const setProps = vi.fn();
|
|
272
|
+
const ctx = {
|
|
273
|
+
model: {
|
|
274
|
+
props: {
|
|
275
|
+
titleField: 'shipmentsDateOnly',
|
|
276
|
+
},
|
|
277
|
+
context: {
|
|
278
|
+
collectionField: {
|
|
279
|
+
type: 'belongsTo',
|
|
280
|
+
targetCollection: {
|
|
281
|
+
getField: (name) =>
|
|
282
|
+
name === 'shipmentsDateOnly'
|
|
283
|
+
? {
|
|
284
|
+
type: 'dateOnly',
|
|
285
|
+
interface: 'date',
|
|
286
|
+
}
|
|
287
|
+
: null,
|
|
288
|
+
},
|
|
289
|
+
},
|
|
290
|
+
},
|
|
291
|
+
setProps,
|
|
292
|
+
},
|
|
293
|
+
};
|
|
294
|
+
|
|
295
|
+
dateTimeFormat.handler(ctx, {
|
|
296
|
+
dateFormat: 'YYYY-MM-DD',
|
|
297
|
+
showTime: true,
|
|
298
|
+
timeFormat: 'HH:mm:ss',
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
expect(setProps).toHaveBeenCalledWith({
|
|
302
|
+
dateFormat: 'YYYY-MM-DD',
|
|
303
|
+
showTime: false,
|
|
304
|
+
timeFormat: 'HH:mm:ss',
|
|
305
|
+
format: 'YYYY-MM-DD',
|
|
306
|
+
});
|
|
307
|
+
});
|
|
308
|
+
|
|
51
309
|
it('uses format as the default time format when timeFormat is missing', () => {
|
|
52
310
|
const ctx = {
|
|
53
311
|
model: {
|
|
@@ -8,51 +8,187 @@
|
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import type { FlowContext, FlowModel } from '@nocobase/flow-engine';
|
|
11
|
-
import
|
|
12
|
-
import { namePathToPathKey, pathKeyToNamePath } from '../models/blocks/form/value-runtime/path';
|
|
11
|
+
import { namePathToPathKey } from '../models/blocks/form/value-runtime/path';
|
|
13
12
|
import { collectStaticDepsFromTemplateValue, type DepCollector } from '../models/blocks/form/value-runtime/deps';
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
13
|
+
import {
|
|
14
|
+
buildItemListRootPath,
|
|
15
|
+
buildItemRowPath,
|
|
16
|
+
findFormValueChangeSource,
|
|
17
|
+
getChangedPathsFromPayload,
|
|
18
|
+
isNamePathPrefix,
|
|
19
|
+
isSameNamePath,
|
|
20
|
+
parseFieldIndexEntries,
|
|
21
|
+
parsePathKey,
|
|
22
|
+
type NamePath,
|
|
23
|
+
} from './formValueDeps';
|
|
24
|
+
import {
|
|
25
|
+
applyDataScopeFieldIndexTargetKeys,
|
|
26
|
+
buildDepsSnapshot,
|
|
27
|
+
createDataScopeRowScope,
|
|
28
|
+
getDepsChangeStatus,
|
|
29
|
+
type DataScopeClearDeps,
|
|
30
|
+
type DataScopeClearSnapshot,
|
|
31
|
+
type DataScopeStructuralPath,
|
|
32
|
+
type DataScopeTriggerPath,
|
|
33
|
+
type DataScopeValuePath,
|
|
34
|
+
} from './dataScopeRowSnapshot';
|
|
21
35
|
|
|
22
36
|
type DataScopeClearBinding = {
|
|
23
37
|
signature: string;
|
|
38
|
+
snapshot: DataScopeClearSnapshot | null;
|
|
24
39
|
dispose: () => void;
|
|
25
40
|
};
|
|
26
41
|
|
|
27
42
|
const FORM_VALUES_CHANGE_EVENT = 'formValuesChange';
|
|
28
43
|
const DATA_SCOPE_CLEAR_BINDINGS_KEY = '__formValueDrivenDataScopeClearBindings';
|
|
29
44
|
|
|
30
|
-
function
|
|
31
|
-
const byKey = new Map<string,
|
|
45
|
+
function dedupeValuePaths(paths: DataScopeValuePath[]) {
|
|
46
|
+
const byKey = new Map<string, DataScopeValuePath>();
|
|
32
47
|
for (const path of paths) {
|
|
33
|
-
if (!path?.length) continue;
|
|
34
|
-
byKey.set(namePathToPathKey(path), path);
|
|
48
|
+
if (!path?.path?.length) continue;
|
|
49
|
+
byKey.set(namePathToPathKey(path.path), path);
|
|
35
50
|
}
|
|
36
51
|
return Array.from(byKey.values());
|
|
37
52
|
}
|
|
38
53
|
|
|
39
|
-
function
|
|
40
|
-
|
|
41
|
-
return prefix.every((seg, index) => seg === path[index]);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
function minimizeValueNamePaths(paths: NamePath[]) {
|
|
45
|
-
const deduped = dedupeNamePaths(paths);
|
|
54
|
+
function minimizeValuePaths(paths: DataScopeValuePath[]) {
|
|
55
|
+
const deduped = dedupeValuePaths(paths);
|
|
46
56
|
return deduped.filter((path, index) => {
|
|
47
|
-
return !deduped.some((other, otherIndex) => otherIndex !== index && isNamePathPrefix(path, other));
|
|
57
|
+
return !deduped.some((other, otherIndex) => otherIndex !== index && isNamePathPrefix(path.path, other.path));
|
|
48
58
|
});
|
|
49
59
|
}
|
|
50
60
|
|
|
51
|
-
function
|
|
61
|
+
function dedupeStructuralPaths(paths: DataScopeStructuralPath[]) {
|
|
62
|
+
const byKey = new Map<string, DataScopeStructuralPath>();
|
|
63
|
+
for (const path of paths) {
|
|
64
|
+
if (!path?.path?.length) continue;
|
|
65
|
+
byKey.set(`${path.kind}:${namePathToPathKey(path.path)}`, path);
|
|
66
|
+
}
|
|
67
|
+
return Array.from(byKey.values());
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function dedupeTriggerPaths(paths: DataScopeTriggerPath[]) {
|
|
71
|
+
const byKey = new Map<string, DataScopeTriggerPath>();
|
|
72
|
+
for (const path of paths) {
|
|
73
|
+
if (!path?.path?.length) continue;
|
|
74
|
+
byKey.set(`${path.includeChildren ? 'children' : 'exact'}:${namePathToPathKey(path.path)}`, path);
|
|
75
|
+
}
|
|
76
|
+
return Array.from(byKey.values());
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function emptyDeps(): DataScopeClearDeps {
|
|
80
|
+
return { wildcard: false, valuePaths: [], structuralPaths: [], triggerPaths: [] };
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function wildcardDeps(): DataScopeClearDeps {
|
|
84
|
+
return { wildcard: true, valuePaths: [], structuralPaths: [], triggerPaths: [] };
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function resolveRootItemDependencyPath(cursor: NamePath): DataScopeClearDeps {
|
|
88
|
+
const head = cursor[0];
|
|
89
|
+
if (head === 'value') {
|
|
90
|
+
const rootValuePath = cursor.slice(1);
|
|
91
|
+
return rootValuePath.length
|
|
92
|
+
? { wildcard: false, valuePaths: [{ path: rootValuePath }], structuralPaths: [], triggerPaths: [] }
|
|
93
|
+
: wildcardDeps();
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (head === '__is_new__' || head === '__is_stored__') {
|
|
97
|
+
return { wildcard: false, valuePaths: [{ path: [head] }], structuralPaths: [], triggerPaths: [] };
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return emptyDeps();
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function resolveItemDependencyPath(ctx: FlowContext, depPath: NamePath): DataScopeClearDeps {
|
|
104
|
+
const entries = applyDataScopeFieldIndexTargetKeys(
|
|
105
|
+
ctx,
|
|
106
|
+
parseFieldIndexEntries((ctx.model as any)?.context?.fieldIndex ?? (ctx as any)?.fieldIndex),
|
|
107
|
+
);
|
|
108
|
+
if (!entries.length) {
|
|
109
|
+
return wildcardDeps();
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
let parentDepth = 0;
|
|
113
|
+
let cursor = [...depPath];
|
|
114
|
+
while (cursor[0] === 'parentItem') {
|
|
115
|
+
parentDepth += 1;
|
|
116
|
+
cursor = cursor.slice(1);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const head = cursor[0];
|
|
120
|
+
if (!head) {
|
|
121
|
+
return wildcardDeps();
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
if (parentDepth === entries.length) {
|
|
125
|
+
return resolveRootItemDependencyPath(cursor);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if (parentDepth > entries.length) {
|
|
129
|
+
return wildcardDeps();
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
if (head === 'value') {
|
|
133
|
+
const rowPath = buildItemRowPath(entries, parentDepth);
|
|
134
|
+
if (!rowPath) return wildcardDeps();
|
|
135
|
+
const listRootPath = buildItemListRootPath(entries, parentDepth);
|
|
136
|
+
const tailPath = cursor.slice(1);
|
|
137
|
+
return {
|
|
138
|
+
wildcard: false,
|
|
139
|
+
valuePaths: [
|
|
140
|
+
{
|
|
141
|
+
path: [...rowPath, ...tailPath],
|
|
142
|
+
rowScope: createDataScopeRowScope(entries, parentDepth, tailPath),
|
|
143
|
+
},
|
|
144
|
+
],
|
|
145
|
+
structuralPaths: [],
|
|
146
|
+
triggerPaths: [
|
|
147
|
+
{ path: rowPath, includeChildren: true },
|
|
148
|
+
...(listRootPath ? [{ path: listRootPath, includeChildren: false }] : []),
|
|
149
|
+
],
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
if (head === 'index' || head === 'length') {
|
|
154
|
+
const listRootPath = buildItemListRootPath(entries, parentDepth);
|
|
155
|
+
if (!listRootPath) return wildcardDeps();
|
|
156
|
+
return {
|
|
157
|
+
wildcard: false,
|
|
158
|
+
valuePaths: [],
|
|
159
|
+
structuralPaths: [
|
|
160
|
+
{ path: listRootPath, kind: head, rowScope: createDataScopeRowScope(entries, parentDepth, []) },
|
|
161
|
+
],
|
|
162
|
+
triggerPaths: [{ path: listRootPath, includeChildren: false }],
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
if (head === '__is_new__' || head === '__is_stored__') {
|
|
167
|
+
const rowPath = buildItemRowPath(entries, parentDepth);
|
|
168
|
+
if (!rowPath) return wildcardDeps();
|
|
169
|
+
return {
|
|
170
|
+
wildcard: false,
|
|
171
|
+
valuePaths: [
|
|
172
|
+
{
|
|
173
|
+
path: [...rowPath, head],
|
|
174
|
+
rowScope: createDataScopeRowScope(entries, parentDepth, [head]),
|
|
175
|
+
},
|
|
176
|
+
],
|
|
177
|
+
structuralPaths: [],
|
|
178
|
+
triggerPaths: [{ path: rowPath, includeChildren: true }],
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
return wildcardDeps();
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
function collectDataScopeClearDeps(ctx: FlowContext, params: any): DataScopeClearDeps {
|
|
52
186
|
const collector: DepCollector = { deps: new Set(), wildcard: false };
|
|
53
187
|
collectStaticDepsFromTemplateValue(params, collector);
|
|
54
188
|
|
|
55
|
-
const valuePaths:
|
|
189
|
+
const valuePaths: DataScopeValuePath[] = [];
|
|
190
|
+
const structuralPaths: DataScopeStructuralPath[] = [];
|
|
191
|
+
const triggerPaths: DataScopeTriggerPath[] = [];
|
|
56
192
|
let wildcard = collector.wildcard;
|
|
57
193
|
|
|
58
194
|
for (const depKey of collector.deps) {
|
|
@@ -61,6 +197,15 @@ function collectDataScopeClearDeps(params: any): DataScopeClearDeps {
|
|
|
61
197
|
continue;
|
|
62
198
|
}
|
|
63
199
|
if (!depKey.startsWith('fv:')) {
|
|
200
|
+
if (depKey === 'ctx:item' || depKey.startsWith('ctx:item:')) {
|
|
201
|
+
const subPath = depKey === 'ctx:item' ? '' : depKey.slice('ctx:item:'.length);
|
|
202
|
+
const depPath = subPath ? parsePathKey(subPath) : [];
|
|
203
|
+
const resolved = resolveItemDependencyPath(ctx, depPath);
|
|
204
|
+
wildcard ||= resolved.wildcard;
|
|
205
|
+
valuePaths.push(...resolved.valuePaths);
|
|
206
|
+
structuralPaths.push(...resolved.structuralPaths);
|
|
207
|
+
triggerPaths.push(...resolved.triggerPaths);
|
|
208
|
+
}
|
|
64
209
|
continue;
|
|
65
210
|
}
|
|
66
211
|
const inner = depKey.slice('fv:'.length);
|
|
@@ -68,17 +213,19 @@ function collectDataScopeClearDeps(params: any): DataScopeClearDeps {
|
|
|
68
213
|
wildcard = true;
|
|
69
214
|
continue;
|
|
70
215
|
}
|
|
71
|
-
valuePaths.push(
|
|
216
|
+
valuePaths.push({ path: parsePathKey(inner) });
|
|
72
217
|
}
|
|
73
218
|
|
|
74
219
|
return {
|
|
75
220
|
wildcard,
|
|
76
|
-
valuePaths:
|
|
221
|
+
valuePaths: minimizeValuePaths(valuePaths),
|
|
222
|
+
structuralPaths: dedupeStructuralPaths(structuralPaths),
|
|
223
|
+
triggerPaths: dedupeTriggerPaths(triggerPaths),
|
|
77
224
|
};
|
|
78
225
|
}
|
|
79
226
|
|
|
80
227
|
function hasDeps(deps: DataScopeClearDeps) {
|
|
81
|
-
return deps.wildcard || deps.valuePaths.length > 0;
|
|
228
|
+
return deps.wildcard || deps.valuePaths.length > 0 || deps.structuralPaths.length > 0 || deps.triggerPaths.length > 0;
|
|
82
229
|
}
|
|
83
230
|
|
|
84
231
|
function hasModelValue(model: any) {
|
|
@@ -88,36 +235,6 @@ function hasModelValue(model: any) {
|
|
|
88
235
|
return true;
|
|
89
236
|
}
|
|
90
237
|
|
|
91
|
-
function getChangedPathsFromPayload(payload: any): NamePath[] {
|
|
92
|
-
const rawChangedPaths = Array.isArray(payload?.changedPaths) ? payload.changedPaths : [];
|
|
93
|
-
const out: NamePath[] = [];
|
|
94
|
-
|
|
95
|
-
for (const path of rawChangedPaths) {
|
|
96
|
-
if (Array.isArray(path)) {
|
|
97
|
-
const segs = path.filter((seg) => typeof seg === 'string' || typeof seg === 'number') as NamePath;
|
|
98
|
-
if (segs.length) out.push(segs);
|
|
99
|
-
continue;
|
|
100
|
-
}
|
|
101
|
-
if (typeof path === 'string' && path) {
|
|
102
|
-
out.push(pathKeyToNamePath(path));
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
if (out.length) {
|
|
107
|
-
return out;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
const changedValues = payload?.changedValues;
|
|
111
|
-
if (changedValues && typeof changedValues === 'object' && !Array.isArray(changedValues)) {
|
|
112
|
-
for (const key of Object.keys(changedValues)) {
|
|
113
|
-
const namePath = pathKeyToNamePath(key);
|
|
114
|
-
if (namePath.length) out.push(namePath);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
return out;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
238
|
function depsMatchPayload(deps: DataScopeClearDeps, payload: any) {
|
|
122
239
|
if (!hasDeps(deps)) return false;
|
|
123
240
|
if (deps.wildcard) return true;
|
|
@@ -127,7 +244,28 @@ function depsMatchPayload(deps: DataScopeClearDeps, payload: any) {
|
|
|
127
244
|
|
|
128
245
|
for (const changedPath of changedPaths) {
|
|
129
246
|
for (const depPath of deps.valuePaths) {
|
|
130
|
-
if (isNamePathPrefix(depPath, changedPath) || isNamePathPrefix(changedPath, depPath)) {
|
|
247
|
+
if (isNamePathPrefix(depPath.path, changedPath) || isNamePathPrefix(changedPath, depPath.path)) {
|
|
248
|
+
return true;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
for (const depPath of deps.structuralPaths) {
|
|
253
|
+
if (isSameNamePath(depPath.path, changedPath)) {
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
256
|
+
if (isNamePathPrefix(changedPath, depPath.path)) {
|
|
257
|
+
return true;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
for (const depPath of deps.triggerPaths) {
|
|
262
|
+
if (
|
|
263
|
+
depPath.includeChildren &&
|
|
264
|
+
(isNamePathPrefix(depPath.path, changedPath) || isNamePathPrefix(changedPath, depPath.path))
|
|
265
|
+
) {
|
|
266
|
+
return true;
|
|
267
|
+
}
|
|
268
|
+
if (!depPath.includeChildren && isSameNamePath(depPath.path, changedPath)) {
|
|
131
269
|
return true;
|
|
132
270
|
}
|
|
133
271
|
}
|
|
@@ -136,11 +274,17 @@ function depsMatchPayload(deps: DataScopeClearDeps, payload: any) {
|
|
|
136
274
|
}
|
|
137
275
|
|
|
138
276
|
function getDepsSignature(deps: DataScopeClearDeps, formBlock: any) {
|
|
139
|
-
const toKeys = (paths:
|
|
277
|
+
const toKeys = (paths: DataScopeValuePath[]) => paths.map((path) => namePathToPathKey(path.path)).sort();
|
|
278
|
+
const toStructuralKeys = (paths: DataScopeStructuralPath[]) =>
|
|
279
|
+
paths.map((path) => `${path.kind}:${namePathToPathKey(path.path)}`).sort();
|
|
140
280
|
return JSON.stringify({
|
|
141
281
|
formBlockUid: formBlock?.uid,
|
|
142
282
|
wildcard: deps.wildcard,
|
|
143
283
|
valuePaths: toKeys(deps.valuePaths),
|
|
284
|
+
structuralPaths: toStructuralKeys(deps.structuralPaths),
|
|
285
|
+
triggerPaths: deps.triggerPaths
|
|
286
|
+
.map((path) => `${path.includeChildren ? 'children' : 'exact'}:${namePathToPathKey(path.path)}`)
|
|
287
|
+
.sort(),
|
|
144
288
|
});
|
|
145
289
|
}
|
|
146
290
|
|
|
@@ -148,28 +292,8 @@ function getBindings(model: any): Map<string, DataScopeClearBinding> {
|
|
|
148
292
|
return (model[DATA_SCOPE_CLEAR_BINDINGS_KEY] ||= new Map<string, DataScopeClearBinding>());
|
|
149
293
|
}
|
|
150
294
|
|
|
151
|
-
function isFormBlock(model: any) {
|
|
152
|
-
if (!model || typeof model !== 'object') return false;
|
|
153
|
-
if (!model.emitter || typeof model.emitter.on !== 'function' || typeof model.emitter.off !== 'function') return false;
|
|
154
|
-
return !!model.formValueRuntime || !!model.context?.form || typeof model.context?.setFormValues === 'function';
|
|
155
|
-
}
|
|
156
|
-
|
|
157
295
|
function findFormBlock(ctx: FlowContext): any | null {
|
|
158
|
-
|
|
159
|
-
const push = (model: any) => {
|
|
160
|
-
if (model && !candidates.includes(model)) candidates.push(model);
|
|
161
|
-
};
|
|
162
|
-
|
|
163
|
-
push((ctx.model as any)?.context?.blockModel);
|
|
164
|
-
push(ctx.model);
|
|
165
|
-
|
|
166
|
-
let cursor: any = (ctx.model as any)?.parent;
|
|
167
|
-
while (cursor) {
|
|
168
|
-
push(cursor);
|
|
169
|
-
cursor = cursor?.parent;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
return candidates.find(isFormBlock) || null;
|
|
296
|
+
return findFormValueChangeSource(ctx) as any;
|
|
173
297
|
}
|
|
174
298
|
|
|
175
299
|
function clearModelValue(model: any) {
|
|
@@ -207,7 +331,7 @@ export function ensureFormValueDrivenDataScopeClear(ctx: FlowContext, params: an
|
|
|
207
331
|
|
|
208
332
|
const stepKey = 'dataScope';
|
|
209
333
|
const bindingKey = `${flowKey}:${stepKey}`;
|
|
210
|
-
const deps = collectDataScopeClearDeps(params);
|
|
334
|
+
const deps = collectDataScopeClearDeps(ctx, params);
|
|
211
335
|
if (!hasDeps(deps)) {
|
|
212
336
|
disposeBinding(model, bindingKey);
|
|
213
337
|
return;
|
|
@@ -233,6 +357,7 @@ export function ensureFormValueDrivenDataScopeClear(ctx: FlowContext, params: an
|
|
|
233
357
|
|
|
234
358
|
const binding: DataScopeClearBinding = {
|
|
235
359
|
signature,
|
|
360
|
+
snapshot: buildDepsSnapshot(deps, formBlock),
|
|
236
361
|
dispose: () => {},
|
|
237
362
|
};
|
|
238
363
|
|
|
@@ -251,7 +376,19 @@ export function ensureFormValueDrivenDataScopeClear(ctx: FlowContext, params: an
|
|
|
251
376
|
return;
|
|
252
377
|
}
|
|
253
378
|
|
|
254
|
-
if (!
|
|
379
|
+
if (!depsMatchPayload(deps, payload)) {
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
const changeStatus = getDepsChangeStatus(deps, formBlock, payload, binding.snapshot);
|
|
384
|
+
if (changeStatus.snapshot?.complete) {
|
|
385
|
+
binding.snapshot = changeStatus.snapshot;
|
|
386
|
+
}
|
|
387
|
+
if (changeStatus.status === 'unchanged') {
|
|
388
|
+
return;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
if (!hasModelValue(model)) {
|
|
255
392
|
return;
|
|
256
393
|
}
|
|
257
394
|
|