@kne/react-form-antd 4.1.4 → 4.1.6

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/README.md CHANGED
@@ -539,6 +539,23 @@ const DatePickerExample = () => {
539
539
  </Form>
540
540
  </Card>
541
541
 
542
+ <Card title="字符串初始值(兼容 antd 6)" size="small">
543
+ <Form
544
+ data={{
545
+ stringDate: '2024-06-15',
546
+ stringRange: ['2024-01-01', '2024-12-31'],
547
+ stringTime: '14:30:00'
548
+ }}
549
+ onSubmit={setFormData}
550
+ >
551
+ <Flex vertical gap={16}>
552
+ <DatePicker name="stringDate" label="日期字符串" placeholder="请选择日期" />
553
+ <DatePicker.RangePicker name="stringRange" label="范围字符串" placeholder={['开始日期', '结束日期']} />
554
+ <TimePicker name="stringTime" label="时间字符串" format="HH:mm:ss" placeholder="请选择时间" />
555
+ </Flex>
556
+ </Form>
557
+ </Card>
558
+
542
559
  <Card title="TimePicker 时间选择" size="small">
543
560
  <Form onSubmit={setFormData}>
544
561
  <Flex vertical gap={16}>
package/dist/index.js CHANGED
@@ -6,6 +6,7 @@ var merge = require('lodash/merge');
6
6
  var antd = require('antd');
7
7
  var reactIntl = require('@kne/react-intl');
8
8
  var dayjs = require('dayjs');
9
+ var customParseFormat = require('dayjs/plugin/customParseFormat');
9
10
  var useControlValue = require('@kne/use-control-value');
10
11
 
11
12
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
@@ -34,6 +35,7 @@ var classnames__default = /*#__PURE__*/_interopDefaultLegacy(classnames);
34
35
  var ReactForm__default = /*#__PURE__*/_interopDefaultLegacy(ReactForm);
35
36
  var merge__default = /*#__PURE__*/_interopDefaultLegacy(merge);
36
37
  var dayjs__default = /*#__PURE__*/_interopDefaultLegacy(dayjs);
38
+ var customParseFormat__default = /*#__PURE__*/_interopDefaultLegacy(customParseFormat);
37
39
  var useControlValue__default = /*#__PURE__*/_interopDefaultLegacy(useControlValue);
38
40
 
39
41
  function _extends$3() {
@@ -77,7 +79,7 @@ var preset = (function (props) {
77
79
  ReactForm.preset(globalParams.rules);
78
80
  });
79
81
 
80
- var _excluded$4 = ["className", "cache", "enterSubmit", "scrollToError", "scrollProps", "type", "size", "children"];
82
+ var _excluded$5 = ["className", "cache", "enterSubmit", "scrollToError", "scrollProps", "type", "size", "children"];
81
83
  var ScrollToError = reactFormHelper.widget.ScrollToError,
82
84
  EnterSubmit = reactFormHelper.widget.EnterSubmit,
83
85
  FormStore = reactFormHelper.widget.FormStore,
@@ -95,7 +97,7 @@ var Form = React.forwardRef(function (originProps, ref) {
95
97
  block: 'center'
96
98
  } : _originProps$scrollPr,
97
99
  children = originProps.children,
98
- props = _objectWithoutPropertiesLoose(originProps, _excluded$4);
100
+ props = _objectWithoutPropertiesLoose(originProps, _excluded$5);
99
101
  var baseClass = 'react-form';
100
102
  var computedClass = baseClass;
101
103
  var _Object$assign = Object.assign({
@@ -179,8 +181,138 @@ TreeSelectInner.Field = antd.TreeSelect;
179
181
  TreeSelectInner.TreeNode = antd.TreeSelect.TreeNode;
180
182
  var _TreeSelect = withLocale(TreeSelectInner);
181
183
 
184
+ dayjs__default["default"].extend(customParseFormat__default["default"]);
185
+
186
+ /**
187
+ * Convert form/API date values to dayjs for antd DatePicker/TimePicker.
188
+ * Newer @rc-component/picker getUDayjs returns non-dayjs values as-is,
189
+ * then calls .isValid() and throws on plain strings.
190
+ */
191
+ var toDayjs = function toDayjs(value, format) {
192
+ if (value == null || value === '') {
193
+ return null;
194
+ }
195
+ if (dayjs__default["default"].isDayjs(value)) {
196
+ return value;
197
+ }
198
+ if (typeof value === 'string' && typeof format === 'string' && format) {
199
+ var _parsed = dayjs__default["default"](value, format, true);
200
+ if (_parsed.isValid()) {
201
+ return _parsed;
202
+ }
203
+ }
204
+ var parsed = dayjs__default["default"](value);
205
+ return parsed.isValid() ? parsed : null;
206
+ };
207
+ var toDayjsValue = function toDayjsValue(value, format) {
208
+ if (Array.isArray(value)) {
209
+ return value.map(function (item) {
210
+ return toDayjs(item, format);
211
+ });
212
+ }
213
+ return toDayjs(value, format);
214
+ };
215
+
216
+ /**
217
+ * Date-only pickers should emit start of the selected unit (e.g. day at 00:00:00),
218
+ * not "selected date + current clock time".
219
+ */
220
+ var startOfByPicker = function startOfByPicker(value, picker) {
221
+ if (picker === void 0) {
222
+ picker = 'date';
223
+ }
224
+ if (!value || !dayjs__default["default"].isDayjs(value) || !value.isValid()) {
225
+ return value;
226
+ }
227
+ var unit = picker === 'week' ? 'week' : picker === 'month' ? 'month' : picker === 'quarter' ? 'quarter' : picker === 'year' ? 'year' : 'day';
228
+ return value.startOf(unit);
229
+ };
230
+ var normalizeDateValue = function normalizeDateValue(value, picker) {
231
+ if (picker === void 0) {
232
+ picker = 'date';
233
+ }
234
+ if (Array.isArray(value)) {
235
+ return value.map(function (item) {
236
+ return startOfByPicker(item, picker);
237
+ });
238
+ }
239
+ return startOfByPicker(value, picker);
240
+ };
241
+
242
+ var _excluded$4 = ["value", "defaultValue", "format", "showTime", "picker", "onChange"];
243
+
244
+ /**
245
+ * Wrap antd picker so string/number initial values from form/API become dayjs.
246
+ * When options.stripTime is true and showTime is off, onChange values are
247
+ * normalized to start of the picker unit (date → 00:00:00).
248
+ */
249
+ var withDayjsValue = function withDayjsValue(WrappedComponent, options) {
250
+ if (options === void 0) {
251
+ options = {};
252
+ }
253
+ var _options = options,
254
+ _options$stripTime = _options.stripTime,
255
+ stripTime = _options$stripTime === void 0 ? false : _options$stripTime,
256
+ _options$defaultPicke = _options.defaultPicker,
257
+ defaultPicker = _options$defaultPicke === void 0 ? 'date' : _options$defaultPicke;
258
+ var Component = React.forwardRef(function (_ref, ref) {
259
+ var value = _ref.value,
260
+ defaultValue = _ref.defaultValue,
261
+ format = _ref.format,
262
+ showTime = _ref.showTime,
263
+ picker = _ref.picker,
264
+ onChange = _ref.onChange,
265
+ props = _objectWithoutPropertiesLoose(_ref, _excluded$4);
266
+ var mergedPicker = picker || defaultPicker;
267
+ var shouldStripTime = stripTime && !showTime;
268
+ var mergedValue = React.useMemo(function () {
269
+ if (value === undefined) {
270
+ return undefined;
271
+ }
272
+ var next = toDayjsValue(value, format);
273
+ return shouldStripTime ? normalizeDateValue(next, mergedPicker) : next;
274
+ }, [value, format, shouldStripTime, mergedPicker]);
275
+ var mergedDefaultValue = React.useMemo(function () {
276
+ if (defaultValue === undefined) {
277
+ return undefined;
278
+ }
279
+ var next = toDayjsValue(defaultValue, format);
280
+ return shouldStripTime ? normalizeDateValue(next, mergedPicker) : next;
281
+ }, [defaultValue, format, shouldStripTime, mergedPicker]);
282
+ var handleChange = React.useCallback(function (next) {
283
+ var rest = [].slice.call(arguments, 1);
284
+ if (!onChange) {
285
+ return;
286
+ }
287
+ if (shouldStripTime && next != null) {
288
+ onChange.apply(void 0, [normalizeDateValue(next, mergedPicker)].concat(rest));
289
+ return;
290
+ }
291
+ onChange.apply(void 0, [next].concat(rest));
292
+ }, [onChange, shouldStripTime, mergedPicker]);
293
+ return /*#__PURE__*/React__default["default"].createElement(WrappedComponent, _extends$3({}, props, {
294
+ ref: ref,
295
+ format: format,
296
+ showTime: showTime,
297
+ picker: picker,
298
+ value: mergedValue,
299
+ defaultValue: mergedDefaultValue,
300
+ onChange: handleChange
301
+ }));
302
+ });
303
+ Component.displayName = "withDayjsValue(" + (WrappedComponent.displayName || WrappedComponent.name || 'Component') + ")";
304
+ Object.keys(WrappedComponent).filter(function (key) {
305
+ return ['$$typeof', 'render', 'field'].indexOf(key) === -1;
306
+ }).forEach(function (key) {
307
+ Component[key] = WrappedComponent[key];
308
+ });
309
+ return Component;
310
+ };
311
+
182
312
  var useOnChange$a = reactFormHelper.hooks.useOnChange;
183
313
  var RangePicker$1 = antd.TimePicker.RangePicker;
314
+ var DayjsTimePicker = withDayjsValue(antd.TimePicker);
315
+ var DayjsRangePicker$1 = withDayjsValue(RangePicker$1);
184
316
  var TimePickerInner = function TimePickerInner(props) {
185
317
  var _useIntl = reactIntl.useIntl(),
186
318
  formatMessage = _useIntl.formatMessage;
@@ -194,9 +326,9 @@ var TimePickerInner = function TimePickerInner(props) {
194
326
  label: mergedProps.label || ''
195
327
  })
196
328
  }, mergedProps));
197
- return render(antd.TimePicker);
329
+ return render(DayjsTimePicker);
198
330
  };
199
- TimePickerInner.Field = antd.TimePicker;
331
+ TimePickerInner.Field = DayjsTimePicker;
200
332
  var RangePickerInner$1 = function RangePickerInner(props) {
201
333
  var _useIntl2 = reactIntl.useIntl(),
202
334
  formatMessage = _useIntl2.formatMessage;
@@ -210,9 +342,9 @@ var RangePickerInner$1 = function RangePickerInner(props) {
210
342
  label: mergedProps.label || ''
211
343
  })
212
344
  }, mergedProps));
