datePicker.stories.tsx 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. import React, { useRef, useEffect, useCallback, useState, useMemo } from 'react';
  2. import { storiesOf } from '@storybook/react';
  3. import { addDays, addWeeks, addMonths, startOfMonth, endOfMonth } from 'date-fns';
  4. import classNames from 'classnames';
  5. import * as dateFns from 'date-fns';
  6. import DatePicker, { DatePickerProps } from '../index';
  7. import { DayStatusType } from '../index';
  8. import { Button, Form, withField } from '../../index';
  9. import {IconClose, IconChevronDown} from '@douyinfe/semi-icons';
  10. const presets = [
  11. {
  12. text: 'Today',
  13. start: new Date(),
  14. end: new Date(),
  15. },
  16. {
  17. text: 'Tomorrow',
  18. start: addDays(new Date(), 1),
  19. end: addDays(new Date(), 1),
  20. },
  21. {
  22. text: 'Next Week',
  23. start: addWeeks(new Date(), 1),
  24. end: addWeeks(new Date(), 2),
  25. },
  26. {
  27. text: 'Next Month',
  28. start: startOfMonth(addMonths(new Date(), 1)),
  29. end: endOfMonth(addMonths(new Date(), 1)),
  30. },
  31. {
  32. text: 'Today',
  33. start: new Date(),
  34. end: new Date(),
  35. },
  36. {
  37. text: 'Tomorrow',
  38. start: addDays(new Date(), 1),
  39. end: addDays(new Date(), 1),
  40. },
  41. {
  42. text: 'Next Week',
  43. start: addWeeks(new Date(), 1),
  44. end: addWeeks(new Date(), 2),
  45. },
  46. {
  47. text: 'Next Month',
  48. start: startOfMonth(addMonths(new Date(), 1)),
  49. end: endOfMonth(addMonths(new Date(), 1)),
  50. },
  51. ];
  52. const stories = storiesOf('DatePicker', module);
  53. stories.add('default', () => {
  54. const Demo = () => {
  55. const ref = useRef(null);
  56. useEffect(() => {
  57. console.log(ref.current);
  58. if (ref.current) {
  59. console.log('triggerElRef: ', ref.current.triggerElRef);
  60. }
  61. }, [ref.current]);
  62. return (
  63. <>
  64. <DatePicker ref={ref} style={{ display: 'inline-block' }} />
  65. <DatePicker
  66. type='dateTime'
  67. presets={presets.map(preset => ({
  68. text: preset.text,
  69. start: preset.start,
  70. }))}
  71. onPresetClick={(item, e) => {
  72. const { start } = item;
  73. console.log('preset click', item, e, start);
  74. }}
  75. />
  76. <DatePicker
  77. type="dateTime"
  78. presets={[() => ({
  79. start: new Date(),
  80. })]}
  81. onPresetClick={(item, e) => {
  82. const { start } = item;
  83. console.log('preset click', item, e, start);
  84. }}
  85. />
  86. </>
  87. );
  88. };
  89. return <Demo />;
  90. });
  91. stories.add('useFullRender', () => {
  92. function Demo() {
  93. const renderFullDate = (dayNumber: number, fullDate: string, dayStatus: DayStatusType) => {
  94. const { isInRange, isHover, isSelected, isSelectedStart, isSelectedEnd } = dayStatus;
  95. const prefix = 'components-datepicker-demo';
  96. const dateCls = classNames({
  97. [`${prefix}-day-inrange`]: isInRange,
  98. [`${prefix}-day-hover`]: isHover,
  99. [`${prefix}-day-selected`]: isSelected,
  100. [`${prefix}-day-selected-start`]: isSelectedStart,
  101. [`${prefix}-day-selected-end`]: isSelectedEnd,
  102. });
  103. const dayStyle = {
  104. display: 'flex',
  105. alignItems: 'center',
  106. justifyContent: 'center',
  107. width: '80%',
  108. height: '80%',
  109. borderRadius: '50%',
  110. };
  111. return (
  112. <div style={dayStyle} className={dateCls}>
  113. {dayNumber}
  114. </div>
  115. );
  116. };
  117. return <DatePicker style={{ width: 240 }} type={'dateRange'} renderFullDate={renderFullDate} />;
  118. }
  119. return <Demo />;
  120. });
  121. stories.add('triggerRender', () => {
  122. function Demo() {
  123. const ref = useRef();
  124. const [date, setDate] = useState(new Date());
  125. const formatToken = 'yyyy-MM-dd';
  126. const onChange = useCallback(date => {
  127. setDate(date);
  128. }, []);
  129. const onClear = useCallback(e => {
  130. e && e.stopPropagation();
  131. setDate(null);
  132. }, []);
  133. const closeIcon = useMemo(() => {
  134. return date ? <IconClose onClick={onClear} /> : <IconChevronDown />;
  135. }, [date]);
  136. return (
  137. <DatePicker
  138. ref={ref}
  139. onChange={onChange}
  140. value={date}
  141. format={formatToken}
  142. triggerRender={({ placeholder }) => (
  143. <Button theme={'light'} icon={closeIcon} iconPosition={'right'}>
  144. {(date && dateFns.format(date, formatToken)) || placeholder}
  145. </Button>
  146. )}
  147. />
  148. );
  149. }
  150. return <Demo />;
  151. });
  152. stories.add('Form.DatePicker', () => {
  153. function Demo() {
  154. const ref = useRef();
  155. const ref2 = useRef();
  156. const [open3, setOpen3] = useState(false);
  157. const presets = [
  158. {
  159. text: 'Today',
  160. start: new Date(),
  161. end: new Date(),
  162. },
  163. {
  164. text: 'Tomorrow',
  165. start: new Date(new Date().valueOf() + 1000 * 3600 * 24),
  166. end: new Date(new Date().valueOf() + 1000 * 3600 * 24),
  167. },
  168. ];
  169. // const CustomDatePicker = (props: DatePickerProps & { fieldRef: React.Ref<Object> }) => {
  170. // const { fieldRef, ...rest } = props;
  171. // return (
  172. // <DatePicker {...rest} ref={fieldRef} />
  173. // );
  174. // };
  175. // const CustomFieldDatePicker = withField(CustomDatePicker);
  176. return (
  177. <>
  178. <DatePicker type="dateRange" ref={ref} />
  179. <Form>
  180. {/* <CustomFieldDatePicker
  181. type="dateTimeRange"
  182. field="a"
  183. label="Form.DatePicker"
  184. presets={presets}
  185. open={open3}
  186. onPresetClick={() => {
  187. console.log('click presets', ref2);
  188. setOpen3(false);
  189. setTimeout(() => {
  190. ref2.current && (ref2.current as any).foundation.closePanel();
  191. }, 0);
  192. }}
  193. onFocus={() => {
  194. console.log('focus');
  195. setOpen3(true);
  196. }}
  197. onBlur={() => {console.log('blur')}}
  198. style={{ width: 500 }}
  199. fieldRef={ref2}
  200. /> */}
  201. </Form>
  202. </>
  203. );
  204. }
  205. return <Demo />;
  206. });
  207. stories.add('fix 1460', () => <DatePicker type={'month'} onChange={(date, dateString) => console.log('DatePicker changed: ', date, dateString)} />);