@kne/react-form-antd 4.1.3 → 4.1.5

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
 
@@ -517,7 +649,7 @@ function warning(valid, message) {
517
649
  warningOnce(valid, `[@ant-design/icons] ${message}`);
518
650
  }
519
651
  function isIconDefinition(target) {
520
- return typeof target === 'object' && typeof target.name === 'string' && typeof target.theme === 'string' && (typeof target.icon === 'object' || typeof target.icon === 'function');
652
+ return target !== null && typeof target === 'object' && typeof target.name === 'string' && typeof target.theme === 'string' && (typeof target.icon === 'object' || typeof target.icon === 'function');
521
653
  }
522
654
  function normalizeAttrs(attrs = {}) {
523
655
  return Object.keys(attrs).reduce((acc, key) => {
@@ -642,7 +774,7 @@ const IconBase = props => {
642
774
  } = props;
643
775
  const svgRef = React__namespace.useRef(null);
644
776
  useInsertStyles(svgRef);
645
- warning(isIconDefinition(icon), `icon should be icon definiton, but got ${icon}`);
777
+ warning(isIconDefinition(icon), `icon should be icon definiton, but got ${typeof icon}`);
646
778
  if (!isIconDefinition(icon)) {
647
779
  return null;
648
780
  }
@@ -682,6 +814,10 @@ const Icon = /*#__PURE__*/React__namespace.forwardRef((props, ref) => {
682
814
  prefixCls = 'anticon',
683
815
  rootClassName
684
816
  } = React__namespace.useContext(Context);
817
+ warning(isIconDefinition(icon), `icon should be icon definiton, but got ${typeof icon}`);
818
+ if (!isIconDefinition(icon)) {
819
+ return null;
820
+ }
685
821
  const classString = clsx(rootClassName, prefixCls, {
686
822
  [`${prefixCls}-${icon.name}`]: !!icon.name,
687
823
  [`${prefixCls}-spin`]: !!spin || icon.name === 'loading'
@@ -713,11 +849,8 @@ if (process.env.NODE_ENV !== 'production') {
713
849
  var AntdIcon = Icon;
714
850
 
715
851
  // This icon file is generated automatically.
716
-
717
852
  var CalendarOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M880 184H712v-64c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v64H384v-64c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v64H144c-17.7 0-32 14.3-32 32v664c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V216c0-17.7-14.3-32-32-32zm-40 656H184V460h656v380zM184 392V256h128v48c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-48h256v48c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-48h128v136H184z" } }] }, "name": "calendar", "theme": "outlined" };
718
- var _default$1 = CalendarOutlined$2;
719
-
720
- var CalendarOutlinedSvg = _default$1;
853
+ var CalendarOutlinedSvg = CalendarOutlined$2;
721
854
 
722
855
  function _extends$1() { _extends$1 = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends$1.apply(this, arguments); }
723
856
  const CalendarOutlined = (props, ref) => /*#__PURE__*/React__namespace.createElement(AntdIcon, _extends$1({}, props, {
@@ -733,11 +866,8 @@ if (process.env.NODE_ENV !== 'production') {
733
866
  var CalendarOutlined$1 = RefIcon$1;
734
867
 
735
868
  // This icon file is generated automatically.
736
-
737
869
  var CloseCircleFilled$2 = { "icon": { "tag": "svg", "attrs": { "fill-rule": "evenodd", "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M512 64c247.4 0 448 200.6 448 448S759.4 960 512 960 64 759.4 64 512 264.6 64 512 64zm127.98 274.82h-.04l-.08.06L512 466.75 384.14 338.88c-.04-.05-.06-.06-.08-.06a.12.12 0 00-.07 0c-.03 0-.05.01-.09.05l-45.02 45.02a.2.2 0 00-.05.09.12.12 0 000 .07v.02a.27.27 0 00.06.06L466.75 512 338.88 639.86c-.05.04-.06.06-.06.08a.12.12 0 000 .07c0 .03.01.05.05.09l45.02 45.02a.2.2 0 00.09.05.12.12 0 00.07 0c.02 0 .04-.01.08-.05L512 557.25l127.86 127.87c.04.04.06.05.08.05a.12.12 0 00.07 0c.03 0 .05-.01.09-.05l45.02-45.02a.2.2 0 00.05-.09.12.12 0 000-.07v-.02a.27.27 0 00-.05-.06L557.25 512l127.87-127.86c.04-.04.05-.06.05-.08a.12.12 0 000-.07c0-.03-.01-.05-.05-.09l-45.02-45.02a.2.2 0 00-.09-.05.12.12 0 00-.07 0z" } }] }, "name": "close-circle", "theme": "filled" };
738
- var _default = CloseCircleFilled$2;
739
-
740
- var CloseCircleFilledSvg = _default;
870
+ var CloseCircleFilledSvg = CloseCircleFilled$2;
741
871
 
742
872
  function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
743
873
  const CloseCircleFilled = (props, ref) => /*#__PURE__*/React__namespace.createElement(AntdIcon, _extends({}, props, {
@@ -1047,6 +1177,22 @@ var useOnChange$5 = reactFormHelper.hooks.useOnChange;
1047
1177
  var MonthPicker = antd.DatePicker.MonthPicker,
1048
1178
  RangePicker = antd.DatePicker.RangePicker,
1049
1179
  WeekPicker = antd.DatePicker.WeekPicker;
1180
+ var DayjsDatePicker = withDayjsValue(antd.DatePicker, {
1181
+ stripTime: true,
1182
+ defaultPicker: 'date'
1183
+ });
1184
+ var DayjsMonthPicker = MonthPicker ? withDayjsValue(MonthPicker, {
1185
+ stripTime: true,
1186
+ defaultPicker: 'month'
1187
+ }) : DayjsDatePicker;
1188
+ var DayjsRangePicker = withDayjsValue(RangePicker, {
1189
+ stripTime: true,
1190
+ defaultPicker: 'date'
1191
+ });
1192
+ var DayjsWeekPicker = WeekPicker ? withDayjsValue(WeekPicker, {
1193
+ stripTime: true,
1194
+ defaultPicker: 'week'
1195
+ }) : DayjsDatePicker;
1050
1196
  var DatePickerInner = function DatePickerInner(props) {
1051
1197
  var _useIntl = reactIntl.useIntl(),
1052
1198
  formatMessage = _useIntl.formatMessage;
@@ -1060,9 +1206,9 @@ var DatePickerInner = function DatePickerInner(props) {
1060
1206
  label: mergedProps.label || ''
1061
1207
  })
1062
1208
  }, mergedProps));
1063
- return render(antd.DatePicker);
1209
+ return render(DayjsDatePicker);
1064
1210
  };
1065
- DatePickerInner.Field = antd.DatePicker;
1211
+ DatePickerInner.Field = DayjsDatePicker;
1066
1212
  var MonthPickerInner = function MonthPickerInner(props) {
1067
1213
  var _useIntl2 = reactIntl.useIntl(),
1068
1214
  formatMessage = _useIntl2.formatMessage;
@@ -1076,9 +1222,9 @@ var MonthPickerInner = function MonthPickerInner(props) {
1076
1222
  id: 'EndTime'
1077
1223
  })]
1078
1224
  }, mergedProps));
1079
- return render(MonthPicker);
1225
+ return render(DayjsMonthPicker);
1080
1226
  };
1081
- MonthPickerInner.Field = MonthPicker;
1227
+ MonthPickerInner.Field = DayjsMonthPicker;
1082
1228
  var RangePickerInner = function RangePickerInner(props) {
1083
1229
  var _useIntl3 = reactIntl.useIntl(),
1084
1230
  formatMessage = _useIntl3.formatMessage;
@@ -1092,9 +1238,9 @@ var RangePickerInner = function RangePickerInner(props) {
1092
1238
  id: 'EndTime'
1093
1239
  })]
1094
1240
  }, mergedProps));
1095
- return render(RangePicker);
1241
+ return render(DayjsRangePicker);
1096
1242
  };
1097
- RangePickerInner.Field = RangePicker;
1243
+ RangePickerInner.Field = DayjsRangePicker;
1098
1244
  var WeekPickerInner = function WeekPickerInner(props) {
1099
1245
  var _useIntl4 = reactIntl.useIntl(),
1100
1246
  formatMessage = _useIntl4.formatMessage;
@@ -1108,9 +1254,9 @@ var WeekPickerInner = function WeekPickerInner(props) {
1108
1254
  id: 'EndTime'
1109
1255
  })]
1110
1256
  }, mergedProps));
1111
- return render(WeekPicker);
1257
+ return render(DayjsWeekPicker);
1112
1258
  };
1113
- WeekPickerInner.Field = WeekPicker;
1259
+ WeekPickerInner.Field = DayjsWeekPicker;
1114
1260
  var _DatePicker = withLocale(DatePickerInner);
1115
1261
  _DatePicker.MonthPicker = withLocale(MonthPickerInner);
1116
1262
  _DatePicker.RangePicker = withLocale(RangePickerInner);