Skip to content

Commit efde704

Browse files
authored
Merge pull request #940 from oceanbase/linhf/feat-daterange-rules
feat(DateRanger): Open rules verification function
2 parents 2a39d0a + 7a69b0c commit efde704

File tree

5 files changed

+88
-55
lines changed

5 files changed

+88
-55
lines changed

packages/ui/src/DateRanger/PickerPanel.tsx

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,20 @@ import type { RangeValue } from './Ranger';
2727
type ValidateTrigger = 'submit' | 'valueChange';
2828

2929
type MaybeArray<T> = T | T[];
30-
type ErrorType = 'endDate' | 'startDate' | 'endTime' | 'startTime';
30+
type ErrorType = 'endDate' | 'startDate' | 'endTime' | 'startTime' | 'all';
31+
32+
const ALL_ERROR_TYPE_LIST = ['endDate', 'startDate', 'endTime', 'startTime'];
3133

3234
export type Rule = {
3335
message: string;
34-
validate: (value: string) => MaybeArray<ErrorType>;
36+
validator: (value: [string, string] | []) => MaybeArray<ErrorType> | null | undefined;
3537
};
3638

3739
export interface PickerPanelProps {
3840
value?: RangeValue;
3941
defaultValue?: RangeValue;
4042
tip?: string;
41-
require?: boolean;
43+
required?: boolean;
4244
rules?: Rule[];
4345
validateTrigger?: ValidateTrigger;
4446
onCancel: () => void;
@@ -60,7 +62,7 @@ const InternalPickerPanel = (props: PickerPanelProps) => {
6062
locale,
6163
tip,
6264
rules,
63-
require = true,
65+
required = true,
6466
onOk = noop,
6567
onCancel = noop,
6668
disabledDate,
@@ -441,30 +443,28 @@ const InternalPickerPanel = (props: PickerPanelProps) => {
441443
const start = `${startDate} ${startTime.format(TIME_FORMAT)}`;
442444
const end = `${endDate} ${endTime.format(TIME_FORMAT)}`;
443445

444-
onOk([start, end]);
445-
446-
// let errorList = [];
447-
// let message = '';
448-
// rules?.some(item => {
449-
// if (typeof item?.validator === 'function') {
450-
// const errorType = item.validator(start, end);
451-
// if (errorType) {
452-
// errorList = toArray(errorType);
453-
// message = item.message;
454-
// return true;
455-
// }
456-
// }
457-
// return false;
458-
// });
446+
let errorList = [];
447+
let message = '';
448+
rules?.some(item => {
449+
if (typeof item?.validator === 'function') {
450+
const errorType = item.validator([start, end]);
451+
if (errorType) {
452+
errorList = Array.isArray(errorType) ? errorType : [errorType];
453+
message = item.message;
454+
return true;
455+
}
456+
}
457+
return false;
458+
});
459459

460-
// if (errorList.length > 0) {
461-
// setErrorTypeList(errorList);
462-
// setErrorMessage(message);
463-
// } else {
464-
// setErrorMessage('');
465-
// setErrorTypeList([]);
466-
// onOk([start, end]);
467-
// }
460+
if (errorList.length > 0) {
461+
setErrorTypeList(errorList.includes('all') ? ALL_ERROR_TYPE_LIST : errorList);
462+
setErrorMessage(message);
463+
} else {
464+
setErrorMessage('');
465+
setErrorTypeList([]);
466+
onOk([start, end]);
467+
}
468468
});
469469
}}
470470
>

packages/ui/src/DateRanger/Ranger.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ export interface DateRangerProps
8888
defaultValue?: RangeValue;
8989
size?: 'small' | 'large' | 'middle';
9090
tooltipProps?: TooltipProps;
91-
locale: any;
91+
locale?: any;
9292
}
9393

9494
const prefix = getPrefix('date-ranger');
@@ -574,4 +574,4 @@ const Ranger = React.forwardRef((props: DateRangerProps, ref) => {
574574
export default LocaleWrapper({
575575
componentName: 'DateRanger',
576576
defaultLocale: zhCN,
577-
})(Ranger);
577+
})(Ranger) as typeof Ranger;
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import React from 'react';
2+
import { DateRanger } from '@oceanbase/ui';
3+
import dayjs from 'dayjs';
4+
5+
export default () => {
6+
return (
7+
<DateRanger
8+
rules={[
9+
{
10+
validator(value) {
11+
if (Math.abs(dayjs(value[0]).diff(dayjs(value[1]))) > 24 * 60 * 60 * 1000) {
12+
return 'all';
13+
}
14+
15+
return null;
16+
},
17+
message: '时间跨度不能超过一天',
18+
},
19+
]}
20+
/>
21+
);
22+
};

packages/ui/src/DateRanger/index.md

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ nav:
1111
<code src="./demo/basic.tsx" title="基本"></code>
1212
<code src="./demo/simple-mode.tsx" title="极简模式"></code>
1313
<code src="./demo/with-form.tsx" title="配合 Form 使用"></code>
14+
<code src="./demo/rules.tsx" title="使用 rules 自定义校验"></code>
1415
<code src="./demo/selected.tsx" title="时间范围快捷选项"></code>
1516
<code src="./demo/default-value.tsx" title="指定默认值"></code>
1617
<code src="./demo/locale.tsx" title="国际化"></code>
@@ -20,7 +21,7 @@ nav:
2021

