123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 |
- import React, { useRef, useEffect, useCallback, useState, useMemo } from 'react';
- import { storiesOf } from '@storybook/react';
- import { addDays, addWeeks, addMonths, startOfMonth, endOfMonth } from 'date-fns';
- import classNames from 'classnames';
- import * as dateFns from 'date-fns';
- import DatePicker, { DatePickerProps } from '../index';
- import { DayStatusType } from '../index';
- import { Button, Form, withField } from '../../index';
- import {IconClose, IconChevronDown} from '@douyinfe/semi-icons';
- const presets = [
- {
- text: 'Today',
- start: new Date(),
- end: new Date(),
- },
- {
- text: 'Tomorrow',
- start: addDays(new Date(), 1),
- end: addDays(new Date(), 1),
- },
- {
- text: 'Next Week',
- start: addWeeks(new Date(), 1),
- end: addWeeks(new Date(), 2),
- },
- {
- text: 'Next Month',
- start: startOfMonth(addMonths(new Date(), 1)),
- end: endOfMonth(addMonths(new Date(), 1)),
- },
- {
- text: 'Today',
- start: new Date(),
- end: new Date(),
- },
- {
- text: 'Tomorrow',
- start: addDays(new Date(), 1),
- end: addDays(new Date(), 1),
- },
- {
- text: 'Next Week',
- start: addWeeks(new Date(), 1),
- end: addWeeks(new Date(), 2),
- },
- {
- text: 'Next Month',
- start: startOfMonth(addMonths(new Date(), 1)),
- end: endOfMonth(addMonths(new Date(), 1)),
- },
- ];
- const stories = storiesOf('DatePicker', module);
- stories.add('default', () => {
- const Demo = () => {
- const ref = useRef(null);
- useEffect(() => {
- console.log(ref.current);
- if (ref.current) {
- console.log('triggerElRef: ', ref.current.triggerElRef);
- }
- }, [ref.current]);
- return (
- <>
- <DatePicker ref={ref} style={{ display: 'inline-block' }} />
- <DatePicker
- type='dateTime'
- presets={presets.map(preset => ({
- text: preset.text,
- start: preset.start,
- }))}
- onPresetClick={(item, e) => {
- const { start } = item;
- console.log('preset click', item, e, start);
- }}
- />
- <DatePicker
- type="dateTime"
- presets={[() => ({
- start: new Date(),
- })]}
- onPresetClick={(item, e) => {
- const { start } = item;
- console.log('preset click', item, e, start);
- }}
- />
- </>
- );
- };
- return <Demo />;
- });
- stories.add('useFullRender', () => {
- function Demo() {
- const renderFullDate = (dayNumber: number, fullDate: string, dayStatus: DayStatusType) => {
- const { isInRange, isHover, isSelected, isSelectedStart, isSelectedEnd } = dayStatus;
- const prefix = 'components-datepicker-demo';
- const dateCls = classNames({
- [`${prefix}-day-inrange`]: isInRange,
- [`${prefix}-day-hover`]: isHover,
- [`${prefix}-day-selected`]: isSelected,
- [`${prefix}-day-selected-start`]: isSelectedStart,
- [`${prefix}-day-selected-end`]: isSelectedEnd,
- });
- const dayStyle = {
- display: 'flex',
- alignItems: 'center',
- justifyContent: 'center',
- width: '80%',
- height: '80%',
- borderRadius: '50%',
- };
- return (
- <div style={dayStyle} className={dateCls}>
- {dayNumber}
- </div>
- );
- };
- return <DatePicker style={{ width: 240 }} type={'dateRange'} renderFullDate={renderFullDate} />;
- }
- return <Demo />;
- });
- stories.add('triggerRender', () => {
- function Demo() {
- const ref = useRef();
- const [date, setDate] = useState(new Date());
- const formatToken = 'yyyy-MM-dd';
- const onChange = useCallback(date => {
- setDate(date);
- }, []);
- const onClear = useCallback(e => {
- e && e.stopPropagation();
- setDate(null);
- }, []);
- const closeIcon = useMemo(() => {
- return date ? <IconClose onClick={onClear} /> : <IconChevronDown />;
- }, [date]);
- return (
- <DatePicker
- ref={ref}
- onChange={onChange}
- value={date}
- format={formatToken}
- triggerRender={({ placeholder }) => (
- <Button theme={'light'} icon={closeIcon} iconPosition={'right'}>
- {(date && dateFns.format(date, formatToken)) || placeholder}
- </Button>
- )}
- />
- );
- }
- return <Demo />;
- });
- stories.add('Form.DatePicker', () => {
- function Demo() {
- const ref = useRef();
- const ref2 = useRef();
- const [open3, setOpen3] = useState(false);
- const presets = [
- {
- text: 'Today',
- start: new Date(),
- end: new Date(),
- },
- {
- text: 'Tomorrow',
- start: new Date(new Date().valueOf() + 1000 * 3600 * 24),
- end: new Date(new Date().valueOf() + 1000 * 3600 * 24),
- },
- ];
- // const CustomDatePicker = (props: DatePickerProps & { fieldRef: React.Ref<Object> }) => {
- // const { fieldRef, ...rest } = props;
- // return (
- // <DatePicker {...rest} ref={fieldRef} />
- // );
- // };
-
- // const CustomFieldDatePicker = withField(CustomDatePicker);
- return (
- <>
- <DatePicker type="dateRange" ref={ref} />
- <Form>
- {/* <CustomFieldDatePicker
- type="dateTimeRange"
- field="a"
- label="Form.DatePicker"
- presets={presets}
- open={open3}
- onPresetClick={() => {
- console.log('click presets', ref2);
- setOpen3(false);
- setTimeout(() => {
- ref2.current && (ref2.current as any).foundation.closePanel();
- }, 0);
- }}
- onFocus={() => {
- console.log('focus');
- setOpen3(true);
- }}
- onBlur={() => {console.log('blur')}}
- style={{ width: 500 }}
- fieldRef={ref2}
- /> */}
- </Form>
- </>
- );
- }
- return <Demo />;
- });
- stories.add('fix 1460', () => <DatePicker type={'month'} onChange={(date, dateString) => console.log('DatePicker changed: ', date, dateString)} />);
|