@flowgram.ai/node 0.1.0-alpha.6 → 0.1.0-alpha.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/dist/esm/index.js +63 -35
- package/dist/esm/index.js.map +1 -1
- package/dist/index.d.mts +5 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +63 -35
- package/dist/index.js.map +1 -1
- package/package.json +11 -11
package/dist/esm/index.js
CHANGED
|
@@ -76,31 +76,32 @@ function mergeEffectMap(origin, source) {
|
|
|
76
76
|
// src/form-render.tsx
|
|
77
77
|
import React from "react";
|
|
78
78
|
import { Form } from "@flowgram.ai/form";
|
|
79
|
-
var FormRender = ({ formModel }) => formModel
|
|
79
|
+
var FormRender = ({ formModel }) => (formModel == null ? void 0 : formModel.formControl) ? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Form, { control: formModel == null ? void 0 : formModel.formControl, keepModelOnUnMount: true }, formModel.formMeta.render)) : null;
|
|
80
80
|
function renderForm(formModel) {
|
|
81
81
|
return /* @__PURE__ */ React.createElement(FormRender, { formModel });
|
|
82
82
|
}
|
|
83
83
|
|
|
84
84
|
// src/form-model-v2.ts
|
|
85
85
|
var DEFAULT = {
|
|
86
|
-
|
|
87
|
-
|
|
86
|
+
// Different formModel should have different reference
|
|
87
|
+
EFFECT_MAP: () => ({}),
|
|
88
|
+
EFFECT_RETURN_MAP: () => /* @__PURE__ */ new Map([
|
|
88
89
|
["onValueInitOrChange" /* onValueInitOrChange */, {}],
|
|
89
90
|
["onValueChange" /* onValueChange */, {}],
|
|
90
91
|
["onValueInit" /* onValueInit */, {}],
|
|
91
92
|
["onArrayAppend" /* onArrayAppend */, {}],
|
|
92
93
|
["onArrayDelete" /* onArrayDelete */, {}]
|
|
93
94
|
]),
|
|
94
|
-
FORM_FEEDBACKS: [],
|
|
95
|
+
FORM_FEEDBACKS: () => [],
|
|
95
96
|
VALID: null
|
|
96
97
|
};
|
|
97
98
|
var FormModelV2 = class extends FormModel {
|
|
98
99
|
constructor(node) {
|
|
99
100
|
super();
|
|
100
|
-
this.effectMap = DEFAULT.EFFECT_MAP;
|
|
101
|
-
this.effectReturnMap = DEFAULT.EFFECT_RETURN_MAP;
|
|
101
|
+
this.effectMap = DEFAULT.EFFECT_MAP();
|
|
102
|
+
this.effectReturnMap = DEFAULT.EFFECT_RETURN_MAP();
|
|
102
103
|
this.plugins = [];
|
|
103
|
-
this.formFeedbacks = DEFAULT.FORM_FEEDBACKS;
|
|
104
|
+
this.formFeedbacks = DEFAULT.FORM_FEEDBACKS();
|
|
104
105
|
this.onInitializedEmitter = new Emitter();
|
|
105
106
|
this.onValidateEmitter = new Emitter();
|
|
106
107
|
this.onValidate = this.onValidateEmitter.event;
|
|
@@ -146,11 +147,18 @@ var FormModelV2 = class extends FormModel {
|
|
|
146
147
|
return this.node.getNodeRegistry().formMeta;
|
|
147
148
|
}
|
|
148
149
|
get values() {
|
|
149
|
-
|
|
150
|
+
var _a;
|
|
151
|
+
return (_a = this.nativeFormModel) == null ? void 0 : _a.values;
|
|
150
152
|
}
|
|
151
153
|
get feedbacks() {
|
|
152
154
|
return this._feedbacks;
|
|
153
155
|
}
|
|
156
|
+
updateFormValues(value) {
|
|
157
|
+
if (this.nativeFormModel) {
|
|
158
|
+
const finalValue = this.formMeta.formatOnInit ? this.formMeta.formatOnInit(value, this.nodeContext) : value;
|
|
159
|
+
this.nativeFormModel.values = finalValue;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
154
162
|
set feedbacks(feedbacks) {
|
|
155
163
|
this._feedbacks = feedbacks;
|
|
156
164
|
this.onFeedbacksChangeEmitter.fire(feedbacks);
|
|
@@ -168,7 +176,8 @@ var FormModelV2 = class extends FormModel {
|
|
|
168
176
|
};
|
|
169
177
|
}
|
|
170
178
|
get nativeFormModel() {
|
|
171
|
-
|
|
179
|
+
var _a;
|
|
180
|
+
return (_a = this._formControl) == null ? void 0 : _a._formModel;
|
|
172
181
|
}
|
|
173
182
|
render() {
|
|
174
183
|
return renderForm(this);
|
|
@@ -179,8 +188,9 @@ var FormModelV2 = class extends FormModel {
|
|
|
179
188
|
}
|
|
180
189
|
this.plugins = plugins;
|
|
181
190
|
plugins.forEach((plugin) => {
|
|
191
|
+
var _a;
|
|
182
192
|
plugin.init(this);
|
|
183
|
-
if (plugin.config
|
|
193
|
+
if ((_a = plugin.config) == null ? void 0 : _a.effect) {
|
|
184
194
|
mergeEffectMap(this.effectMap, plugin.config.effect);
|
|
185
195
|
}
|
|
186
196
|
});
|
|
@@ -220,9 +230,10 @@ var FormModelV2 = class extends FormModel {
|
|
|
220
230
|
effectKeys.forEach((effectKey) => {
|
|
221
231
|
const effectOptionsArr = this.effectMap[effectKey];
|
|
222
232
|
effectOptionsArr.forEach(({ effect: effect2, event }) => {
|
|
233
|
+
var _a;
|
|
223
234
|
if (event === "onValueChange" /* onValueChange */ || event === "onValueInitOrChange" /* onValueInitOrChange */) {
|
|
224
235
|
const currentName = Glob.getParentPathByPattern(effectKey, name);
|
|
225
|
-
const prevEffectReturn = this.effectReturnMap.get(event)
|
|
236
|
+
const prevEffectReturn = (_a = this.effectReturnMap.get(event)) == null ? void 0 : _a[currentName];
|
|
226
237
|
if (prevEffectReturn) {
|
|
227
238
|
prevEffectReturn();
|
|
228
239
|
}
|
|
@@ -249,8 +260,9 @@ var FormModelV2 = class extends FormModel {
|
|
|
249
260
|
effectOptionsArr.forEach(({ event, effect: effect2 }) => {
|
|
250
261
|
if (event === "onValueInit" /* onValueInit */ || event === "onValueInitOrChange" /* onValueInitOrChange */) {
|
|
251
262
|
paths.forEach((path) => {
|
|
263
|
+
var _a;
|
|
252
264
|
if (Glob.isMatchOrParent(name, path) || name === path) {
|
|
253
|
-
const prevEffectReturn = this.effectReturnMap.get(event)
|
|
265
|
+
const prevEffectReturn = (_a = this.effectReturnMap.get(event)) == null ? void 0 : _a[path];
|
|
254
266
|
if (prevEffectReturn) {
|
|
255
267
|
prevEffectReturn();
|
|
256
268
|
}
|
|
@@ -274,7 +286,7 @@ var FormModelV2 = class extends FormModel {
|
|
|
274
286
|
});
|
|
275
287
|
nativeFormModel.onFieldModelCreate((field) => {
|
|
276
288
|
const effectOptionsArr = findMatchedInMap(field, this.effectMap);
|
|
277
|
-
if (effectOptionsArr
|
|
289
|
+
if (effectOptionsArr == null ? void 0 : effectOptionsArr.length) {
|
|
278
290
|
const eventMap = groupBy(effectOptionsArr, "event");
|
|
279
291
|
mapKeys(eventMap, (optionsArr, event) => {
|
|
280
292
|
const combinedEffect = (props) => {
|
|
@@ -312,10 +324,11 @@ var FormModelV2 = class extends FormModel {
|
|
|
312
324
|
});
|
|
313
325
|
}
|
|
314
326
|
toJSON() {
|
|
327
|
+
var _a, _b;
|
|
315
328
|
if (this.formMeta.formatOnSubmit) {
|
|
316
|
-
return this.formMeta.formatOnSubmit(this.nativeFormModel
|
|
329
|
+
return this.formMeta.formatOnSubmit((_a = this.nativeFormModel) == null ? void 0 : _a.values, this.nodeContext);
|
|
317
330
|
}
|
|
318
|
-
return this.nativeFormModel
|
|
331
|
+
return (_b = this.nativeFormModel) == null ? void 0 : _b.values;
|
|
319
332
|
}
|
|
320
333
|
clearValid() {
|
|
321
334
|
if (this.valid !== null) {
|
|
@@ -323,25 +336,30 @@ var FormModelV2 = class extends FormModel {
|
|
|
323
336
|
}
|
|
324
337
|
}
|
|
325
338
|
async validate() {
|
|
326
|
-
|
|
327
|
-
this.
|
|
339
|
+
var _a, _b;
|
|
340
|
+
this.formFeedbacks = await ((_a = this.nativeFormModel) == null ? void 0 : _a.validate());
|
|
341
|
+
this.valid = isEmpty((_b = this.formFeedbacks) == null ? void 0 : _b.filter((f) => f.level === "error"));
|
|
328
342
|
this.onValidateEmitter.fire(this);
|
|
329
343
|
return this.valid;
|
|
330
344
|
}
|
|
331
345
|
getValues() {
|
|
332
|
-
|
|
346
|
+
var _a;
|
|
347
|
+
return (_a = this._formControl) == null ? void 0 : _a._formModel.values;
|
|
333
348
|
}
|
|
334
349
|
getField(name) {
|
|
350
|
+
var _a;
|
|
335
351
|
let finalName = name.includes("/") ? convertGlobPath(name) : name;
|
|
336
|
-
return this.formControl
|
|
352
|
+
return (_a = this.formControl) == null ? void 0 : _a.getField(finalName);
|
|
337
353
|
}
|
|
338
354
|
getValueIn(name) {
|
|
355
|
+
var _a;
|
|
339
356
|
let finalName = name.includes("/") ? convertGlobPath(name) : name;
|
|
340
|
-
return this.nativeFormModel
|
|
357
|
+
return (_a = this.nativeFormModel) == null ? void 0 : _a.getValueIn(finalName);
|
|
341
358
|
}
|
|
342
359
|
setValueIn(name, value) {
|
|
360
|
+
var _a;
|
|
343
361
|
let finalName = name.includes("/") ? convertGlobPath(name) : name;
|
|
344
|
-
this.nativeFormModel
|
|
362
|
+
(_a = this.nativeFormModel) == null ? void 0 : _a.setValueIn(finalName, value);
|
|
345
363
|
}
|
|
346
364
|
/**
|
|
347
365
|
* 监听表单某个路径下的值变化
|
|
@@ -372,11 +390,12 @@ var FormModelV2 = class extends FormModel {
|
|
|
372
390
|
* @param path glob path
|
|
373
391
|
*/
|
|
374
392
|
getFormItemValueByPath(globPath) {
|
|
393
|
+
var _a;
|
|
375
394
|
if (!globPath) {
|
|
376
395
|
return;
|
|
377
396
|
}
|
|
378
397
|
if (globPath === "/") {
|
|
379
|
-
return this._formControl
|
|
398
|
+
return (_a = this._formControl) == null ? void 0 : _a._formModel.values;
|
|
380
399
|
}
|
|
381
400
|
const name = convertGlobPath(globPath);
|
|
382
401
|
return this.getValueIn(name);
|
|
@@ -422,13 +441,13 @@ var FormModelV2 = class extends FormModel {
|
|
|
422
441
|
effectReturn();
|
|
423
442
|
});
|
|
424
443
|
});
|
|
425
|
-
this.effectMap = DEFAULT.EFFECT_MAP;
|
|
426
|
-
this.effectReturnMap = DEFAULT.EFFECT_RETURN_MAP;
|
|
444
|
+
this.effectMap = DEFAULT.EFFECT_MAP();
|
|
445
|
+
this.effectReturnMap = DEFAULT.EFFECT_RETURN_MAP();
|
|
427
446
|
this.plugins.forEach((p) => {
|
|
428
447
|
p.dispose();
|
|
429
448
|
});
|
|
430
449
|
this.plugins = [];
|
|
431
|
-
this.formFeedbacks = DEFAULT.FORM_FEEDBACKS;
|
|
450
|
+
this.formFeedbacks = DEFAULT.FORM_FEEDBACKS();
|
|
432
451
|
this._valid = DEFAULT.VALID;
|
|
433
452
|
this._formControl = void 0;
|
|
434
453
|
this._initialized = false;
|
|
@@ -439,7 +458,8 @@ var FormModelV2 = class extends FormModel {
|
|
|
439
458
|
// src/helpers.ts
|
|
440
459
|
import { FlowNodeFormData as FlowNodeFormData2 } from "@flowgram.ai/form-core";
|
|
441
460
|
function isFormV2(node) {
|
|
442
|
-
|
|
461
|
+
var _a;
|
|
462
|
+
return !!((_a = node.getNodeRegistry().formMeta) == null ? void 0 : _a.render);
|
|
443
463
|
}
|
|
444
464
|
function createEffectOptions(event, effect) {
|
|
445
465
|
return {
|
|
@@ -457,10 +477,11 @@ function useWatchFormValues(node) {
|
|
|
457
477
|
const formModel = node.getData(FlowNodeFormData3).getFormModel();
|
|
458
478
|
const refresh = useRefresh();
|
|
459
479
|
useEffect(() => {
|
|
460
|
-
|
|
480
|
+
var _a;
|
|
481
|
+
const disposable = (_a = formModel.nativeFormModel) == null ? void 0 : _a.onFormValuesChange(() => {
|
|
461
482
|
refresh();
|
|
462
483
|
});
|
|
463
|
-
return () => disposable
|
|
484
|
+
return () => disposable == null ? void 0 : disposable.dispose();
|
|
464
485
|
}, [formModel.nativeFormModel]);
|
|
465
486
|
return formModel.getValues();
|
|
466
487
|
}
|
|
@@ -468,12 +489,13 @@ function useWatchFormValueIn(node, name) {
|
|
|
468
489
|
const formModel = node.getData(FlowNodeFormData3).getFormModel();
|
|
469
490
|
const refresh = useRefresh();
|
|
470
491
|
useEffect(() => {
|
|
471
|
-
|
|
492
|
+
var _a;
|
|
493
|
+
const disposable = (_a = formModel.nativeFormModel) == null ? void 0 : _a.onFormValuesChange(({ name: changedName }) => {
|
|
472
494
|
if (name === changedName) {
|
|
473
495
|
refresh();
|
|
474
496
|
}
|
|
475
497
|
});
|
|
476
|
-
return () => disposable
|
|
498
|
+
return () => disposable == null ? void 0 : disposable.dispose();
|
|
477
499
|
}, []);
|
|
478
500
|
return formModel.getValueIn(name);
|
|
479
501
|
}
|
|
@@ -521,12 +543,14 @@ var FormPlugin = class {
|
|
|
521
543
|
};
|
|
522
544
|
}
|
|
523
545
|
init(formModel) {
|
|
546
|
+
var _a, _b;
|
|
524
547
|
this._formModel = formModel;
|
|
525
|
-
this.config
|
|
548
|
+
(_b = (_a = this.config) == null ? void 0 : _a.onInit) == null ? void 0 : _b.call(_a, this.ctx, this.opts);
|
|
526
549
|
}
|
|
527
550
|
dispose() {
|
|
528
|
-
|
|
529
|
-
|
|
551
|
+
var _a, _b;
|
|
552
|
+
if ((_a = this.config) == null ? void 0 : _a.onDispose) {
|
|
553
|
+
(_b = this.config) == null ? void 0 : _b.onDispose(this.ctx, this.opts);
|
|
530
554
|
}
|
|
531
555
|
}
|
|
532
556
|
};
|
|
@@ -540,8 +564,9 @@ function defineFormPluginCreator(name, config) {
|
|
|
540
564
|
import React2 from "react";
|
|
541
565
|
import { FlowNodeFormData as FlowNodeFormData4, NodeRender } from "@flowgram.ai/form-core";
|
|
542
566
|
function getNodeForm(node) {
|
|
543
|
-
|
|
544
|
-
const
|
|
567
|
+
var _a;
|
|
568
|
+
const formModel = (_a = node.getData(FlowNodeFormData4)) == null ? void 0 : _a.getFormModel();
|
|
569
|
+
const nativeFormModel = formModel == null ? void 0 : formModel.nativeFormModel;
|
|
545
570
|
if (!formModel || !nativeFormModel) return void 0;
|
|
546
571
|
const result = {
|
|
547
572
|
initialValues: nativeFormModel.initialValues,
|
|
@@ -551,6 +576,9 @@ function getNodeForm(node) {
|
|
|
551
576
|
state: nativeFormModel.state,
|
|
552
577
|
getValueIn: (name) => nativeFormModel.getValueIn(name),
|
|
553
578
|
setValueIn: (name, value) => nativeFormModel.setValueIn(name, value),
|
|
579
|
+
updateFormValues: (values) => {
|
|
580
|
+
formModel.updateFormValues(values);
|
|
581
|
+
},
|
|
554
582
|
render: () => /* @__PURE__ */ React2.createElement(NodeRender, { node }),
|
|
555
583
|
onFormValuesChange: formModel.onFormValuesChange.bind(formModel),
|
|
556
584
|
onFormValueChangeIn: formModel.onFormValueChangeIn.bind(formModel),
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/types.ts","../../src/form-model-v2.ts","../../src/utils.ts","../../src/form-render.tsx","../../src/helpers.ts","../../src/hooks.ts","../../src/form-plugin.ts","../../src/get-node-form.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { FormModel, IFormMeta, NodeFormContext } from '@flowgram.ai/form-core';\nimport { FieldName, FieldValue } from '@flowgram.ai/form/src/types';\nimport {\n FormRenderProps,\n IForm,\n Validate as FormValidate,\n ValidateTrigger,\n} from '@flowgram.ai/form';\n\nimport { FormPlugin } from './form-plugin';\nimport { FormModelV2 } from './form-model-v2';\n\nexport interface Node {}\n\nexport interface Flow {}\n\n/**\n * NodeContext contains\n * - node: the Editor's node entity.\n * - playgroundContext: the Editor's playgroundContext injected when initiate the Editor.\n */\ntype NodeContext = NodeFormContext;\n\nexport type Validate<TFieldValue = any, TFormValues = any> = (props: {\n value: TFieldValue;\n formValues: TFormValues;\n context: NodeContext;\n name: FieldName;\n}) => ReturnType<FormValidate<TFieldValue, TFormValues>>;\n\nexport enum DataEvent {\n /* When value change */\n onValueChange = 'onValueChange',\n /**\n * When value Init,it triggers when\n * - defaultValue is configured in formMeta, it will trigger when form is initializing.\n * - defaultValue is configured in Field, it will trigger when this Field is initializing if no initial value is set to this field.\n */\n onValueInit = 'onValueInit',\n /**\n * When Value Init or change\n */\n onValueInitOrChange = 'onValueInitOrChange',\n /* It will trigger when ArrayField.append is called. It relies on ArrayField's rendering. If ArrayField is possibly not rendered in your case, please avoid using this event */\n onArrayAppend = 'onArrayAppend',\n /* It will trigger when ArrayField.delete is called. It relies on ArrayField's rendering. If ArrayField is possibly not rendered in your case, please avoid using this event */\n onArrayDelete = 'onArrayDelete',\n}\n\nexport type EffectReturn = () => void;\n\nexport interface EffectFuncProps<TFieldValue = any, TFormValues = any> {\n name: FieldName;\n value: TFieldValue;\n prevValue?: TFieldValue;\n formValues: TFormValues;\n form: IForm;\n context: NodeContext;\n}\n\nexport type Effect<TFieldValue = any, TFormValues = any> = (\n props: EffectFuncProps<TFieldValue, TFormValues>\n) => void | EffectReturn;\n\nexport type ArrayAppendEffect<TFieldValue = any, TFormValues = any> = (props: {\n index: number;\n value: TFieldValue;\n arrayValues: Array<TFieldValue>;\n formValues: TFormValues;\n form: IForm;\n context: NodeContext;\n}) => void | EffectReturn;\n\nexport type ArrayDeleteEffect<TFieldValue = any, TFormValues = any> = (props: {\n index: number;\n arrayValue: Array<TFieldValue>;\n formValues: TFormValues;\n form: IForm;\n context: NodeContext;\n}) => void | EffectReturn;\n\nexport type EffectOptions =\n | { effect: Effect; event: DataEvent }\n | { effect: ArrayAppendEffect; event: DataEvent }\n | { effect: ArrayDeleteEffect; event: DataEvent };\n\nexport interface FormMeta<TValues = any> {\n /**\n * The render method of the node form content. <Form /> is already integrated, so you don't need to wrap your components with <Form />\n * @param props\n */\n render: (props: FormRenderProps<any>) => React.ReactElement;\n /**\n * When to trigger the validation.\n */\n validateTrigger?: ValidateTrigger;\n /**\n * Form data's validation rules. It's a key value map, where the key is a pattern of data's path (or field name), the value is a validate function.\n */\n validate?: Record<FieldName, Validate>;\n /**\n * Form data's effects. It's a key value map, where the key is a pattern of data's path (or field name), the value is an array of effect configuration.\n */\n effect?: Record<FieldName, EffectOptions[]>;\n /**\n * Form data's complete default value. it will not be sent to formatOnInit, but used directly as form's value when needed.\n */\n defaultValues?: TValues | ((context: NodeContext) => TValues);\n /**\n * This function is to format the value when initiate the form, the returned value will be used as the initial value of the form.\n * @param value value input to node as initialValue.\n * @param context\n */\n formatOnInit?: (value: any, context: NodeContext) => any;\n /**\n * This function is to format the value when FormModel.toJSON is called, the returned value will be used as the final value to be saved .\n * @param value value sent by form before format.\n * @param context\n */\n formatOnSubmit?: (value: any, context: NodeContext) => any;\n /**\n * Form's plugins\n */\n plugins?: FormPlugin[];\n}\n\nexport function isFormModelV2(fm: FormModel | FormModelV2): fm is FormModelV2 {\n return 'onFormValuesChange' in fm;\n}\n\nexport function isFormMetaV2(formMeta: IFormMeta | FormMeta) {\n return 'render' in formMeta;\n}\n\nexport type FormPluginCtx = {\n formModel: FormModelV2;\n} & NodeContext;\n\nexport interface onFormValueChangeInPayload<TValue = FieldValue, TFormValues = FieldValue> {\n value: TValue;\n prevValue: TValue;\n formValues: TFormValues;\n prevFormValues: TFormValues;\n}\n","import { get, groupBy, isEmpty, mapKeys } from 'lodash';\nimport { Disposable, DisposableCollection, Emitter } from '@flowgram.ai/utils';\nimport {\n FlowNodeFormData,\n FormFeedback,\n FormItem,\n FormManager,\n FormModel,\n FormModelValid,\n IFormItem,\n OnFormValuesChangePayload,\n} from '@flowgram.ai/form-core';\nimport {\n createForm,\n FieldArrayModel,\n FieldName,\n FieldValue,\n type FormControl,\n FormModel as NativeFormModel,\n FormValidateReturn,\n Glob,\n IField,\n IFieldArray,\n toForm,\n} from '@flowgram.ai/form';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\nimport { PlaygroundContext } from '@flowgram.ai/core';\n\nimport {\n convertGlobPath,\n findMatchedInMap,\n formFeedbacksToNodeCoreFormFeedbacks,\n mergeEffectMap,\n} from './utils';\nimport {\n DataEvent,\n Effect,\n EffectOptions,\n EffectReturn,\n FormMeta,\n onFormValueChangeInPayload,\n} from './types';\nimport { renderForm } from './form-render';\nimport { FormPlugin } from './form-plugin';\n\nconst DEFAULT = {\n EFFECT_MAP: {},\n EFFECT_RETURN_MAP: new Map([\n [DataEvent.onValueInitOrChange, {}],\n [DataEvent.onValueChange, {}],\n [DataEvent.onValueInit, {}],\n [DataEvent.onArrayAppend, {}],\n [DataEvent.onArrayDelete, {}],\n ]),\n FORM_FEEDBACKS: [],\n VALID: null,\n};\n\nexport class FormModelV2 extends FormModel implements Disposable {\n protected effectMap: Record<string, EffectOptions[]> = DEFAULT.EFFECT_MAP;\n\n protected effectReturnMap: Map<DataEvent, Record<string, EffectReturn>> =\n DEFAULT.EFFECT_RETURN_MAP;\n\n protected plugins: FormPlugin[] = [];\n\n protected node: FlowNodeEntity;\n\n protected formFeedbacks: FormValidateReturn | undefined = DEFAULT.FORM_FEEDBACKS;\n\n protected onInitializedEmitter = new Emitter<FormModel>();\n\n protected onValidateEmitter = new Emitter<FormModel>();\n\n readonly onValidate = this.onValidateEmitter.event;\n\n readonly onInitialized = this.onInitializedEmitter.event;\n\n protected onDisposeEmitter = new Emitter<void>();\n\n readonly onDispose = this.onDisposeEmitter.event;\n\n protected toDispose = new DisposableCollection();\n\n protected onFormValuesChangeEmitter = new Emitter<OnFormValuesChangePayload>();\n\n readonly onFormValuesChange = this.onFormValuesChangeEmitter.event;\n\n protected onValidChangeEmitter = new Emitter<FormModelValid>();\n\n readonly onValidChange = this.onValidChangeEmitter.event;\n\n protected onFeedbacksChangeEmitter = new Emitter<FormFeedback[]>();\n\n readonly onFeedbacksChange = this.onFeedbacksChangeEmitter.event;\n\n constructor(node: FlowNodeEntity) {\n super();\n this.node = node;\n this.toDispose.pushAll([\n this.onInitializedEmitter,\n this.onValidateEmitter,\n this.onValidChangeEmitter,\n this.onFeedbacksChangeEmitter,\n this.onFormValuesChangeEmitter,\n ]);\n }\n\n protected _valid: FormModelValid = DEFAULT.VALID;\n\n get valid(): FormModelValid {\n return this._valid;\n }\n\n private set valid(valid: FormModelValid) {\n this._valid = valid;\n this.onValidChangeEmitter.fire(valid);\n }\n\n get flowNodeEntity() {\n return this.node;\n }\n\n get formManager() {\n return this.node.getService(FormManager);\n }\n\n protected _formControl?: FormControl<any>;\n\n get formControl() {\n return this._formControl;\n }\n\n get formMeta() {\n return this.node.getNodeRegistry().formMeta;\n }\n\n get values() {\n return this.nativeFormModel?.values;\n }\n\n protected _feedbacks: FormFeedback[] = [];\n\n get feedbacks(): FormFeedback[] {\n return this._feedbacks;\n }\n\n private set feedbacks(feedbacks: FormFeedback[]) {\n this._feedbacks = feedbacks;\n this.onFeedbacksChangeEmitter.fire(feedbacks);\n }\n\n get formItemPathMap(): Map<string, IFormItem> {\n return new Map<string, IFormItem>();\n }\n\n protected _initialized: boolean = false;\n\n get initialized(): boolean {\n return this._initialized;\n }\n\n get nodeContext() {\n return {\n node: this.node,\n playgroundContext: this.node.getService(PlaygroundContext),\n };\n }\n\n get nativeFormModel(): NativeFormModel | undefined {\n return this._formControl?._formModel;\n }\n\n render() {\n return renderForm(this);\n }\n\n initPlugins(plugins: FormPlugin[]) {\n if (!plugins.length) {\n return;\n }\n\n this.plugins = plugins;\n plugins.forEach((plugin) => {\n plugin.init(this);\n if (plugin.config?.effect) {\n mergeEffectMap(this.effectMap, plugin.config.effect);\n }\n });\n }\n\n init(formMeta: FormMeta, rawInitialValues?: any) {\n /* 透传 onFormValuesChange 事件给 FlowNodeFormData */\n const formData = this.node.getData<FlowNodeFormData>(FlowNodeFormData);\n this.onFormValuesChange(() => {\n this._valid = null;\n formData.fireChange();\n });\n\n const { validateTrigger, validate, effect } = formMeta;\n if (effect) {\n this.effectMap = effect;\n }\n\n // 计算初始值: defaultValues 是默认表单值,不需要被format, 而rawInitialValues 是用户创建form 时传入的初始值,可能不同于表单数据格式,需要被format\n const defaultValues =\n typeof formMeta.defaultValues === 'function'\n ? formMeta.defaultValues(this.nodeContext)\n : formMeta.defaultValues;\n\n const initialValues = formMeta.formatOnInit\n ? formMeta.formatOnInit(rawInitialValues, this.nodeContext)\n : rawInitialValues;\n\n // 初始化底层表单\n const { control } = createForm({\n initialValues: initialValues || defaultValues,\n validateTrigger,\n context: this.nodeContext,\n validate: validate,\n disableAutoInit: true,\n });\n\n this._formControl = control;\n const nativeFormModel = control._formModel;\n this.toDispose.push(nativeFormModel);\n\n // forward onFormValuesChange event\n nativeFormModel.onFormValuesChange((props) => {\n this.onFormValuesChangeEmitter.fire(props);\n });\n\n if (formMeta.plugins) {\n this.initPlugins(formMeta.plugins);\n }\n\n // Form 数据变更时触发对应的effect\n nativeFormModel.onFormValuesChange(({ values, prevValues, name }) => {\n // 找到所有路径匹配的副作用,包括父亲路径\n const effectKeys = Object.keys(this.effectMap).filter((pattern) =>\n Glob.isMatchOrParent(pattern, name)\n );\n\n effectKeys.forEach((effectKey) => {\n const effectOptionsArr = this.effectMap[effectKey];\n // 执行该事件配置下所有 onValueChange 事件的 effect\n effectOptionsArr.forEach(({ effect, event }: EffectOptions) => {\n if (event === DataEvent.onValueChange || event === DataEvent.onValueInitOrChange) {\n // 对于冒泡的事件,需要获取 parent 的 name\n const currentName = Glob.getParentPathByPattern(effectKey, name);\n\n // 执行上一次effect 的 return\n const prevEffectReturn = this.effectReturnMap.get(event)?.[currentName];\n if (prevEffectReturn) {\n prevEffectReturn();\n }\n\n // 执行effect\n const effectReturn = (effect as Effect)({\n name: currentName,\n value: get(values, currentName),\n prevValue: get(prevValues, currentName),\n formValues: values,\n form: toForm(this.nativeFormModel!),\n context: this.nodeContext,\n });\n\n // 更新 effect return\n if (\n effectReturn &&\n typeof effectReturn === 'function' &&\n this.effectReturnMap.has(event)\n ) {\n const eventMap = this.effectReturnMap.get(event) as Record<string, EffectReturn>;\n eventMap[currentName] = effectReturn;\n }\n }\n });\n });\n });\n\n // Form 数据初始化时触发对应的effect\n nativeFormModel.onFormValuesInit(({ values, name, prevValues }) => {\n Object.keys(this.effectMap).forEach((pattern) => {\n // 找到匹配 pattern 的数据路径\n const paths = Glob.findMatchPaths(values, pattern);\n\n // 获取配置在该 pattern上的所有effect配置\n const effectOptionsArr = this.effectMap[pattern];\n\n effectOptionsArr.forEach(({ event, effect }: EffectOptions) => {\n if (event === DataEvent.onValueInit || event === DataEvent.onValueInitOrChange) {\n paths.forEach((path) => {\n // 对触发 init 事件的 name 或他的字 path 触发effect\n if (Glob.isMatchOrParent(name, path) || name === path) {\n // 执行上一次effect 的 return\n const prevEffectReturn = this.effectReturnMap.get(event)?.[path];\n if (prevEffectReturn) {\n prevEffectReturn();\n }\n\n const effectReturn = (effect as Effect)({\n name: path,\n value: get(values, path),\n formValues: values,\n prevValue: get(prevValues, path),\n form: toForm(this.nativeFormModel!),\n context: this.nodeContext,\n });\n\n // 更新 effect return\n if (\n effectReturn &&\n typeof effectReturn === 'function' &&\n this.effectReturnMap.has(event)\n ) {\n const eventMap = this.effectReturnMap.get(event) as Record<string, EffectReturn>;\n eventMap[path] = effectReturn;\n }\n }\n });\n }\n });\n });\n });\n\n // 为 Field 添加 effect, 主要针对array\n nativeFormModel.onFieldModelCreate((field) => {\n // register effect\n const effectOptionsArr = findMatchedInMap<EffectOptions[]>(field, this.effectMap);\n if (effectOptionsArr?.length) {\n // 按事件聚合\n const eventMap = groupBy(effectOptionsArr, 'event');\n\n mapKeys(eventMap, (optionsArr, event) => {\n const combinedEffect = (props: any) => {\n // 该事件下执行所有effect\n optionsArr.forEach(({ effect }) =>\n effect({\n ...props,\n formValues: nativeFormModel.values,\n form: toForm(this.nativeFormModel!),\n context: this.nodeContext,\n })\n );\n };\n\n switch (event) {\n case DataEvent.onArrayAppend:\n if (field instanceof FieldArrayModel) {\n (field as FieldArrayModel).onAppend(combinedEffect);\n }\n break;\n case DataEvent.onArrayDelete:\n if (field instanceof FieldArrayModel) {\n (field as FieldArrayModel).onDelete(combinedEffect);\n }\n break;\n }\n });\n }\n });\n\n // 手动初始化form\n this._formControl.init();\n\n this._initialized = true;\n\n this.onInitializedEmitter.fire(this);\n\n this.onDispose(() => {\n this._initialized = false;\n this.effectMap = {};\n nativeFormModel.dispose();\n });\n }\n\n toJSON() {\n if (this.formMeta.formatOnSubmit) {\n return this.formMeta.formatOnSubmit(this.nativeFormModel?.values, this.nodeContext);\n }\n return this.nativeFormModel?.values;\n }\n\n clearValid() {\n if (this.valid !== null) {\n this.valid = null;\n }\n }\n\n async validate() {\n this.formFeedbacks = await this.nativeFormModel?.validate();\n this.valid = isEmpty(this.formFeedbacks?.filter((f) => f.level === 'error'));\n this.onValidateEmitter.fire(this);\n return this.valid;\n }\n\n getValues<T = any>(): T | undefined {\n return this._formControl?._formModel.values;\n }\n\n getField<\n TValue = FieldValue,\n TField extends IFieldArray<TValue> | IField<TValue> = IField<TValue>\n >(name: FieldName): TField | undefined {\n let finalName = name.includes('/') ? convertGlobPath(name) : name;\n\n return this.formControl?.getField<TValue, TField>(finalName) as TField;\n }\n\n getValueIn<TValue>(name: FieldName): TValue | undefined {\n let finalName = name.includes('/') ? convertGlobPath(name) : name;\n\n return this.nativeFormModel?.getValueIn(finalName);\n }\n\n setValueIn(name: FieldName, value: any) {\n let finalName = name.includes('/') ? convertGlobPath(name) : name;\n\n this.nativeFormModel?.setValueIn(finalName, value);\n }\n\n /**\n * 监听表单某个路径下的值变化\n * @param name 路径\n * @param callback 回调函数\n */\n onFormValueChangeIn<TValue = FieldValue, TFormValue = FieldValue>(\n name: FieldName,\n callback: (payload: onFormValueChangeInPayload<TValue, TFormValue>) => void\n ): Disposable {\n if (!this._initialized) {\n throw new Error(\n `[NodeEngine] FormModel Error: onFormValueChangeIn can not be called before initialized`\n );\n }\n\n return this.formControl!._formModel.onFormValuesChange(\n ({ name: changedName, values, prevValues }) => {\n if (changedName === name) {\n callback({\n value: get(values, name),\n prevValue: get(prevValues, name),\n formValues: values,\n prevFormValues: prevValues,\n });\n }\n }\n );\n }\n\n /**\n * @deprecated 该方法用于兼容 V1 版本 FormModel接口,如果确定是FormModelV2 请使用 FormModel.getValueIn\n * @param path glob path\n */\n getFormItemValueByPath(globPath: string) {\n if (!globPath) {\n return;\n }\n if (globPath === '/') {\n return this._formControl?._formModel.values;\n }\n const name = convertGlobPath(globPath);\n return this.getValueIn(name!);\n }\n\n async validateWithFeedbacks(): Promise<FormFeedback[]> {\n await this.validate();\n return formFeedbacksToNodeCoreFormFeedbacks(this.formFeedbacks!);\n }\n\n /**\n * @deprecated 该方法用于兼容 V1 版本 FormModel接口,如果确定是FormModelV2, 请使用FormModel.getValueIn 和 FormModel.setValueIn\n * @param path glob path\n */\n getFormItemByPath(path: string): FormItem | undefined {\n if (!this.nativeFormModel) {\n return;\n }\n\n const that = this;\n\n if (path === '/') {\n return {\n get value() {\n return that.nativeFormModel!.values;\n },\n set value(v) {\n that.nativeFormModel!.values = v;\n },\n } as FormItem;\n }\n\n const name = convertGlobPath(path);\n const formItemValue = that.getValueIn(name!);\n return {\n get value() {\n return formItemValue;\n },\n set value(v) {\n that.setValueIn(name, v);\n },\n } as FormItem;\n }\n\n dispose(): void {\n this.onDisposeEmitter.fire();\n\n // 执行所有effect return\n this.effectReturnMap.forEach((eventMap) => {\n Object.values(eventMap).forEach((effectReturn) => {\n effectReturn();\n });\n });\n\n this.effectMap = DEFAULT.EFFECT_MAP;\n this.effectReturnMap = DEFAULT.EFFECT_RETURN_MAP;\n\n this.plugins.forEach((p) => {\n p.dispose();\n });\n\n this.plugins = [];\n\n this.formFeedbacks = DEFAULT.FORM_FEEDBACKS;\n this._valid = DEFAULT.VALID;\n\n this._formControl = undefined;\n this._initialized = false;\n this.toDispose.dispose();\n }\n}\n","import { find, mergeWith } from 'lodash';\nimport { FormFeedback, FormPathService } from '@flowgram.ai/form-core';\nimport { FormValidateReturn } from '@flowgram.ai/form/src/types';\nimport { type FieldModel, FieldName } from '@flowgram.ai/form';\n\nimport { EffectOptions } from './types';\n\nexport function findMatchedInMap<T = any>(\n field: FieldModel<any>,\n validateMap: Record<FieldName, T> | undefined\n): T | undefined {\n if (!validateMap) {\n return;\n }\n if (validateMap[field.name]) {\n return validateMap[field.name];\n }\n\n const found = find(Object.keys(validateMap), (key) => {\n if (key.startsWith('regex:')) {\n const regex = RegExp(key.split(':')[1]);\n return regex.test(field.name);\n }\n return false;\n });\n\n if (found) {\n return validateMap[found];\n }\n}\n\nexport function formFeedbacksToNodeCoreFormFeedbacks(\n formFeedbacks: FormValidateReturn\n): FormFeedback[] {\n return formFeedbacks.map(\n (f) =>\n ({\n feedbackStatus: f.level,\n feedbackText: f.message,\n path: f.name,\n } as FormFeedback)\n );\n}\n\nexport function convertGlobPath(path: string) {\n if (path.startsWith('/')) {\n const parts = FormPathService.normalize(path).slice(1).split('/');\n return parts.join('.');\n }\n return path;\n}\n\nexport function mergeEffectMap(\n origin: Record<string, EffectOptions[]>,\n source: Record<string, EffectOptions[]>\n) {\n return mergeWith(origin, source, function (objValue: EffectOptions[], srcValue: EffectOptions[]) {\n return (objValue || []).concat(srcValue);\n });\n}\n","import React from 'react';\n\nimport { Form } from '@flowgram.ai/form';\n\nimport { FormModelV2 } from './form-model-v2';\n\ninterface FormRenderProps {\n formModel: FormModelV2;\n}\n\nconst FormRender = ({ formModel }: FormRenderProps) =>\n formModel?.formControl ? (\n <>\n <Form control={formModel?.formControl} keepModelOnUnMount>\n {formModel.formMeta.render}\n </Form>\n </>\n ) : null;\n\nexport function renderForm(formModel: FormModelV2) {\n return <FormRender formModel={formModel} />;\n}\n","import { FlowNodeFormData } from '@flowgram.ai/form-core';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nimport { DataEvent } from './types';\nimport { FormModelV2 } from './form-model-v2';\n\nexport function getFormModel(node: FlowNodeEntity) {\n // @ts-ignore\n return node.getData<FlowNodeFormData>(FlowNodeFormData)?.formModel as FormModelV2;\n}\n\nexport function isFormV2(node: FlowNodeEntity) {\n return !!node.getNodeRegistry().formMeta?.render;\n}\n\nexport function createEffectOptions<T>(\n event: DataEvent,\n effect: T\n): { effect: T; event: DataEvent } {\n return {\n event,\n effect,\n };\n}\n","import { useEffect } from 'react';\n\nimport { useRefresh } from '@flowgram.ai/utils';\nimport { FlowNodeFormData } from '@flowgram.ai/form-core';\nimport { Errors, Warnings } from '@flowgram.ai/form/src/types';\nimport { FormState, useFormErrors, useFormState, useFormWarnings } from '@flowgram.ai/form';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nimport { FormModelV2 } from './form-model-v2';\n\n/**\n * Listen to Form's values and refresh the React component.\n * By providing related node, you can use this hook outside the Form Component.\n * @param node\n */\nexport function useWatchFormValues<T = any>(node: FlowNodeEntity): T | undefined {\n const formModel = node.getData(FlowNodeFormData).getFormModel<FormModelV2>();\n const refresh = useRefresh();\n\n useEffect(() => {\n const disposable = formModel.nativeFormModel?.onFormValuesChange(() => {\n refresh();\n });\n return () => disposable?.dispose();\n }, [formModel.nativeFormModel]);\n\n return formModel.getValues<T>();\n}\n\n/**\n * Listen to Form's value in a certain path and refresh the React component.\n * By providing related node, you can use this hook outside the Form Component.\n * @param node\n */\nexport function useWatchFormValueIn<T = any>(node: FlowNodeEntity, name: string): T | undefined {\n const formModel = node.getData(FlowNodeFormData).getFormModel<FormModelV2>();\n const refresh = useRefresh();\n\n useEffect(() => {\n const disposable = formModel.nativeFormModel?.onFormValuesChange(({ name: changedName }) => {\n if (name === changedName) {\n refresh();\n }\n });\n\n return () => disposable?.dispose();\n }, []);\n\n return formModel.getValueIn<T>(name);\n}\n\n/**\n * Listen to FormModel's initialization and refresh React component.\n * By providing related node, you can use this hook outside the Form Component.\n * @param node\n */\nexport function useInitializedFormModel(node: FlowNodeEntity) {\n const formModel = node.getData(FlowNodeFormData).getFormModel<FormModelV2>();\n const refresh = useRefresh();\n\n useEffect(() => {\n const disposable = formModel.onInitialized(() => {\n refresh();\n });\n return () => disposable.dispose();\n }, [formModel]);\n\n return formModel;\n}\n\n/**\n * Get Form's state, Form State is a proxy, it will refresh the React component when the value you accessed changed\n * By providing related node, you can use this hook outside the Form Component.\n * @param node\n */\nexport function useWatchFormState(node: FlowNodeEntity): FormState | undefined {\n const formModel = useInitializedFormModel(node);\n return useFormState(formModel.formControl);\n}\n\n/**\n * Get Form's errors, Form errors is a proxy, it will refresh the React component when the value you accessed changed\n * By providing related node, you can use this hook outside the Form Component.\n * @param node\n */\nexport function useWatchFormErrors(node: FlowNodeEntity): Errors | undefined {\n const formModel = useInitializedFormModel(node);\n return useFormErrors(formModel.formControl);\n}\n\n/**\n * Get Form's warnings, Form warnings is a proxy, it will refresh the React component when the value you accessed changed\n * By providing related node, you can use this hook outside the Form Component.\n * @param node\n */\nexport function useWatchFormWarnings(node: FlowNodeEntity): Warnings | undefined {\n const formModel = useInitializedFormModel(node);\n return useFormWarnings(formModel.formControl);\n}\n","import { nanoid } from 'nanoid';\nimport { Disposable } from '@flowgram.ai/utils';\n\nimport { EffectOptions, FormPluginCtx } from './types';\nimport { FormModelV2 } from './form-model-v2';\n\nexport interface FormPluginConfig<Opts = any> {\n /**\n * FormModel 初始化时执行\n * @param ctx\n */\n onInit?: (ctx: FormPluginCtx, opts: Opts) => void;\n\n /**\n * 同 FormMeta 中的effects 会与 FormMeta 中的effects 合并\n */\n effect?: Record<string, EffectOptions[]>;\n /**\n * FormModel 销毁时执行\n * @param ctx\n */\n onDispose?: (ctx: FormPluginCtx, opts: Opts) => void;\n}\n\nexport class FormPlugin<Opts = any> implements Disposable {\n readonly name: string;\n\n readonly pluginId: string;\n\n readonly config: FormPluginConfig;\n\n readonly opts?: Opts;\n\n protected _formModel: FormModelV2;\n\n constructor(name: string, config: FormPluginConfig, opts?: Opts) {\n this.name = name;\n this.pluginId = `${name}__${nanoid()}`;\n this.config = config;\n this.opts = opts;\n }\n\n get formModel(): FormModelV2 {\n return this._formModel;\n }\n\n get ctx() {\n return {\n formModel: this.formModel,\n node: this.formModel.nodeContext.node,\n playgroundContext: this.formModel.nodeContext.playgroundContext,\n };\n }\n\n init(formModel: FormModelV2) {\n this._formModel = formModel;\n this.config?.onInit?.(this.ctx, this.opts);\n }\n\n dispose() {\n if (this.config?.onDispose) {\n this.config?.onDispose(this.ctx, this.opts);\n }\n }\n}\n\nexport function defineFormPluginCreator<Opts>(name: string, config: FormPluginConfig) {\n return function (opts: Opts) {\n return new FormPlugin(name, config, opts);\n };\n}\n","import React from 'react';\n\nimport { Disposable, Event } from '@flowgram.ai/utils';\nimport { FlowNodeFormData, NodeRender, OnFormValuesChangePayload } from '@flowgram.ai/form-core';\nimport { FieldName, FieldValue, FormState } from '@flowgram.ai/form';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nimport { onFormValueChangeInPayload } from './types';\nimport { FormModelV2 } from './form-model-v2';\n\nexport interface NodeFormProps<TValues> {\n /**\n * The initialValues of the form.\n */\n initialValues: TValues;\n /**\n * Form values. Returns a deep copy of the data in the store.\n */\n values: TValues;\n /**\n * Form state\n */\n state: FormState;\n /**\n * Get value in certain path\n * @param name path\n */\n getValueIn<TValue = FieldValue>(name: FieldName): TValue;\n\n /**\n * Set value in certain path.\n * It will trigger the re-rendering of the Field Component if a Field is related to this path\n * @param name path\n */\n setValueIn<TValue>(name: FieldName, value: TValue): void;\n /**\n * Render form\n */\n render: () => React.ReactNode;\n /**\n * Form value change event\n */\n onFormValuesChange: Event<OnFormValuesChangePayload>;\n /**\n * Trigger form validate\n */\n validate: () => Promise<boolean>;\n /**\n * Form validate event\n */\n onValidate: Event<FormState>;\n /**\n * Form field value change event\n */\n onFormValueChangeIn<TValue = FieldValue, TFormValue = FieldValue>(\n name: FieldName,\n callback: (payload: onFormValueChangeInPayload<TValue, TFormValue>) => void\n ): Disposable;\n}\n\n/**\n * Only support FormModelV2\n * @param node\n */\nexport function getNodeForm<TValues = FieldValue>(\n node: FlowNodeEntity\n): NodeFormProps<TValues> | undefined {\n const formModel = node.getData<FlowNodeFormData>(FlowNodeFormData)?.getFormModel<FormModelV2>();\n const nativeFormModel = formModel?.nativeFormModel;\n\n if (!formModel || !nativeFormModel) return undefined;\n\n const result: NodeFormProps<TValues> = {\n initialValues: nativeFormModel.initialValues,\n get values() {\n return nativeFormModel.values;\n },\n state: nativeFormModel.state,\n getValueIn: (name: FieldName) => nativeFormModel.getValueIn(name),\n setValueIn: (name: FieldName, value: any) => nativeFormModel.setValueIn(name, value),\n render: () => <NodeRender node={node} />,\n onFormValuesChange: formModel.onFormValuesChange.bind(formModel),\n onFormValueChangeIn: formModel.onFormValueChangeIn.bind(formModel),\n onValidate: formModel.nativeFormModel.onValidate,\n validate: formModel.validate.bind(formModel),\n };\n\n Object.defineProperty(result, '_formModel', {\n enumerable: false,\n get() {\n return formModel;\n },\n });\n return result;\n}\n"],"mappings":"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","names":["DataEvent","effect","FlowNodeFormData","FlowNodeFormData","React","FlowNodeFormData"]}
|
|
1
|
+
{"version":3,"sources":["../../src/types.ts","../../src/form-model-v2.ts","../../src/utils.ts","../../src/form-render.tsx","../../src/helpers.ts","../../src/hooks.ts","../../src/form-plugin.ts","../../src/get-node-form.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { FormModel, IFormMeta, NodeFormContext } from '@flowgram.ai/form-core';\nimport { FieldName, FieldValue } from '@flowgram.ai/form/src/types';\nimport {\n FormRenderProps,\n IForm,\n Validate as FormValidate,\n ValidateTrigger,\n} from '@flowgram.ai/form';\n\nimport { FormPlugin } from './form-plugin';\nimport { FormModelV2 } from './form-model-v2';\n\nexport interface Node {}\n\nexport interface Flow {}\n\n/**\n * NodeContext contains\n * - node: the Editor's node entity.\n * - playgroundContext: the Editor's playgroundContext injected when initiate the Editor.\n */\ntype NodeContext = NodeFormContext;\n\nexport type Validate<TFieldValue = any, TFormValues = any> = (props: {\n value: TFieldValue;\n formValues: TFormValues;\n context: NodeContext;\n name: FieldName;\n}) => ReturnType<FormValidate<TFieldValue, TFormValues>>;\n\nexport enum DataEvent {\n /* When value change */\n onValueChange = 'onValueChange',\n /**\n * When value Init,it triggers when\n * - defaultValue is configured in formMeta, it will trigger when form is initializing.\n * - defaultValue is configured in Field, it will trigger when this Field is initializing if no initial value is set to this field.\n */\n onValueInit = 'onValueInit',\n /**\n * When Value Init or change\n */\n onValueInitOrChange = 'onValueInitOrChange',\n /* It will trigger when ArrayField.append is called. It relies on ArrayField's rendering. If ArrayField is possibly not rendered in your case, please avoid using this event */\n onArrayAppend = 'onArrayAppend',\n /* It will trigger when ArrayField.delete is called. It relies on ArrayField's rendering. If ArrayField is possibly not rendered in your case, please avoid using this event */\n onArrayDelete = 'onArrayDelete',\n}\n\nexport type EffectReturn = () => void;\n\nexport interface EffectFuncProps<TFieldValue = any, TFormValues = any> {\n name: FieldName;\n value: TFieldValue;\n prevValue?: TFieldValue;\n formValues: TFormValues;\n form: IForm;\n context: NodeContext;\n}\n\nexport type Effect<TFieldValue = any, TFormValues = any> = (\n props: EffectFuncProps<TFieldValue, TFormValues>\n) => void | EffectReturn;\n\nexport type ArrayAppendEffect<TFieldValue = any, TFormValues = any> = (props: {\n index: number;\n value: TFieldValue;\n arrayValues: Array<TFieldValue>;\n formValues: TFormValues;\n form: IForm;\n context: NodeContext;\n}) => void | EffectReturn;\n\nexport type ArrayDeleteEffect<TFieldValue = any, TFormValues = any> = (props: {\n index: number;\n arrayValue: Array<TFieldValue>;\n formValues: TFormValues;\n form: IForm;\n context: NodeContext;\n}) => void | EffectReturn;\n\nexport type EffectOptions =\n | { effect: Effect; event: DataEvent }\n | { effect: ArrayAppendEffect; event: DataEvent }\n | { effect: ArrayDeleteEffect; event: DataEvent };\n\nexport interface FormMeta<TValues = any> {\n /**\n * The render method of the node form content. <Form /> is already integrated, so you don't need to wrap your components with <Form />\n * @param props\n */\n render: (props: FormRenderProps<any>) => React.ReactElement;\n /**\n * When to trigger the validation.\n */\n validateTrigger?: ValidateTrigger;\n /**\n * Form data's validation rules. It's a key value map, where the key is a pattern of data's path (or field name), the value is a validate function.\n */\n validate?: Record<FieldName, Validate>;\n /**\n * Form data's effects. It's a key value map, where the key is a pattern of data's path (or field name), the value is an array of effect configuration.\n */\n effect?: Record<FieldName, EffectOptions[]>;\n /**\n * Form data's complete default value. it will not be sent to formatOnInit, but used directly as form's value when needed.\n */\n defaultValues?: TValues | ((context: NodeContext) => TValues);\n /**\n * This function is to format the value when initiate the form, the returned value will be used as the initial value of the form.\n * @param value value input to node as initialValue.\n * @param context\n */\n formatOnInit?: (value: any, context: NodeContext) => any;\n /**\n * This function is to format the value when FormModel.toJSON is called, the returned value will be used as the final value to be saved .\n * @param value value sent by form before format.\n * @param context\n */\n formatOnSubmit?: (value: any, context: NodeContext) => any;\n /**\n * Form's plugins\n */\n plugins?: FormPlugin[];\n}\n\nexport function isFormModelV2(fm: FormModel | FormModelV2): fm is FormModelV2 {\n return 'onFormValuesChange' in fm;\n}\n\nexport function isFormMetaV2(formMeta: IFormMeta | FormMeta) {\n return 'render' in formMeta;\n}\n\nexport type FormPluginCtx = {\n formModel: FormModelV2;\n} & NodeContext;\n\nexport interface onFormValueChangeInPayload<TValue = FieldValue, TFormValues = FieldValue> {\n value: TValue;\n prevValue: TValue;\n formValues: TFormValues;\n prevFormValues: TFormValues;\n}\n","import { get, groupBy, isEmpty, mapKeys } from 'lodash';\nimport { Disposable, DisposableCollection, Emitter } from '@flowgram.ai/utils';\nimport {\n FlowNodeFormData,\n FormFeedback,\n FormItem,\n FormManager,\n FormModel,\n FormModelValid,\n IFormItem,\n OnFormValuesChangePayload,\n} from '@flowgram.ai/form-core';\nimport {\n createForm,\n FieldArrayModel,\n FieldName,\n FieldValue,\n type FormControl,\n FormModel as NativeFormModel,\n FormValidateReturn,\n Glob,\n IField,\n IFieldArray,\n toForm,\n} from '@flowgram.ai/form';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\nimport { PlaygroundContext } from '@flowgram.ai/core';\n\nimport {\n convertGlobPath,\n findMatchedInMap,\n formFeedbacksToNodeCoreFormFeedbacks,\n mergeEffectMap,\n} from './utils';\nimport {\n DataEvent,\n Effect,\n EffectOptions,\n EffectReturn,\n FormMeta,\n onFormValueChangeInPayload,\n} from './types';\nimport { renderForm } from './form-render';\nimport { FormPlugin } from './form-plugin';\n\nconst DEFAULT = {\n // Different formModel should have different reference\n EFFECT_MAP: () => ({}),\n EFFECT_RETURN_MAP: () =>\n new Map([\n [DataEvent.onValueInitOrChange, {}],\n [DataEvent.onValueChange, {}],\n [DataEvent.onValueInit, {}],\n [DataEvent.onArrayAppend, {}],\n [DataEvent.onArrayDelete, {}],\n ]),\n FORM_FEEDBACKS: () => [],\n VALID: null,\n};\n\nexport class FormModelV2 extends FormModel implements Disposable {\n protected effectMap: Record<string, EffectOptions[]> = DEFAULT.EFFECT_MAP();\n\n protected effectReturnMap: Map<DataEvent, Record<string, EffectReturn>> =\n DEFAULT.EFFECT_RETURN_MAP();\n\n protected plugins: FormPlugin[] = [];\n\n protected node: FlowNodeEntity;\n\n protected formFeedbacks: FormValidateReturn | undefined = DEFAULT.FORM_FEEDBACKS();\n\n protected onInitializedEmitter = new Emitter<FormModel>();\n\n protected onValidateEmitter = new Emitter<FormModel>();\n\n readonly onValidate = this.onValidateEmitter.event;\n\n readonly onInitialized = this.onInitializedEmitter.event;\n\n protected onDisposeEmitter = new Emitter<void>();\n\n readonly onDispose = this.onDisposeEmitter.event;\n\n protected toDispose = new DisposableCollection();\n\n protected onFormValuesChangeEmitter = new Emitter<OnFormValuesChangePayload>();\n\n readonly onFormValuesChange = this.onFormValuesChangeEmitter.event;\n\n protected onValidChangeEmitter = new Emitter<FormModelValid>();\n\n readonly onValidChange = this.onValidChangeEmitter.event;\n\n protected onFeedbacksChangeEmitter = new Emitter<FormFeedback[]>();\n\n readonly onFeedbacksChange = this.onFeedbacksChangeEmitter.event;\n\n constructor(node: FlowNodeEntity) {\n super();\n this.node = node;\n this.toDispose.pushAll([\n this.onInitializedEmitter,\n this.onValidateEmitter,\n this.onValidChangeEmitter,\n this.onFeedbacksChangeEmitter,\n this.onFormValuesChangeEmitter,\n ]);\n }\n\n protected _valid: FormModelValid = DEFAULT.VALID;\n\n get valid(): FormModelValid {\n return this._valid;\n }\n\n private set valid(valid: FormModelValid) {\n this._valid = valid;\n this.onValidChangeEmitter.fire(valid);\n }\n\n get flowNodeEntity() {\n return this.node;\n }\n\n get formManager() {\n return this.node.getService(FormManager);\n }\n\n protected _formControl?: FormControl<any>;\n\n get formControl() {\n return this._formControl;\n }\n\n get formMeta() {\n return this.node.getNodeRegistry().formMeta;\n }\n\n get values() {\n return this.nativeFormModel?.values;\n }\n\n protected _feedbacks: FormFeedback[] = [];\n\n get feedbacks(): FormFeedback[] {\n return this._feedbacks;\n }\n\n updateFormValues(value: any) {\n if (this.nativeFormModel) {\n const finalValue = this.formMeta.formatOnInit\n ? this.formMeta.formatOnInit(value, this.nodeContext)\n : value;\n this.nativeFormModel.values = finalValue;\n }\n }\n\n private set feedbacks(feedbacks: FormFeedback[]) {\n this._feedbacks = feedbacks;\n this.onFeedbacksChangeEmitter.fire(feedbacks);\n }\n\n get formItemPathMap(): Map<string, IFormItem> {\n return new Map<string, IFormItem>();\n }\n\n protected _initialized: boolean = false;\n\n get initialized(): boolean {\n return this._initialized;\n }\n\n get nodeContext() {\n return {\n node: this.node,\n playgroundContext: this.node.getService(PlaygroundContext),\n };\n }\n\n get nativeFormModel(): NativeFormModel | undefined {\n return this._formControl?._formModel;\n }\n\n render() {\n return renderForm(this);\n }\n\n initPlugins(plugins: FormPlugin[]) {\n if (!plugins.length) {\n return;\n }\n\n this.plugins = plugins;\n plugins.forEach((plugin) => {\n plugin.init(this);\n if (plugin.config?.effect) {\n mergeEffectMap(this.effectMap, plugin.config.effect);\n }\n });\n }\n\n init(formMeta: FormMeta, rawInitialValues?: any) {\n /* 透传 onFormValuesChange 事件给 FlowNodeFormData */\n const formData = this.node.getData<FlowNodeFormData>(FlowNodeFormData);\n this.onFormValuesChange(() => {\n this._valid = null;\n formData.fireChange();\n });\n\n const { validateTrigger, validate, effect } = formMeta;\n if (effect) {\n this.effectMap = effect;\n }\n\n // 计算初始值: defaultValues 是默认表单值,不需要被format, 而rawInitialValues 是用户创建form 时传入的初始值,可能不同于表单数据格式,需要被format\n const defaultValues =\n typeof formMeta.defaultValues === 'function'\n ? formMeta.defaultValues(this.nodeContext)\n : formMeta.defaultValues;\n\n const initialValues = formMeta.formatOnInit\n ? formMeta.formatOnInit(rawInitialValues, this.nodeContext)\n : rawInitialValues;\n\n // 初始化底层表单\n const { control } = createForm({\n initialValues: initialValues || defaultValues,\n validateTrigger,\n context: this.nodeContext,\n validate: validate,\n disableAutoInit: true,\n });\n\n this._formControl = control;\n const nativeFormModel = control._formModel;\n this.toDispose.push(nativeFormModel);\n\n // forward onFormValuesChange event\n nativeFormModel.onFormValuesChange((props) => {\n this.onFormValuesChangeEmitter.fire(props);\n });\n\n if (formMeta.plugins) {\n this.initPlugins(formMeta.plugins);\n }\n\n // Form 数据变更时触发对应的effect\n nativeFormModel.onFormValuesChange(({ values, prevValues, name }) => {\n // 找到所有路径匹配的副作用,包括父亲路径\n const effectKeys = Object.keys(this.effectMap).filter((pattern) =>\n Glob.isMatchOrParent(pattern, name)\n );\n\n effectKeys.forEach((effectKey) => {\n const effectOptionsArr = this.effectMap[effectKey];\n // 执行该事件配置下所有 onValueChange 事件的 effect\n effectOptionsArr.forEach(({ effect, event }: EffectOptions) => {\n if (event === DataEvent.onValueChange || event === DataEvent.onValueInitOrChange) {\n // 对于冒泡的事件,需要获取 parent 的 name\n const currentName = Glob.getParentPathByPattern(effectKey, name);\n\n // 执行上一次effect 的 return\n const prevEffectReturn = this.effectReturnMap.get(event)?.[currentName];\n if (prevEffectReturn) {\n prevEffectReturn();\n }\n\n // 执行effect\n const effectReturn = (effect as Effect)({\n name: currentName,\n value: get(values, currentName),\n prevValue: get(prevValues, currentName),\n formValues: values,\n form: toForm(this.nativeFormModel!),\n context: this.nodeContext,\n });\n\n // 更新 effect return\n if (\n effectReturn &&\n typeof effectReturn === 'function' &&\n this.effectReturnMap.has(event)\n ) {\n const eventMap = this.effectReturnMap.get(event) as Record<string, EffectReturn>;\n eventMap[currentName] = effectReturn;\n }\n }\n });\n });\n });\n\n // Form 数据初始化时触发对应的effect\n nativeFormModel.onFormValuesInit(({ values, name, prevValues }) => {\n Object.keys(this.effectMap).forEach((pattern) => {\n // 找到匹配 pattern 的数据路径\n const paths = Glob.findMatchPaths(values, pattern);\n\n // 获取配置在该 pattern上的所有effect配置\n const effectOptionsArr = this.effectMap[pattern];\n\n effectOptionsArr.forEach(({ event, effect }: EffectOptions) => {\n if (event === DataEvent.onValueInit || event === DataEvent.onValueInitOrChange) {\n paths.forEach((path) => {\n // 对触发 init 事件的 name 或他的字 path 触发effect\n if (Glob.isMatchOrParent(name, path) || name === path) {\n // 执行上一次effect 的 return\n const prevEffectReturn = this.effectReturnMap.get(event)?.[path];\n if (prevEffectReturn) {\n prevEffectReturn();\n }\n\n const effectReturn = (effect as Effect)({\n name: path,\n value: get(values, path),\n formValues: values,\n prevValue: get(prevValues, path),\n form: toForm(this.nativeFormModel!),\n context: this.nodeContext,\n });\n\n // 更新 effect return\n if (\n effectReturn &&\n typeof effectReturn === 'function' &&\n this.effectReturnMap.has(event)\n ) {\n const eventMap = this.effectReturnMap.get(event) as Record<string, EffectReturn>;\n eventMap[path] = effectReturn;\n }\n }\n });\n }\n });\n });\n });\n\n // 为 Field 添加 effect, 主要针对array\n nativeFormModel.onFieldModelCreate((field) => {\n // register effect\n const effectOptionsArr = findMatchedInMap<EffectOptions[]>(field, this.effectMap);\n if (effectOptionsArr?.length) {\n // 按事件聚合\n const eventMap = groupBy(effectOptionsArr, 'event');\n\n mapKeys(eventMap, (optionsArr, event) => {\n const combinedEffect = (props: any) => {\n // 该事件下执行所有effect\n optionsArr.forEach(({ effect }) =>\n effect({\n ...props,\n formValues: nativeFormModel.values,\n form: toForm(this.nativeFormModel!),\n context: this.nodeContext,\n })\n );\n };\n\n switch (event) {\n case DataEvent.onArrayAppend:\n if (field instanceof FieldArrayModel) {\n (field as FieldArrayModel).onAppend(combinedEffect);\n }\n break;\n case DataEvent.onArrayDelete:\n if (field instanceof FieldArrayModel) {\n (field as FieldArrayModel).onDelete(combinedEffect);\n }\n break;\n }\n });\n }\n });\n\n // 手动初始化form\n this._formControl.init();\n\n this._initialized = true;\n\n this.onInitializedEmitter.fire(this);\n\n this.onDispose(() => {\n this._initialized = false;\n this.effectMap = {};\n nativeFormModel.dispose();\n });\n }\n\n toJSON() {\n if (this.formMeta.formatOnSubmit) {\n return this.formMeta.formatOnSubmit(this.nativeFormModel?.values, this.nodeContext);\n }\n return this.nativeFormModel?.values;\n }\n\n clearValid() {\n if (this.valid !== null) {\n this.valid = null;\n }\n }\n\n async validate() {\n this.formFeedbacks = await this.nativeFormModel?.validate();\n this.valid = isEmpty(this.formFeedbacks?.filter((f) => f.level === 'error'));\n this.onValidateEmitter.fire(this);\n return this.valid;\n }\n\n getValues<T = any>(): T | undefined {\n return this._formControl?._formModel.values;\n }\n\n getField<\n TValue = FieldValue,\n TField extends IFieldArray<TValue> | IField<TValue> = IField<TValue>\n >(name: FieldName): TField | undefined {\n let finalName = name.includes('/') ? convertGlobPath(name) : name;\n\n return this.formControl?.getField<TValue, TField>(finalName) as TField;\n }\n\n getValueIn<TValue>(name: FieldName): TValue | undefined {\n let finalName = name.includes('/') ? convertGlobPath(name) : name;\n\n return this.nativeFormModel?.getValueIn(finalName);\n }\n\n setValueIn(name: FieldName, value: any) {\n let finalName = name.includes('/') ? convertGlobPath(name) : name;\n\n this.nativeFormModel?.setValueIn(finalName, value);\n }\n\n /**\n * 监听表单某个路径下的值变化\n * @param name 路径\n * @param callback 回调函数\n */\n onFormValueChangeIn<TValue = FieldValue, TFormValue = FieldValue>(\n name: FieldName,\n callback: (payload: onFormValueChangeInPayload<TValue, TFormValue>) => void\n ): Disposable {\n if (!this._initialized) {\n throw new Error(\n `[NodeEngine] FormModel Error: onFormValueChangeIn can not be called before initialized`\n );\n }\n\n return this.formControl!._formModel.onFormValuesChange(\n ({ name: changedName, values, prevValues }) => {\n if (changedName === name) {\n callback({\n value: get(values, name),\n prevValue: get(prevValues, name),\n formValues: values,\n prevFormValues: prevValues,\n });\n }\n }\n );\n }\n\n /**\n * @deprecated 该方法用于兼容 V1 版本 FormModel接口,如果确定是FormModelV2 请使用 FormModel.getValueIn\n * @param path glob path\n */\n getFormItemValueByPath(globPath: string) {\n if (!globPath) {\n return;\n }\n if (globPath === '/') {\n return this._formControl?._formModel.values;\n }\n const name = convertGlobPath(globPath);\n return this.getValueIn(name!);\n }\n\n async validateWithFeedbacks(): Promise<FormFeedback[]> {\n await this.validate();\n return formFeedbacksToNodeCoreFormFeedbacks(this.formFeedbacks!);\n }\n\n /**\n * @deprecated 该方法用于兼容 V1 版本 FormModel接口,如果确定是FormModelV2, 请使用FormModel.getValueIn 和 FormModel.setValueIn\n * @param path glob path\n */\n getFormItemByPath(path: string): FormItem | undefined {\n if (!this.nativeFormModel) {\n return;\n }\n\n const that = this;\n\n if (path === '/') {\n return {\n get value() {\n return that.nativeFormModel!.values;\n },\n set value(v) {\n that.nativeFormModel!.values = v;\n },\n } as FormItem;\n }\n\n const name = convertGlobPath(path);\n const formItemValue = that.getValueIn(name!);\n return {\n get value() {\n return formItemValue;\n },\n set value(v) {\n that.setValueIn(name, v);\n },\n } as FormItem;\n }\n\n dispose(): void {\n this.onDisposeEmitter.fire();\n\n // 执行所有effect return\n this.effectReturnMap.forEach((eventMap) => {\n Object.values(eventMap).forEach((effectReturn) => {\n effectReturn();\n });\n });\n\n this.effectMap = DEFAULT.EFFECT_MAP();\n this.effectReturnMap = DEFAULT.EFFECT_RETURN_MAP();\n\n this.plugins.forEach((p) => {\n p.dispose();\n });\n\n this.plugins = [];\n\n this.formFeedbacks = DEFAULT.FORM_FEEDBACKS();\n this._valid = DEFAULT.VALID;\n\n this._formControl = undefined;\n this._initialized = false;\n this.toDispose.dispose();\n }\n}\n","import { find, mergeWith } from 'lodash';\nimport { FormFeedback, FormPathService } from '@flowgram.ai/form-core';\nimport { FormValidateReturn } from '@flowgram.ai/form/src/types';\nimport { type FieldModel, FieldName } from '@flowgram.ai/form';\n\nimport { EffectOptions } from './types';\n\nexport function findMatchedInMap<T = any>(\n field: FieldModel<any>,\n validateMap: Record<FieldName, T> | undefined\n): T | undefined {\n if (!validateMap) {\n return;\n }\n if (validateMap[field.name]) {\n return validateMap[field.name];\n }\n\n const found = find(Object.keys(validateMap), (key) => {\n if (key.startsWith('regex:')) {\n const regex = RegExp(key.split(':')[1]);\n return regex.test(field.name);\n }\n return false;\n });\n\n if (found) {\n return validateMap[found];\n }\n}\n\nexport function formFeedbacksToNodeCoreFormFeedbacks(\n formFeedbacks: FormValidateReturn\n): FormFeedback[] {\n return formFeedbacks.map(\n (f) =>\n ({\n feedbackStatus: f.level,\n feedbackText: f.message,\n path: f.name,\n } as FormFeedback)\n );\n}\n\nexport function convertGlobPath(path: string) {\n if (path.startsWith('/')) {\n const parts = FormPathService.normalize(path).slice(1).split('/');\n return parts.join('.');\n }\n return path;\n}\n\nexport function mergeEffectMap(\n origin: Record<string, EffectOptions[]>,\n source: Record<string, EffectOptions[]>\n) {\n return mergeWith(origin, source, function (objValue: EffectOptions[], srcValue: EffectOptions[]) {\n return (objValue || []).concat(srcValue);\n });\n}\n","import React from 'react';\n\nimport { Form } from '@flowgram.ai/form';\n\nimport { FormModelV2 } from './form-model-v2';\n\ninterface FormRenderProps {\n formModel: FormModelV2;\n}\n\nconst FormRender = ({ formModel }: FormRenderProps) =>\n formModel?.formControl ? (\n <>\n <Form control={formModel?.formControl} keepModelOnUnMount>\n {formModel.formMeta.render}\n </Form>\n </>\n ) : null;\n\nexport function renderForm(formModel: FormModelV2) {\n return <FormRender formModel={formModel} />;\n}\n","import { FlowNodeFormData } from '@flowgram.ai/form-core';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nimport { DataEvent } from './types';\nimport { FormModelV2 } from './form-model-v2';\n\nexport function getFormModel(node: FlowNodeEntity) {\n // @ts-ignore\n return node.getData<FlowNodeFormData>(FlowNodeFormData)?.formModel as FormModelV2;\n}\n\nexport function isFormV2(node: FlowNodeEntity) {\n return !!node.getNodeRegistry().formMeta?.render;\n}\n\nexport function createEffectOptions<T>(\n event: DataEvent,\n effect: T\n): { effect: T; event: DataEvent } {\n return {\n event,\n effect,\n };\n}\n","import { useEffect } from 'react';\n\nimport { useRefresh } from '@flowgram.ai/utils';\nimport { FlowNodeFormData } from '@flowgram.ai/form-core';\nimport { Errors, Warnings } from '@flowgram.ai/form/src/types';\nimport { FormState, useFormErrors, useFormState, useFormWarnings } from '@flowgram.ai/form';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nimport { FormModelV2 } from './form-model-v2';\n\n/**\n * Listen to Form's values and refresh the React component.\n * By providing related node, you can use this hook outside the Form Component.\n * @param node\n */\nexport function useWatchFormValues<T = any>(node: FlowNodeEntity): T | undefined {\n const formModel = node.getData(FlowNodeFormData).getFormModel<FormModelV2>();\n const refresh = useRefresh();\n\n useEffect(() => {\n const disposable = formModel.nativeFormModel?.onFormValuesChange(() => {\n refresh();\n });\n return () => disposable?.dispose();\n }, [formModel.nativeFormModel]);\n\n return formModel.getValues<T>();\n}\n\n/**\n * Listen to Form's value in a certain path and refresh the React component.\n * By providing related node, you can use this hook outside the Form Component.\n * @param node\n */\nexport function useWatchFormValueIn<T = any>(node: FlowNodeEntity, name: string): T | undefined {\n const formModel = node.getData(FlowNodeFormData).getFormModel<FormModelV2>();\n const refresh = useRefresh();\n\n useEffect(() => {\n const disposable = formModel.nativeFormModel?.onFormValuesChange(({ name: changedName }) => {\n if (name === changedName) {\n refresh();\n }\n });\n\n return () => disposable?.dispose();\n }, []);\n\n return formModel.getValueIn<T>(name);\n}\n\n/**\n * Listen to FormModel's initialization and refresh React component.\n * By providing related node, you can use this hook outside the Form Component.\n * @param node\n */\nexport function useInitializedFormModel(node: FlowNodeEntity) {\n const formModel = node.getData(FlowNodeFormData).getFormModel<FormModelV2>();\n const refresh = useRefresh();\n\n useEffect(() => {\n const disposable = formModel.onInitialized(() => {\n refresh();\n });\n return () => disposable.dispose();\n }, [formModel]);\n\n return formModel;\n}\n\n/**\n * Get Form's state, Form State is a proxy, it will refresh the React component when the value you accessed changed\n * By providing related node, you can use this hook outside the Form Component.\n * @param node\n */\nexport function useWatchFormState(node: FlowNodeEntity): FormState | undefined {\n const formModel = useInitializedFormModel(node);\n return useFormState(formModel.formControl);\n}\n\n/**\n * Get Form's errors, Form errors is a proxy, it will refresh the React component when the value you accessed changed\n * By providing related node, you can use this hook outside the Form Component.\n * @param node\n */\nexport function useWatchFormErrors(node: FlowNodeEntity): Errors | undefined {\n const formModel = useInitializedFormModel(node);\n return useFormErrors(formModel.formControl);\n}\n\n/**\n * Get Form's warnings, Form warnings is a proxy, it will refresh the React component when the value you accessed changed\n * By providing related node, you can use this hook outside the Form Component.\n * @param node\n */\nexport function useWatchFormWarnings(node: FlowNodeEntity): Warnings | undefined {\n const formModel = useInitializedFormModel(node);\n return useFormWarnings(formModel.formControl);\n}\n","import { nanoid } from 'nanoid';\nimport { Disposable } from '@flowgram.ai/utils';\n\nimport { EffectOptions, FormPluginCtx } from './types';\nimport { FormModelV2 } from './form-model-v2';\n\nexport interface FormPluginConfig<Opts = any> {\n /**\n * FormModel 初始化时执行\n * @param ctx\n */\n onInit?: (ctx: FormPluginCtx, opts: Opts) => void;\n\n /**\n * 同 FormMeta 中的effects 会与 FormMeta 中的effects 合并\n */\n effect?: Record<string, EffectOptions[]>;\n /**\n * FormModel 销毁时执行\n * @param ctx\n */\n onDispose?: (ctx: FormPluginCtx, opts: Opts) => void;\n}\n\nexport class FormPlugin<Opts = any> implements Disposable {\n readonly name: string;\n\n readonly pluginId: string;\n\n readonly config: FormPluginConfig;\n\n readonly opts?: Opts;\n\n protected _formModel: FormModelV2;\n\n constructor(name: string, config: FormPluginConfig, opts?: Opts) {\n this.name = name;\n this.pluginId = `${name}__${nanoid()}`;\n this.config = config;\n this.opts = opts;\n }\n\n get formModel(): FormModelV2 {\n return this._formModel;\n }\n\n get ctx() {\n return {\n formModel: this.formModel,\n node: this.formModel.nodeContext.node,\n playgroundContext: this.formModel.nodeContext.playgroundContext,\n };\n }\n\n init(formModel: FormModelV2) {\n this._formModel = formModel;\n this.config?.onInit?.(this.ctx, this.opts);\n }\n\n dispose() {\n if (this.config?.onDispose) {\n this.config?.onDispose(this.ctx, this.opts);\n }\n }\n}\n\nexport function defineFormPluginCreator<Opts>(name: string, config: FormPluginConfig) {\n return function (opts: Opts) {\n return new FormPlugin(name, config, opts);\n };\n}\n","import React from 'react';\n\nimport { Disposable, Event } from '@flowgram.ai/utils';\nimport { FlowNodeFormData, NodeRender, OnFormValuesChangePayload } from '@flowgram.ai/form-core';\nimport { FieldName, FieldValue, FormState } from '@flowgram.ai/form';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nimport { onFormValueChangeInPayload } from './types';\nimport { FormModelV2 } from './form-model-v2';\n\nexport interface NodeFormProps<TValues> {\n /**\n * The initialValues of the form.\n */\n initialValues: TValues;\n /**\n * Form values. Returns a deep copy of the data in the store.\n */\n values: TValues;\n /**\n * Form state\n */\n state: FormState;\n /**\n * Get value in certain path\n * @param name path\n */\n getValueIn<TValue = FieldValue>(name: FieldName): TValue;\n\n /**\n * Set value in certain path.\n * It will trigger the re-rendering of the Field Component if a Field is related to this path\n * @param name path\n */\n setValueIn<TValue>(name: FieldName, value: TValue): void;\n /**\n * set form values\n */\n updateFormValues(values: any): void;\n /**\n * Render form\n */\n render: () => React.ReactNode;\n /**\n * Form value change event\n */\n onFormValuesChange: Event<OnFormValuesChangePayload>;\n /**\n * Trigger form validate\n */\n validate: () => Promise<boolean>;\n /**\n * Form validate event\n */\n onValidate: Event<FormState>;\n /**\n * Form field value change event\n */\n onFormValueChangeIn<TValue = FieldValue, TFormValue = FieldValue>(\n name: FieldName,\n callback: (payload: onFormValueChangeInPayload<TValue, TFormValue>) => void\n ): Disposable;\n}\n\n/**\n * Only support FormModelV2\n * @param node\n */\nexport function getNodeForm<TValues = FieldValue>(\n node: FlowNodeEntity\n): NodeFormProps<TValues> | undefined {\n const formModel = node.getData<FlowNodeFormData>(FlowNodeFormData)?.getFormModel<FormModelV2>();\n const nativeFormModel = formModel?.nativeFormModel;\n\n if (!formModel || !nativeFormModel) return undefined;\n\n const result: NodeFormProps<TValues> = {\n initialValues: nativeFormModel.initialValues,\n get values() {\n return nativeFormModel.values;\n },\n\n state: nativeFormModel.state,\n getValueIn: (name: FieldName) => nativeFormModel.getValueIn(name),\n setValueIn: (name: FieldName, value: any) => nativeFormModel.setValueIn(name, value),\n updateFormValues: (values: any) => {\n formModel.updateFormValues(values);\n },\n render: () => <NodeRender node={node} />,\n onFormValuesChange: formModel.onFormValuesChange.bind(formModel),\n onFormValueChangeIn: formModel.onFormValueChangeIn.bind(formModel),\n onValidate: formModel.nativeFormModel.onValidate,\n validate: formModel.validate.bind(formModel),\n };\n\n Object.defineProperty(result, '_formModel', {\n enumerable: false,\n get() {\n return formModel;\n },\n });\n return result;\n}\n"],"mappings":"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","names":["DataEvent","effect","FlowNodeFormData","FlowNodeFormData","React","FlowNodeFormData"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -39,6 +39,7 @@ declare class FormModelV2 extends FormModel implements Disposable {
|
|
|
39
39
|
get values(): any;
|
|
40
40
|
protected _feedbacks: FormFeedback[];
|
|
41
41
|
get feedbacks(): FormFeedback[];
|
|
42
|
+
updateFormValues(value: any): void;
|
|
42
43
|
private set feedbacks(value);
|
|
43
44
|
get formItemPathMap(): Map<string, IFormItem>;
|
|
44
45
|
protected _initialized: boolean;
|
|
@@ -296,6 +297,10 @@ interface NodeFormProps<TValues> {
|
|
|
296
297
|
* @param name path
|
|
297
298
|
*/
|
|
298
299
|
setValueIn<TValue>(name: FieldName, value: TValue): void;
|
|
300
|
+
/**
|
|
301
|
+
* set form values
|
|
302
|
+
*/
|
|
303
|
+
updateFormValues(values: any): void;
|
|
299
304
|
/**
|
|
300
305
|
* Render form
|
|
301
306
|
*/
|
package/dist/index.d.ts
CHANGED
|
@@ -39,6 +39,7 @@ declare class FormModelV2 extends FormModel implements Disposable {
|
|
|
39
39
|
get values(): any;
|
|
40
40
|
protected _feedbacks: FormFeedback[];
|
|
41
41
|
get feedbacks(): FormFeedback[];
|
|
42
|
+
updateFormValues(value: any): void;
|
|
42
43
|
private set feedbacks(value);
|
|
43
44
|
get formItemPathMap(): Map<string, IFormItem>;
|
|
44
45
|
protected _initialized: boolean;
|
|
@@ -296,6 +297,10 @@ interface NodeFormProps<TValues> {
|
|
|
296
297
|
* @param name path
|
|
297
298
|
*/
|
|
298
299
|
setValueIn<TValue>(name: FieldName, value: TValue): void;
|
|
300
|
+
/**
|
|
301
|
+
* set form values
|
|
302
|
+
*/
|
|
303
|
+
updateFormValues(values: any): void;
|
|
299
304
|
/**
|
|
300
305
|
* Render form
|
|
301
306
|
*/
|
package/dist/index.js
CHANGED
|
@@ -117,31 +117,32 @@ function mergeEffectMap(origin, source) {
|
|
|
117
117
|
// src/form-render.tsx
|
|
118
118
|
var import_react = __toESM(require("react"));
|
|
119
119
|
var import_form = require("@flowgram.ai/form");
|
|
120
|
-
var FormRender = ({ formModel }) => formModel
|
|
120
|
+
var FormRender = ({ formModel }) => (formModel == null ? void 0 : formModel.formControl) ? /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement(import_form.Form, { control: formModel == null ? void 0 : formModel.formControl, keepModelOnUnMount: true }, formModel.formMeta.render)) : null;
|
|
121
121
|
function renderForm(formModel) {
|
|
122
122
|
return /* @__PURE__ */ import_react.default.createElement(FormRender, { formModel });
|
|
123
123
|
}
|
|
124
124
|
|
|
125
125
|
// src/form-model-v2.ts
|
|
126
126
|
var DEFAULT = {
|
|
127
|
-
|
|
128
|
-
|
|
127
|
+
// Different formModel should have different reference
|
|
128
|
+
EFFECT_MAP: () => ({}),
|
|
129
|
+
EFFECT_RETURN_MAP: () => /* @__PURE__ */ new Map([
|
|
129
130
|
["onValueInitOrChange" /* onValueInitOrChange */, {}],
|
|
130
131
|
["onValueChange" /* onValueChange */, {}],
|
|
131
132
|
["onValueInit" /* onValueInit */, {}],
|
|
132
133
|
["onArrayAppend" /* onArrayAppend */, {}],
|
|
133
134
|
["onArrayDelete" /* onArrayDelete */, {}]
|
|
134
135
|
]),
|
|
135
|
-
FORM_FEEDBACKS: [],
|
|
136
|
+
FORM_FEEDBACKS: () => [],
|
|
136
137
|
VALID: null
|
|
137
138
|
};
|
|
138
139
|
var FormModelV2 = class extends import_form_core2.FormModel {
|
|
139
140
|
constructor(node) {
|
|
140
141
|
super();
|
|
141
|
-
this.effectMap = DEFAULT.EFFECT_MAP;
|
|
142
|
-
this.effectReturnMap = DEFAULT.EFFECT_RETURN_MAP;
|
|
142
|
+
this.effectMap = DEFAULT.EFFECT_MAP();
|
|
143
|
+
this.effectReturnMap = DEFAULT.EFFECT_RETURN_MAP();
|
|
143
144
|
this.plugins = [];
|
|
144
|
-
this.formFeedbacks = DEFAULT.FORM_FEEDBACKS;
|
|
145
|
+
this.formFeedbacks = DEFAULT.FORM_FEEDBACKS();
|
|
145
146
|
this.onInitializedEmitter = new import_utils.Emitter();
|
|
146
147
|
this.onValidateEmitter = new import_utils.Emitter();
|
|
147
148
|
this.onValidate = this.onValidateEmitter.event;
|
|
@@ -187,11 +188,18 @@ var FormModelV2 = class extends import_form_core2.FormModel {
|
|
|
187
188
|
return this.node.getNodeRegistry().formMeta;
|
|
188
189
|
}
|
|
189
190
|
get values() {
|
|
190
|
-
|
|
191
|
+
var _a;
|
|
192
|
+
return (_a = this.nativeFormModel) == null ? void 0 : _a.values;
|
|
191
193
|
}
|
|
192
194
|
get feedbacks() {
|
|
193
195
|
return this._feedbacks;
|
|
194
196
|
}
|
|
197
|
+
updateFormValues(value) {
|
|
198
|
+
if (this.nativeFormModel) {
|
|
199
|
+
const finalValue = this.formMeta.formatOnInit ? this.formMeta.formatOnInit(value, this.nodeContext) : value;
|
|
200
|
+
this.nativeFormModel.values = finalValue;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
195
203
|
set feedbacks(feedbacks) {
|
|
196
204
|
this._feedbacks = feedbacks;
|
|
197
205
|
this.onFeedbacksChangeEmitter.fire(feedbacks);
|
|
@@ -209,7 +217,8 @@ var FormModelV2 = class extends import_form_core2.FormModel {
|
|
|
209
217
|
};
|
|
210
218
|
}
|
|
211
219
|
get nativeFormModel() {
|
|
212
|
-
|
|
220
|
+
var _a;
|
|
221
|
+
return (_a = this._formControl) == null ? void 0 : _a._formModel;
|
|
213
222
|
}
|
|
214
223
|
render() {
|
|
215
224
|
return renderForm(this);
|
|
@@ -220,8 +229,9 @@ var FormModelV2 = class extends import_form_core2.FormModel {
|
|
|
220
229
|
}
|
|
221
230
|
this.plugins = plugins;
|
|
222
231
|
plugins.forEach((plugin) => {
|
|
232
|
+
var _a;
|
|
223
233
|
plugin.init(this);
|
|
224
|
-
if (plugin.config
|
|
234
|
+
if ((_a = plugin.config) == null ? void 0 : _a.effect) {
|
|
225
235
|
mergeEffectMap(this.effectMap, plugin.config.effect);
|
|
226
236
|
}
|
|
227
237
|
});
|
|
@@ -261,9 +271,10 @@ var FormModelV2 = class extends import_form_core2.FormModel {
|
|
|
261
271
|
effectKeys.forEach((effectKey) => {
|
|
262
272
|
const effectOptionsArr = this.effectMap[effectKey];
|
|
263
273
|
effectOptionsArr.forEach(({ effect: effect2, event }) => {
|
|
274
|
+
var _a;
|
|
264
275
|
if (event === "onValueChange" /* onValueChange */ || event === "onValueInitOrChange" /* onValueInitOrChange */) {
|
|
265
276
|
const currentName = import_form2.Glob.getParentPathByPattern(effectKey, name);
|
|
266
|
-
const prevEffectReturn = this.effectReturnMap.get(event)
|
|
277
|
+
const prevEffectReturn = (_a = this.effectReturnMap.get(event)) == null ? void 0 : _a[currentName];
|
|
267
278
|
if (prevEffectReturn) {
|
|
268
279
|
prevEffectReturn();
|
|
269
280
|
}
|
|
@@ -290,8 +301,9 @@ var FormModelV2 = class extends import_form_core2.FormModel {
|
|
|
290
301
|
effectOptionsArr.forEach(({ event, effect: effect2 }) => {
|
|
291
302
|
if (event === "onValueInit" /* onValueInit */ || event === "onValueInitOrChange" /* onValueInitOrChange */) {
|
|
292
303
|
paths.forEach((path) => {
|
|
304
|
+
var _a;
|
|
293
305
|
if (import_form2.Glob.isMatchOrParent(name, path) || name === path) {
|
|
294
|
-
const prevEffectReturn = this.effectReturnMap.get(event)
|
|
306
|
+
const prevEffectReturn = (_a = this.effectReturnMap.get(event)) == null ? void 0 : _a[path];
|
|
295
307
|
if (prevEffectReturn) {
|
|
296
308
|
prevEffectReturn();
|
|
297
309
|
}
|
|
@@ -315,7 +327,7 @@ var FormModelV2 = class extends import_form_core2.FormModel {
|
|
|
315
327
|
});
|
|
316
328
|
nativeFormModel.onFieldModelCreate((field) => {
|
|
317
329
|
const effectOptionsArr = findMatchedInMap(field, this.effectMap);
|
|
318
|
-
if (effectOptionsArr
|
|
330
|
+
if (effectOptionsArr == null ? void 0 : effectOptionsArr.length) {
|
|
319
331
|
const eventMap = (0, import_lodash2.groupBy)(effectOptionsArr, "event");
|
|
320
332
|
(0, import_lodash2.mapKeys)(eventMap, (optionsArr, event) => {
|
|
321
333
|
const combinedEffect = (props) => {
|
|
@@ -353,10 +365,11 @@ var FormModelV2 = class extends import_form_core2.FormModel {
|
|
|
353
365
|
});
|
|
354
366
|
}
|
|
355
367
|
toJSON() {
|
|
368
|
+
var _a, _b;
|
|
356
369
|
if (this.formMeta.formatOnSubmit) {
|
|
357
|
-
return this.formMeta.formatOnSubmit(this.nativeFormModel
|
|
370
|
+
return this.formMeta.formatOnSubmit((_a = this.nativeFormModel) == null ? void 0 : _a.values, this.nodeContext);
|
|
358
371
|
}
|
|
359
|
-
return this.nativeFormModel
|
|
372
|
+
return (_b = this.nativeFormModel) == null ? void 0 : _b.values;
|
|
360
373
|
}
|
|
361
374
|
clearValid() {
|
|
362
375
|
if (this.valid !== null) {
|
|
@@ -364,25 +377,30 @@ var FormModelV2 = class extends import_form_core2.FormModel {
|
|
|
364
377
|
}
|
|
365
378
|
}
|
|
366
379
|
async validate() {
|
|
367
|
-
|
|
368
|
-
this.
|
|
380
|
+
var _a, _b;
|
|
381
|
+
this.formFeedbacks = await ((_a = this.nativeFormModel) == null ? void 0 : _a.validate());
|
|
382
|
+
this.valid = (0, import_lodash2.isEmpty)((_b = this.formFeedbacks) == null ? void 0 : _b.filter((f) => f.level === "error"));
|
|
369
383
|
this.onValidateEmitter.fire(this);
|
|
370
384
|
return this.valid;
|
|
371
385
|
}
|
|
372
386
|
getValues() {
|
|
373
|
-
|
|
387
|
+
var _a;
|
|
388
|
+
return (_a = this._formControl) == null ? void 0 : _a._formModel.values;
|
|
374
389
|
}
|
|
375
390
|
getField(name) {
|
|
391
|
+
var _a;
|
|
376
392
|
let finalName = name.includes("/") ? convertGlobPath(name) : name;
|
|
377
|
-
return this.formControl
|
|
393
|
+
return (_a = this.formControl) == null ? void 0 : _a.getField(finalName);
|
|
378
394
|
}
|
|
379
395
|
getValueIn(name) {
|
|
396
|
+
var _a;
|
|
380
397
|
let finalName = name.includes("/") ? convertGlobPath(name) : name;
|
|
381
|
-
return this.nativeFormModel
|
|
398
|
+
return (_a = this.nativeFormModel) == null ? void 0 : _a.getValueIn(finalName);
|
|
382
399
|
}
|
|
383
400
|
setValueIn(name, value) {
|
|
401
|
+
var _a;
|
|
384
402
|
let finalName = name.includes("/") ? convertGlobPath(name) : name;
|
|
385
|
-
this.nativeFormModel
|
|
403
|
+
(_a = this.nativeFormModel) == null ? void 0 : _a.setValueIn(finalName, value);
|
|
386
404
|
}
|
|
387
405
|
/**
|
|
388
406
|
* 监听表单某个路径下的值变化
|
|
@@ -413,11 +431,12 @@ var FormModelV2 = class extends import_form_core2.FormModel {
|
|
|
413
431
|
* @param path glob path
|
|
414
432
|
*/
|
|
415
433
|
getFormItemValueByPath(globPath) {
|
|
434
|
+
var _a;
|
|
416
435
|
if (!globPath) {
|
|
417
436
|
return;
|
|
418
437
|
}
|
|
419
438
|
if (globPath === "/") {
|
|
420
|
-
return this._formControl
|
|
439
|
+
return (_a = this._formControl) == null ? void 0 : _a._formModel.values;
|
|
421
440
|
}
|
|
422
441
|
const name = convertGlobPath(globPath);
|
|
423
442
|
return this.getValueIn(name);
|
|
@@ -463,13 +482,13 @@ var FormModelV2 = class extends import_form_core2.FormModel {
|
|
|
463
482
|
effectReturn();
|
|
464
483
|
});
|
|
465
484
|
});
|
|
466
|
-
this.effectMap = DEFAULT.EFFECT_MAP;
|
|
467
|
-
this.effectReturnMap = DEFAULT.EFFECT_RETURN_MAP;
|
|
485
|
+
this.effectMap = DEFAULT.EFFECT_MAP();
|
|
486
|
+
this.effectReturnMap = DEFAULT.EFFECT_RETURN_MAP();
|
|
468
487
|
this.plugins.forEach((p) => {
|
|
469
488
|
p.dispose();
|
|
470
489
|
});
|
|
471
490
|
this.plugins = [];
|
|
472
|
-
this.formFeedbacks = DEFAULT.FORM_FEEDBACKS;
|
|
491
|
+
this.formFeedbacks = DEFAULT.FORM_FEEDBACKS();
|
|
473
492
|
this._valid = DEFAULT.VALID;
|
|
474
493
|
this._formControl = void 0;
|
|
475
494
|
this._initialized = false;
|
|
@@ -480,7 +499,8 @@ var FormModelV2 = class extends import_form_core2.FormModel {
|
|
|
480
499
|
// src/helpers.ts
|
|
481
500
|
var import_form_core3 = require("@flowgram.ai/form-core");
|
|
482
501
|
function isFormV2(node) {
|
|
483
|
-
|
|
502
|
+
var _a;
|
|
503
|
+
return !!((_a = node.getNodeRegistry().formMeta) == null ? void 0 : _a.render);
|
|
484
504
|
}
|
|
485
505
|
function createEffectOptions(event, effect) {
|
|
486
506
|
return {
|
|
@@ -498,10 +518,11 @@ function useWatchFormValues(node) {
|
|
|
498
518
|
const formModel = node.getData(import_form_core4.FlowNodeFormData).getFormModel();
|
|
499
519
|
const refresh = (0, import_utils3.useRefresh)();
|
|
500
520
|
(0, import_react2.useEffect)(() => {
|
|
501
|
-
|
|
521
|
+
var _a;
|
|
522
|
+
const disposable = (_a = formModel.nativeFormModel) == null ? void 0 : _a.onFormValuesChange(() => {
|
|
502
523
|
refresh();
|
|
503
524
|
});
|
|
504
|
-
return () => disposable
|
|
525
|
+
return () => disposable == null ? void 0 : disposable.dispose();
|
|
505
526
|
}, [formModel.nativeFormModel]);
|
|
506
527
|
return formModel.getValues();
|
|
507
528
|
}
|
|
@@ -509,12 +530,13 @@ function useWatchFormValueIn(node, name) {
|
|
|
509
530
|
const formModel = node.getData(import_form_core4.FlowNodeFormData).getFormModel();
|
|
510
531
|
const refresh = (0, import_utils3.useRefresh)();
|
|
511
532
|
(0, import_react2.useEffect)(() => {
|
|
512
|
-
|
|
533
|
+
var _a;
|
|
534
|
+
const disposable = (_a = formModel.nativeFormModel) == null ? void 0 : _a.onFormValuesChange(({ name: changedName }) => {
|
|
513
535
|
if (name === changedName) {
|
|
514
536
|
refresh();
|
|
515
537
|
}
|
|
516
538
|
});
|
|
517
|
-
return () => disposable
|
|
539
|
+
return () => disposable == null ? void 0 : disposable.dispose();
|
|
518
540
|
}, []);
|
|
519
541
|
return formModel.getValueIn(name);
|
|
520
542
|
}
|
|
@@ -562,12 +584,14 @@ var FormPlugin = class {
|
|
|
562
584
|
};
|
|
563
585
|
}
|
|
564
586
|
init(formModel) {
|
|
587
|
+
var _a, _b;
|
|
565
588
|
this._formModel = formModel;
|
|
566
|
-
this.config
|
|
589
|
+
(_b = (_a = this.config) == null ? void 0 : _a.onInit) == null ? void 0 : _b.call(_a, this.ctx, this.opts);
|
|
567
590
|
}
|
|
568
591
|
dispose() {
|
|
569
|
-
|
|
570
|
-
|
|
592
|
+
var _a, _b;
|
|
593
|
+
if ((_a = this.config) == null ? void 0 : _a.onDispose) {
|
|
594
|
+
(_b = this.config) == null ? void 0 : _b.onDispose(this.ctx, this.opts);
|
|
571
595
|
}
|
|
572
596
|
}
|
|
573
597
|
};
|
|
@@ -581,8 +605,9 @@ function defineFormPluginCreator(name, config) {
|
|
|
581
605
|
var import_react3 = __toESM(require("react"));
|
|
582
606
|
var import_form_core5 = require("@flowgram.ai/form-core");
|
|
583
607
|
function getNodeForm(node) {
|
|
584
|
-
|
|
585
|
-
const
|
|
608
|
+
var _a;
|
|
609
|
+
const formModel = (_a = node.getData(import_form_core5.FlowNodeFormData)) == null ? void 0 : _a.getFormModel();
|
|
610
|
+
const nativeFormModel = formModel == null ? void 0 : formModel.nativeFormModel;
|
|
586
611
|
if (!formModel || !nativeFormModel) return void 0;
|
|
587
612
|
const result = {
|
|
588
613
|
initialValues: nativeFormModel.initialValues,
|
|
@@ -592,6 +617,9 @@ function getNodeForm(node) {
|
|
|
592
617
|
state: nativeFormModel.state,
|
|
593
618
|
getValueIn: (name) => nativeFormModel.getValueIn(name),
|
|
594
619
|
setValueIn: (name, value) => nativeFormModel.setValueIn(name, value),
|
|
620
|
+
updateFormValues: (values) => {
|
|
621
|
+
formModel.updateFormValues(values);
|
|
622
|
+
},
|
|
595
623
|
render: () => /* @__PURE__ */ import_react3.default.createElement(import_form_core5.NodeRender, { node }),
|
|
596
624
|
onFormValuesChange: formModel.onFormValuesChange.bind(formModel),
|
|
597
625
|
onFormValueChangeIn: formModel.onFormValueChangeIn.bind(formModel),
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/types.ts","../src/form-model-v2.ts","../src/utils.ts","../src/form-render.tsx","../src/helpers.ts","../src/hooks.ts","../src/form-plugin.ts","../src/get-node-form.tsx"],"sourcesContent":["export * from './types';\nexport * from './form-model-v2';\nexport { isFormV2, createEffectOptions } from './helpers';\nexport * from './hooks';\nexport * from './form-plugin';\nexport { type NodeFormProps, getNodeForm } from './get-node-form';\n","import * as React from 'react';\n\nimport { FormModel, IFormMeta, NodeFormContext } from '@flowgram.ai/form-core';\nimport { FieldName, FieldValue } from '@flowgram.ai/form/src/types';\nimport {\n FormRenderProps,\n IForm,\n Validate as FormValidate,\n ValidateTrigger,\n} from '@flowgram.ai/form';\n\nimport { FormPlugin } from './form-plugin';\nimport { FormModelV2 } from './form-model-v2';\n\nexport interface Node {}\n\nexport interface Flow {}\n\n/**\n * NodeContext contains\n * - node: the Editor's node entity.\n * - playgroundContext: the Editor's playgroundContext injected when initiate the Editor.\n */\ntype NodeContext = NodeFormContext;\n\nexport type Validate<TFieldValue = any, TFormValues = any> = (props: {\n value: TFieldValue;\n formValues: TFormValues;\n context: NodeContext;\n name: FieldName;\n}) => ReturnType<FormValidate<TFieldValue, TFormValues>>;\n\nexport enum DataEvent {\n /* When value change */\n onValueChange = 'onValueChange',\n /**\n * When value Init,it triggers when\n * - defaultValue is configured in formMeta, it will trigger when form is initializing.\n * - defaultValue is configured in Field, it will trigger when this Field is initializing if no initial value is set to this field.\n */\n onValueInit = 'onValueInit',\n /**\n * When Value Init or change\n */\n onValueInitOrChange = 'onValueInitOrChange',\n /* It will trigger when ArrayField.append is called. It relies on ArrayField's rendering. If ArrayField is possibly not rendered in your case, please avoid using this event */\n onArrayAppend = 'onArrayAppend',\n /* It will trigger when ArrayField.delete is called. It relies on ArrayField's rendering. If ArrayField is possibly not rendered in your case, please avoid using this event */\n onArrayDelete = 'onArrayDelete',\n}\n\nexport type EffectReturn = () => void;\n\nexport interface EffectFuncProps<TFieldValue = any, TFormValues = any> {\n name: FieldName;\n value: TFieldValue;\n prevValue?: TFieldValue;\n formValues: TFormValues;\n form: IForm;\n context: NodeContext;\n}\n\nexport type Effect<TFieldValue = any, TFormValues = any> = (\n props: EffectFuncProps<TFieldValue, TFormValues>\n) => void | EffectReturn;\n\nexport type ArrayAppendEffect<TFieldValue = any, TFormValues = any> = (props: {\n index: number;\n value: TFieldValue;\n arrayValues: Array<TFieldValue>;\n formValues: TFormValues;\n form: IForm;\n context: NodeContext;\n}) => void | EffectReturn;\n\nexport type ArrayDeleteEffect<TFieldValue = any, TFormValues = any> = (props: {\n index: number;\n arrayValue: Array<TFieldValue>;\n formValues: TFormValues;\n form: IForm;\n context: NodeContext;\n}) => void | EffectReturn;\n\nexport type EffectOptions =\n | { effect: Effect; event: DataEvent }\n | { effect: ArrayAppendEffect; event: DataEvent }\n | { effect: ArrayDeleteEffect; event: DataEvent };\n\nexport interface FormMeta<TValues = any> {\n /**\n * The render method of the node form content. <Form /> is already integrated, so you don't need to wrap your components with <Form />\n * @param props\n */\n render: (props: FormRenderProps<any>) => React.ReactElement;\n /**\n * When to trigger the validation.\n */\n validateTrigger?: ValidateTrigger;\n /**\n * Form data's validation rules. It's a key value map, where the key is a pattern of data's path (or field name), the value is a validate function.\n */\n validate?: Record<FieldName, Validate>;\n /**\n * Form data's effects. It's a key value map, where the key is a pattern of data's path (or field name), the value is an array of effect configuration.\n */\n effect?: Record<FieldName, EffectOptions[]>;\n /**\n * Form data's complete default value. it will not be sent to formatOnInit, but used directly as form's value when needed.\n */\n defaultValues?: TValues | ((context: NodeContext) => TValues);\n /**\n * This function is to format the value when initiate the form, the returned value will be used as the initial value of the form.\n * @param value value input to node as initialValue.\n * @param context\n */\n formatOnInit?: (value: any, context: NodeContext) => any;\n /**\n * This function is to format the value when FormModel.toJSON is called, the returned value will be used as the final value to be saved .\n * @param value value sent by form before format.\n * @param context\n */\n formatOnSubmit?: (value: any, context: NodeContext) => any;\n /**\n * Form's plugins\n */\n plugins?: FormPlugin[];\n}\n\nexport function isFormModelV2(fm: FormModel | FormModelV2): fm is FormModelV2 {\n return 'onFormValuesChange' in fm;\n}\n\nexport function isFormMetaV2(formMeta: IFormMeta | FormMeta) {\n return 'render' in formMeta;\n}\n\nexport type FormPluginCtx = {\n formModel: FormModelV2;\n} & NodeContext;\n\nexport interface onFormValueChangeInPayload<TValue = FieldValue, TFormValues = FieldValue> {\n value: TValue;\n prevValue: TValue;\n formValues: TFormValues;\n prevFormValues: TFormValues;\n}\n","import { get, groupBy, isEmpty, mapKeys } from 'lodash';\nimport { Disposable, DisposableCollection, Emitter } from '@flowgram.ai/utils';\nimport {\n FlowNodeFormData,\n FormFeedback,\n FormItem,\n FormManager,\n FormModel,\n FormModelValid,\n IFormItem,\n OnFormValuesChangePayload,\n} from '@flowgram.ai/form-core';\nimport {\n createForm,\n FieldArrayModel,\n FieldName,\n FieldValue,\n type FormControl,\n FormModel as NativeFormModel,\n FormValidateReturn,\n Glob,\n IField,\n IFieldArray,\n toForm,\n} from '@flowgram.ai/form';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\nimport { PlaygroundContext } from '@flowgram.ai/core';\n\nimport {\n convertGlobPath,\n findMatchedInMap,\n formFeedbacksToNodeCoreFormFeedbacks,\n mergeEffectMap,\n} from './utils';\nimport {\n DataEvent,\n Effect,\n EffectOptions,\n EffectReturn,\n FormMeta,\n onFormValueChangeInPayload,\n} from './types';\nimport { renderForm } from './form-render';\nimport { FormPlugin } from './form-plugin';\n\nconst DEFAULT = {\n EFFECT_MAP: {},\n EFFECT_RETURN_MAP: new Map([\n [DataEvent.onValueInitOrChange, {}],\n [DataEvent.onValueChange, {}],\n [DataEvent.onValueInit, {}],\n [DataEvent.onArrayAppend, {}],\n [DataEvent.onArrayDelete, {}],\n ]),\n FORM_FEEDBACKS: [],\n VALID: null,\n};\n\nexport class FormModelV2 extends FormModel implements Disposable {\n protected effectMap: Record<string, EffectOptions[]> = DEFAULT.EFFECT_MAP;\n\n protected effectReturnMap: Map<DataEvent, Record<string, EffectReturn>> =\n DEFAULT.EFFECT_RETURN_MAP;\n\n protected plugins: FormPlugin[] = [];\n\n protected node: FlowNodeEntity;\n\n protected formFeedbacks: FormValidateReturn | undefined = DEFAULT.FORM_FEEDBACKS;\n\n protected onInitializedEmitter = new Emitter<FormModel>();\n\n protected onValidateEmitter = new Emitter<FormModel>();\n\n readonly onValidate = this.onValidateEmitter.event;\n\n readonly onInitialized = this.onInitializedEmitter.event;\n\n protected onDisposeEmitter = new Emitter<void>();\n\n readonly onDispose = this.onDisposeEmitter.event;\n\n protected toDispose = new DisposableCollection();\n\n protected onFormValuesChangeEmitter = new Emitter<OnFormValuesChangePayload>();\n\n readonly onFormValuesChange = this.onFormValuesChangeEmitter.event;\n\n protected onValidChangeEmitter = new Emitter<FormModelValid>();\n\n readonly onValidChange = this.onValidChangeEmitter.event;\n\n protected onFeedbacksChangeEmitter = new Emitter<FormFeedback[]>();\n\n readonly onFeedbacksChange = this.onFeedbacksChangeEmitter.event;\n\n constructor(node: FlowNodeEntity) {\n super();\n this.node = node;\n this.toDispose.pushAll([\n this.onInitializedEmitter,\n this.onValidateEmitter,\n this.onValidChangeEmitter,\n this.onFeedbacksChangeEmitter,\n this.onFormValuesChangeEmitter,\n ]);\n }\n\n protected _valid: FormModelValid = DEFAULT.VALID;\n\n get valid(): FormModelValid {\n return this._valid;\n }\n\n private set valid(valid: FormModelValid) {\n this._valid = valid;\n this.onValidChangeEmitter.fire(valid);\n }\n\n get flowNodeEntity() {\n return this.node;\n }\n\n get formManager() {\n return this.node.getService(FormManager);\n }\n\n protected _formControl?: FormControl<any>;\n\n get formControl() {\n return this._formControl;\n }\n\n get formMeta() {\n return this.node.getNodeRegistry().formMeta;\n }\n\n get values() {\n return this.nativeFormModel?.values;\n }\n\n protected _feedbacks: FormFeedback[] = [];\n\n get feedbacks(): FormFeedback[] {\n return this._feedbacks;\n }\n\n private set feedbacks(feedbacks: FormFeedback[]) {\n this._feedbacks = feedbacks;\n this.onFeedbacksChangeEmitter.fire(feedbacks);\n }\n\n get formItemPathMap(): Map<string, IFormItem> {\n return new Map<string, IFormItem>();\n }\n\n protected _initialized: boolean = false;\n\n get initialized(): boolean {\n return this._initialized;\n }\n\n get nodeContext() {\n return {\n node: this.node,\n playgroundContext: this.node.getService(PlaygroundContext),\n };\n }\n\n get nativeFormModel(): NativeFormModel | undefined {\n return this._formControl?._formModel;\n }\n\n render() {\n return renderForm(this);\n }\n\n initPlugins(plugins: FormPlugin[]) {\n if (!plugins.length) {\n return;\n }\n\n this.plugins = plugins;\n plugins.forEach((plugin) => {\n plugin.init(this);\n if (plugin.config?.effect) {\n mergeEffectMap(this.effectMap, plugin.config.effect);\n }\n });\n }\n\n init(formMeta: FormMeta, rawInitialValues?: any) {\n /* 透传 onFormValuesChange 事件给 FlowNodeFormData */\n const formData = this.node.getData<FlowNodeFormData>(FlowNodeFormData);\n this.onFormValuesChange(() => {\n this._valid = null;\n formData.fireChange();\n });\n\n const { validateTrigger, validate, effect } = formMeta;\n if (effect) {\n this.effectMap = effect;\n }\n\n // 计算初始值: defaultValues 是默认表单值,不需要被format, 而rawInitialValues 是用户创建form 时传入的初始值,可能不同于表单数据格式,需要被format\n const defaultValues =\n typeof formMeta.defaultValues === 'function'\n ? formMeta.defaultValues(this.nodeContext)\n : formMeta.defaultValues;\n\n const initialValues = formMeta.formatOnInit\n ? formMeta.formatOnInit(rawInitialValues, this.nodeContext)\n : rawInitialValues;\n\n // 初始化底层表单\n const { control } = createForm({\n initialValues: initialValues || defaultValues,\n validateTrigger,\n context: this.nodeContext,\n validate: validate,\n disableAutoInit: true,\n });\n\n this._formControl = control;\n const nativeFormModel = control._formModel;\n this.toDispose.push(nativeFormModel);\n\n // forward onFormValuesChange event\n nativeFormModel.onFormValuesChange((props) => {\n this.onFormValuesChangeEmitter.fire(props);\n });\n\n if (formMeta.plugins) {\n this.initPlugins(formMeta.plugins);\n }\n\n // Form 数据变更时触发对应的effect\n nativeFormModel.onFormValuesChange(({ values, prevValues, name }) => {\n // 找到所有路径匹配的副作用,包括父亲路径\n const effectKeys = Object.keys(this.effectMap).filter((pattern) =>\n Glob.isMatchOrParent(pattern, name)\n );\n\n effectKeys.forEach((effectKey) => {\n const effectOptionsArr = this.effectMap[effectKey];\n // 执行该事件配置下所有 onValueChange 事件的 effect\n effectOptionsArr.forEach(({ effect, event }: EffectOptions) => {\n if (event === DataEvent.onValueChange || event === DataEvent.onValueInitOrChange) {\n // 对于冒泡的事件,需要获取 parent 的 name\n const currentName = Glob.getParentPathByPattern(effectKey, name);\n\n // 执行上一次effect 的 return\n const prevEffectReturn = this.effectReturnMap.get(event)?.[currentName];\n if (prevEffectReturn) {\n prevEffectReturn();\n }\n\n // 执行effect\n const effectReturn = (effect as Effect)({\n name: currentName,\n value: get(values, currentName),\n prevValue: get(prevValues, currentName),\n formValues: values,\n form: toForm(this.nativeFormModel!),\n context: this.nodeContext,\n });\n\n // 更新 effect return\n if (\n effectReturn &&\n typeof effectReturn === 'function' &&\n this.effectReturnMap.has(event)\n ) {\n const eventMap = this.effectReturnMap.get(event) as Record<string, EffectReturn>;\n eventMap[currentName] = effectReturn;\n }\n }\n });\n });\n });\n\n // Form 数据初始化时触发对应的effect\n nativeFormModel.onFormValuesInit(({ values, name, prevValues }) => {\n Object.keys(this.effectMap).forEach((pattern) => {\n // 找到匹配 pattern 的数据路径\n const paths = Glob.findMatchPaths(values, pattern);\n\n // 获取配置在该 pattern上的所有effect配置\n const effectOptionsArr = this.effectMap[pattern];\n\n effectOptionsArr.forEach(({ event, effect }: EffectOptions) => {\n if (event === DataEvent.onValueInit || event === DataEvent.onValueInitOrChange) {\n paths.forEach((path) => {\n // 对触发 init 事件的 name 或他的字 path 触发effect\n if (Glob.isMatchOrParent(name, path) || name === path) {\n // 执行上一次effect 的 return\n const prevEffectReturn = this.effectReturnMap.get(event)?.[path];\n if (prevEffectReturn) {\n prevEffectReturn();\n }\n\n const effectReturn = (effect as Effect)({\n name: path,\n value: get(values, path),\n formValues: values,\n prevValue: get(prevValues, path),\n form: toForm(this.nativeFormModel!),\n context: this.nodeContext,\n });\n\n // 更新 effect return\n if (\n effectReturn &&\n typeof effectReturn === 'function' &&\n this.effectReturnMap.has(event)\n ) {\n const eventMap = this.effectReturnMap.get(event) as Record<string, EffectReturn>;\n eventMap[path] = effectReturn;\n }\n }\n });\n }\n });\n });\n });\n\n // 为 Field 添加 effect, 主要针对array\n nativeFormModel.onFieldModelCreate((field) => {\n // register effect\n const effectOptionsArr = findMatchedInMap<EffectOptions[]>(field, this.effectMap);\n if (effectOptionsArr?.length) {\n // 按事件聚合\n const eventMap = groupBy(effectOptionsArr, 'event');\n\n mapKeys(eventMap, (optionsArr, event) => {\n const combinedEffect = (props: any) => {\n // 该事件下执行所有effect\n optionsArr.forEach(({ effect }) =>\n effect({\n ...props,\n formValues: nativeFormModel.values,\n form: toForm(this.nativeFormModel!),\n context: this.nodeContext,\n })\n );\n };\n\n switch (event) {\n case DataEvent.onArrayAppend:\n if (field instanceof FieldArrayModel) {\n (field as FieldArrayModel).onAppend(combinedEffect);\n }\n break;\n case DataEvent.onArrayDelete:\n if (field instanceof FieldArrayModel) {\n (field as FieldArrayModel).onDelete(combinedEffect);\n }\n break;\n }\n });\n }\n });\n\n // 手动初始化form\n this._formControl.init();\n\n this._initialized = true;\n\n this.onInitializedEmitter.fire(this);\n\n this.onDispose(() => {\n this._initialized = false;\n this.effectMap = {};\n nativeFormModel.dispose();\n });\n }\n\n toJSON() {\n if (this.formMeta.formatOnSubmit) {\n return this.formMeta.formatOnSubmit(this.nativeFormModel?.values, this.nodeContext);\n }\n return this.nativeFormModel?.values;\n }\n\n clearValid() {\n if (this.valid !== null) {\n this.valid = null;\n }\n }\n\n async validate() {\n this.formFeedbacks = await this.nativeFormModel?.validate();\n this.valid = isEmpty(this.formFeedbacks?.filter((f) => f.level === 'error'));\n this.onValidateEmitter.fire(this);\n return this.valid;\n }\n\n getValues<T = any>(): T | undefined {\n return this._formControl?._formModel.values;\n }\n\n getField<\n TValue = FieldValue,\n TField extends IFieldArray<TValue> | IField<TValue> = IField<TValue>\n >(name: FieldName): TField | undefined {\n let finalName = name.includes('/') ? convertGlobPath(name) : name;\n\n return this.formControl?.getField<TValue, TField>(finalName) as TField;\n }\n\n getValueIn<TValue>(name: FieldName): TValue | undefined {\n let finalName = name.includes('/') ? convertGlobPath(name) : name;\n\n return this.nativeFormModel?.getValueIn(finalName);\n }\n\n setValueIn(name: FieldName, value: any) {\n let finalName = name.includes('/') ? convertGlobPath(name) : name;\n\n this.nativeFormModel?.setValueIn(finalName, value);\n }\n\n /**\n * 监听表单某个路径下的值变化\n * @param name 路径\n * @param callback 回调函数\n */\n onFormValueChangeIn<TValue = FieldValue, TFormValue = FieldValue>(\n name: FieldName,\n callback: (payload: onFormValueChangeInPayload<TValue, TFormValue>) => void\n ): Disposable {\n if (!this._initialized) {\n throw new Error(\n `[NodeEngine] FormModel Error: onFormValueChangeIn can not be called before initialized`\n );\n }\n\n return this.formControl!._formModel.onFormValuesChange(\n ({ name: changedName, values, prevValues }) => {\n if (changedName === name) {\n callback({\n value: get(values, name),\n prevValue: get(prevValues, name),\n formValues: values,\n prevFormValues: prevValues,\n });\n }\n }\n );\n }\n\n /**\n * @deprecated 该方法用于兼容 V1 版本 FormModel接口,如果确定是FormModelV2 请使用 FormModel.getValueIn\n * @param path glob path\n */\n getFormItemValueByPath(globPath: string) {\n if (!globPath) {\n return;\n }\n if (globPath === '/') {\n return this._formControl?._formModel.values;\n }\n const name = convertGlobPath(globPath);\n return this.getValueIn(name!);\n }\n\n async validateWithFeedbacks(): Promise<FormFeedback[]> {\n await this.validate();\n return formFeedbacksToNodeCoreFormFeedbacks(this.formFeedbacks!);\n }\n\n /**\n * @deprecated 该方法用于兼容 V1 版本 FormModel接口,如果确定是FormModelV2, 请使用FormModel.getValueIn 和 FormModel.setValueIn\n * @param path glob path\n */\n getFormItemByPath(path: string): FormItem | undefined {\n if (!this.nativeFormModel) {\n return;\n }\n\n const that = this;\n\n if (path === '/') {\n return {\n get value() {\n return that.nativeFormModel!.values;\n },\n set value(v) {\n that.nativeFormModel!.values = v;\n },\n } as FormItem;\n }\n\n const name = convertGlobPath(path);\n const formItemValue = that.getValueIn(name!);\n return {\n get value() {\n return formItemValue;\n },\n set value(v) {\n that.setValueIn(name, v);\n },\n } as FormItem;\n }\n\n dispose(): void {\n this.onDisposeEmitter.fire();\n\n // 执行所有effect return\n this.effectReturnMap.forEach((eventMap) => {\n Object.values(eventMap).forEach((effectReturn) => {\n effectReturn();\n });\n });\n\n this.effectMap = DEFAULT.EFFECT_MAP;\n this.effectReturnMap = DEFAULT.EFFECT_RETURN_MAP;\n\n this.plugins.forEach((p) => {\n p.dispose();\n });\n\n this.plugins = [];\n\n this.formFeedbacks = DEFAULT.FORM_FEEDBACKS;\n this._valid = DEFAULT.VALID;\n\n this._formControl = undefined;\n this._initialized = false;\n this.toDispose.dispose();\n }\n}\n","import { find, mergeWith } from 'lodash';\nimport { FormFeedback, FormPathService } from '@flowgram.ai/form-core';\nimport { FormValidateReturn } from '@flowgram.ai/form/src/types';\nimport { type FieldModel, FieldName } from '@flowgram.ai/form';\n\nimport { EffectOptions } from './types';\n\nexport function findMatchedInMap<T = any>(\n field: FieldModel<any>,\n validateMap: Record<FieldName, T> | undefined\n): T | undefined {\n if (!validateMap) {\n return;\n }\n if (validateMap[field.name]) {\n return validateMap[field.name];\n }\n\n const found = find(Object.keys(validateMap), (key) => {\n if (key.startsWith('regex:')) {\n const regex = RegExp(key.split(':')[1]);\n return regex.test(field.name);\n }\n return false;\n });\n\n if (found) {\n return validateMap[found];\n }\n}\n\nexport function formFeedbacksToNodeCoreFormFeedbacks(\n formFeedbacks: FormValidateReturn\n): FormFeedback[] {\n return formFeedbacks.map(\n (f) =>\n ({\n feedbackStatus: f.level,\n feedbackText: f.message,\n path: f.name,\n } as FormFeedback)\n );\n}\n\nexport function convertGlobPath(path: string) {\n if (path.startsWith('/')) {\n const parts = FormPathService.normalize(path).slice(1).split('/');\n return parts.join('.');\n }\n return path;\n}\n\nexport function mergeEffectMap(\n origin: Record<string, EffectOptions[]>,\n source: Record<string, EffectOptions[]>\n) {\n return mergeWith(origin, source, function (objValue: EffectOptions[], srcValue: EffectOptions[]) {\n return (objValue || []).concat(srcValue);\n });\n}\n","import React from 'react';\n\nimport { Form } from '@flowgram.ai/form';\n\nimport { FormModelV2 } from './form-model-v2';\n\ninterface FormRenderProps {\n formModel: FormModelV2;\n}\n\nconst FormRender = ({ formModel }: FormRenderProps) =>\n formModel?.formControl ? (\n <>\n <Form control={formModel?.formControl} keepModelOnUnMount>\n {formModel.formMeta.render}\n </Form>\n </>\n ) : null;\n\nexport function renderForm(formModel: FormModelV2) {\n return <FormRender formModel={formModel} />;\n}\n","import { FlowNodeFormData } from '@flowgram.ai/form-core';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nimport { DataEvent } from './types';\nimport { FormModelV2 } from './form-model-v2';\n\nexport function getFormModel(node: FlowNodeEntity) {\n // @ts-ignore\n return node.getData<FlowNodeFormData>(FlowNodeFormData)?.formModel as FormModelV2;\n}\n\nexport function isFormV2(node: FlowNodeEntity) {\n return !!node.getNodeRegistry().formMeta?.render;\n}\n\nexport function createEffectOptions<T>(\n event: DataEvent,\n effect: T\n): { effect: T; event: DataEvent } {\n return {\n event,\n effect,\n };\n}\n","import { useEffect } from 'react';\n\nimport { useRefresh } from '@flowgram.ai/utils';\nimport { FlowNodeFormData } from '@flowgram.ai/form-core';\nimport { Errors, Warnings } from '@flowgram.ai/form/src/types';\nimport { FormState, useFormErrors, useFormState, useFormWarnings } from '@flowgram.ai/form';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nimport { FormModelV2 } from './form-model-v2';\n\n/**\n * Listen to Form's values and refresh the React component.\n * By providing related node, you can use this hook outside the Form Component.\n * @param node\n */\nexport function useWatchFormValues<T = any>(node: FlowNodeEntity): T | undefined {\n const formModel = node.getData(FlowNodeFormData).getFormModel<FormModelV2>();\n const refresh = useRefresh();\n\n useEffect(() => {\n const disposable = formModel.nativeFormModel?.onFormValuesChange(() => {\n refresh();\n });\n return () => disposable?.dispose();\n }, [formModel.nativeFormModel]);\n\n return formModel.getValues<T>();\n}\n\n/**\n * Listen to Form's value in a certain path and refresh the React component.\n * By providing related node, you can use this hook outside the Form Component.\n * @param node\n */\nexport function useWatchFormValueIn<T = any>(node: FlowNodeEntity, name: string): T | undefined {\n const formModel = node.getData(FlowNodeFormData).getFormModel<FormModelV2>();\n const refresh = useRefresh();\n\n useEffect(() => {\n const disposable = formModel.nativeFormModel?.onFormValuesChange(({ name: changedName }) => {\n if (name === changedName) {\n refresh();\n }\n });\n\n return () => disposable?.dispose();\n }, []);\n\n return formModel.getValueIn<T>(name);\n}\n\n/**\n * Listen to FormModel's initialization and refresh React component.\n * By providing related node, you can use this hook outside the Form Component.\n * @param node\n */\nexport function useInitializedFormModel(node: FlowNodeEntity) {\n const formModel = node.getData(FlowNodeFormData).getFormModel<FormModelV2>();\n const refresh = useRefresh();\n\n useEffect(() => {\n const disposable = formModel.onInitialized(() => {\n refresh();\n });\n return () => disposable.dispose();\n }, [formModel]);\n\n return formModel;\n}\n\n/**\n * Get Form's state, Form State is a proxy, it will refresh the React component when the value you accessed changed\n * By providing related node, you can use this hook outside the Form Component.\n * @param node\n */\nexport function useWatchFormState(node: FlowNodeEntity): FormState | undefined {\n const formModel = useInitializedFormModel(node);\n return useFormState(formModel.formControl);\n}\n\n/**\n * Get Form's errors, Form errors is a proxy, it will refresh the React component when the value you accessed changed\n * By providing related node, you can use this hook outside the Form Component.\n * @param node\n */\nexport function useWatchFormErrors(node: FlowNodeEntity): Errors | undefined {\n const formModel = useInitializedFormModel(node);\n return useFormErrors(formModel.formControl);\n}\n\n/**\n * Get Form's warnings, Form warnings is a proxy, it will refresh the React component when the value you accessed changed\n * By providing related node, you can use this hook outside the Form Component.\n * @param node\n */\nexport function useWatchFormWarnings(node: FlowNodeEntity): Warnings | undefined {\n const formModel = useInitializedFormModel(node);\n return useFormWarnings(formModel.formControl);\n}\n","import { nanoid } from 'nanoid';\nimport { Disposable } from '@flowgram.ai/utils';\n\nimport { EffectOptions, FormPluginCtx } from './types';\nimport { FormModelV2 } from './form-model-v2';\n\nexport interface FormPluginConfig<Opts = any> {\n /**\n * FormModel 初始化时执行\n * @param ctx\n */\n onInit?: (ctx: FormPluginCtx, opts: Opts) => void;\n\n /**\n * 同 FormMeta 中的effects 会与 FormMeta 中的effects 合并\n */\n effect?: Record<string, EffectOptions[]>;\n /**\n * FormModel 销毁时执行\n * @param ctx\n */\n onDispose?: (ctx: FormPluginCtx, opts: Opts) => void;\n}\n\nexport class FormPlugin<Opts = any> implements Disposable {\n readonly name: string;\n\n readonly pluginId: string;\n\n readonly config: FormPluginConfig;\n\n readonly opts?: Opts;\n\n protected _formModel: FormModelV2;\n\n constructor(name: string, config: FormPluginConfig, opts?: Opts) {\n this.name = name;\n this.pluginId = `${name}__${nanoid()}`;\n this.config = config;\n this.opts = opts;\n }\n\n get formModel(): FormModelV2 {\n return this._formModel;\n }\n\n get ctx() {\n return {\n formModel: this.formModel,\n node: this.formModel.nodeContext.node,\n playgroundContext: this.formModel.nodeContext.playgroundContext,\n };\n }\n\n init(formModel: FormModelV2) {\n this._formModel = formModel;\n this.config?.onInit?.(this.ctx, this.opts);\n }\n\n dispose() {\n if (this.config?.onDispose) {\n this.config?.onDispose(this.ctx, this.opts);\n }\n }\n}\n\nexport function defineFormPluginCreator<Opts>(name: string, config: FormPluginConfig) {\n return function (opts: Opts) {\n return new FormPlugin(name, config, opts);\n };\n}\n","import React from 'react';\n\nimport { Disposable, Event } from '@flowgram.ai/utils';\nimport { FlowNodeFormData, NodeRender, OnFormValuesChangePayload } from '@flowgram.ai/form-core';\nimport { FieldName, FieldValue, FormState } from '@flowgram.ai/form';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nimport { onFormValueChangeInPayload } from './types';\nimport { FormModelV2 } from './form-model-v2';\n\nexport interface NodeFormProps<TValues> {\n /**\n * The initialValues of the form.\n */\n initialValues: TValues;\n /**\n * Form values. Returns a deep copy of the data in the store.\n */\n values: TValues;\n /**\n * Form state\n */\n state: FormState;\n /**\n * Get value in certain path\n * @param name path\n */\n getValueIn<TValue = FieldValue>(name: FieldName): TValue;\n\n /**\n * Set value in certain path.\n * It will trigger the re-rendering of the Field Component if a Field is related to this path\n * @param name path\n */\n setValueIn<TValue>(name: FieldName, value: TValue): void;\n /**\n * Render form\n */\n render: () => React.ReactNode;\n /**\n * Form value change event\n */\n onFormValuesChange: Event<OnFormValuesChangePayload>;\n /**\n * Trigger form validate\n */\n validate: () => Promise<boolean>;\n /**\n * Form validate event\n */\n onValidate: Event<FormState>;\n /**\n * Form field value change event\n */\n onFormValueChangeIn<TValue = FieldValue, TFormValue = FieldValue>(\n name: FieldName,\n callback: (payload: onFormValueChangeInPayload<TValue, TFormValue>) => void\n ): Disposable;\n}\n\n/**\n * Only support FormModelV2\n * @param node\n */\nexport function getNodeForm<TValues = FieldValue>(\n node: FlowNodeEntity\n): NodeFormProps<TValues> | undefined {\n const formModel = node.getData<FlowNodeFormData>(FlowNodeFormData)?.getFormModel<FormModelV2>();\n const nativeFormModel = formModel?.nativeFormModel;\n\n if (!formModel || !nativeFormModel) return undefined;\n\n const result: NodeFormProps<TValues> = {\n initialValues: nativeFormModel.initialValues,\n get values() {\n return nativeFormModel.values;\n },\n state: nativeFormModel.state,\n getValueIn: (name: FieldName) => nativeFormModel.getValueIn(name),\n setValueIn: (name: FieldName, value: any) => nativeFormModel.setValueIn(name, value),\n render: () => <NodeRender node={node} />,\n onFormValuesChange: formModel.onFormValuesChange.bind(formModel),\n onFormValueChangeIn: formModel.onFormValueChangeIn.bind(formModel),\n onValidate: formModel.nativeFormModel.onValidate,\n validate: formModel.validate.bind(formModel),\n };\n\n Object.defineProperty(result, '_formModel', {\n enumerable: false,\n get() {\n return formModel;\n },\n });\n return result;\n}\n"],"mappings":"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","names":["DataEvent","import_lodash","import_form_core","import_form","React","effect","import_form_core","import_react","import_utils","import_form_core","import_form","import_react","import_form_core","React"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/types.ts","../src/form-model-v2.ts","../src/utils.ts","../src/form-render.tsx","../src/helpers.ts","../src/hooks.ts","../src/form-plugin.ts","../src/get-node-form.tsx"],"sourcesContent":["export * from './types';\nexport * from './form-model-v2';\nexport { isFormV2, createEffectOptions } from './helpers';\nexport * from './hooks';\nexport * from './form-plugin';\nexport { type NodeFormProps, getNodeForm } from './get-node-form';\n","import * as React from 'react';\n\nimport { FormModel, IFormMeta, NodeFormContext } from '@flowgram.ai/form-core';\nimport { FieldName, FieldValue } from '@flowgram.ai/form/src/types';\nimport {\n FormRenderProps,\n IForm,\n Validate as FormValidate,\n ValidateTrigger,\n} from '@flowgram.ai/form';\n\nimport { FormPlugin } from './form-plugin';\nimport { FormModelV2 } from './form-model-v2';\n\nexport interface Node {}\n\nexport interface Flow {}\n\n/**\n * NodeContext contains\n * - node: the Editor's node entity.\n * - playgroundContext: the Editor's playgroundContext injected when initiate the Editor.\n */\ntype NodeContext = NodeFormContext;\n\nexport type Validate<TFieldValue = any, TFormValues = any> = (props: {\n value: TFieldValue;\n formValues: TFormValues;\n context: NodeContext;\n name: FieldName;\n}) => ReturnType<FormValidate<TFieldValue, TFormValues>>;\n\nexport enum DataEvent {\n /* When value change */\n onValueChange = 'onValueChange',\n /**\n * When value Init,it triggers when\n * - defaultValue is configured in formMeta, it will trigger when form is initializing.\n * - defaultValue is configured in Field, it will trigger when this Field is initializing if no initial value is set to this field.\n */\n onValueInit = 'onValueInit',\n /**\n * When Value Init or change\n */\n onValueInitOrChange = 'onValueInitOrChange',\n /* It will trigger when ArrayField.append is called. It relies on ArrayField's rendering. If ArrayField is possibly not rendered in your case, please avoid using this event */\n onArrayAppend = 'onArrayAppend',\n /* It will trigger when ArrayField.delete is called. It relies on ArrayField's rendering. If ArrayField is possibly not rendered in your case, please avoid using this event */\n onArrayDelete = 'onArrayDelete',\n}\n\nexport type EffectReturn = () => void;\n\nexport interface EffectFuncProps<TFieldValue = any, TFormValues = any> {\n name: FieldName;\n value: TFieldValue;\n prevValue?: TFieldValue;\n formValues: TFormValues;\n form: IForm;\n context: NodeContext;\n}\n\nexport type Effect<TFieldValue = any, TFormValues = any> = (\n props: EffectFuncProps<TFieldValue, TFormValues>\n) => void | EffectReturn;\n\nexport type ArrayAppendEffect<TFieldValue = any, TFormValues = any> = (props: {\n index: number;\n value: TFieldValue;\n arrayValues: Array<TFieldValue>;\n formValues: TFormValues;\n form: IForm;\n context: NodeContext;\n}) => void | EffectReturn;\n\nexport type ArrayDeleteEffect<TFieldValue = any, TFormValues = any> = (props: {\n index: number;\n arrayValue: Array<TFieldValue>;\n formValues: TFormValues;\n form: IForm;\n context: NodeContext;\n}) => void | EffectReturn;\n\nexport type EffectOptions =\n | { effect: Effect; event: DataEvent }\n | { effect: ArrayAppendEffect; event: DataEvent }\n | { effect: ArrayDeleteEffect; event: DataEvent };\n\nexport interface FormMeta<TValues = any> {\n /**\n * The render method of the node form content. <Form /> is already integrated, so you don't need to wrap your components with <Form />\n * @param props\n */\n render: (props: FormRenderProps<any>) => React.ReactElement;\n /**\n * When to trigger the validation.\n */\n validateTrigger?: ValidateTrigger;\n /**\n * Form data's validation rules. It's a key value map, where the key is a pattern of data's path (or field name), the value is a validate function.\n */\n validate?: Record<FieldName, Validate>;\n /**\n * Form data's effects. It's a key value map, where the key is a pattern of data's path (or field name), the value is an array of effect configuration.\n */\n effect?: Record<FieldName, EffectOptions[]>;\n /**\n * Form data's complete default value. it will not be sent to formatOnInit, but used directly as form's value when needed.\n */\n defaultValues?: TValues | ((context: NodeContext) => TValues);\n /**\n * This function is to format the value when initiate the form, the returned value will be used as the initial value of the form.\n * @param value value input to node as initialValue.\n * @param context\n */\n formatOnInit?: (value: any, context: NodeContext) => any;\n /**\n * This function is to format the value when FormModel.toJSON is called, the returned value will be used as the final value to be saved .\n * @param value value sent by form before format.\n * @param context\n */\n formatOnSubmit?: (value: any, context: NodeContext) => any;\n /**\n * Form's plugins\n */\n plugins?: FormPlugin[];\n}\n\nexport function isFormModelV2(fm: FormModel | FormModelV2): fm is FormModelV2 {\n return 'onFormValuesChange' in fm;\n}\n\nexport function isFormMetaV2(formMeta: IFormMeta | FormMeta) {\n return 'render' in formMeta;\n}\n\nexport type FormPluginCtx = {\n formModel: FormModelV2;\n} & NodeContext;\n\nexport interface onFormValueChangeInPayload<TValue = FieldValue, TFormValues = FieldValue> {\n value: TValue;\n prevValue: TValue;\n formValues: TFormValues;\n prevFormValues: TFormValues;\n}\n","import { get, groupBy, isEmpty, mapKeys } from 'lodash';\nimport { Disposable, DisposableCollection, Emitter } from '@flowgram.ai/utils';\nimport {\n FlowNodeFormData,\n FormFeedback,\n FormItem,\n FormManager,\n FormModel,\n FormModelValid,\n IFormItem,\n OnFormValuesChangePayload,\n} from '@flowgram.ai/form-core';\nimport {\n createForm,\n FieldArrayModel,\n FieldName,\n FieldValue,\n type FormControl,\n FormModel as NativeFormModel,\n FormValidateReturn,\n Glob,\n IField,\n IFieldArray,\n toForm,\n} from '@flowgram.ai/form';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\nimport { PlaygroundContext } from '@flowgram.ai/core';\n\nimport {\n convertGlobPath,\n findMatchedInMap,\n formFeedbacksToNodeCoreFormFeedbacks,\n mergeEffectMap,\n} from './utils';\nimport {\n DataEvent,\n Effect,\n EffectOptions,\n EffectReturn,\n FormMeta,\n onFormValueChangeInPayload,\n} from './types';\nimport { renderForm } from './form-render';\nimport { FormPlugin } from './form-plugin';\n\nconst DEFAULT = {\n // Different formModel should have different reference\n EFFECT_MAP: () => ({}),\n EFFECT_RETURN_MAP: () =>\n new Map([\n [DataEvent.onValueInitOrChange, {}],\n [DataEvent.onValueChange, {}],\n [DataEvent.onValueInit, {}],\n [DataEvent.onArrayAppend, {}],\n [DataEvent.onArrayDelete, {}],\n ]),\n FORM_FEEDBACKS: () => [],\n VALID: null,\n};\n\nexport class FormModelV2 extends FormModel implements Disposable {\n protected effectMap: Record<string, EffectOptions[]> = DEFAULT.EFFECT_MAP();\n\n protected effectReturnMap: Map<DataEvent, Record<string, EffectReturn>> =\n DEFAULT.EFFECT_RETURN_MAP();\n\n protected plugins: FormPlugin[] = [];\n\n protected node: FlowNodeEntity;\n\n protected formFeedbacks: FormValidateReturn | undefined = DEFAULT.FORM_FEEDBACKS();\n\n protected onInitializedEmitter = new Emitter<FormModel>();\n\n protected onValidateEmitter = new Emitter<FormModel>();\n\n readonly onValidate = this.onValidateEmitter.event;\n\n readonly onInitialized = this.onInitializedEmitter.event;\n\n protected onDisposeEmitter = new Emitter<void>();\n\n readonly onDispose = this.onDisposeEmitter.event;\n\n protected toDispose = new DisposableCollection();\n\n protected onFormValuesChangeEmitter = new Emitter<OnFormValuesChangePayload>();\n\n readonly onFormValuesChange = this.onFormValuesChangeEmitter.event;\n\n protected onValidChangeEmitter = new Emitter<FormModelValid>();\n\n readonly onValidChange = this.onValidChangeEmitter.event;\n\n protected onFeedbacksChangeEmitter = new Emitter<FormFeedback[]>();\n\n readonly onFeedbacksChange = this.onFeedbacksChangeEmitter.event;\n\n constructor(node: FlowNodeEntity) {\n super();\n this.node = node;\n this.toDispose.pushAll([\n this.onInitializedEmitter,\n this.onValidateEmitter,\n this.onValidChangeEmitter,\n this.onFeedbacksChangeEmitter,\n this.onFormValuesChangeEmitter,\n ]);\n }\n\n protected _valid: FormModelValid = DEFAULT.VALID;\n\n get valid(): FormModelValid {\n return this._valid;\n }\n\n private set valid(valid: FormModelValid) {\n this._valid = valid;\n this.onValidChangeEmitter.fire(valid);\n }\n\n get flowNodeEntity() {\n return this.node;\n }\n\n get formManager() {\n return this.node.getService(FormManager);\n }\n\n protected _formControl?: FormControl<any>;\n\n get formControl() {\n return this._formControl;\n }\n\n get formMeta() {\n return this.node.getNodeRegistry().formMeta;\n }\n\n get values() {\n return this.nativeFormModel?.values;\n }\n\n protected _feedbacks: FormFeedback[] = [];\n\n get feedbacks(): FormFeedback[] {\n return this._feedbacks;\n }\n\n updateFormValues(value: any) {\n if (this.nativeFormModel) {\n const finalValue = this.formMeta.formatOnInit\n ? this.formMeta.formatOnInit(value, this.nodeContext)\n : value;\n this.nativeFormModel.values = finalValue;\n }\n }\n\n private set feedbacks(feedbacks: FormFeedback[]) {\n this._feedbacks = feedbacks;\n this.onFeedbacksChangeEmitter.fire(feedbacks);\n }\n\n get formItemPathMap(): Map<string, IFormItem> {\n return new Map<string, IFormItem>();\n }\n\n protected _initialized: boolean = false;\n\n get initialized(): boolean {\n return this._initialized;\n }\n\n get nodeContext() {\n return {\n node: this.node,\n playgroundContext: this.node.getService(PlaygroundContext),\n };\n }\n\n get nativeFormModel(): NativeFormModel | undefined {\n return this._formControl?._formModel;\n }\n\n render() {\n return renderForm(this);\n }\n\n initPlugins(plugins: FormPlugin[]) {\n if (!plugins.length) {\n return;\n }\n\n this.plugins = plugins;\n plugins.forEach((plugin) => {\n plugin.init(this);\n if (plugin.config?.effect) {\n mergeEffectMap(this.effectMap, plugin.config.effect);\n }\n });\n }\n\n init(formMeta: FormMeta, rawInitialValues?: any) {\n /* 透传 onFormValuesChange 事件给 FlowNodeFormData */\n const formData = this.node.getData<FlowNodeFormData>(FlowNodeFormData);\n this.onFormValuesChange(() => {\n this._valid = null;\n formData.fireChange();\n });\n\n const { validateTrigger, validate, effect } = formMeta;\n if (effect) {\n this.effectMap = effect;\n }\n\n // 计算初始值: defaultValues 是默认表单值,不需要被format, 而rawInitialValues 是用户创建form 时传入的初始值,可能不同于表单数据格式,需要被format\n const defaultValues =\n typeof formMeta.defaultValues === 'function'\n ? formMeta.defaultValues(this.nodeContext)\n : formMeta.defaultValues;\n\n const initialValues = formMeta.formatOnInit\n ? formMeta.formatOnInit(rawInitialValues, this.nodeContext)\n : rawInitialValues;\n\n // 初始化底层表单\n const { control } = createForm({\n initialValues: initialValues || defaultValues,\n validateTrigger,\n context: this.nodeContext,\n validate: validate,\n disableAutoInit: true,\n });\n\n this._formControl = control;\n const nativeFormModel = control._formModel;\n this.toDispose.push(nativeFormModel);\n\n // forward onFormValuesChange event\n nativeFormModel.onFormValuesChange((props) => {\n this.onFormValuesChangeEmitter.fire(props);\n });\n\n if (formMeta.plugins) {\n this.initPlugins(formMeta.plugins);\n }\n\n // Form 数据变更时触发对应的effect\n nativeFormModel.onFormValuesChange(({ values, prevValues, name }) => {\n // 找到所有路径匹配的副作用,包括父亲路径\n const effectKeys = Object.keys(this.effectMap).filter((pattern) =>\n Glob.isMatchOrParent(pattern, name)\n );\n\n effectKeys.forEach((effectKey) => {\n const effectOptionsArr = this.effectMap[effectKey];\n // 执行该事件配置下所有 onValueChange 事件的 effect\n effectOptionsArr.forEach(({ effect, event }: EffectOptions) => {\n if (event === DataEvent.onValueChange || event === DataEvent.onValueInitOrChange) {\n // 对于冒泡的事件,需要获取 parent 的 name\n const currentName = Glob.getParentPathByPattern(effectKey, name);\n\n // 执行上一次effect 的 return\n const prevEffectReturn = this.effectReturnMap.get(event)?.[currentName];\n if (prevEffectReturn) {\n prevEffectReturn();\n }\n\n // 执行effect\n const effectReturn = (effect as Effect)({\n name: currentName,\n value: get(values, currentName),\n prevValue: get(prevValues, currentName),\n formValues: values,\n form: toForm(this.nativeFormModel!),\n context: this.nodeContext,\n });\n\n // 更新 effect return\n if (\n effectReturn &&\n typeof effectReturn === 'function' &&\n this.effectReturnMap.has(event)\n ) {\n const eventMap = this.effectReturnMap.get(event) as Record<string, EffectReturn>;\n eventMap[currentName] = effectReturn;\n }\n }\n });\n });\n });\n\n // Form 数据初始化时触发对应的effect\n nativeFormModel.onFormValuesInit(({ values, name, prevValues }) => {\n Object.keys(this.effectMap).forEach((pattern) => {\n // 找到匹配 pattern 的数据路径\n const paths = Glob.findMatchPaths(values, pattern);\n\n // 获取配置在该 pattern上的所有effect配置\n const effectOptionsArr = this.effectMap[pattern];\n\n effectOptionsArr.forEach(({ event, effect }: EffectOptions) => {\n if (event === DataEvent.onValueInit || event === DataEvent.onValueInitOrChange) {\n paths.forEach((path) => {\n // 对触发 init 事件的 name 或他的字 path 触发effect\n if (Glob.isMatchOrParent(name, path) || name === path) {\n // 执行上一次effect 的 return\n const prevEffectReturn = this.effectReturnMap.get(event)?.[path];\n if (prevEffectReturn) {\n prevEffectReturn();\n }\n\n const effectReturn = (effect as Effect)({\n name: path,\n value: get(values, path),\n formValues: values,\n prevValue: get(prevValues, path),\n form: toForm(this.nativeFormModel!),\n context: this.nodeContext,\n });\n\n // 更新 effect return\n if (\n effectReturn &&\n typeof effectReturn === 'function' &&\n this.effectReturnMap.has(event)\n ) {\n const eventMap = this.effectReturnMap.get(event) as Record<string, EffectReturn>;\n eventMap[path] = effectReturn;\n }\n }\n });\n }\n });\n });\n });\n\n // 为 Field 添加 effect, 主要针对array\n nativeFormModel.onFieldModelCreate((field) => {\n // register effect\n const effectOptionsArr = findMatchedInMap<EffectOptions[]>(field, this.effectMap);\n if (effectOptionsArr?.length) {\n // 按事件聚合\n const eventMap = groupBy(effectOptionsArr, 'event');\n\n mapKeys(eventMap, (optionsArr, event) => {\n const combinedEffect = (props: any) => {\n // 该事件下执行所有effect\n optionsArr.forEach(({ effect }) =>\n effect({\n ...props,\n formValues: nativeFormModel.values,\n form: toForm(this.nativeFormModel!),\n context: this.nodeContext,\n })\n );\n };\n\n switch (event) {\n case DataEvent.onArrayAppend:\n if (field instanceof FieldArrayModel) {\n (field as FieldArrayModel).onAppend(combinedEffect);\n }\n break;\n case DataEvent.onArrayDelete:\n if (field instanceof FieldArrayModel) {\n (field as FieldArrayModel).onDelete(combinedEffect);\n }\n break;\n }\n });\n }\n });\n\n // 手动初始化form\n this._formControl.init();\n\n this._initialized = true;\n\n this.onInitializedEmitter.fire(this);\n\n this.onDispose(() => {\n this._initialized = false;\n this.effectMap = {};\n nativeFormModel.dispose();\n });\n }\n\n toJSON() {\n if (this.formMeta.formatOnSubmit) {\n return this.formMeta.formatOnSubmit(this.nativeFormModel?.values, this.nodeContext);\n }\n return this.nativeFormModel?.values;\n }\n\n clearValid() {\n if (this.valid !== null) {\n this.valid = null;\n }\n }\n\n async validate() {\n this.formFeedbacks = await this.nativeFormModel?.validate();\n this.valid = isEmpty(this.formFeedbacks?.filter((f) => f.level === 'error'));\n this.onValidateEmitter.fire(this);\n return this.valid;\n }\n\n getValues<T = any>(): T | undefined {\n return this._formControl?._formModel.values;\n }\n\n getField<\n TValue = FieldValue,\n TField extends IFieldArray<TValue> | IField<TValue> = IField<TValue>\n >(name: FieldName): TField | undefined {\n let finalName = name.includes('/') ? convertGlobPath(name) : name;\n\n return this.formControl?.getField<TValue, TField>(finalName) as TField;\n }\n\n getValueIn<TValue>(name: FieldName): TValue | undefined {\n let finalName = name.includes('/') ? convertGlobPath(name) : name;\n\n return this.nativeFormModel?.getValueIn(finalName);\n }\n\n setValueIn(name: FieldName, value: any) {\n let finalName = name.includes('/') ? convertGlobPath(name) : name;\n\n this.nativeFormModel?.setValueIn(finalName, value);\n }\n\n /**\n * 监听表单某个路径下的值变化\n * @param name 路径\n * @param callback 回调函数\n */\n onFormValueChangeIn<TValue = FieldValue, TFormValue = FieldValue>(\n name: FieldName,\n callback: (payload: onFormValueChangeInPayload<TValue, TFormValue>) => void\n ): Disposable {\n if (!this._initialized) {\n throw new Error(\n `[NodeEngine] FormModel Error: onFormValueChangeIn can not be called before initialized`\n );\n }\n\n return this.formControl!._formModel.onFormValuesChange(\n ({ name: changedName, values, prevValues }) => {\n if (changedName === name) {\n callback({\n value: get(values, name),\n prevValue: get(prevValues, name),\n formValues: values,\n prevFormValues: prevValues,\n });\n }\n }\n );\n }\n\n /**\n * @deprecated 该方法用于兼容 V1 版本 FormModel接口,如果确定是FormModelV2 请使用 FormModel.getValueIn\n * @param path glob path\n */\n getFormItemValueByPath(globPath: string) {\n if (!globPath) {\n return;\n }\n if (globPath === '/') {\n return this._formControl?._formModel.values;\n }\n const name = convertGlobPath(globPath);\n return this.getValueIn(name!);\n }\n\n async validateWithFeedbacks(): Promise<FormFeedback[]> {\n await this.validate();\n return formFeedbacksToNodeCoreFormFeedbacks(this.formFeedbacks!);\n }\n\n /**\n * @deprecated 该方法用于兼容 V1 版本 FormModel接口,如果确定是FormModelV2, 请使用FormModel.getValueIn 和 FormModel.setValueIn\n * @param path glob path\n */\n getFormItemByPath(path: string): FormItem | undefined {\n if (!this.nativeFormModel) {\n return;\n }\n\n const that = this;\n\n if (path === '/') {\n return {\n get value() {\n return that.nativeFormModel!.values;\n },\n set value(v) {\n that.nativeFormModel!.values = v;\n },\n } as FormItem;\n }\n\n const name = convertGlobPath(path);\n const formItemValue = that.getValueIn(name!);\n return {\n get value() {\n return formItemValue;\n },\n set value(v) {\n that.setValueIn(name, v);\n },\n } as FormItem;\n }\n\n dispose(): void {\n this.onDisposeEmitter.fire();\n\n // 执行所有effect return\n this.effectReturnMap.forEach((eventMap) => {\n Object.values(eventMap).forEach((effectReturn) => {\n effectReturn();\n });\n });\n\n this.effectMap = DEFAULT.EFFECT_MAP();\n this.effectReturnMap = DEFAULT.EFFECT_RETURN_MAP();\n\n this.plugins.forEach((p) => {\n p.dispose();\n });\n\n this.plugins = [];\n\n this.formFeedbacks = DEFAULT.FORM_FEEDBACKS();\n this._valid = DEFAULT.VALID;\n\n this._formControl = undefined;\n this._initialized = false;\n this.toDispose.dispose();\n }\n}\n","import { find, mergeWith } from 'lodash';\nimport { FormFeedback, FormPathService } from '@flowgram.ai/form-core';\nimport { FormValidateReturn } from '@flowgram.ai/form/src/types';\nimport { type FieldModel, FieldName } from '@flowgram.ai/form';\n\nimport { EffectOptions } from './types';\n\nexport function findMatchedInMap<T = any>(\n field: FieldModel<any>,\n validateMap: Record<FieldName, T> | undefined\n): T | undefined {\n if (!validateMap) {\n return;\n }\n if (validateMap[field.name]) {\n return validateMap[field.name];\n }\n\n const found = find(Object.keys(validateMap), (key) => {\n if (key.startsWith('regex:')) {\n const regex = RegExp(key.split(':')[1]);\n return regex.test(field.name);\n }\n return false;\n });\n\n if (found) {\n return validateMap[found];\n }\n}\n\nexport function formFeedbacksToNodeCoreFormFeedbacks(\n formFeedbacks: FormValidateReturn\n): FormFeedback[] {\n return formFeedbacks.map(\n (f) =>\n ({\n feedbackStatus: f.level,\n feedbackText: f.message,\n path: f.name,\n } as FormFeedback)\n );\n}\n\nexport function convertGlobPath(path: string) {\n if (path.startsWith('/')) {\n const parts = FormPathService.normalize(path).slice(1).split('/');\n return parts.join('.');\n }\n return path;\n}\n\nexport function mergeEffectMap(\n origin: Record<string, EffectOptions[]>,\n source: Record<string, EffectOptions[]>\n) {\n return mergeWith(origin, source, function (objValue: EffectOptions[], srcValue: EffectOptions[]) {\n return (objValue || []).concat(srcValue);\n });\n}\n","import React from 'react';\n\nimport { Form } from '@flowgram.ai/form';\n\nimport { FormModelV2 } from './form-model-v2';\n\ninterface FormRenderProps {\n formModel: FormModelV2;\n}\n\nconst FormRender = ({ formModel }: FormRenderProps) =>\n formModel?.formControl ? (\n <>\n <Form control={formModel?.formControl} keepModelOnUnMount>\n {formModel.formMeta.render}\n </Form>\n </>\n ) : null;\n\nexport function renderForm(formModel: FormModelV2) {\n return <FormRender formModel={formModel} />;\n}\n","import { FlowNodeFormData } from '@flowgram.ai/form-core';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nimport { DataEvent } from './types';\nimport { FormModelV2 } from './form-model-v2';\n\nexport function getFormModel(node: FlowNodeEntity) {\n // @ts-ignore\n return node.getData<FlowNodeFormData>(FlowNodeFormData)?.formModel as FormModelV2;\n}\n\nexport function isFormV2(node: FlowNodeEntity) {\n return !!node.getNodeRegistry().formMeta?.render;\n}\n\nexport function createEffectOptions<T>(\n event: DataEvent,\n effect: T\n): { effect: T; event: DataEvent } {\n return {\n event,\n effect,\n };\n}\n","import { useEffect } from 'react';\n\nimport { useRefresh } from '@flowgram.ai/utils';\nimport { FlowNodeFormData } from '@flowgram.ai/form-core';\nimport { Errors, Warnings } from '@flowgram.ai/form/src/types';\nimport { FormState, useFormErrors, useFormState, useFormWarnings } from '@flowgram.ai/form';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nimport { FormModelV2 } from './form-model-v2';\n\n/**\n * Listen to Form's values and refresh the React component.\n * By providing related node, you can use this hook outside the Form Component.\n * @param node\n */\nexport function useWatchFormValues<T = any>(node: FlowNodeEntity): T | undefined {\n const formModel = node.getData(FlowNodeFormData).getFormModel<FormModelV2>();\n const refresh = useRefresh();\n\n useEffect(() => {\n const disposable = formModel.nativeFormModel?.onFormValuesChange(() => {\n refresh();\n });\n return () => disposable?.dispose();\n }, [formModel.nativeFormModel]);\n\n return formModel.getValues<T>();\n}\n\n/**\n * Listen to Form's value in a certain path and refresh the React component.\n * By providing related node, you can use this hook outside the Form Component.\n * @param node\n */\nexport function useWatchFormValueIn<T = any>(node: FlowNodeEntity, name: string): T | undefined {\n const formModel = node.getData(FlowNodeFormData).getFormModel<FormModelV2>();\n const refresh = useRefresh();\n\n useEffect(() => {\n const disposable = formModel.nativeFormModel?.onFormValuesChange(({ name: changedName }) => {\n if (name === changedName) {\n refresh();\n }\n });\n\n return () => disposable?.dispose();\n }, []);\n\n return formModel.getValueIn<T>(name);\n}\n\n/**\n * Listen to FormModel's initialization and refresh React component.\n * By providing related node, you can use this hook outside the Form Component.\n * @param node\n */\nexport function useInitializedFormModel(node: FlowNodeEntity) {\n const formModel = node.getData(FlowNodeFormData).getFormModel<FormModelV2>();\n const refresh = useRefresh();\n\n useEffect(() => {\n const disposable = formModel.onInitialized(() => {\n refresh();\n });\n return () => disposable.dispose();\n }, [formModel]);\n\n return formModel;\n}\n\n/**\n * Get Form's state, Form State is a proxy, it will refresh the React component when the value you accessed changed\n * By providing related node, you can use this hook outside the Form Component.\n * @param node\n */\nexport function useWatchFormState(node: FlowNodeEntity): FormState | undefined {\n const formModel = useInitializedFormModel(node);\n return useFormState(formModel.formControl);\n}\n\n/**\n * Get Form's errors, Form errors is a proxy, it will refresh the React component when the value you accessed changed\n * By providing related node, you can use this hook outside the Form Component.\n * @param node\n */\nexport function useWatchFormErrors(node: FlowNodeEntity): Errors | undefined {\n const formModel = useInitializedFormModel(node);\n return useFormErrors(formModel.formControl);\n}\n\n/**\n * Get Form's warnings, Form warnings is a proxy, it will refresh the React component when the value you accessed changed\n * By providing related node, you can use this hook outside the Form Component.\n * @param node\n */\nexport function useWatchFormWarnings(node: FlowNodeEntity): Warnings | undefined {\n const formModel = useInitializedFormModel(node);\n return useFormWarnings(formModel.formControl);\n}\n","import { nanoid } from 'nanoid';\nimport { Disposable } from '@flowgram.ai/utils';\n\nimport { EffectOptions, FormPluginCtx } from './types';\nimport { FormModelV2 } from './form-model-v2';\n\nexport interface FormPluginConfig<Opts = any> {\n /**\n * FormModel 初始化时执行\n * @param ctx\n */\n onInit?: (ctx: FormPluginCtx, opts: Opts) => void;\n\n /**\n * 同 FormMeta 中的effects 会与 FormMeta 中的effects 合并\n */\n effect?: Record<string, EffectOptions[]>;\n /**\n * FormModel 销毁时执行\n * @param ctx\n */\n onDispose?: (ctx: FormPluginCtx, opts: Opts) => void;\n}\n\nexport class FormPlugin<Opts = any> implements Disposable {\n readonly name: string;\n\n readonly pluginId: string;\n\n readonly config: FormPluginConfig;\n\n readonly opts?: Opts;\n\n protected _formModel: FormModelV2;\n\n constructor(name: string, config: FormPluginConfig, opts?: Opts) {\n this.name = name;\n this.pluginId = `${name}__${nanoid()}`;\n this.config = config;\n this.opts = opts;\n }\n\n get formModel(): FormModelV2 {\n return this._formModel;\n }\n\n get ctx() {\n return {\n formModel: this.formModel,\n node: this.formModel.nodeContext.node,\n playgroundContext: this.formModel.nodeContext.playgroundContext,\n };\n }\n\n init(formModel: FormModelV2) {\n this._formModel = formModel;\n this.config?.onInit?.(this.ctx, this.opts);\n }\n\n dispose() {\n if (this.config?.onDispose) {\n this.config?.onDispose(this.ctx, this.opts);\n }\n }\n}\n\nexport function defineFormPluginCreator<Opts>(name: string, config: FormPluginConfig) {\n return function (opts: Opts) {\n return new FormPlugin(name, config, opts);\n };\n}\n","import React from 'react';\n\nimport { Disposable, Event } from '@flowgram.ai/utils';\nimport { FlowNodeFormData, NodeRender, OnFormValuesChangePayload } from '@flowgram.ai/form-core';\nimport { FieldName, FieldValue, FormState } from '@flowgram.ai/form';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nimport { onFormValueChangeInPayload } from './types';\nimport { FormModelV2 } from './form-model-v2';\n\nexport interface NodeFormProps<TValues> {\n /**\n * The initialValues of the form.\n */\n initialValues: TValues;\n /**\n * Form values. Returns a deep copy of the data in the store.\n */\n values: TValues;\n /**\n * Form state\n */\n state: FormState;\n /**\n * Get value in certain path\n * @param name path\n */\n getValueIn<TValue = FieldValue>(name: FieldName): TValue;\n\n /**\n * Set value in certain path.\n * It will trigger the re-rendering of the Field Component if a Field is related to this path\n * @param name path\n */\n setValueIn<TValue>(name: FieldName, value: TValue): void;\n /**\n * set form values\n */\n updateFormValues(values: any): void;\n /**\n * Render form\n */\n render: () => React.ReactNode;\n /**\n * Form value change event\n */\n onFormValuesChange: Event<OnFormValuesChangePayload>;\n /**\n * Trigger form validate\n */\n validate: () => Promise<boolean>;\n /**\n * Form validate event\n */\n onValidate: Event<FormState>;\n /**\n * Form field value change event\n */\n onFormValueChangeIn<TValue = FieldValue, TFormValue = FieldValue>(\n name: FieldName,\n callback: (payload: onFormValueChangeInPayload<TValue, TFormValue>) => void\n ): Disposable;\n}\n\n/**\n * Only support FormModelV2\n * @param node\n */\nexport function getNodeForm<TValues = FieldValue>(\n node: FlowNodeEntity\n): NodeFormProps<TValues> | undefined {\n const formModel = node.getData<FlowNodeFormData>(FlowNodeFormData)?.getFormModel<FormModelV2>();\n const nativeFormModel = formModel?.nativeFormModel;\n\n if (!formModel || !nativeFormModel) return undefined;\n\n const result: NodeFormProps<TValues> = {\n initialValues: nativeFormModel.initialValues,\n get values() {\n return nativeFormModel.values;\n },\n\n state: nativeFormModel.state,\n getValueIn: (name: FieldName) => nativeFormModel.getValueIn(name),\n setValueIn: (name: FieldName, value: any) => nativeFormModel.setValueIn(name, value),\n updateFormValues: (values: any) => {\n formModel.updateFormValues(values);\n },\n render: () => <NodeRender node={node} />,\n onFormValuesChange: formModel.onFormValuesChange.bind(formModel),\n onFormValueChangeIn: formModel.onFormValueChangeIn.bind(formModel),\n onValidate: formModel.nativeFormModel.onValidate,\n validate: formModel.validate.bind(formModel),\n };\n\n Object.defineProperty(result, '_formModel', {\n enumerable: false,\n get() {\n return formModel;\n },\n });\n return result;\n}\n"],"mappings":"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","names":["DataEvent","import_lodash","import_form_core","import_form","React","effect","import_form_core","import_react","import_utils","import_form_core","import_form","import_react","import_form_core","React"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flowgram.ai/node",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.8",
|
|
4
4
|
"description": "automation form core",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"flow",
|
|
@@ -25,11 +25,11 @@
|
|
|
25
25
|
"lodash": "^4.17.21",
|
|
26
26
|
"nanoid": "^4.0.2",
|
|
27
27
|
"reflect-metadata": "~0.2.2",
|
|
28
|
-
"@flowgram.ai/core": "0.1.0-alpha.
|
|
29
|
-
"@flowgram.ai/
|
|
30
|
-
"@flowgram.ai/
|
|
31
|
-
"@flowgram.ai/form-core": "0.1.0-alpha.
|
|
32
|
-
"@flowgram.ai/utils": "0.1.0-alpha.
|
|
28
|
+
"@flowgram.ai/core": "0.1.0-alpha.8",
|
|
29
|
+
"@flowgram.ai/document": "0.1.0-alpha.8",
|
|
30
|
+
"@flowgram.ai/form": "0.1.0-alpha.8",
|
|
31
|
+
"@flowgram.ai/form-core": "0.1.0-alpha.8",
|
|
32
|
+
"@flowgram.ai/utils": "0.1.0-alpha.8"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"@types/lodash": "^4.14.137",
|
|
@@ -40,13 +40,13 @@
|
|
|
40
40
|
"tsup": "^8.0.1",
|
|
41
41
|
"typescript": "^5.0.4",
|
|
42
42
|
"vitest": "^0.34.6",
|
|
43
|
-
"@flowgram.ai/eslint-config": "0.1.0-alpha.
|
|
44
|
-
"@flowgram.ai/
|
|
45
|
-
"@flowgram.ai/
|
|
43
|
+
"@flowgram.ai/eslint-config": "0.1.0-alpha.8",
|
|
44
|
+
"@flowgram.ai/form": "0.1.0-alpha.8",
|
|
45
|
+
"@flowgram.ai/ts-config": "0.1.0-alpha.8"
|
|
46
46
|
},
|
|
47
47
|
"peerDependencies": {
|
|
48
|
-
"react": ">=
|
|
49
|
-
"react-dom": ">=
|
|
48
|
+
"react": ">=16.8",
|
|
49
|
+
"react-dom": ">=16.8"
|
|
50
50
|
},
|
|
51
51
|
"publishConfig": {
|
|
52
52
|
"access": "public",
|