/
DateInputRange.tsx
117 lines (109 loc) · 3.64 KB
/
DateInputRange.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import React, { useEffect, useState } from 'react';
import Input, { InputProps } from '@uiw/react-input';
import Popover, { PopoverProps } from '@uiw/react-popover';
import DatePicker, { DatePickerProps } from '@uiw/react-date-picker';
import Icon from '@uiw/react-icon';
import { IProps } from '@uiw/utils';
import formatter from '@uiw/formatter';
import './style/date-input-range.less';
export interface DateInputRangeProps<V> extends IProps, Omit<InputProps, 'onChange' | 'value'> {
popoverProps?: PopoverProps;
datePickerProps?: DatePickerProps;
value?: Array<V>;
format?: string;
allowClear?: boolean;
bodyStyle?: object;
onChange?: (selectedDate?: Date, dateRange?: Array<Date | undefined>) => void;
}
export function DateInputRange<V extends string | Date>(props: DateInputRangeProps<V>) {
const {
prefixCls = 'w-dateinputrange',
bodyStyle = undefined,
className,
popoverProps,
datePickerProps,
allowClear = true,
format = 'YYYY/MM/DD',
onChange,
value,
...inputProps
} = props;
const [dateRange, setDateRange] = useState<Array<Date | undefined>>([]);
useEffect(() => {
let valueTemp: Array<Date> = [];
const propsValue = value;
if (Array.isArray(propsValue) && !!propsValue?.length) {
propsValue.forEach((date, index) => {
valueTemp[index] = typeof propsValue[index] === 'string' ? new Date(date) : (date as Date);
});
}
setDateRange(valueTemp);
}, [JSON.stringify(value)]);
function handleChange(cdate: Date | undefined, idx?: number) {
const changeValue = [...dateRange];
changeValue[idx!] = cdate;
setDateRange(changeValue);
onChange && onChange(cdate, changeValue);
}
function clearDateRange() {
setDateRange([]);
onChange && onChange(undefined, []);
}
return (
<div
className={[`${prefixCls}-contents`, `${prefixCls}-inner`].filter(Boolean).join(' ').trim()}
style={{ width: 300, ...bodyStyle }}
>
<Popover
trigger="focus"
placement="bottomLeft"
autoAdjustOverflow
{...popoverProps}
content={
<DatePicker
date={dateRange[0]}
className={`${prefixCls}-popover`}
{...datePickerProps}
onChange={(selectedDate) => handleChange(selectedDate, 0)}
/>
}
>
<Input
placeholder="请选择日期"
readOnly
{...(inputProps as InputProps)}
// onChange={(v) => console.log('v', v)}
value={dateRange[0] ? formatter(format, dateRange[0]) : ''}
className={[prefixCls, className].filter(Boolean).join(' ').trim()}
/>
</Popover>
<Icon type="swap-right" verticalAlign="baseline" style={{ fontSize: 21, top: -1, margin: '0px 8px 0px 5px' }} />
<Popover
trigger="focus"
placement="bottomLeft"
autoAdjustOverflow
{...popoverProps}
content={
<DatePicker
date={dateRange[1]}
className={`${prefixCls}-popover`}
{...datePickerProps}
onChange={(selectedDate) => handleChange(selectedDate, 1)}
/>
}
>
<Input
placeholder="请选择日期"
readOnly
{...(inputProps as InputProps)}
value={dateRange[1] ? formatter(format, dateRange[1]) : ''}
// onChange={(v) => console.log('v2', v)}
className={[prefixCls, className].filter(Boolean).join(' ').trim()}
/>
</Popover>
{allowClear && dateRange.length > 0 && (
<Icon className={`${prefixCls}-close-btn`} color="#a5a5a5" onClick={() => clearDateRange()} type="close" />
)}
</div>
);
}