2122
| 参数 | 说明 | 类型 | 默认值 | 版本 |
2223
| :-- | :-- | :-- | :-- | :-- |
23-
| selects | 快速选择时间配置项 | RangeOption | [NEAR_1_MINUTES, NEAR_30_MINUTES, NEAR_1_HOURS,NEAR_3_HOURS, NEAR_6_HOURS, TODAY, LAST_3_DAYS] | - |
24+
| selects | 快速选择时间配置项 | [RangeOption](#rangeoption) | [NEAR_1_MINUTES, NEAR_30_MINUTES, NEAR_1_HOURS,NEAR_3_HOURS, NEAR_6_HOURS, TODAY, LAST_3_DAYS] | - |
2425
| value | DatePicker 控件的值 | Dayjs[] \| Moment[] | - | - |
2526
| onChange | value 变化时的回调函数 | (range: Dayjs[] \| Moment[]) => void | noop | - |
2627
| defaultValue | DatePicker 控件的默认值 | Dayjs[] \| Moment[] | - | - |
@@ -29,6 +30,7 @@ nav:
2930
| hasRewind | 后退按钮 | boolean | true | - |
3031
| hasForward | 前进按钮 | boolean | true | - |
3132
| hasSync | 刷新按钮 | boolean | true | - |
33+
| rules | 校验规则,设置字段的校验逻辑。[点击此处](#packages-ui-src-date-ranger-demo-rules)查看示例 | Rule[] | - | - |
3234
| hasTagInPicker | 在选项面板中是否展示Tag | boolean | false | - |
3335
| pastOnly | 只能选择过去时间 | boolean | false | - |
3436
| disabledDate | 不可选择的日期 | (currentDate: Dayjs \| Moment) => boolean | - | - |
@@ -38,7 +40,6 @@ nav:
3840
| hideSecond | 隐藏"秒” | boolean | false | - |
3941
| autoCalcRange | 自动计算时间范围并回显到选择器tag | boolean | false | - |
4042
| ref | updateCurrentTime 手动更新当前时间 | function | - | - |
41-
4243
| 其他 antd/RangePicker 的 `props` | [antd-RangePicker](https://ant.design/components/date-picker-cn/#RangePicker) | - | - | - |
4344

4445
### RangeOption
@@ -49,3 +50,14 @@ nav:
4950
| name | 快速选择的名称(英文) | string | - | - |
5051
| rangeLabel | 快速选择的区间简写 | string | - | - |
5152
| range | 选中的时间区间 | () => Dayjs[] \| Moment[] | - | - |
53+
54+
### Rule
55+
56+
| 参数 | 说明 | 类型 | 默认值 | 版本 |
57+
| :-- | :-- | :-- | :-- | :-- |
58+
| validator | 自定义校验,存在返回值时,会将对应位置标红并展示错误信息 | (value) => RuleErrorType \| RuleErrorType[] \| undefined | - | - |
59+
| message | 错误信息 | string | - | - |
60+
61+
### RuleErrorType
62+
63+
`'all' | 'startDate' | 'startTime' | 'endDate' | 'endTime' |`

packages/ui/src/DateRanger/index.ts

Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -25,29 +25,28 @@ import InternalDateRanger from './Ranger';
2525

2626
export * from './Ranger';
2727

28-
const DateRanger = InternalDateRanger;
29-
30-
// 内置 ranges
31-
DateRanger.NEAR_1_MINUTES = NEAR_1_MINUTES;
32-
DateRanger.NEAR_5_MINUTES = NEAR_5_MINUTES;
33-
DateRanger.NEAR_10_MINUTES = NEAR_10_MINUTES;
34-
DateRanger.NEAR_20_MINUTES = NEAR_20_MINUTES;
35-
DateRanger.NEAR_30_MINUTES = NEAR_30_MINUTES;
36-
DateRanger.NEAR_1_HOURS = NEAR_1_HOURS;
37-
DateRanger.NEAR_2_HOURS = NEAR_2_HOURS;
38-
DateRanger.NEAR_3_HOURS = NEAR_3_HOURS;
39-
DateRanger.NEAR_6_HOURS = NEAR_6_HOURS;
40-
DateRanger.NEAR_12_HOURS = NEAR_12_HOURS;
41-
DateRanger.TODAY = TODAY;
42-
DateRanger.LAST_1_DAY = LAST_1_DAY;
43-
DateRanger.LAST_3_DAYS = LAST_3_DAYS;
44-
DateRanger.YESTERDAY = YESTERDAY;
45-
DateRanger.THIS_WEEK = THIS_WEEK;
46-
DateRanger.LAST_WEEK = LAST_WEEK;
47-
DateRanger.THIS_MONTH = THIS_MONTH;
48-
DateRanger.LAST_MONTH = LAST_MONTH;
49-
DateRanger.THIS_YEAR = THIS_YEAR;
50-
DateRanger.LAST_YEAR = LAST_YEAR;
51-
DateRanger.NEXT_YEAR = NEXT_YEAR;
28+
const DateRanger = Object.assign(InternalDateRanger, {
29+
NEAR_1_MINUTES,
30+
NEAR_5_MINUTES,
31+
NEAR_10_MINUTES,
32+
NEAR_20_MINUTES,
33+
NEAR_30_MINUTES,
34+
NEAR_1_HOURS,
35+
NEAR_2_HOURS,
36+
NEAR_3_HOURS,
37+
NEAR_6_HOURS,
38+
NEAR_12_HOURS,
39+
TODAY,
40+
LAST_1_DAY,
41+
LAST_3_DAYS,
42+
YESTERDAY,
43+
THIS_WEEK,
44+
LAST_WEEK,
45+
THIS_MONTH,
46+
LAST_MONTH,
47+
THIS_YEAR,
48+
LAST_YEAR,
49+
NEXT_YEAR,
50+
});
5251

5352
export default DateRanger;

0 commit comments

Comments
 (0)