213
- return render(RangePicker$1);
345
+ return render(DayjsRangePicker$1);
214
346
  };
215
- RangePickerInner$1.Field = RangePicker$1;
347
+ RangePickerInner$1.Field = DayjsRangePicker$1;
216
348
  var _TimePicker = withLocale(TimePickerInner);
217
349
  _TimePicker.RangePicker = withLocale(RangePickerInner$1);
218
350
 
@@ -863,30 +995,33 @@ var PickerTodayInner = function PickerTodayInner(_ref) {
863
995
  setOpenEnd(false);
864
996
  }, [onChange]);
865
997
 
866
- // 处理开始时间变化
867
- var handleStartChange = React.useCallback(function (date) {
998
+ // 开始日期确认后切到结束选择。
999
+ // 必须用 onSelect:已有值时再次点选同一天,antd onChange 不会触发,弹层会直接关闭。
1000
+ var switchToEndPicker = React.useCallback(function (date) {
1001
+ if (!date) {
1002
+ return;
1003
+ }
868
1004
  setTempStart(date);
869
- isSwitchingRef.current = true; // 标记正在切换
1005
+ isSwitchingRef.current = true;
870
1006
  setOpenStart(false);
871
1007
  setTimeout(function () {
872
1008
  setOpenEnd(true);
873
1009
  isSwitchingRef.current = false;
874
1010
  }, 100);
875
1011
  }, []);
1012
+ var handleStartSelect = React.useCallback(function (date) {
1013
+ switchToEndPicker(date);
1014
+ }, [switchToEndPicker]);
876
1015
 
877
- // 处理结束时间变化(选择日期时实时更新显示,选择后确认值)
878
- var handleEndChange = React.useCallback(function (date) {
879
- if (date) {
880
- // 选择了有效日期,确认值
881
- if (!tempStart) return;
882
- onChange([tempStart.toISOString(), date.toISOString()]);
883
- setOpenEnd(false);
884
- setTempStart(null);
885
- setTempEnd(null);
886
- } else {
887
- // 清空选择
888
- setTempEnd(null);
1016
+ // 结束日期确认(同样用 onSelect,避免与当前结束值相同时无法提交)
1017
+ var handleEndSelect = React.useCallback(function (date) {
1018
+ if (!date || !tempStart) {
1019
+ return;
889
1020
  }
1021
+ onChange([tempStart.toISOString(), date.toISOString()]);
1022
+ setOpenEnd(false);
1023
+ setTempStart(null);
1024
+ setTempEnd(null);
890
1025
  }, [tempStart, onChange]);
891
1026
 
892
1027
  // 点击"至今"按钮
@@ -996,7 +1131,7 @@ var PickerTodayInner = function PickerTodayInner(_ref) {
996
1131
  open: openStart,
997
1132
  onOpenChange: handleStartOpenChange,
998
1133
  value: tempStart || parsedValue.start,
999
- onChange: handleStartChange,
1134
+ onSelect: handleStartSelect,
1000
1135
  renderExtraFooter: renderEmptyFooter,
1001
1136
  showNow: false,
1002
1137
  getPopupContainer: function getPopupContainer() {
@@ -1014,7 +1149,7 @@ var PickerTodayInner = function PickerTodayInner(_ref) {
1014
1149
  open: openEnd,
1015
1150
  onOpenChange: handleEndOpenChange,
1016
1151
  value: tempEnd || parsedValue.end,
1017
- onChange: handleEndChange,
1152
+ onSelect: handleEndSelect,
1018
1153
  onPanelChange: handleEndPanelChange,
1019
1154
  disabledDate: endDisabledDate,
1020
1155
  renderExtraFooter: renderExtraFooter,
@@ -1045,6 +1180,22 @@ var useOnChange$5 = reactFormHelper.hooks.useOnChange;
1045
1180
  var MonthPicker = antd.DatePicker.MonthPicker,
1046
1181
  RangePicker = antd.DatePicker.RangePicker,
1047
1182
  WeekPicker = antd.DatePicker.WeekPicker;
1183
+ var DayjsDatePicker = withDayjsValue(antd.DatePicker, {
1184
+ stripTime: true,
1185
+ defaultPicker: 'date'
1186
+ });
1187
+ var DayjsMonthPicker = MonthPicker ? withDayjsValue(MonthPicker, {
1188
+ stripTime: true,
1189
+ defaultPicker: 'month'
1190
+ }) : DayjsDatePicker;
1191
+ var DayjsRangePicker = withDayjsValue(RangePicker, {
1192
+ stripTime: true,
1193
+ defaultPicker: 'date'
1194
+ });
1195
+ var DayjsWeekPicker = WeekPicker ? withDayjsValue(WeekPicker, {
1196
+ stripTime: true,
1197
+ defaultPicker: 'week'
1198
+ }) : DayjsDatePicker;
1048
1199
  var DatePickerInner = function DatePickerInner(props) {
1049
1200
  var _useIntl = reactIntl.useIntl(),
1050
1201
  formatMessage = _useIntl.formatMessage;
@@ -1058,9 +1209,9 @@ var DatePickerInner = function DatePickerInner(props) {
1058
1209
  label: mergedProps.label || ''
1059
1210
  })
1060
1211
  }, mergedProps));
1061
- return render(antd.DatePicker);
1212
+ return render(DayjsDatePicker);
1062
1213
  };
1063
- DatePickerInner.Field = antd.DatePicker;
1214
+ DatePickerInner.Field = DayjsDatePicker;
1064
1215
  var MonthPickerInner = function MonthPickerInner(props) {
1065
1216
  var _useIntl2 = reactIntl.useIntl(),
1066
1217
  formatMessage = _useIntl2.formatMessage;
@@ -1074,9 +1225,9 @@ var MonthPickerInner = function MonthPickerInner(props) {
1074
1225
  id: 'EndTime'
1075
1226
  })]
1076
1227
  }, mergedProps));
