get-node-form.tsx 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. /**
  2. * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
  3. * SPDX-License-Identifier: MIT
  4. */
  5. import React from 'react';
  6. import { Disposable, Event } from '@flowgram.ai/utils';
  7. import { FlowNodeFormData, NodeRender, OnFormValuesChangePayload } from '@flowgram.ai/form-core';
  8. import { FieldName, FieldValue, FormState } from '@flowgram.ai/form';
  9. import { FlowNodeEntity } from '@flowgram.ai/document';
  10. import { onFormValueChangeInPayload } from './types';
  11. import { FormModelV2 } from './form-model-v2';
  12. export interface NodeFormProps<TValues> {
  13. /**
  14. * The initialValues of the form.
  15. */
  16. initialValues: TValues;
  17. /**
  18. * Form values. Returns a deep copy of the data in the store.
  19. */
  20. values: TValues;
  21. /**
  22. * Form state
  23. */
  24. state: FormState;
  25. /**
  26. * Get value in certain path
  27. * @param name path
  28. */
  29. getValueIn<TValue = FieldValue>(name: FieldName): TValue;
  30. /**
  31. * Set value in certain path.
  32. * It will trigger the re-rendering of the Field Component if a Field is related to this path
  33. * @param name path
  34. */
  35. setValueIn<TValue>(name: FieldName, value: TValue): void;
  36. /**
  37. * set form values
  38. */
  39. updateFormValues(values: any): void;
  40. /**
  41. * Render form
  42. */
  43. render: () => React.ReactNode;
  44. /**
  45. * Form value change event
  46. */
  47. onFormValuesChange: Event<OnFormValuesChangePayload>;
  48. /**
  49. * Trigger form validate
  50. */
  51. validate: () => Promise<boolean>;
  52. /**
  53. * Form validate event
  54. */
  55. onValidate: Event<FormState>;
  56. /**
  57. * Form field value change event
  58. */
  59. onFormValueChangeIn<TValue = FieldValue, TFormValue = FieldValue>(
  60. name: FieldName,
  61. callback: (payload: onFormValueChangeInPayload<TValue, TFormValue>) => void
  62. ): Disposable;
  63. }
  64. /**
  65. * Use `node.form` instead
  66. * @deprecated
  67. * @param node
  68. */
  69. export function getNodeForm<TValues = FieldValue>(
  70. node: FlowNodeEntity
  71. ): NodeFormProps<TValues> | undefined {
  72. const formModel = node.getData<FlowNodeFormData>(FlowNodeFormData)?.getFormModel<FormModelV2>();
  73. const nativeFormModel = formModel?.nativeFormModel;
  74. if (!formModel || !nativeFormModel) return undefined;
  75. const result: NodeFormProps<TValues> = {
  76. initialValues: nativeFormModel.initialValues,
  77. get values() {
  78. return nativeFormModel.values;
  79. },
  80. state: nativeFormModel.state,
  81. getValueIn: (name: FieldName) => nativeFormModel.getValueIn(name),
  82. setValueIn: (name: FieldName, value: any) => nativeFormModel.setValueIn(name, value),
  83. updateFormValues: (values: any) => {
  84. formModel.updateFormValues(values);
  85. },
  86. render: () => <NodeRender node={node} />,
  87. onFormValuesChange: formModel.onFormValuesChange.bind(formModel),
  88. onFormValueChangeIn: formModel.onFormValueChangeIn.bind(formModel),
  89. onValidate: formModel.nativeFormModel.onValidate,
  90. validate: formModel.validate.bind(formModel),
  91. };
  92. Object.defineProperty(result, '_formModel', {
  93. enumerable: false,
  94. get() {
  95. return formModel;
  96. },
  97. });
  98. return result;
  99. }