index.js 5.21 KB
Newer Older
邓晓峰's avatar
邓晓峰 committed
1
// eslint-disable-next-line no-unused-vars
2
import React, { useContext } from 'react';
3
import moment from 'moment';
4
import classNames from 'classnames';
李纪文's avatar
李纪文 committed
5
import { DatePicker, ConfigProvider, TimePicker } from 'antd';
6 7
import './index.less';

李纪文's avatar
李纪文 committed
8
const { RangePicker } = DatePicker;
9 10 11 12
const FORMATS = {
  day: 'YYYY-MM-DD',
  week: 'YYYY-wo',
  month: 'YYYY-MM',
13
  quarter: 'YYYY-第Q季度',
14 15 16 17 18
  year: 'YYYY',
};
const STANTFORMAT = 'YYYY-MM-DD 00:00:00';
const ENDFORMAT = 'YYYY-MM-DD 23:59:59';
const DatePickerCustom = (props) => {
19 20 21
  const { getPrefixCls } = useContext(ConfigProvider.ConfigContext);
  const prefixCls = getPrefixCls('datepicker-custom');
  // eslint-disable-next-line no-nested-ternary
李纪文's avatar
李纪文 committed
22
  const modes = props.picker ? (props.picker !== 'date' ? props.picker : 'day') : 'day';
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
  const selectedDate = props.value ? props.value : new Date();
  const onChange = (date, dateString) => {
    const dateTime = moment(date).format('YYYY-MM-DD');
    let startTime = null;
    let endTime = null;
    switch (modes) {
      case 'day':
        startTime = moment(dateTime);
        endTime = moment(dateTime);
        break;
      case 'week':
        startTime = moment(dateTime).startOf(modes);
        endTime = moment(dateTime).endOf(modes);
        break;
      case 'month':
        startTime = moment(dateTime).startOf(modes);
        endTime = moment(dateTime).endOf(modes);
        break;
41 42 43 44
      case 'quarter':
        startTime = moment(dateTime).startOf(modes);
        endTime = moment(dateTime).endOf(modes);
        break;
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
      case 'year':
        startTime = moment(dateTime).startOf(modes);
        endTime = moment(dateTime).endOf(modes);
        break;
      default:
        startTime = moment(dateTime);
        endTime = moment(dateTime);
        break;
    }
    props.onChange(
      { startTime: startTime.format(STANTFORMAT), endTime: endTime.format(ENDFORMAT) },
      dateString,
    );
  };
  const customFormat = (value) => {
    let name = null;
    switch (modes) {
      case 'day':
        name = value.format(FORMATS[modes]);
64
        // eslint-disable-next-line no-use-before-define
65 66
        if (name === getTime(0, 'days', FORMATS[modes])) {
          name = '今天';
67
          // eslint-disable-next-line no-use-before-define
68 69 70 71 72
        } else if (name === getTime(1, 'days', FORMATS[modes])) {
          name = '昨天';
        }
        break;
      case 'week':
邓晓峰's avatar
邓晓峰 committed
73
        // eslint-disable-next-line no-use-before-define
74
        name = getMonthWeek(value);
邓晓峰's avatar
邓晓峰 committed
75
        // eslint-disable-next-line no-use-before-define
76 77
        if (value.format('YYYY-wo') === getTime(0, 'week', FORMATS[modes])) {
          name = '本周';
78
          // eslint-disable-next-line no-use-before-define
79 80 81 82 83 84
        } else if (value.format('YYYY-wo') === getTime(1, 'week', FORMATS[modes])) {
          name = '上周';
        }
        break;
      case 'month':
        name = value.format(FORMATS[modes]);
85
        // eslint-disable-next-line no-use-before-define
86 87
        if (name === getTime(0, 'month', FORMATS[modes])) {
          name = '本月';
88
          // eslint-disable-next-line no-use-before-define
89 90 91 92
        } else if (name === getTime(1, 'month', FORMATS[modes])) {
          name = '上月';
        }
        break;
93 94 95 96 97 98 99 100 101 102
      case 'quarter':
        name = value.format(FORMATS[modes]);
        // eslint-disable-next-line no-use-before-define
        if (name === getTime(0, 'month', FORMATS[modes])) {
          name = '本季度';
          // eslint-disable-next-line no-use-before-define
        } else if (name === getTime(3, 'month', FORMATS[modes])) {
          name = '上季度';
        }
        break;
103 104
      case 'year':
        name = value.format(FORMATS[modes]);
105
        // eslint-disable-next-line no-use-before-define
106 107
        if (name === getTime(0, 'year', FORMATS[modes])) {
          name = '今年';
108
          // eslint-disable-next-line no-use-before-define
109 110 111 112 113 114 115 116 117 118 119 120 121
        } else if (name === getTime(1, 'year', FORMATS[modes])) {
          name = '去年';
        }
        break;
      default:
        break;
    }
    return name;
  };
  const getTime = (num, type, format) => {
    return moment(new Date()).subtract(num, type).format(format);
  };
  const getMonthWeek = (value) => {
122 123 124 125 126 127 128
    const a = value.format('YYYY');
    const b = value.format('MM');
    const c = value.format('DD');
    // eslint-disable-next-line radix
    const date = new Date(a, parseInt(b) - 1, c);
    let w = date.getDay();
    const d = date.getDate();
李纪文's avatar
李纪文 committed
129
    if (w === 0) {
130 131
      w = 7;
    }
132
    const config = {
133 134 135 136
      getMonth: moment(date).format('MM'),
      getYear: date.getFullYear(),
      getWeek: Math.ceil((d + 6 - w) / 7),
    };
137
    return `第${config.getWeek}周(${config.getYear}/${config.getMonth})`;
138 139 140 141
  };
  return (
    <DatePicker
      {...props}
142 143
      className={modes === 'quarter' ? classNames(`${prefixCls}-quarter-Box`) : ''}
      dropdownClassName={modes === 'quarter' ? classNames(`${prefixCls}-quarter`) : ''}
144 145 146 147 148 149 150
      defaultValue={selectedDate ? moment(selectedDate) : ''}
      format={customFormat}
      onChange={onChange}
    />
  );
};

李纪文's avatar
李纪文 committed
151 152 153 154 155 156 157 158 159
const TimePickerCustom = (props) => {
  return <TimePicker {...props} />;
};
const RangePickerCustom = (props) => {
  return <RangePicker {...props} />;
};

export { TimePickerCustom, RangePickerCustom };

160
export default DatePickerCustom;