@kne/react-form-antd 4.1.4 → 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.
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react';
2
- import React__default, { forwardRef, useCallback, createContext, useContext, useEffect, useState, useRef, useMemo } from 'react';
2
+ import React__default, { forwardRef, useMemo, useCallback, createContext, useContext, useEffect, useState, useRef } from 'react';
3
3
  import classnames from 'classnames';
4
4
  import ReactForm__default, { preset as preset$2, useReset, useSubmit } from '@kne/react-form';
5
5
  export * from '@kne/react-form';
@@ -9,6 +9,7 @@ import merge from 'lodash/merge';
9
9
  import { TreeSelect, TimePicker, Input, Switch as Switch$1, Select, Radio, InputNumber, Button, DatePicker, Checkbox as Checkbox$1, Cascader as Cascader$1, Rate as Rate$1, Slider as Slider$1 } from 'antd';
10
10
  import { createWithIntlProvider, useIntl } from '@kne/react-intl';
11
11
  import dayjs from 'dayjs';
12
+ import customParseFormat from 'dayjs/plugin/customParseFormat';
12
13
  import useControlValue from '@kne/use-control-value';
13
14
 
14
15
  function _extends$3() {
@@ -52,7 +53,7 @@ var preset = props => {
52
53
  preset$2(globalParams.rules);
53
54
  };
54
55
 
55
- const _excluded$4 = ["className", "cache", "enterSubmit", "scrollToError", "scrollProps", "type", "size", "children"];
56
+ const _excluded$5 = ["className", "cache", "enterSubmit", "scrollToError", "scrollProps", "type", "size", "children"];
56
57
  const {
57
58
  ScrollToError,
58
59
  EnterSubmit,
@@ -71,7 +72,7 @@ const Form = forwardRef((originProps, ref) => {
71
72
  },
72
73
  children
73
74
  } = originProps,
74
- props = _objectWithoutPropertiesLoose(originProps, _excluded$4);
75
+ props = _objectWithoutPropertiesLoose(originProps, _excluded$5);
75
76
  const baseClass = 'react-form';
76
77
  let computedClass = baseClass;
77
78
  const {
@@ -159,12 +160,127 @@ TreeSelectInner.Field = TreeSelect;
159
160
  TreeSelectInner.TreeNode = TreeSelect.TreeNode;
160
161
  const _TreeSelect = withLocale(TreeSelectInner);
161
162
 
163
+ dayjs.extend(customParseFormat);
164
+
165
+ /**
166
+ * Convert form/API date values to dayjs for antd DatePicker/TimePicker.
167
+ * Newer @rc-component/picker getUDayjs returns non-dayjs values as-is,
168
+ * then calls .isValid() and throws on plain strings.
169
+ */
170
+ const toDayjs = (value, format) => {
171
+ if (value == null || value === '') {
172
+ return null;
173
+ }
174
+ if (dayjs.isDayjs(value)) {
175
+ return value;
176
+ }
177
+ if (typeof value === 'string' && typeof format === 'string' && format) {
178
+ const _parsed = dayjs(value, format, true);
179
+ if (_parsed.isValid()) {
180
+ return _parsed;
181
+ }
182
+ }
183
+ const parsed = dayjs(value);
184
+ return parsed.isValid() ? parsed : null;
185
+ };
186
+ const toDayjsValue = (value, format) => {
187
+ if (Array.isArray(value)) {
188
+ return value.map(item => toDayjs(item, format));
189
+ }
190
+ return toDayjs(value, format);
191
+ };
192
+
193
+ /**
194
+ * Date-only pickers should emit start of the selected unit (e.g. day at 00:00:00),
195
+ * not "selected date + current clock time".
196
+ */
197
+ const startOfByPicker = (value, picker = 'date') => {
198
+ if (!value || !dayjs.isDayjs(value) || !value.isValid()) {
199
+ return value;
200
+ }
201
+ const unit = picker === 'week' ? 'week' : picker === 'month' ? 'month' : picker === 'quarter' ? 'quarter' : picker === 'year' ? 'year' : 'day';
202
+ return value.startOf(unit);
203
+ };
204
+ const normalizeDateValue = (value, picker = 'date') => {
205
+ if (Array.isArray(value)) {
206
+ return value.map(item => startOfByPicker(item, picker));
207
+ }
208
+ return startOfByPicker(value, picker);
209
+ };
210
+
211
+ const _excluded$4 = ["value", "defaultValue", "format", "showTime", "picker", "onChange"];
212
+
213
+ /**
214
+ * Wrap antd picker so string/number initial values from form/API become dayjs.
215
+ * When options.stripTime is true and showTime is off, onChange values are
216
+ * normalized to start of the picker unit (date → 00:00:00).
217
+ */
218
+ const withDayjsValue = (WrappedComponent, options = {}) => {
219
+ const {
220
+ stripTime = false,
221
+ defaultPicker = 'date'
222
+ } = options;
223
+ const Component = forwardRef((_ref, ref) => {
224
+ let {
225
+ value,
226
+ defaultValue,
227
+ format,
228
+ showTime,
229
+ picker,
230
+ onChange
231
+ } = _ref,
232
+ props = _objectWithoutPropertiesLoose(_ref, _excluded$4);
233
+ const mergedPicker = picker || defaultPicker;
234
+ const shouldStripTime = stripTime && !showTime;
235
+ const mergedValue = useMemo(() => {
236
+ if (value === undefined) {
237
+ return undefined;
238
+ }
239
+ const next = toDayjsValue(value, format);
240
+ return shouldStripTime ? normalizeDateValue(next, mergedPicker) : next;
241
+ }, [value, format, shouldStripTime, mergedPicker]);
242
+ const mergedDefaultValue = useMemo(() => {
243
+ if (defaultValue === undefined) {
244
+ return undefined;
245
+ }
246
+ const next = toDayjsValue(defaultValue, format);
247
+ return shouldStripTime ? normalizeDateValue(next, mergedPicker) : next;
248
+ }, [defaultValue, format, shouldStripTime, mergedPicker]);
249
+ const handleChange = useCallback((next, ...rest) => {
250
+ if (!onChange) {
251
+ return;
252
+ }
253
+ if (shouldStripTime && next != null) {
254
+ onChange(normalizeDateValue(next, mergedPicker), ...rest);
255
+ return;
256
+ }
257
+ onChange(next, ...rest);
258
+ }, [onChange, shouldStripTime, mergedPicker]);
259
+ return /*#__PURE__*/React__default.createElement(WrappedComponent, _extends$3({}, props, {
260
+ ref: ref,
261
+ format: format,
262
+ showTime: showTime,
263
+ picker: picker,
264
+ value: mergedValue,
265
+ defaultValue: mergedDefaultValue,
266
+ onChange: handleChange
267
+ }));
268
+ });
269
+ Component.displayName = `withDayjsValue(${WrappedComponent.displayName || WrappedComponent.name || 'Component'})`;
270
+ Object.keys(WrappedComponent).filter(key => ['$$typeof', 'render', 'field'].indexOf(key) === -1).forEach(key => {
271
+ Component[key] = WrappedComponent[key];
272
+ });
273
+ return Component;
274
+ };
275
+
162
276
  const {
163
277
  useOnChange: useOnChange$a
164
278
  } = hooks;
165
279
  const {
166
280
  RangePicker: RangePicker$1
167
281
  } = TimePicker;
282
+ const DayjsTimePicker = withDayjsValue(TimePicker);
283
+ const DayjsRangePicker$1 = withDayjsValue(RangePicker$1);
168
284
  const TimePickerInner = props => {
169
285
  const {
170
286
  formatMessage
@@ -179,9 +295,9 @@ const TimePickerInner = props => {
179
295
  label: mergedProps.label || ''
180
296
  })
181
297
  }, mergedProps));
182
- return render(TimePicker);
298
+ return render(DayjsTimePicker);
183
299
  };
