Blame view

src/components/date-picker/util.js 4.12 KB
0f677893   梁灏   update DatePicker
1
2
  import dateUtil from '../../utils/date';
  
0f677893   梁灏   update DatePicker
3
  export const toDate = function(date) {
58ff14d7   Sergio Crisostomo   Make date more IE...
4
5
6
7
8
9
10
11
12
13
14
      let _date = new Date(date);
      // IE patch start (#1422)
      if (isNaN(_date.getTime()) && typeof date === 'string'){
          _date = date.split('-').map(Number);
          _date[1] += 1;
          _date = new Date(..._date);
      }
      // IE patch end
  
      if (isNaN(_date.getTime())) return null;
      return _date;
0f677893   梁灏   update DatePicker
15
16
  };
  
0b51803b   Sergio Crisostomo   Add functions to ...
17
18
19
20
21
22
23
24
25
26
27
28
  export const clearHours = function (time) {
      const cloneDate = new Date(time);
      cloneDate.setHours(0, 0, 0, 0);
      return cloneDate.getTime();
  };
  
  export const isInRange = (time, a, b) => {
      if (!a || !b) return false;
      const [start, end] = [a, b].sort();
      return time >= start && time <= end;
  };
  
0f677893   梁灏   update DatePicker
29
30
31
32
33
34
35
36
37
38
39
  export const formatDate = function(date, format) {
      date = toDate(date);
      if (!date) return '';
      return dateUtil.format(date, format || 'yyyy-MM-dd');
  };
  
  export const parseDate = function(string, format) {
      return dateUtil.parse(string, format || 'yyyy-MM-dd');
  };
  
  export const getDayCountOfMonth = function(year, month) {
c91c30cc   Sergio Crisostomo   Date utils improv...
40
      return new Date(year, month + 1, 0).getDate();
0f677893   梁灏   update DatePicker
41
42
43
44
45
46
47
48
  };
  
  export const getFirstDayOfMonth = function(date) {
      const temp = new Date(date.getTime());
      temp.setDate(1);
      return temp.getDay();
  };
  
c91c30cc   Sergio Crisostomo   Date utils improv...
49
50
51
52
53
54
  export const siblingMonth = function(src, diff) {
      const temp = new Date(src); // lets copy it so we don't change the original
      const newMonth = temp.getMonth() + diff;
      const newMonthDayCount = getDayCountOfMonth(temp.getFullYear(), newMonth);
      if (newMonthDayCount < temp.getDate()) {
          temp.setDate(newMonthDayCount);
0f677893   梁灏   update DatePicker
55
      }
c91c30cc   Sergio Crisostomo   Date utils improv...
56
      temp.setMonth(newMonth);
0f677893   梁灏   update DatePicker
57
  
c91c30cc   Sergio Crisostomo   Date utils improv...
58
59
      return temp;
  };
0f677893   梁灏   update DatePicker
60
  
c91c30cc   Sergio Crisostomo   Date utils improv...
61
62
  export const prevMonth = function(src) {
      return siblingMonth(src, -1);
0f677893   梁灏   update DatePicker
63
64
65
  };
  
  export const nextMonth = function(src) {
c91c30cc   Sergio Crisostomo   Date utils improv...
66
      return siblingMonth(src, 1);
2dbbd7de   梁灏   update TimePicker
67
68
  };
  
c91c30cc   Sergio Crisostomo   Date utils improv...
69
  export const initTimeDate = function() {
2dbbd7de   梁灏   update TimePicker
70
71
72
73
74
      const date = new Date();
      date.setHours(0);
      date.setMinutes(0);
      date.setSeconds(0);
      return date;
c91c30cc   Sergio Crisostomo   Date utils improv...
75
  };
b27858dd   Sergio Crisostomo   add date panel la...
76
77
78
79
80
81
  
  export const formatDateLabels = (function() {
      /*
        Formats:
        yyyy - 4 digit year
        m - month, numeric, 1 - 12
3ed12b4e   Sergio Crisostomo   Correct month cal...
82
        mm - month, numeric, 01 - 12
b27858dd   Sergio Crisostomo   add date panel la...
83
84
85
86
87
88
89
90
        mmm - month, 3 letters, as in `toLocaleDateString`
        Mmm - month, 3 letters, capitalize the return from `toLocaleDateString`
        mmmm - month, full name, as in `toLocaleDateString`
        Mmmm - month, full name, capitalize the return from `toLocaleDateString`
      */
  
      const formats = {
          yyyy: date => date.getFullYear(),
3ed12b4e   Sergio Crisostomo   Correct month cal...
91
92
          m: date => date.getMonth() + 1,
          mm: date => ('0' + (date.getMonth() + 1)).slice(-2),
b27858dd   Sergio Crisostomo   add date panel la...
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
          mmm: (date, locale) => {
              const monthName = date.toLocaleDateString(locale, {
                  month: 'long'
              });
              return monthName.slice(0, 3);
          },
          Mmm: (date, locale) => {
              const monthName = date.toLocaleDateString(locale, {
                  month: 'long'
              });
              return (monthName[0].toUpperCase() + monthName.slice(1).toLowerCase()).slice(0, 3);
          },
          mmmm: (date, locale) =>
              date.toLocaleDateString(locale, {
                  month: 'long'
              }),
          Mmmm: (date, locale) => {
              const monthName = date.toLocaleDateString(locale, {
                  month: 'long'
              });
              return monthName[0].toUpperCase() + monthName.slice(1).toLowerCase();
          }
      };
      const formatRegex = new RegExp(['yyyy', 'Mmmm', 'mmmm', 'Mmm', 'mmm', 'mm', 'm'].join('|'), 'g');
  
      return function(locale, format, date) {
          const componetsRegex = /(\[[^\]]+\])([^\[\]]+)(\[[^\]]+\])/;
          const components = format.match(componetsRegex).slice(1);
          const separator = components[1];
          const labels = [components[0], components[2]].map(component => {
              const label = component.replace(/\[[^\]]+\]/, str => {
                  return str.slice(1, -1).replace(formatRegex, match => formats[match](date, locale));
              });
              return {
                  label: label,
236e0bfd   Sergio Crisostomo   DOn't use include...
128
                  type: component.indexOf('yy') != -1 ? 'year' : 'month'
b27858dd   Sergio Crisostomo   add date panel la...
129
130
131
132
133
134
135
136
              };
          });
          return {
              separator: separator,
              labels: labels
          };
      };
  })();