@zat-design/sisyphus-react 4.4.1-beta.4 → 4.4.3-beta.2

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.
Files changed (45) hide show
  1. package/dist/index.esm.css +1 -1
  2. package/dist/less.esm.css +1 -1
  3. package/es/FormsProvider/index.d.ts +1 -1
  4. package/es/ProEditTable/components/RenderField/index.js +8 -8
  5. package/es/ProEditTable/utils/config.js +5 -2
  6. package/es/ProEditTable/utils/index.js +11 -6
  7. package/es/ProEditTable/utils/tools.js +3 -2
  8. package/es/ProEnum/index.js +1 -1
  9. package/es/ProForm/components/FormFooter/propsType.d.ts +1 -1
  10. package/es/ProForm/components/base/DatePicker/index.js +3 -2
  11. package/es/ProForm/components/combination/Group/component/ComRender.js +1 -1
  12. package/es/ProForm/components/combination/Group/component/FlexibleGroup.js +4 -11
  13. package/es/ProForm/components/combination/Group/hooks/index.js +1 -2
  14. package/es/ProForm/components/combination/Group/utils/index.d.ts +20 -20
  15. package/es/ProForm/components/render/Render.js +149 -180
  16. package/es/ProForm/components/render/RenderFields.js +13 -38
  17. package/es/ProForm/components/render/propsType.d.ts +1 -18
  18. package/es/ProForm/components/render/propsType.js +0 -26
  19. package/es/ProForm/hooks/useControlled.d.ts +1 -0
  20. package/es/ProForm/hooks/useControlled.js +14 -0
  21. package/es/ProForm/hooks/useForm.d.ts +8 -0
  22. package/es/ProForm/{utils → hooks}/useForm.js +1 -1
  23. package/es/ProForm/{utils → hooks}/useRules.js +2 -2
  24. package/es/ProForm/{utils → hooks}/useShouldUpdate.d.ts +5 -1
  25. package/es/ProForm/{utils → hooks}/useShouldUpdate.js +30 -77
  26. package/es/ProForm/{utils → hooks}/useWatch.js +1 -1
  27. package/es/ProForm/index.js +5 -4
  28. package/es/ProForm/propsType.d.ts +13 -1
  29. package/es/ProForm/utils/buildFormItemProps.d.ts +25 -0
  30. package/es/ProForm/utils/buildFormItemProps.js +90 -0
  31. package/es/ProForm/utils/index.d.ts +2 -6
  32. package/es/ProForm/utils/index.js +3 -30
  33. package/es/ProForm/utils/reactiveValues.d.ts +34 -0
  34. package/es/ProForm/utils/reactiveValues.js +45 -0
  35. package/es/ProSelect/index.js +8 -7
  36. package/es/ProTreeModal/components/Trigger.js +13 -12
  37. package/es/ProTreeModal/style/index.less +12 -1
  38. package/package.json +1 -1
  39. package/es/ProForm/utils/useForm.d.ts +0 -22
  40. /package/es/ProForm/{utils → hooks}/useDeepCompareMemo.d.ts +0 -0
  41. /package/es/ProForm/{utils → hooks}/useDeepCompareMemo.js +0 -0
  42. /package/es/ProForm/{utils → hooks}/useFieldProps.d.ts +0 -0
  43. /package/es/ProForm/{utils → hooks}/useFieldProps.js +0 -0
  44. /package/es/ProForm/{utils → hooks}/useRules.d.ts +0 -0
  45. /package/es/ProForm/{utils → hooks}/useWatch.d.ts +0 -0
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { ModifiedFormInstanceType } from '../ProForm/utils/useForm';
2
+ import type { ModifiedFormInstanceType } from '../ProForm/propsType';
3
3
  type Forms = Record<string, ModifiedFormInstanceType<any>>;
4
4
  export declare const FormsContext: React.Context<Forms>;