1077
- return render(MonthPicker);
1228
+ return render(DayjsMonthPicker);
1078
1229
  };
1079
- MonthPickerInner.Field = MonthPicker;
1230
+ MonthPickerInner.Field = DayjsMonthPicker;
1080
1231
  var RangePickerInner = function RangePickerInner(props) {
1081
1232
  var _useIntl3 = reactIntl.useIntl(),
1082
1233
  formatMessage = _useIntl3.formatMessage;
@@ -1090,9 +1241,9 @@ var RangePickerInner = function RangePickerInner(props) {
1090
1241
  id: 'EndTime'
1091
1242
  })]
1092
1243
  }, mergedProps));
1093
- return render(RangePicker);
1244
+ return render(DayjsRangePicker);
1094
1245
  };
1095
- RangePickerInner.Field = RangePicker;
1246
+ RangePickerInner.Field = DayjsRangePicker;
1096
1247
  var WeekPickerInner = function WeekPickerInner(props) {
1097
1248
  var _useIntl4 = reactIntl.useIntl(),
1098
1249
  formatMessage = _useIntl4.formatMessage;
@@ -1106,9 +1257,9 @@ var WeekPickerInner = function WeekPickerInner(props) {
1106
1257
  id: 'EndTime'
1107
1258
  })]
1108
1259
  }, mergedProps));
1109
- return render(WeekPicker);
1260
+ return render(DayjsWeekPicker);
1110
1261
  };
1111
- WeekPickerInner.Field = WeekPicker;
1262
+ WeekPickerInner.Field = DayjsWeekPicker;
1112
1263
  var _DatePicker = withLocale(DatePickerInner);
1113
1264
  _DatePicker.MonthPicker = withLocale(MonthPickerInner);
1114
1265
  _DatePicker.RangePicker = withLocale(RangePickerInner);