timepicker.stories.js 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. import React, { Component, useState } from 'react';
  2. import TimePickerPanel from '../index';
  3. import { TimePicker as BasicTimePicker, Button } from '../../index';
  4. import { strings } from '@douyinfe/semi-foundation/timePicker/constants';
  5. import { get } from 'lodash-es';
  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. return (
  41. <div>
  42. <TimePicker panelHeader={'Time Select'} onChange={val => console.log(val)} />
  43. <TimePicker
  44. format={'HH:mm:ss'}
  45. defaultValue={'10:24:18'}
  46. defaultOpen={true}
  47. scrollItemProps={{ cycled: false }}
  48. />
  49. </div>
  50. );
  51. };
  52. TimePickerPanelDefault.story = {
  53. name: 'TimePickerPanel default',
  54. };
  55. export const BasicUsage = () => <TimePicker />;
  56. BasicUsage.story = {
  57. name: 'basic usage',
  58. };
  59. class Demo extends React.Component {
  60. constructor() {
  61. super();
  62. this.state = {
  63. value: null,
  64. };
  65. this.onChange = this.onChange.bind(this);
  66. }
  67. onChange(time) {
  68. // console.log(time);
  69. this.setState({ value: time });
  70. }
  71. render() {
  72. return <TimePicker value={this.state.value} onChange={this.onChange} />;
  73. }
  74. }
  75. export const PanelHeader = () => {
  76. const Demo = () => {
  77. const [value, setValue] = useState(new Date());
  78. const onChange = (date, str) => setValue(date);
  79. return (
  80. <div>
  81. <TimePicker panelHeader={'Time Select'} value={new Date()} />
  82. <TimePicker panelHeader={'Time Select'} value={value} onChange={onChange} />
  83. <TimePicker open />
  84. </div>
  85. );
  86. };
  87. return <Demo />;
  88. };
  89. PanelHeader.story = {
  90. name: 'panelHeader',
  91. };
  92. function CustomDemo() {
  93. const [open, setOpen] = useState(false);
  94. const closePanel = () => setOpen(false);
  95. const onOpenChange = open => {
  96. setOpen(open);
  97. console.log(open);
  98. };
  99. return (
  100. <TimePicker
  101. open={open}
  102. onOpenChange={onOpenChange}
  103. panelHeader={'Time Select'}
  104. panelFooter={<Button onClick={closePanel}>close</Button>}
  105. />
  106. );
  107. }
  108. export const HeaderAndFooter = () => <CustomDemo />;
  109. HeaderAndFooter.story = {
  110. name: 'header and footer',
  111. };
  112. export const Format = () => <TimePicker format={'HH:mm'} defaultValue={'10:24'} />;
  113. Format.story = {
  114. name: 'format',
  115. };
  116. export const Disabled = () => {
  117. return <TimePicker defaultValue={'12:08:23'} disabled />;
  118. };
  119. Disabled.story = {
  120. name: 'disabled',
  121. };
  122. export const MinuteStepAndSecondStep = () => {
  123. return <TimePicker minuteStep={15} secondStep={10} />;
  124. };
  125. MinuteStepAndSecondStep.story = {
  126. name: 'minuteStep and secondStep',
  127. };
  128. export const InputReadOnly = () => {
  129. return <TimePicker inputReadOnly />;
  130. };
  131. InputReadOnly.story = {
  132. name: 'inputReadOnly',
  133. };
  134. export const RangePicker = () => {
  135. const RangePickerDemo = () => {
  136. const log = (...args) => {
  137. console.log(...args);
  138. };
  139. const disabledHM = { 3: [3, 6, 12, 24, 48], 9: [9, 18, 36] };
  140. const disabledHMS = { 6: { 6: [6, 12, 24, 48] }, 18: { 18: [18, 36] } };
  141. const defaultValue = ['10:11:12', '12:11:23'];
  142. const [value, setValue] = useState(['10:11:12', '12:11:23']);
  143. const disabledHours = () => [1, 2, 4, 8, 16];
  144. const disabledMinutes = hours => get(disabledHM, [hours], []);
  145. const disabledSeconds = (hours, seconds) => get(disabledHMS, [hours, seconds], []);
  146. const onChange = (dates, str) => {
  147. log(dates, str);
  148. setValue(dates);
  149. };
  150. return (
  151. <div style={{ margin: 200 }}>
  152. <div>
  153. <p>基本</p>
  154. <TimePicker type={strings.TYPE_TIME_RANGE_PICKER} onChange={log} />
  155. </div>
  156. <br />
  157. <div>
  158. <p>默认值</p>
  159. <TimePicker
  160. defaultValue={defaultValue}
  161. type={strings.TYPE_TIME_RANGE_PICKER}
  162. onChange={log}
  163. />
  164. </div>
  165. <div>
  166. <p>受控</p>
  167. <TimePicker value={value} type={strings.TYPE_TIME_RANGE_PICKER} onChange={onChange} />
  168. </div>
  169. <div>
  170. <p>默认值+format</p>
  171. <TimePicker
  172. format="HH:mm"
  173. disabledHours={disabledHours}
  174. disabledMinutes={disabledMinutes}
  175. disabledSeconds={disabledSeconds}
  176. defaultValue={['10:12', '18:08']}
  177. type={strings.TYPE_TIME_RANGE_PICKER}
  178. onChange={log}
  179. />
  180. <br />
  181. </div>
  182. <div>
  183. <p>默认值+use12Hours+format</p>
  184. <TimePicker
  185. use12Hours
  186. format="a hh:mm"
  187. disabledHours={disabledHours}
  188. disabledMinutes={disabledMinutes}
  189. disabledSeconds={disabledSeconds}
  190. defaultValue={['上午 10:12', '上午 11:08']}
  191. type={strings.TYPE_TIME_RANGE_PICKER}
  192. onChange={log}
  193. scrollItemProps={{ mode: 'normal' }}
  194. />
  195. <br />
  196. </div>
  197. </div>
  198. );
  199. };
  200. return <RangePickerDemo />;
  201. };
  202. RangePicker.story = {
  203. name: 'range picker',
  204. };
  205. RangePicker.parameters = {
  206. chromatic: { disableSnapshot: false },
  207. }
  208. export const ShowClear = () => (
  209. <>
  210. <TimePicker
  211. defaultValue={new Date()}
  212. showClear
  213. onChange={(...args) => {
  214. console.log('clear', ...args);
  215. }}
  216. />
  217. <TimePicker
  218. type="timeRange"
  219. defaultValue={(new Date(), new Date())}
  220. showClear
  221. onChange={(...args) => {
  222. console.log('clear', ...args);
  223. }}
  224. />
  225. </>
  226. );