5
5
  /**
@@ -18,8 +18,8 @@ import * as componentMap from "../../../ProForm/components";
18
18
  import { useProConfig } from "../../../ProConfigProvider";
19
19
  import Container from "../../../ProForm/components/Container";
20
20
  import transformNames from "../../../ProForm/utils/transformNames";
21
- import { FieldProvider } from "../../../ProForm/utils/useFieldProps";
22
- import useRules from "../../../ProForm/utils/useRules";
21
+ import { FieldProvider } from "../../../ProForm/hooks/useFieldProps";
22
+ import useRules from "../../../ProForm/hooks/useRules";
23
23
  import { isSelect, isTrim } from "../../../ProForm/utils";
24
24
  import locale from "../../../locale";
25
25
  import ConfirmWrapper from "../../../ProForm/components/render/ConfirmWrapper";
@@ -51,7 +51,6 @@ const RenderField = ({
51
51
  originTitle,
52
52
  label,
53
53
  dataIndex,
54
- formItemProps,
55
54
  isEditable = true,
56
55
  required = false,
57
56
  rules = [],
@@ -81,7 +80,7 @@ const RenderField = ({
81
80
  getIsNew,
82
81
  shouldUpdateDebounce
83
82
  } = config;
84
- let _fieldProps = fieldProps || formItemProps || {};
83
+ let _fieldProps = fieldProps || {};
85
84
  let _rules = rules || [];
86
85
  let _required = required;
87
86
  let _valueType = valueType;
@@ -620,7 +619,7 @@ const RenderField = ({
620
619
  const latestRowParams = [latestRowData, latestReactiveParams];
621
620
 
622
621
  // ⭐ 关键修改:shouldUpdate 模式下,跳过缓存,直接重新计算所有响应式属性
623
- let latestFieldProps = fieldProps || formItemProps || {};
622
+ let latestFieldProps = fieldProps || {};
624
623
  if (_isFunction(fieldProps)) {
625
624
  latestFieldProps = fieldProps(latestRowData, latestReactiveParams);
626
625
  }
@@ -893,9 +892,10 @@ export default /*#__PURE__*/memo(RenderField, (prevProps, nextProps) => {
893
892
  config: nextConfig
894
893
  } = nextProps;
895
894
 
896
- // 自定义 component/editRender 且行对象为同引用时,浅比较无法区分原地修改,需强制重渲染
897
- const hasFunctionComponent = _isFunction(prevColumn?.component) || _isFunction(prevColumn?.editRender) || _isFunction(nextColumn?.component) || _isFunction(nextColumn?.editRender);
898
- if (hasFunctionComponent && prevRecord === nextRecord) {
895
+ // 函数型动态属性(component/editRender/fieldProps/rules/required/disabled/isEditable/valueType)
896
+ // 可能依赖行内兄弟字段;行对象为同引用(原地修改)时,浅比较无法区分,需强制重渲染
897
+ const hasFunctionDependency = _isFunction(prevColumn?.component) || _isFunction(prevColumn?.editRender) || _isFunction(prevColumn?.fieldProps) || _isFunction(prevColumn?.rules) || _isFunction(prevColumn?.required) || _isFunction(prevColumn?.disabled) || _isFunction(prevColumn?.isEditable) || _isFunction(prevColumn?.valueType) || _isFunction(nextColumn?.component) || _isFunction(nextColumn?.editRender) || _isFunction(nextColumn?.fieldProps) || _isFunction(nextColumn?.rules) || _isFunction(nextColumn?.required) || _isFunction(nextColumn?.disabled) || _isFunction(nextColumn?.isEditable) || _isFunction(nextColumn?.valueType);
898
+ if (hasFunctionDependency && prevRecord === nextRecord) {
899
899
  return false;
900
900
  }
901
901
 
@@ -89,7 +89,9 @@ export const actions = {
89
89
  delete record._isEditing;
90
90
  }
91
91
  // 防止value引用不变, 值不更新 - (自定义组件)
92
- const values = form.getFieldsValue();
92
+ // 必须取全量 store(true):names 组合列只注册合并字段,拆分子字段(如 address/postcode)
93
+ // 未注册;getFieldsValue() 会丢掉它们,叠加 setFieldsValue 对数组「整体覆盖」会抹掉其他行的子字段
94
+ const values = form.getFieldsValue(true);
93
95
  _set(values, rowName, record);
94
96
  // 同步清理虚拟路径上的 _addFlag,避免再次编辑→取消时把已保存行误删
95
97
  _set(values, virtualRowName, record);
@@ -128,8 +130,9 @@ export const actions = {
128
130
  });
129
131
  } else {
130
132
  // 取消时使用主 form 原始行数据重置虚拟 form,避免编辑值残留
133
+ // 同 save:取全量 store(true),避免抹掉其他行未注册的 names 拆分子字段
131
134
  const originalRecord = form.getFieldValue(rowName);
132
- const values = form.getFieldsValue();
135
+ const values = form.getFieldsValue(true);
133
136
  _set(values, virtualRowName, originalRecord ?? record);
134
137
  form.setFieldsValue(values);
135
138
  }