184
- TimePickerInner.Field = TimePicker;
300
+ TimePickerInner.Field = DayjsTimePicker;
185
301
  const RangePickerInner$1 = props => {
186
302
  const {
187
303
  formatMessage
@@ -196,9 +312,9 @@ const RangePickerInner$1 = props => {
196
312
  label: mergedProps.label || ''
197
313
  })
198
314
  }, mergedProps));
199
- return render(RangePicker$1);
315
+ return render(DayjsRangePicker$1);
200
316
  };
201
- RangePickerInner$1.Field = RangePicker$1;
317
+ RangePickerInner$1.Field = DayjsRangePicker$1;
202
318
  const _TimePicker = withLocale(TimePickerInner);
203
319
  _TimePicker.RangePicker = withLocale(RangePickerInner$1);
204
320
 
@@ -1031,6 +1147,22 @@ const {
1031
1147
  RangePicker,
1032
1148
  WeekPicker
1033
1149
  } = DatePicker;
1150
+ const DayjsDatePicker = withDayjsValue(DatePicker, {
1151
+ stripTime: true,
1152
+ defaultPicker: 'date'
1153
+ });
1154
+ const DayjsMonthPicker = MonthPicker ? withDayjsValue(MonthPicker, {
1155
+ stripTime: true,
1156
+ defaultPicker: 'month'
1157
+ }) : DayjsDatePicker;
1158
+ const DayjsRangePicker = withDayjsValue(RangePicker, {
1159
+ stripTime: true,
1160
+ defaultPicker: 'date'
1161
+ });
1162
+ const DayjsWeekPicker = WeekPicker ? withDayjsValue(WeekPicker, {
1163
+ stripTime: true,
1164
+ defaultPicker: 'week'
1165
+ }) : DayjsDatePicker;
1034
1166
  const DatePickerInner = props => {
1035
1167
  const {
1036
1168
  formatMessage
@@ -1045,9 +1177,9 @@ const DatePickerInner = props => {
1045
1177
  label: mergedProps.label || ''
1046
1178
  })
1047
1179
  }, mergedProps));
