timepicker.stories.js 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. import React, { Component, useState } from 'react';
  2. import TimePickerPanel from '../index';
  3. import { TimePicker as BasicTimePicker, Button, Form } from '../../index';
  4. import { strings } from '@douyinfe/semi-foundation/timePicker/constants';
  5. import { get } from 'lodash';
  6. import Callbacks from './Callbacks';
  7. import CustomTrigger from './CustomTrigger';
  8. import DisabledTime from './DisabledTime';
  9. let TimePicker;
  10. export default {
  11. title: 'TimePicker',
  12. parameters: {
  13. chromatic: { disableSnapshot: true },
  14. },
  15. }
  16. export {
  17. Callbacks,
  18. CustomTrigger,
  19. DisabledTime
  20. }
  21. // auto add scrollItemProps.cycled = false, prevent waiting indefinitely in snapshot testing
  22. const TimePickerForTest = props => {
  23. let scrollItemProps = {};
  24. if (!props.scrollItemProps) {
  25. scrollItemProps = { cycled: false };
  26. } else {
  27. scrollItemProps = { ...props.scrollItemProps, cycled: false };
  28. }
  29. return <BasicTimePicker {...props} scrollItemProps={scrollItemProps} />;
  30. };
  31. const init = () => {
  32. if (process.env.NODE_ENV === 'development') {
  33. TimePicker = BasicTimePicker;
  34. } else {
  35. TimePicker = TimePickerForTest;
  36. }
  37. };
  38. init();
  39. export const TimePickerPanelDefault = () => {
  40. const initValues = {
  41. testRange: [
  42. new Date("2022-04-17T15:00:00"),
  43. new Date("2022-04-17T18:00:00"),
  44. ],
  45. };
  46. return (
  47. <div>
  48. <TimePicker panelHeader={'Time Select'} onChange={val => console.log(val)} />
  49. <TimePicker
  50. format={'HH:mm:ss'}
  51. defaultValue={'10:24:18'}
  52. defaultOpen={true}
  53. scrollItemProps={{ cycled: false }}
  54. />
  55. <TimePicker use12Hours defaultValue={"上午 10:32:33"}/>
  56. <br/><br/>
  57. <TimePicker type="timeRange" use12Hours format="a h:mm" defaultValue={["下午 08:11", "上午 11:21"]} />
  58. <Form initValues={initValues}>
  59. <pre>{JSON.stringify(initValues)}</pre>
  60. <Form.TimePicker
  61. use12Hours
  62. field="testRange"
  63. label="Time Range"
  64. type="timeRange"
  65. format="a hh:mm"
  66. />
  67. </Form>
  68. </div>
  69. );
  70. };
  71. TimePickerPanelDefault.story = {
  72. name: 'TimePickerPanel default',
  73. };
  74. export const BasicUsage = () => <TimePicker />;
  75. BasicUsage.story = {
  76. name: 'basic usage',
  77. };
  78. class Demo extends React.Component {
  79. constructor() {
  80. super();
  81. this.state = {
  82. value: null,
  83. };
  84. this.onChange = this.onChange.bind(this);
  85. }
  86. onChange(time) {
  87. // console.log(time);
  88. this.setState({ value: time });
  89. }
  90. render() {
  91. return <TimePicker value={this.state.value} onChange={this.onChange} />;
  92. }
  93. }
  94. export const PanelHeader = () => {
  95. const Demo = () => {
  96. const [value, setValue] = useState(new Date());
  97. const onChange = (date, str) => setValue(date);
  98. return (
  99. <div>
  100. <TimePicker panelHeader={'Time Select'} value={new Date()} />
  101. <TimePicker panelHeader={'Time Select'} value={value} onChange={onChange} />
  102. <TimePicker open />
  103. </div>
  104. );
  105. };
  106. return <Demo />;
  107. };
  108. PanelHeader.story = {
  109. name: 'panelHeader',
  110. };
  111. function CustomDemo() {
  112. const [open, setOpen] = useState(false);
  113. const closePanel = () => setOpen(false);
  114. const onOpenChange = open => {
  115. setOpen(open);
  116. console.log(open);
  117. };
  118. return (
  119. <TimePicker
  120. open={open}
  121. onOpenChange={onOpenChange}
  122. panelHeader={'Time Select'}
  123. panelFooter={<Button onClick={closePanel}>close</Button>}
  124. />
  125. );
  126. }
  127. export const HeaderAndFooter = () => <CustomDemo />;
  128. HeaderAndFooter.story = {
  129. name: 'header and footer',
  130. };
  131. export const Format = () => <TimePicker format={'HH:mm'} defaultValue={'10:24'} />;
  132. Format.story = {
  133. name: 'format',
  134. };
  135. export const Disabled = () => {
  136. return <TimePicker defaultValue={'12:08:23'} disabled />;
  137. };
  138. Disabled.story = {
  139. name: 'disabled',
  140. };
  141. export const MinuteStepAndSecondStep = () => {
  142. return <TimePicker minuteStep={15} secondStep={10} />;
  143. };
  144. MinuteStepAndSecondStep.story = {
  145. name: 'minuteStep and secondStep',
  146. };
  147. export const InputReadOnly = () => {
  148. return <TimePicker inputReadOnly />;
  149. };
  150. InputReadOnly.story = {
  151. name: 'inputReadOnly',
  152. };
  153. export const RangePicker = () => {
  154. const RangePickerDemo = () => {
  155. const log = (...args) => {
  156. console.log(...args);
  157. };
  158. const disabledHM = { 3: [3, 6, 12, 24, 48], 9: [9, 18, 36] };
  159. const disabledHMS = { 6: { 6: [6, 12, 24, 48] }, 18: { 18: [18, 36] } };
  160. const defaultValue = ['10:11:12', '12:11:23'];
  161. const [value, setValue] = useState(['10:11:12', '12:11:23']);
  162. const disabledHours = () => [1, 2, 4, 8, 16];
  163. const disabledMinutes = hours => get(disabledHM, [hours], []);
  164. const disabledSeconds = (hours, seconds) => get(disabledHMS, [hours, seconds], []);
  165. const onChange = (dates, str) => {
  166. log(dates, str);
  167. setValue(dates);
  168. };
  169. return (
  170. <div style={{ margin: 200 }}>
  171. <div>
  172. <p>基本</p>
  173. <TimePicker type={strings.TYPE_TIME_RANGE_PICKER} onChange={log} />
  174. </div>
  175. <br />
  176. <div>
  177. <p>默认值</p>
  178. <TimePicker
  179. defaultValue={defaultValue}
  180. type={strings.TYPE_TIME_RANGE_PICKER}
  181. onChange={log}
  182. />
  183. </div>
  184. <div>
  185. <p>受控</p>
  186. <TimePicker value={value} type={strings.TYPE_TIME_RANGE_PICKER} onChange={onChange} />
  187. </div>
  188. <div>
  189. <p>默认值+format</p>
  190. <TimePicker
  191. format="HH:mm"
  192. disabledHours={disabledHours}
  193. disabledMinutes={disabledMinutes}
  194. disabledSeconds={disabledSeconds}
  195. defaultValue={['10:12', '18:08']}
  196. type={strings.TYPE_TIME_RANGE_PICKER}
  197. onChange={log}
  198. />
  199. <br />
  200. </div>
  201. <div>
  202. <p>默认值+use12Hours+format</p>
  203. <TimePicker
  204. use12Hours
  205. format="a hh:mm"
  206. disabledHours={disabledHours}
  207. disabledMinutes={disabledMinutes}
  208. disabledSeconds={disabledSeconds}
  209. defaultValue={['上午 10:12', '上午 11:08']}
  210. type={strings.TYPE_TIME_RANGE_PICKER}
  211. onChange={log}
  212. scrollItemProps={{ mode: 'normal' }}
  213. />
  214. <br />
  215. </div>
  216. </div>
  217. );
  218. };
  219. return <RangePickerDemo />;
  220. };
  221. RangePicker.story = {
  222. name: 'range picker',
  223. };
  224. RangePicker.parameters = {
  225. chromatic: { disableSnapshot: false },
  226. }
  227. export const ShowClear = () => (
  228. <>
  229. <TimePicker
  230. defaultValue={new Date()}
  231. showClear
  232. onChange={(...args) => {
  233. console.log('clear', ...args);
  234. }}
  235. />
  236. <TimePicker
  237. type="timeRange"
  238. defaultValue={(new Date(), new Date())}
  239. showClear
  240. onChange={(...args) => {
  241. console.log('clear', ...args);
  242. }}
  243. />
  244. </>
  245. );
  246. export const TimePickerWithOnChangeWithDateFirst = () => {
  247. return (
  248. <div>
  249. onChangeWithDateFirst=true (default)
  250. <TimePicker onChange={(...val) => console.log(...val)} />
  251. <br />
  252. onChangeWithDateFirst=false
  253. <TimePicker onChangeWithDateFirst={false} onChange={(...val) => console.log(...val)} />
  254. </div>
  255. );
  256. };
  257. TimePickerWithOnChangeWithDateFirst.story = {
  258. name: 'OnChangeWithDateFirst',
  259. };