@@ -344,6 +344,9 @@ export const transformColumns = (columns = [], config, caches) => {
344
344
  // 精准控制单元格更新,减少不必要的渲染
345
345
  if (!item.shouldCellUpdate) {
346
346
  const hasComponent = _isFunction(item.component);
347
+ // 函数型动态属性会依赖整行数据(可能是当前列之外的兄弟字段),
348
+ // 这类列在行内任意字段变化时都需重渲染,不能只比对本列 dataIndex
349
+ const hasFunctionDependency = hasComponent || _isFunction(item.editRender) || _isFunction(item.fieldProps) || _isFunction(item.rules) || _isFunction(item.required) || _isFunction(item.disabled) || _isFunction(item.isEditable) || _isFunction(item.valueType);
347
350
  const columnCacheKey = `${Array.isArray(name) ? name.join('.') : String(name)}::${String(columnName)}`;
348
351
 
349
352
  // Fix 问题1:用原始列引用(克隆前)比对 dataSource
@@ -387,22 +390,24 @@ export const transformColumns = (columns = [], config, caches) => {
387
390
  if (virtualKey && record?._isEditing !== prevRecord?._isEditing) {
388
391
  return true;
389
392
  }
390
- // 动态 component 可能依赖行内其他字段,需比较整行
393
+ // 动态 component 函数引用变化说明外部依赖(如异步 list)已更新,必须重渲染
394
+ // 即使行数据未变,旧闭包仍持有过时的外部状态
391
395
  if (hasComponent) {
392
- // component 函数引用变化说明外部依赖(如异步 list)已更新,必须重渲染
393
- // 即使行数据未变,旧闭包仍持有过时的外部状态
394
396
  const prevComponentRef = cellCaches.componentRef.get(columnCacheKey);
395
397
  const currentComponentRef = item.component;
396
398
  if (prevComponentRef !== currentComponentRef) {
397
399
  cellCaches.componentRef.set(columnCacheKey, currentComponentRef);
398
400
  return true;
399
401
  }
400
- // 同引用时 isEqual 恒为 true,无法感知原地修改,必须重渲染
402
+ }
403
+ // 函数型动态属性(component/fieldProps/rules/required/disabled/isEditable/valueType)
404
+ // 可能依赖行内其他字段(兄弟字段),需比较整行;
405
+ // 同引用原地修改时 isEqual 恒为 true,无法感知,必须强制重渲染
406
+ if (hasFunctionDependency) {
401
407
  if (record === prevRecord) {
402
408
  return true;
403
409
  }
404
- const rowChanged = !_isEqual(record, prevRecord);
405
- return rowChanged;
410
+ return !_isEqual(record, prevRecord);
406
411
  }
407
412
  const key = item.dataIndex || item.key;
408
413
  if (!key) return true;
@@ -114,15 +114,16 @@ export const onDelete = ({
114
114
  selectedRowKeys
115
115
  }) => {
116
116
  // 正常的form数据流处理
117
+ // 行可能为 undefined/null(单行编辑下虚拟数组多轮增删改后残留的空位),过滤时需先做空值守卫
117
118
  let dataSource = form.getFieldValue(name);
118
- dataSource = dataSource.filter(row => !selectedRowKeys.includes(row.rowKey));
119
+ dataSource = dataSource.filter(row => row && !selectedRowKeys.includes(row.rowKey));
119
120
  form.setFieldValue(name, dataSource);
120
121
  // 单行模式数据流处理 重置中间正在编辑状态单行数据
121
122
  if (virtualKey) {
122
123
  const namePath = getNamePath(name, virtualKey);
123
124
  let virtualList = form.getFieldValue(namePath);
124
125
  if (virtualList?.length) {
125
- virtualList = virtualList.filter(row => !selectedRowKeys.includes(row.rowKey));
126
+ virtualList = virtualList.filter(row => row && !selectedRowKeys.includes(row.rowKey));
126
127
  form.setFieldValue(namePath, virtualList);
127
128
  }
128
129
  }
@@ -16,7 +16,7 @@ import getEnumLabel from "./utils/getEnumLabel";
16
16
  import useEnum from "./hooks/useEnum";
17
17
  import getEnum from "./utils/getEnum";
18
18
  import locale from "../locale";
19
- import { useFieldProps } from "../ProForm/utils/useFieldProps";
19
+ import { useFieldProps } from "../ProForm/hooks/useFieldProps";
20
20
  import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
21
21
  const ProEnum = props => {
22
22
  const {
@@ -1,6 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import { ButtonProps, ColProps, FormInstance } from 'antd';
3
- import { ModifiedFormInstanceType } from '../../utils/useForm';
3
+ import type { ModifiedFormInstanceType } from '../../propsType';
4
4
  export interface ButtonItem extends ButtonProps {
5
5
  children?: any;
6
6
  }
@@ -62,10 +62,11 @@ const DatePicker = props => {
62
62
  let viewChildren = null;
63
63
  if (!value) {
64
64
  viewChildren = null;
65
- } else if (typeof format === 'string' && _isObject(value)) {
66
- viewChildren = value.format?.(format) || value;
67
65
  } else if (_isFunction(format)) {
68
66
  viewChildren = format(value);
67
+ } else if (_isObject(value) && _isFunction(value.format)) {
68
+ // dayjs / dayjs-like 对象:format 字符串优先,否则用 viewFormat(valueType > picker default)
69
+ viewChildren = value.format(typeof format === 'string' ? format : viewFormat);
69
70
  } else if (_isString(value)) {
70
71
  viewChildren = dayjs(value).format(viewFormat);
71
72
  }
@@ -2,7 +2,7 @@ import _omit from "lodash/omit";
2
2
  import React from 'react';
3
3
  import { Form } from 'antd';
4
4
  import ConfirmWrapper from "../../../../components/render/ConfirmWrapper";
5
- import { FieldProvider } from "../../../../utils/useFieldProps";
5
+ import { FieldProvider } from "../../../../hooks/useFieldProps";
6
6
  import * as componentMap from "../../../../../index";
7
7
  import AddonWrapper from "./AddonWrapper";
8
8
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
@@ -3,7 +3,7 @@ import _isEmpty from "lodash/isEmpty";
3
3
  import React from 'react';
4
4
  import { Space, Form } from 'antd';
5
5
  import classnames from 'classnames';
6
- import { FieldProvider } from "../../../../utils/useFieldProps";
6
+ import { FieldProvider } from "../../../../hooks/useFieldProps";
7
7
  import ProForm from "../../../../../ProForm";
8
8
  import Render from "../../../render/Render";
9
9
  import * as componentMap from "../../../../../index";
@@ -189,6 +189,8 @@ const FlexibleGroupRender = props => {
189
189
  namePath: childNamePath || contextProps.namePath,
190
190
  formDisabled: otherProps?.formDisabled,
191
191
  globalControl: otherProps?.globalControl,
192
+ diffConfig: otherProps?.diffConfig,
193
+ shouldUpdateDebounce: otherProps?.shouldUpdateDebounce,
192
194
  // 灵活模式样式属性
193
195
  flexibleGroupProps: {
194
196
  className: formItemClassName,
@@ -204,27 +206,18 @@ const FlexibleGroupRender = props => {
204
206
  value: renderOtherProps,
205
207
  children: /*#__PURE__*/_jsx(Render, {
206
208
  show: child.show,
207
- form: form,
208
209
  disabled: child.disabled,
209
- formDisabled: otherProps?.formDisabled,
210
- type: type,
211
210
  originComponent: child.component,
212
211
  component: TargetComponent,
213
212
  formItemProps: formItemProps,
214
213
  confirm: child.confirm,
215
- colProps: {
216
- span: 24
217
- },
218
214
  componentProps: adjustedFieldProps || {},
219
215
  otherProps: renderOtherProps,
220
216
  fieldProps: child.fieldProps,
221
217
  isSelect: false // 由 Render 内部计算
222
218
  ,
223
- diffConfig: otherProps?.diffConfig,
224
219
  requiredOnView: otherProps?.requiredOnView,
225
- globalControl: otherProps?.globalControl,
226
- viewRender: child.viewRender,
227
- shouldUpdateDebounce: otherProps?.shouldUpdateDebounce
220
+ viewRender: child.viewRender
228
221
  })
229
222
  }, child.name || `item-${index}`);
230
223
  };
@@ -3,7 +3,7 @@ import _isEqual from "lodash/isEqual";
3
3
  import _cloneDeep from "lodash/cloneDeep";
4
4
  /* eslint-disable no-lonely-if */
5
5
  import { useRef, useEffect } from 'react';
6
- import { useDeepCompareMemo } from "../../../../utils/useDeepCompareMemo";
6
+ import { useDeepCompareMemo } from "../../../../hooks/useDeepCompareMemo";
7
7
  import { difference } from "../../../../../ProEditTable/utils/tools";
8
8
  import { getReactiveProps, getValueTypeTrans, valueFromEventWrapper } from "../utils";
9
9
  /** 转换columns */
@@ -65,7 +65,6 @@ export const useTransformColumns = params => {
65
65
  };
66
66
 
67
67
  // 响应式字段
68
- // eslint-disable-next-line react-hooks/rules-of-hooks
69
68
  const reactiveProps = useDeepCompareMemo(() => {
70
69
  return getReactiveProps({
71
70
  form,
@@ -75,58 +75,58 @@ export declare const useFormItemProps: (column: FlexibleGroupColumnType, context
75
75
  confirm?: boolean | import("antd").ModalFuncProps | import("../../../render/propsType").FunctionArgs<any, boolean | import("antd").ModalFuncProps>;
76
76
  show?: boolean | ReactiveFunction<any, boolean>;
77
77
  component?: React.ReactNode | ReactiveFunction<any, React.ReactNode>;
78
- prefixCls?: string;
79
- htmlFor?: string;
80
- className?: string;
81
- hidden?: boolean;
82
- id?: string;
83
- style?: React.CSSProperties;
84
- children?: React.ReactNode | ((form: FormInstance<any>) => React.ReactNode);
85
- onReset?: () => void;
86
- trim?: boolean;
87
- normalize?: (value: any, prevValue: any, allValues: import("@rc-component/form/lib/interface").Store) => any;
88
- vertical?: boolean;
89
- isView?: boolean;
90
- trigger?: string;
91
78
  toISOString?: boolean;
92
79
  toCSTString?: boolean;
93
80
  switchValue?: [any, any];
94
81
  clearNotShow?: boolean;
95
- validateTrigger?: string | false | string[];
96
- rootClassName?: string;
97
- status?: "" | "warning" | "error" | "success" | "validating";
98
- valueType?: import("../../../render/propsType").ProFormValueType;
82
+ trim?: boolean;
83
+ upperCase?: boolean;
84
+ normalize?: (value: any, prevValue: any, allValues: import("@rc-component/form/lib/interface").Store) => any;
99
85
  getValueProps?: ((value: any) => Record<string, unknown>) & ((value: any) => Record<string, unknown>);
100
86
  shouldUpdate?: import("@rc-component/form/lib/Field").ShouldUpdate<any>;
101
87
  colon?: boolean;
88
+ htmlFor?: string;
102
89
  labelAlign?: import("antd/es/form/interface").FormLabelAlign;
103
90
  labelCol?: import("antd").ColProps;
91
+ vertical?: boolean;
92
+ children?: React.ReactNode | ((form: FormInstance<any>) => React.ReactNode);
104
93
  getValueFromEvent?: (...args: import("@rc-component/form/lib/interface").EventArgs) => any;
94
+ trigger?: string;
95
+ validateTrigger?: string | false | string[];
105
96
  validateDebounce?: number;
106
97
  valuePropName?: string;
107
98
  messageVariables?: Record<string, string>;
108
99
  initialValue?: any;
100
+ onReset?: () => void;
109
101
  onMetaChange?: (meta: import("@rc-component/form/lib/Field").MetaEvent) => void;
110
102
  preserve?: boolean;
111
103
  isListField?: boolean;
112
104
  isList?: boolean;
105
+ prefixCls?: string;
113
106
  noStyle?: boolean;
107
+ style?: React.CSSProperties;
108
+ className?: string;
109
+ rootClassName?: string;
110
+ id?: string;
114
111
  hasFeedback?: boolean | {
115
112
  icons: import("antd/es/form/FormItem").FeedbackIcons;
116
113
  };
117
- validateStatus?: "" | "warning" | "error" | "success" | "validating";
114
+ validateStatus?: "" | "success" | "warning" | "error" | "validating";
115
+ hidden?: boolean;
118
116
  layout?: import("antd/es/form/Form").FormItemLayout;
119
117
  wrapperCol?: import("antd").ColProps;
118
+ status?: "" | "success" | "warning" | "error" | "validating";
120
119
  help?: React.ReactNode;
121
120
  fieldId?: string;
122
- desensitization?: [number, number] | ReactiveFunction<any, [number, number]>;
121
+ valueType?: import("../../../render/propsType").ProFormValueType;
122
+ isView?: boolean;
123
123
  viewRender?: (value: any, record: any, { form, index, namePath, }: {
124
124
  [key: string]: any;
125
125
  form: FormInstance<any>;
126
126
  index?: number;
127
127
  }) => string | React.ReactElement<any, any>;
128
128
  viewType?: import("../../../render/propsType").ViewType;
129
- upperCase?: boolean;
129
+ desensitization?: [number, number] | ReactiveFunction<any, [number, number]>;
130
130
  name: any;
131
131
  dependencies: any[];
132
132
  tooltip: string | {