1048
- return render(DatePicker);
1180
+ return render(DayjsDatePicker);
1049
1181
  };
1050
- DatePickerInner.Field = DatePicker;
1182
+ DatePickerInner.Field = DayjsDatePicker;
1051
1183
  const MonthPickerInner = props => {
1052
1184
  const {
1053
1185
  formatMessage
@@ -1062,9 +1194,9 @@ const MonthPickerInner = props => {
1062
1194
  id: 'EndTime'
1063
1195
  })]
1064
1196
  }, mergedProps));
1065
- return render(MonthPicker);
1197
+ return render(DayjsMonthPicker);
1066
1198
  };
1067
- MonthPickerInner.Field = MonthPicker;
1199
+ MonthPickerInner.Field = DayjsMonthPicker;
1068
1200
  const RangePickerInner = props => {
1069
1201
  const {
1070
1202
  formatMessage
@@ -1079,9 +1211,9 @@ const RangePickerInner = props => {
1079
1211
  id: 'EndTime'
1080
1212
  })]
1081
1213
  }, mergedProps));
1082
- return render(RangePicker);
1214
+ return render(DayjsRangePicker);
1083
1215
  };
1084
- RangePickerInner.Field = RangePicker;
1216
+ RangePickerInner.Field = DayjsRangePicker;
1085
1217
  const WeekPickerInner = props => {
1086
1218
  const {
1087
1219
  formatMessage
@@ -1096,9 +1228,9 @@ const WeekPickerInner = props => {
1096
1228
  id: 'EndTime'
1097
1229
  })]
1098
1230
  }, mergedProps));
1099
- return render(WeekPicker);
1231
+ return render(DayjsWeekPicker);
1100
1232
  };
1101
- WeekPickerInner.Field = WeekPicker;
1233
+ WeekPickerInner.Field = DayjsWeekPicker;
1102
1234
  const _DatePicker = withLocale(DatePickerInner);
1103
1235
  _DatePicker.MonthPicker = withLocale(MonthPickerInner);
1104
1236
  _DatePicker.RangePicker = withLocale(RangePickerInner);