@nocobase/client-v2 2.2.0-beta.5 → 2.2.0-beta.7
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/form/JsonTextArea.d.ts +2 -1
- package/es/components/form/VariableJsonTextArea.d.ts +19 -0
- package/es/components/form/index.d.ts +1 -0
- package/es/components/index.d.ts +1 -0
- 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 +4 -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/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/value-runtime/rules.d.ts +21 -0
- package/es/flow/models/blocks/form/value-runtime/runtime.d.ts +21 -0
- package/es/flow/models/blocks/form/value-runtime/types.d.ts +2 -2
- package/es/flow-compat/FieldValidation.d.ts +2 -1
- package/es/index.d.ts +2 -1
- package/es/index.mjs +145 -119
- package/lib/index.js +148 -122
- 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__/exports.test.ts +16 -0
- package/src/__tests__/plugin-manager.test.tsx +44 -2
- package/src/__tests__/settings-center.test.tsx +40 -1
- package/src/components/form/JsonTextArea.tsx +21 -11
- package/src/components/form/VariableJsonTextArea.tsx +175 -0
- package/src/components/form/__tests__/JsonTextArea.test.tsx +43 -0
- package/src/components/form/__tests__/VariableJsonTextArea.test.tsx +86 -0
- package/src/components/form/index.tsx +1 -0
- package/src/components/index.ts +1 -0
- package/src/flow/__tests__/FlowRoute.test.tsx +443 -5
- package/src/flow/actions/__tests__/dataScopeFilter.test.ts +58 -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/customVariable.tsx +1 -2
- package/src/flow/actions/dataScopeFilter.ts +10 -0
- package/src/flow/actions/linkageRules.tsx +122 -34
- package/src/flow/actions/runjs.tsx +2 -14
- package/src/flow/actions/validation.tsx +62 -30
- package/src/flow/admin-shell/admin-layout/AdminLayoutComponent.tsx +33 -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 +21 -8
- 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__/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/FieldAssignRulesEditor.tsx +128 -21
- package/src/flow/components/FlowRoute.tsx +56 -11
- 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/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/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__/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/form/EditFormModel.tsx +1 -0
- 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/value-runtime/__tests__/runtime.test.ts +880 -102
- package/src/flow/models/blocks/form/value-runtime/rules.ts +445 -13
- package/src/flow/models/blocks/form/value-runtime/runtime.ts +257 -13
- package/src/flow/models/blocks/form/value-runtime/types.ts +2 -2
- package/src/flow/models/blocks/js-block/JSBlock.tsx +2 -7
- package/src/flow/models/blocks/table/JSColumnModel.tsx +1 -9
- package/src/flow/models/blocks/table/TableActionsColumnModel.tsx +1 -1
- package/src/flow/models/blocks/table/TableBlockModel.tsx +13 -3
- package/src/flow/models/blocks/table/__tests__/TableActionsColumnModel.test.tsx +54 -0
- package/src/flow/models/blocks/table/__tests__/TableBlockModel.mobileSettingsButtons.test.tsx +78 -0
- 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/SubTableFieldModel/SubTableField.tsx +13 -1
- 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/InputFieldModel.tsx +14 -22
- 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/__tests__/InputFieldModel.test.tsx +17 -0
- package/src/flow/models/topbar/TopbarActionModel.tsx +93 -10
- 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 +0 -2
- package/src/settings-center/AdminSettingsLayout.tsx +3 -0
- package/src/settings-center/SystemSettingsPage.tsx +0 -1
- 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
|
@@ -50,6 +50,7 @@ function createFilterFormDefaultValuesModel(rules: any[], initialValues: Record<
|
|
|
50
50
|
const model = {
|
|
51
51
|
defaultValuesRefreshSeq: 0,
|
|
52
52
|
lastDefaultValueByFieldName: new Map<string, any>(),
|
|
53
|
+
userEditedFieldNames: new Set<string>(),
|
|
53
54
|
form: {
|
|
54
55
|
getFieldsValue: () => ({ ...values }),
|
|
55
56
|
getFieldValue: (name: string) => values[name],
|
|
@@ -86,6 +87,10 @@ function createFilterFormDefaultValuesModel(rules: any[], initialValues: Record<
|
|
|
86
87
|
return undefined;
|
|
87
88
|
}),
|
|
88
89
|
canApplyFormDefaultValue: (FilterFormBlockModel.prototype as any).canApplyFormDefaultValue,
|
|
90
|
+
canApplyFormOverrideValue: (FilterFormBlockModel.prototype as any).canApplyFormOverrideValue,
|
|
91
|
+
normalizeFieldValueMode: (FilterFormBlockModel.prototype as any).normalizeFieldValueMode,
|
|
92
|
+
markFilterFormUserEditedFields: (FilterFormBlockModel.prototype as any).markFilterFormUserEditedFields,
|
|
93
|
+
resetFilterFormUserEditedFields: (FilterFormBlockModel.prototype as any).resetFilterFormUserEditedFields,
|
|
89
94
|
matchDefaultValueCondition: (FilterFormBlockModel.prototype as any).matchDefaultValueCondition,
|
|
90
95
|
applyFormDefaultValues: FilterFormBlockModel.prototype.applyFormDefaultValues,
|
|
91
96
|
handleFilterFormValuesChange: (FilterFormBlockModel.prototype as any).handleFilterFormValuesChange,
|
|
@@ -315,6 +320,78 @@ describe('filter-form defaultValues wiring', () => {
|
|
|
315
320
|
expect(values.username_user).toBe('Bob');
|
|
316
321
|
});
|
|
317
322
|
|
|
323
|
+
it('applies override values until the target filter field is changed by user', async () => {
|
|
324
|
+
const { model, values } = createFilterFormDefaultValuesModel(
|
|
325
|
+
[
|
|
326
|
+
{
|
|
327
|
+
key: 'username-override',
|
|
328
|
+
enable: true,
|
|
329
|
+
targetPath: 'username',
|
|
330
|
+
mode: 'override',
|
|
331
|
+
value: '{{ ctx.formValues.nickname_nick }}',
|
|
332
|
+
},
|
|
333
|
+
],
|
|
334
|
+
{ nickname_nick: 'Bob', username_user: 'Manual' },
|
|
335
|
+
);
|
|
336
|
+
|
|
337
|
+
await FilterFormBlockModel.prototype.applyFormDefaultValues.call(model as any);
|
|
338
|
+
expect(values.username_user).toBe('Bob');
|
|
339
|
+
|
|
340
|
+
values.nickname_nick = 'Carol';
|
|
341
|
+
model.defaultValuesRefreshSeq += 1;
|
|
342
|
+
await FilterFormBlockModel.prototype.applyFormDefaultValues.call(model as any, {
|
|
343
|
+
refreshSeq: model.defaultValuesRefreshSeq,
|
|
344
|
+
});
|
|
345
|
+
expect(values.username_user).toBe('Carol');
|
|
346
|
+
|
|
347
|
+
values.username_user = 'User value';
|
|
348
|
+
(model as any).handleFilterFormValuesChange(
|
|
349
|
+
{ username_user: 'User value' },
|
|
350
|
+
{ nickname_nick: 'Carol', username_user: 'User value' },
|
|
351
|
+
);
|
|
352
|
+
|
|
353
|
+
await waitFor(() => {
|
|
354
|
+
expect(values.username_user).toBe('User value');
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
values.nickname_nick = 'Dora';
|
|
358
|
+
model.defaultValuesRefreshSeq += 1;
|
|
359
|
+
await FilterFormBlockModel.prototype.applyFormDefaultValues.call(model as any, {
|
|
360
|
+
refreshSeq: model.defaultValuesRefreshSeq,
|
|
361
|
+
});
|
|
362
|
+
expect(values.username_user).toBe('User value');
|
|
363
|
+
});
|
|
364
|
+
|
|
365
|
+
it('clears filter form user-edited override state on forced apply', async () => {
|
|
366
|
+
const { model, values } = createFilterFormDefaultValuesModel(
|
|
367
|
+
[
|
|
368
|
+
{
|
|
369
|
+
key: 'username-override',
|
|
370
|
+
enable: true,
|
|
371
|
+
targetPath: 'username',
|
|
372
|
+
mode: 'override',
|
|
373
|
+
condition: {
|
|
374
|
+
logic: '$and',
|
|
375
|
+
items: [{ path: '{{ ctx.formValues.nickname_nick }}', operator: '$eq', value: 'allow' }],
|
|
376
|
+
},
|
|
377
|
+
value: '{{ ctx.formValues.nickname_nick }}',
|
|
378
|
+
},
|
|
379
|
+
],
|
|
380
|
+
{ nickname_nick: 'deny', username_user: 'User value' },
|
|
381
|
+
);
|
|
382
|
+
|
|
383
|
+
model.userEditedFieldNames.add('username_user');
|
|
384
|
+
|
|
385
|
+
await FilterFormBlockModel.prototype.applyFormDefaultValues.call(model as any, { force: true });
|
|
386
|
+
expect(values.username_user).toBe('User value');
|
|
387
|
+
expect(model.userEditedFieldNames.has('username_user')).toBe(false);
|
|
388
|
+
|
|
389
|
+
values.nickname_nick = 'allow';
|
|
390
|
+
await FilterFormBlockModel.prototype.applyFormDefaultValues.call(model as any);
|
|
391
|
+
|
|
392
|
+
expect(values.username_user).toBe('allow');
|
|
393
|
+
});
|
|
394
|
+
|
|
318
395
|
it('skips filter form field values when the rule condition does not match', async () => {
|
|
319
396
|
const { model, values } = createFilterFormDefaultValuesModel(
|
|
320
397
|
[
|
|
@@ -166,6 +166,13 @@ export class FormBlockModel<
|
|
|
166
166
|
this.userModifiedTopLevelFields.clear();
|
|
167
167
|
}
|
|
168
168
|
|
|
169
|
+
/**
|
|
170
|
+
* @internal
|
|
171
|
+
*/
|
|
172
|
+
resetRuntimeUserEditedState(): void {
|
|
173
|
+
this.formValueRuntime?.resetUserEditedState?.();
|
|
174
|
+
}
|
|
175
|
+
|
|
169
176
|
public async onDispatchEventStart(eventName: string, options?: any, inputArgs?: Record<string, any>): Promise<void> {
|
|
170
177
|
if (eventName === 'beforeRender') {
|
|
171
178
|
const grid = this.subModels.grid;
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
/**
|
|
11
11
|
* JS Form Action:表单工具栏按钮点击执行 JS。
|
|
12
12
|
*/
|
|
13
|
-
import { tExpr
|
|
13
|
+
import { tExpr } from '@nocobase/flow-engine';
|
|
14
14
|
import { CodeEditor } from '../../../components/code-editor';
|
|
15
15
|
import { FormActionModel } from './FormActionModel';
|
|
16
16
|
import { resolveRunJsParams } from '../../utils/resolveRunJsParams';
|
|
@@ -73,12 +73,7 @@ ctx.message.success('Current form values: ' + JSON.stringify(values));
|
|
|
73
73
|
await ctx.resource.refresh();
|
|
74
74
|
}
|
|
75
75
|
});
|
|
76
|
-
|
|
77
|
-
await ctx.runjs(
|
|
78
|
-
code,
|
|
79
|
-
{ window: createSafeWindow({ navigator }), document: createSafeDocument(), navigator },
|
|
80
|
-
{ version },
|
|
81
|
-
);
|
|
76
|
+
await ctx.runjs(code, undefined, { version });
|
|
82
77
|
},
|
|
83
78
|
},
|
|
84
79
|
},
|
|
@@ -420,6 +420,23 @@ describe('FormBlockModel (form/formValues injection & server resolve anchors)',
|
|
|
420
420
|
expect(savedUids).toContain('grid-1');
|
|
421
421
|
});
|
|
422
422
|
|
|
423
|
+
it('keeps dirty reset separate from runtime user-edited reset', async () => {
|
|
424
|
+
const model = await setupFormModel();
|
|
425
|
+
const resetUserEditedState = vi.fn();
|
|
426
|
+
model.formValueRuntime = { resetUserEditedState } as any;
|
|
427
|
+
|
|
428
|
+
model.markUserModifiedFields({ status: 'draft' });
|
|
429
|
+
expect(model.getUserModifiedFields().has('status')).toBe(true);
|
|
430
|
+
|
|
431
|
+
model.resetUserModifiedFields();
|
|
432
|
+
|
|
433
|
+
expect(model.getUserModifiedFields().size).toBe(0);
|
|
434
|
+
expect(resetUserEditedState).not.toHaveBeenCalled();
|
|
435
|
+
|
|
436
|
+
model.resetRuntimeUserEditedState();
|
|
437
|
+
expect(resetUserEditedState).toHaveBeenCalledTimes(1);
|
|
438
|
+
});
|
|
439
|
+
|
|
423
440
|
it('re-syncs delegated assignRules when grid submodel is added after block init', async () => {
|
|
424
441
|
const model = await setupFormModel();
|
|
425
442
|
const syncAssignRules = vi.fn();
|