UNPKG

9.81 kBJavaScriptView Raw
1import Picker from './../Picker/instance.js';
2
3if (!window._seeds_lang) window._seeds_lang = {}; // 国际化数据
4
5var PickerDate = function PickerDate(params) {
6 // 参数改写
7 var onDateClickSubmit = params.onClickSubmit;
8 var onDateScrollEnd = params.onScrollEnd;
9 params.onClickSubmit = undefined;
10 params.onScrollEnd = undefined;
11 var nowDate = new Date();
12 /* ----------------
13 Model
14 ---------------- */
15 var defaults = {
16 split: '-',
17
18 viewType: 'date', // 'date','month','time','datetime'
19 isSimpleYear: false,
20
21 yearClass: 'text-center',
22 monthClass: 'text-center',
23 dayClass: 'text-center',
24 hourClass: 'text-center',
25 minuteClass: 'text-center',
26
27 yearsData: null,
28 monthsData: null,
29 daysData: null,
30 hoursData: null,
31 minutesData: null,
32
33 defaultYear: '',
34 defaultMonth: '',
35 defaultDay: '',
36 defaultHour: '',
37 defaultMinute: '',
38
39 minYear: nowDate.getFullYear() - 10, // 1950
40 maxYear: nowDate.getFullYear() + 10, // 2050
41
42 yyUnit: window._seeds_lang['unit_year'] || '年',
43 MMUnit: window._seeds_lang['unit_month'] || '月',
44 ddUnit: window._seeds_lang['unit_date'] || '日',
45 hhUnit: window._seeds_lang['unit_hour'] || '时',
46 mmUnit: window._seeds_lang['unit_minute'] || '分',
47
48 onClickSubmit: function onClickSubmit(e) {
49 e.activeText = getActiveText(e.activeOptions);
50 var activeKeys = e.activeOptions.map(function (n, i, a) {
51 return n['key'];
52 });
53 s.setDefaultsByKeys(activeKeys);
54 if (onDateClickSubmit) onDateClickSubmit(e);
55 },
56 onScrollEnd: function onScrollEnd(e) {
57 // 根据月份算日
58 if ((e.params.viewType === 'date' || e.params.viewType === 'datetime') && (e.activeSlot.index === 0 || e.activeSlot.index === 1)) {
59 var year = e.activeOptions[0]['key'];
60 var month = e.activeOptions[1]['key'];
61 var defaultDay = e.activeOptions[2]['key'];
62 updateDays(year, month, defaultDay); // 更新总天数
63 }
64 // 回调
65 if (onDateScrollEnd) onDateScrollEnd(e);
66 }
67 };
68 params = params || {};
69 for (var def in defaults) {
70 if (params[def] === undefined) {
71 params[def] = defaults[def];
72 }
73 }
74 var s = new Picker(params);
75
76 function trim(str) {
77 return str.replace(/(^\s*)|(\s*$)/g, '');
78 }
79 // 设置默认值
80 s.setDefaultYear = function (yearKey) {
81 s.params.defaultYear = trim('' + yearKey);
82 };
83 s.setDefaultMonth = function (monthKey) {
84 s.params.defaultMonth = trim('' + monthKey);
85 };
86 s.setDefaultDay = function (dayKey) {
87 s.params.defaultDay = trim('' + dayKey);
88 };
89 s.setDefaultHour = function (hourKey) {
90 s.params.defaultHour = trim('' + hourKey);
91 };
92 s.setDefaultMinute = function (minuteKey) {
93 s.params.defaultMinute = trim('' + minuteKey);
94 };
95
96 // 默认时间
97 s.updateDetault = function () {
98 nowDate = new Date();
99 // 默认值
100 if (!s.params.defaultYear) {
101 var yyyy = nowDate.getFullYear();
102 var _yyyy = '' + yyyy;
103 s.setDefaultYear(_yyyy);
104 }
105 if (!s.params.defaultMonth) {
106 var MM = nowDate.getMonth() + 1;
107 var _MM = MM.toString().length === 1 ? '0' + MM : MM;
108 s.setDefaultMonth(_MM);
109 }
110 if (!s.params.defaultDay) {
111 var dd = nowDate.getDate();
112 var _dd = dd.toString().length === 1 ? '0' + dd : dd;
113 s.setDefaultDay(_dd);
114 }
115 if (!s.params.defaultHour) {
116 var hh = nowDate.getHours();
117 var _hh = hh.toString().length === 1 ? '0' + hh : hh;
118 s.setDefaultHour(_hh);
119 }
120 if (!s.params.defaultMinute) {
121 var mm = nowDate.getMinutes();
122 var _mm = mm.toString().length === 1 ? '0' + mm : mm;
123 s.setDefaultMinute(_mm);
124 }
125 };
126 s.updateDetault();
127
128 // 年
129 s.years = [];
130 if (s.params.yearsData) {
131 s.years = s.params.yearsData;
132 } else {
133 for (var yyyy = s.params.minYear; yyyy <= s.params.maxYear; yyyy++) {
134 s.years.push({
135 'key': '' + yyyy,
136 'value': s.params.isSimpleYear ? yyyy.toString().substring(2, 4) + s.params.yyUnit : yyyy + s.params.yyUnit
137 });
138 }
139 }
140 // 月
141 s.months = [];
142 if (s.params.monthsData) {
143 s.months = s.params.monthsData;
144 } else {
145 for (var MM = 1; MM <= 12; MM++) {
146 var _MM = MM.toString().length === 1 ? '0' + MM : MM;
147 s.months.push({
148 'key': '' + _MM,
149 'value': _MM + s.params.MMUnit
150 });
151 }
152 }
153 // 日
154 s.days = [];
155 var currentMaxday = new Date(nowDate.getFullYear(), nowDate.getMonth() + 1, 0).getDate();
156 if (s.params.daysData) {
157 s.days = Object.clone(s.params.daysData);
158 } else {
159 for (var dd = 1; dd <= currentMaxday; dd++) {
160 var _dd = dd.toString().length === 1 ? '0' + dd : dd;
161 s.days.push({
162 'key': '' + _dd,
163 'value': _dd + s.params.ddUnit
164 });
165 }
166 }
167
168 function updateDaysForDefault(year, month) {
169 var lastDay = '' + new Date(year, month, 0).getDate();
170 var currentLastDay = s.days[s.days.length - 1]['key'];
171 if (lastDay === currentLastDay) return;
172 if (lastDay > currentLastDay) {
173 for (var i = 1 + parseInt(currentLastDay, 10); i <= lastDay; i++) {
174 s.days.push({
175 'key': '' + i,
176 'value': '' + i + s.params.ddUnit
177 });
178 }
179 } else if (lastDay < currentLastDay) {
180 var spliceCount = currentLastDay - lastDay;
181 s.days.splice(s.days.length - spliceCount, spliceCount);
182 }
183 }
184 function updateDaysForCustom(year, month) {
185 var lastDay = '' + new Date(year, month, 0).getDate();
186 var currentLastDay = s.days[s.days.length - 1]['key'];
187 var customData = s.params.daysData;
188 if (lastDay === currentLastDay) return;
189 if (lastDay > currentLastDay) {
190 customData.forEach(function (n) {
191 if (n['key'] <= lastDay && n['key'] > currentLastDay) s.days.push(n);
192 });
193 } else if (lastDay < currentLastDay) {
194 for (var j = currentLastDay; j > lastDay; j--) {
195 s.days.forEach(function (n) {
196 // eslint-disable-line
197 if (n['key'] === '' + j) s.days.pop();
198 });
199 }
200 }
201 }
202 function updateDays(year, month, defaultDay) {
203 if (s.params.daysData) {
204 updateDaysForCustom(year, month);
205 } else {
206 updateDaysForDefault(year, month);
207 }
208 var defaultKey = defaultDay;
209 if (s.days.length < defaultDay) defaultKey = s.days[s.days.length - 1]['key'];
210 s.replaceSlot(2, s.days, defaultKey, s.params.dayClass); // 修改第三项
211 }
212
213 // 时
214 s.hours = [];
215 if (s.params.hoursData) {
216 s.hours = s.params.hoursData;
217 } else {
218 for (var hh = 0; hh <= 23; hh++) {
219 var _hh = hh.toString().length === 1 ? '0' + hh : hh;
220 s.hours.push({
221 'key': '' + _hh,
222 'value': _hh + s.params.hhUnit
223 });
224 }
225 }
226
227 // 分
228 s.minutes = [];
229 if (s.params.minutesData) {
230 s.minutes = s.params.minutesData;
231 } else {
232 for (var mm = 0; mm <= 59; mm++) {
233 var _mm = mm.toString().length === 1 ? '0' + mm : mm;
234 s.minutes.push({
235 'key': '' + _mm,
236 'value': _mm + s.params.mmUnit
237 });
238 }
239 }
240
241 /* ----------------
242 Method
243 ---------------- */
244 function getActiveText(activeData) {
245 var activeKeys = activeData.map(function (n, i, a) {
246 return n['key'];
247 });
248 if (s.params.viewType === 'date') return activeKeys[0] + s.params.split + activeKeys[1] + s.params.split + activeKeys[2];else if (s.params.viewType === 'datetime') return activeKeys[0] + s.params.split + activeKeys[1] + s.params.split + activeKeys[2] + ' ' + activeKeys[3] + ':' + activeKeys[4];else if (s.params.viewType === 'time') return activeKeys[0] + ':' + activeKeys[1];else if (s.params.viewType === 'month') return activeKeys[0] + s.params.split + activeKeys[1];
249 }
250 s.setDefaultsByKeys = function (activeKeys) {
251 if (s.params.viewType === 'date' || s.params.viewType === 'datetime' || s.params.viewType === 'month') {
252 if (activeKeys[0]) s.setDefaultYear(activeKeys[0]);
253 if (activeKeys[1]) s.setDefaultMonth(activeKeys[1]);
254 if (activeKeys[2]) s.setDefaultDay(activeKeys[2]);
255 if (activeKeys[3]) s.setDefaultHour(activeKeys[3]);
256 if (activeKeys[4]) s.setDefaultMinute(activeKeys[4]);
257 } else if (s.params.viewType === 'time') {
258 if (activeKeys[0]) s.setDefaultHour(activeKeys[0]);
259 if (activeKeys[1]) s.setDefaultMinute(activeKeys[1]);
260 }
261 };
262 s.setDefaults = function (activeData) {
263 if (activeData.year) s.setDefaultYear(activeData.year);
264 if (activeData.month) s.setDefaultMonth(activeData.month);
265 if (activeData.day) s.setDefaultDay(activeData.day);
266 if (activeData.hour) s.setDefaultHour(activeData.hour);
267 if (activeData.minute) s.setDefaultMinute(activeData.minute);
268 };
269 /* ----------------
270 Init
271 ---------------- */
272
273 // 添加数据
274 function addMonthSlot() {
275 s.addSlot(s.years, s.params.defaultYear, s.params.yearClass);
276 s.addSlot(s.months, s.params.defaultMonth, s.params.monthClass);
277 }
278
279 function addDateSlot() {
280 addMonthSlot();
281 s.addSlot(s.days, s.params.defaultDay, s.params.dayClass);
282 }
283
284 function addTimeSlot() {
285 s.addSlot(s.hours, s.params.defaultHour, s.params.hourClass);
286 s.addSlot(s.minutes, s.params.defaultMinute, s.params.minuteClass);
287 }
288
289 function addDateTime() {
290 addDateSlot();
291 addTimeSlot();
292 }
293
294 function initSlots() {
295 switch (s.params.viewType) {
296 case 'date':
297 addDateSlot();
298 break;
299 case 'month':
300 addMonthSlot();
301 break;
302 case 'time':
303 addTimeSlot();
304 break;
305 case 'datetime':
306 addDateTime();
307 break;
308 default:
309 console.log('SeedsUI Error: initSlots失败');
310 }
311 }
312 s.update = function () {
313 s.clearSlots();
314 initSlots();
315 };
316 initSlots();
317 return s;
318};
319
320export default PickerDate;
\No newline at end of file