timepicker.stories.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. import React, { Component, useState } from 'react';
  2. import { storiesOf } from '@storybook/react';
  3. import TimePickerPanel from '../index';
  4. import { TimePicker as BasicTimePicker, Button } from '../../index';
  5. import { strings } from '@douyinfe/semi-foundation/timePicker/constants';
  6. import { get } from 'lodash-es';
  7. import Callbacks from './Callbacks';
  8. import CustomTrigger from './CustomTrigger';
  9. import DisabledTime from './DisabledTime';
  10. let TimePicker;
  11. const stories = storiesOf('timePicker', module);
  12. // auto add scrollItemProps.cycled = false, prevent waiting indefinitely in snapshot testing
  13. const TimePickerForTest = props => {
  14. let scrollItemProps = {};
  15. if (!props.scrollItemProps) {
  16. scrollItemProps = { cycled: false };
  17. } else {
  18. scrollItemProps = { ...props.scrollItemProps, cycled: false };
  19. }
  20. return <BasicTimePicker {...props} scrollItemProps={scrollItemProps} />;
  21. };
  22. const init = () => {
  23. if (process.env.NODE_ENV === 'development') {
  24. TimePicker = BasicTimePicker;
  25. } else {
  26. TimePicker = TimePickerForTest;
  27. }
  28. };
  29. init();
  30. stories.add('TimePickerPanel default', () => {
  31. return (
  32. <div>
  33. <TimePicker panelHeader={'Time Select'} onChange={val => console.log(val)} />
  34. <TimePicker format={'HH:mm:ss'} defaultValue={'10:24:18'} defaultOpen={true} scrollItemProps={{ cycled: false }} />
  35. </div>
  36. );
  37. });
  38. stories.add('基础使用', () => <TimePicker />);
  39. class Demo extends React.Component {
  40. constructor() {
  41. super();
  42. this.state = {
  43. value: null,
  44. };
  45. this.onChange = this.onChange.bind(this);
  46. }
  47. onChange(time) {
  48. // console.log(time);
  49. this.setState({ value: time });
  50. }
  51. render() {
  52. return <TimePicker value={this.state.value} onChange={this.onChange} />;
  53. }
  54. }
  55. stories.add('TimePickerPanel 受控组件', () => {
  56. const Demo = () => {
  57. const [value, setValue] = useState(new Date());
  58. const onChange = (date, str) => setValue(date);
  59. return (
  60. <div>
  61. <TimePicker panelHeader={'Time Select'} value={new Date()} />
  62. <TimePicker panelHeader={'Time Select'} value={value} onChange={onChange} />
  63. <TimePicker open />
  64. </div>
  65. );
  66. };
  67. return <Demo />;
  68. });
  69. function CustomDemo() {
  70. const [open, setOpen] = useState(false);
  71. const closePanel = () => setOpen(false);
  72. const onOpenChange = open => {
  73. setOpen(open);
  74. console.log(open);
  75. };
  76. return (
  77. <TimePicker
  78. open={open}
  79. onOpenChange={onOpenChange}
  80. panelHeader={'Time Select'}
  81. panelFooter={<Button onClick={closePanel}>close</Button>}
  82. />
  83. );
  84. }
  85. stories.add('设置面板头部,底部', () => <CustomDemo />);
  86. stories.add('不同format格式', () => <TimePicker format={'HH:mm'} defaultValue={'10:24'} />);
  87. stories.add('禁用时间选择', () => {
  88. return <TimePicker defaultValue={'12:08:23'} disabled />;
  89. });
  90. stories.add('设置步长', () => {
  91. return <TimePicker minuteStep={15} secondStep={10} />;
  92. });
  93. stories.add('inputReadOnly', () => {
  94. return <TimePicker inputReadOnly />;
  95. });
  96. stories.add('range picker', () => {
  97. const RangePickerDemo = () => {
  98. const log = (...args) => {
  99. console.log(...args);
  100. };
  101. const disabledHM = { 3: [3, 6, 12, 24, 48], 9: [9, 18, 36] };
  102. const disabledHMS = { 6: { 6: [6, 12, 24, 48] }, 18: { 18: [18, 36] } };
  103. const defaultValue = ['10:11:12', '12:11:23'];
  104. const [value, setValue] = useState(['10:11:12', '12:11:23']);
  105. const disabledHours = () => [1, 2, 4, 8, 16];
  106. const disabledMinutes = hours => get(disabledHM, [hours], []);
  107. const disabledSeconds = (hours, seconds) => get(disabledHMS, [hours, seconds], []);
  108. const onChange = (dates, str) => {
  109. log(dates, str);
  110. setValue(dates);
  111. };
  112. return (
  113. <div style={{ margin: 200 }}>
  114. <div>
  115. <p>基本</p>
  116. <TimePicker type={strings.TYPE_TIME_RANGE_PICKER} onChange={log} />
  117. </div>
  118. <br />
  119. <div>
  120. <p>默认值</p>
  121. <TimePicker defaultValue={defaultValue} type={strings.TYPE_TIME_RANGE_PICKER} onChange={log} />
  122. </div>
  123. <div>
  124. <p>受控</p>
  125. <TimePicker value={value} type={strings.TYPE_TIME_RANGE_PICKER} onChange={onChange} />
  126. </div>
  127. <div>
  128. <p>默认值+format</p>
  129. <TimePicker
  130. format="HH:mm"
  131. disabledHours={disabledHours}
  132. disabledMinutes={disabledMinutes}
  133. disabledSeconds={disabledSeconds}
  134. defaultValue={['10:12', '18:08']}
  135. type={strings.TYPE_TIME_RANGE_PICKER}
  136. onChange={log}
  137. />
  138. <br />
  139. </div>
  140. <div>
  141. <p>默认值+use12Hours+format</p>
  142. <TimePicker
  143. use12Hours
  144. format="a hh:mm"
  145. disabledHours={disabledHours}
  146. disabledMinutes={disabledMinutes}
  147. disabledSeconds={disabledSeconds}
  148. defaultValue={['上午 10:12', '上午 11:08']}
  149. type={strings.TYPE_TIME_RANGE_PICKER}
  150. onChange={log}
  151. scrollItemProps={{ mode: 'normal' }}
  152. />
  153. <br />
  154. </div>
  155. </div>
  156. );
  157. };
  158. return <RangePickerDemo />;
  159. });
  160. stories.add(`callbacks`, () => <Callbacks />);
  161. stories.add(`custom trigger`, () => <CustomTrigger />);
  162. stories.add(`disabled time demos`, () => <DisabledTime />);
  163. stories.add(`showClear`, () => {
  164. function Demo() {
  165. return (
  166. <>
  167. <TimePicker defaultValue={new Date()} showClear onChange={(...args) => { console.log('clear', ...args); }} />
  168. <TimePicker type="timeRange" defaultValue={new Date(), new Date()} showClear onChange={(...args) => { console.log('clear', ...args); }} />
  169. </>
  170. );
  171. }
  172. return <Demo />;
  173. });