get-node-form.tsx 2.7 KB

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