index.js 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. /* eslint-disable max-lines-per-function */
  2. import React, { useState, useMemo } from 'react';
  3. import { DatePicker, ConfigProvider, Select } from '@douyinfe/semi-ui';
  4. import * as _ from 'lodash';
  5. import * as dateFns from 'date-fns';
  6. import { utcToZonedTime } from 'date-fns-tz';
  7. const { Option } = Select;
  8. function Demo() {
  9. const now = new Date();
  10. const startDate = dateFns.addMinutes(dateFns.subDays(now, 1), 5);
  11. const [timeZone, setTimeZone] = useState('GMT+09:00');
  12. const gmtList = useMemo(() => {
  13. const list = [];
  14. for (let hourOffset = -11; hourOffset <= 14; hourOffset++) {
  15. const prefix = hourOffset >= 0 ? '+' : '-';
  16. const hOffset = Math.abs(parseInt(hourOffset, 10));
  17. list.push(`GMT${prefix}${String(hOffset).padStart(2, '0')}:00`);
  18. }
  19. return list;
  20. }, []);
  21. return (
  22. <div style={{ width: 300 }}>
  23. <DatePicker
  24. type="dateTime"
  25. disabledTimePicker={true}
  26. disabledDate={str => {
  27. const date = new Date(str);
  28. if (str.length <= 4) {
  29. return date.getFullYear() < 2015;
  30. }
  31. return date.getMonth() + 1 < 10;
  32. }}
  33. onChange={date => console.log('date changed', date)}
  34. />
  35. <DatePicker
  36. type="dateTimeRange"
  37. defaultValue={['2020-02-01 11:22:33', '2020-02-22 12:32:38']}
  38. disabledTimePicker={true}
  39. disabledDate={str => {
  40. const date = new Date(str);
  41. if (str.length <= 4) {
  42. return date.getFullYear() < 2015;
  43. }
  44. return date.getMonth() + 1 < 10;
  45. }}
  46. />
  47. <br />
  48. <strong>Disabled 17:00:00-18:00:00 today</strong>
  49. <DatePicker
  50. type="dateTime"
  51. hideDisabledOptions={false}
  52. disabledTime={date =>
  53. (dateFns.isToday(date)
  54. ? {
  55. disabledHours: () => [17, 18],
  56. disabledMinutes: hour => (19 === hour ? _.range(0, 10, 1) : []),
  57. disabledSeconds: (hour, minute) =>
  58. (hour === 20 && minute === 20 ? _.range(0, 20, 1) : []),
  59. }
  60. : null)
  61. }
  62. />
  63. <div>
  64. <h5>Month Picker</h5>
  65. <DatePicker
  66. type="month"
  67. disabledDate={date =>
  68. // [2019, 2018].includes(dateFns.getYear(date)) ||
  69. 2020 === dateFns.getYear(date) && [1, 2, 3].includes(dateFns.getMonth(date))
  70. }
  71. />
  72. </div>
  73. {/* 开始时间不能早于当下时间+5min,结束时间要在7天内 */}
  74. <DatePicker
  75. type={'dateTimeRange'}
  76. disabledDate={cur => {
  77. const deadDate = dateFns.addDays(now, 7);
  78. return dateFns.isAfter(cur, deadDate) || dateFns.isBefore(cur, startDate);
  79. }}
  80. disabledTime={(dates, panelType) => {
  81. if (dateFns.isToday(dates[0]) && panelType === 'left') {
  82. return {
  83. disabledHours: () => _.range(0, now.getHours(), 1),
  84. disabledMinutes: hour =>
  85. (now.getHours() === hour ? _.range(0, now.getMinutes() + 5, 1) : []),
  86. };
  87. }
  88. }}
  89. onChange={(...args) => console.log(...args)}
  90. />
  91. <br />
  92. {/* 动态禁止时间,禁止选中之前的Date */}
  93. <strong>Disabled date before rangeStart</strong>
  94. <DatePicker
  95. type={'dateRange'}
  96. disabledDate={(cur, options) => {
  97. const { rangeStart } = options;
  98. const startDate = dateFns.parseISO(rangeStart);
  99. return dateFns.isBefore(cur, startDate);
  100. }}
  101. style={{ width: 240 }}
  102. />
  103. <br /><br />
  104. <strong>type=month时禁止2020年且11月之前的日期 v1.10.0</strong>
  105. <DatePicker
  106. type={'month'}
  107. disabledDate={cur => {
  108. if (cur.getFullYear() === 2020 && cur.getMonth() < 10) {
  109. return true;
  110. }
  111. return false;
  112. }}
  113. style={{ width: 240 }}
  114. />
  115. <br /><br />
  116. <strong>type=month时禁止2008年-2020年 v1.10.0</strong>
  117. <DatePicker
  118. type={'month'}
  119. style={{ width: 240 }}
  120. disabledDate={cur => {
  121. const currentYear = cur.getFullYear();
  122. if (2008 <= currentYear && currentYear <= 2020) {
  123. return true;
  124. }
  125. return false;
  126. }}
  127. />
  128. <br /><br />
  129. <strong>fix disabledDate callback timeZone bug</strong>
  130. <ConfigProvider timeZone={timeZone}>
  131. <div style={{ width: 300 }}>
  132. <h5 style={{ margin: 10 }}>Select Time Zone:</h5>
  133. <Select
  134. placeholder={'请选择时区'}
  135. style={{ width: 300 }}
  136. value={timeZone}
  137. showClear={true}
  138. onSelect={value => setTimeZone(value)}
  139. >
  140. {gmtList.map(gmt => (
  141. <Option key={gmt} value={gmt}>
  142. {gmt}
  143. </Option>
  144. ))}
  145. </Select>
  146. <br />
  147. <br />
  148. <DatePicker
  149. disabledDate={str => {
  150. const date = new Date(str);
  151. const isDisabled = date.valueOf() === 1626274800000;
  152. if (isDisabled) {
  153. console.log(str);
  154. }
  155. return isDisabled;
  156. }}
  157. placeholder="禁用每月10号"
  158. onChange={date => {
  159. console.log('selected', date);
  160. }}
  161. />
  162. <DatePicker
  163. type="dateTime"
  164. disabledTime={str => {
  165. const date = new Date(str);
  166. const localDate = utcToZonedTime(date, timeZone);
  167. const isDisabled = localDate.getDate() === 15;
  168. return isDisabled ? ({ disabledHours: () => [18] }) : null;
  169. }}
  170. defaultPickerValue={new Date('2021-07-15 17:00:00')}
  171. placeholder="禁用7月15号下午6点"
  172. onChange={date => {
  173. console.log('selected', date);
  174. }}
  175. />
  176. </div>
  177. </ConfigProvider>
  178. </div>
  179. );
  180. }
  181. export default Demo;