@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 +17 -0
- package/dist/index.js +182 -31
- package/dist/index.js.map +1 -1
- package/dist/index.modern.js +167 -32
- package/dist/index.modern.js.map +1 -1
- package/package.json +1 -1
package/dist/index.modern.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import React__default, { forwardRef, useCallback, createContext, useContext, useEffect, useState, useRef
|
|
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$
|
|
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$
|
|
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(
|
|
298
|
+
return render(DayjsTimePicker);
|
|
183
299
|
};
|
|
184
|
-
TimePickerInner.Field =
|
|
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(
|
|
315
|
+
return render(DayjsRangePicker$1);
|
|
200
316
|
};
|
|
201
|
-
RangePickerInner$1.Field =
|
|
317
|
+
RangePickerInner$1.Field = DayjsRangePicker$1;
|
|
202
318
|
const _TimePicker = withLocale(TimePickerInner);
|
|
203
319
|
_TimePicker.RangePicker = withLocale(RangePickerInner$1);
|
|
204
320
|
|
|
@@ -855,30 +971,33 @@ const PickerTodayInner = _ref => {
|
|
|
855
971
|
setOpenEnd(false);
|
|
856
972
|
}, [onChange]);
|
|
857
973
|
|
|
858
|
-
//
|
|
859
|
-
|
|
974
|
+
// 开始日期确认后切到结束选择。
|
|
975
|
+
// 必须用 onSelect:已有值时再次点选同一天,antd 的 onChange 不会触发,弹层会直接关闭。
|
|
976
|
+
const switchToEndPicker = useCallback(date => {
|
|
977
|
+
if (!date) {
|
|
978
|
+
return;
|
|
979
|
+
}
|
|
860
980
|
setTempStart(date);
|
|
861
|
-
isSwitchingRef.current = true;
|
|
981
|
+
isSwitchingRef.current = true;
|
|
862
982
|
setOpenStart(false);
|
|
863
983
|
setTimeout(() => {
|
|
864
984
|
setOpenEnd(true);
|
|
865
985
|
isSwitchingRef.current = false;
|
|
866
986
|
}, 100);
|
|
867
987
|
}, []);
|
|
988
|
+
const handleStartSelect = useCallback(date => {
|
|
989
|
+
switchToEndPicker(date);
|
|
990
|
+
}, [switchToEndPicker]);
|
|
868
991
|
|
|
869
|
-
//
|
|
870
|
-
const
|
|
871
|
-
if (date) {
|
|
872
|
-
|
|
873
|
-
if (!tempStart) return;
|
|
874
|
-
onChange([tempStart.toISOString(), date.toISOString()]);
|
|
875
|
-
setOpenEnd(false);
|
|
876
|
-
setTempStart(null);
|
|
877
|
-
setTempEnd(null);
|
|
878
|
-
} else {
|
|
879
|
-
// 清空选择
|
|
880
|
-
setTempEnd(null);
|
|
992
|
+
// 结束日期确认(同样用 onSelect,避免与当前结束值相同时无法提交)
|
|
993
|
+
const handleEndSelect = useCallback(date => {
|
|
994
|
+
if (!date || !tempStart) {
|
|
995
|
+
return;
|
|
881
996
|
}
|
|
997
|
+
onChange([tempStart.toISOString(), date.toISOString()]);
|
|
998
|
+
setOpenEnd(false);
|
|
999
|
+
setTempStart(null);
|
|
1000
|
+
setTempEnd(null);
|
|
882
1001
|
}, [tempStart, onChange]);
|
|
883
1002
|
|
|
884
1003
|
// 点击"至今"按钮
|
|
@@ -982,7 +1101,7 @@ const PickerTodayInner = _ref => {
|
|
|
982
1101
|
open: openStart,
|
|
983
1102
|
onOpenChange: handleStartOpenChange,
|
|
984
1103
|
value: tempStart || parsedValue.start,
|
|
985
|
-
|
|
1104
|
+
onSelect: handleStartSelect,
|
|
986
1105
|
renderExtraFooter: renderEmptyFooter,
|
|
987
1106
|
showNow: false,
|
|
988
1107
|
getPopupContainer: () => containerRef.current || document.body,
|
|
@@ -998,7 +1117,7 @@ const PickerTodayInner = _ref => {
|
|
|
998
1117
|
open: openEnd,
|
|
999
1118
|
onOpenChange: handleEndOpenChange,
|
|
1000
1119
|
value: tempEnd || parsedValue.end,
|
|
1001
|
-
|
|
1120
|
+
onSelect: handleEndSelect,
|
|
1002
1121
|
onPanelChange: handleEndPanelChange,
|
|
1003
1122
|
disabledDate: endDisabledDate,
|
|
1004
1123
|
renderExtraFooter: renderExtraFooter,
|
|
@@ -1031,6 +1150,22 @@ const {
|
|
|
1031
1150
|
RangePicker,
|
|
1032
1151
|
WeekPicker
|
|
1033
1152
|
} = DatePicker;
|
|
1153
|
+
const DayjsDatePicker = withDayjsValue(DatePicker, {
|
|
1154
|
+
stripTime: true,
|
|
1155
|
+
defaultPicker: 'date'
|
|
1156
|
+
});
|
|
1157
|
+
const DayjsMonthPicker = MonthPicker ? withDayjsValue(MonthPicker, {
|
|
1158
|
+
stripTime: true,
|
|
1159
|
+
defaultPicker: 'month'
|
|
1160
|
+
}) : DayjsDatePicker;
|
|
1161
|
+
const DayjsRangePicker = withDayjsValue(RangePicker, {
|
|
1162
|
+
stripTime: true,
|
|
1163
|
+
defaultPicker: 'date'
|
|
1164
|
+
});
|
|
1165
|
+
const DayjsWeekPicker = WeekPicker ? withDayjsValue(WeekPicker, {
|
|
1166
|
+
stripTime: true,
|
|
1167
|
+
defaultPicker: 'week'
|
|
1168
|
+
}) : DayjsDatePicker;
|
|
1034
1169
|
const DatePickerInner = props => {
|
|
1035
1170
|
const {
|
|
1036
1171
|
formatMessage
|
|
@@ -1045,9 +1180,9 @@ const DatePickerInner = props => {
|
|
|
1045
1180
|
label: mergedProps.label || ''
|
|
1046
1181
|
})
|
|
1047
1182
|
}, mergedProps));
|
|
1048
|
-
return render(
|
|
1183
|
+
return render(DayjsDatePicker);
|
|
1049
1184
|
};
|
|
1050
|
-
DatePickerInner.Field =
|
|
1185
|
+
DatePickerInner.Field = DayjsDatePicker;
|
|
1051
1186
|
const MonthPickerInner = props => {
|
|
1052
1187
|
const {
|
|
1053
1188
|
formatMessage
|
|
@@ -1062,9 +1197,9 @@ const MonthPickerInner = props => {
|
|
|
1062
1197
|
id: 'EndTime'
|
|
1063
1198
|
})]
|
|
1064
1199
|
}, mergedProps));
|
|
1065
|
-
return render(
|
|
1200
|
+
return render(DayjsMonthPicker);
|
|
1066
1201
|
};
|
|
1067
|
-
MonthPickerInner.Field =
|
|
1202
|
+
MonthPickerInner.Field = DayjsMonthPicker;
|
|
1068
1203
|
const RangePickerInner = props => {
|
|
1069
1204
|
const {
|
|
1070
1205
|
formatMessage
|
|
@@ -1079,9 +1214,9 @@ const RangePickerInner = props => {
|
|
|
1079
1214
|
id: 'EndTime'
|
|
1080
1215
|
})]
|
|
1081
1216
|
}, mergedProps));
|
|
1082
|
-
return render(
|
|
1217
|
+
return render(DayjsRangePicker);
|
|
1083
1218
|
};
|
|
1084
|
-
RangePickerInner.Field =
|
|
1219
|
+
RangePickerInner.Field = DayjsRangePicker;
|
|
1085
1220
|
const WeekPickerInner = props => {
|
|
1086
1221
|
const {
|
|
1087
1222
|
formatMessage
|
|
@@ -1096,9 +1231,9 @@ const WeekPickerInner = props => {
|
|
|
1096
1231
|
id: 'EndTime'
|
|
1097
1232
|
})]
|
|
1098
1233
|
}, mergedProps));
|
|
1099
|
-
return render(
|
|
1234
|
+
return render(DayjsWeekPicker);
|
|
1100
1235
|
};
|
|
1101
|
-
WeekPickerInner.Field =
|
|
1236
|
+
WeekPickerInner.Field = DayjsWeekPicker;
|
|
1102
1237
|
const _DatePicker = withLocale(DatePickerInner);
|
|
1103
1238
|
_DatePicker.MonthPicker = withLocale(MonthPickerInner);
|
|
1104
1239
|
_DatePicker.RangePicker = withLocale(RangePickerInner);
|