@xtdev/xt-miniprogram-ui 1.2.41 → 1.2.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/libs/xt-date-picker-loop/index.js +311 -207
- package/package.json +1 -1
|
@@ -4,15 +4,17 @@
|
|
|
4
4
|
* @Description: 日期组件-js逻辑
|
|
5
5
|
* @LastEditors: Mr.Hu
|
|
6
6
|
*/
|
|
7
|
+
let LASTMONTH = null; // 用于储存上一次选中的月份
|
|
7
8
|
// 获取当前月份的天数
|
|
8
9
|
const getDaysInMonth = (year, month) => {
|
|
9
10
|
const daysInMonth = new Date(year, month, 0).getDate();
|
|
10
11
|
return daysInMonth;
|
|
11
|
-
}
|
|
12
|
+
};
|
|
12
13
|
// 深拷贝
|
|
13
14
|
const deepClone = (val) => {
|
|
14
|
-
if (!val) return null;
|
|
15
|
-
const isObject = (obj) =>
|
|
15
|
+
if (!val) {return null;}
|
|
16
|
+
const isObject = (obj) =>
|
|
17
|
+
Object.prototype.toString.call(obj) === "[object object]";
|
|
16
18
|
let newResult = Array.isArray(val) ? [] : {};
|
|
17
19
|
for (const key in val) {
|
|
18
20
|
if (Object.prototype.hasOwnProperty.call(val, key)) {
|
|
@@ -20,12 +22,12 @@ const deepClone = (val) => {
|
|
|
20
22
|
}
|
|
21
23
|
}
|
|
22
24
|
return newResult;
|
|
23
|
-
}
|
|
25
|
+
};
|
|
24
26
|
// 获取默认时间
|
|
25
27
|
const getDefaultDate = () => {
|
|
26
28
|
const now = new Date();
|
|
27
|
-
return `${now.getFullYear()}-${now.getMonth()+1}-${now.getDate()}`;
|
|
28
|
-
}
|
|
29
|
+
return `${now.getFullYear()}-${now.getMonth() + 1}-${now.getDate()}`;
|
|
30
|
+
};
|
|
29
31
|
// 查找数组中第二个出现的元素下标
|
|
30
32
|
const findSecondIndexOf = (arr, predicate) => {
|
|
31
33
|
const firstIndex = arr.findIndex(predicate);
|
|
@@ -34,8 +36,8 @@ const findSecondIndexOf = (arr, predicate) => {
|
|
|
34
36
|
}
|
|
35
37
|
// 从第一个匹配项的下一个位置继续查找
|
|
36
38
|
return arr.slice(firstIndex + 1).findIndex(predicate);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
+
};
|
|
40
|
+
|
|
39
41
|
Component({
|
|
40
42
|
behaviors: [],
|
|
41
43
|
properties: {
|
|
@@ -47,92 +49,101 @@ Component({
|
|
|
47
49
|
// 弹窗标题
|
|
48
50
|
title: {
|
|
49
51
|
type: String,
|
|
50
|
-
value:
|
|
52
|
+
value: "日期筛选",
|
|
51
53
|
},
|
|
52
54
|
// 日期选择器模式 date 年月日选择 dateRange 时间范围选择 yearMonth 年月
|
|
53
55
|
type: {
|
|
54
56
|
type: String,
|
|
55
|
-
value:
|
|
57
|
+
value: "dateRange",
|
|
56
58
|
observer: function (value) {
|
|
57
|
-
this.setData({filtType: value})
|
|
58
|
-
}
|
|
59
|
+
this.setData({ filtType: value });
|
|
60
|
+
},
|
|
59
61
|
},
|
|
60
62
|
// 最小可选日期
|
|
61
63
|
minDate: {
|
|
62
64
|
type: String,
|
|
63
|
-
value:
|
|
65
|
+
value: "1990-1-1",
|
|
64
66
|
},
|
|
65
67
|
// 最大可选日期
|
|
66
68
|
maxDate: {
|
|
67
69
|
type: String,
|
|
68
|
-
value:
|
|
70
|
+
value: "",
|
|
69
71
|
},
|
|
70
72
|
// 当前时间
|
|
71
73
|
currentDate: {
|
|
72
74
|
type: String,
|
|
73
|
-
value:
|
|
75
|
+
value: "",
|
|
74
76
|
},
|
|
75
77
|
// 展示切换按钮
|
|
76
78
|
showChangeTab: {
|
|
77
79
|
type: Boolean,
|
|
78
|
-
value: false
|
|
80
|
+
value: false,
|
|
79
81
|
},
|
|
80
82
|
// 确认按钮文字
|
|
81
83
|
confirmButtonText: {
|
|
82
84
|
type: String,
|
|
83
|
-
value:
|
|
85
|
+
value: "确认",
|
|
84
86
|
},
|
|
85
87
|
// 取消按钮文字
|
|
86
88
|
cancelButtonText: {
|
|
87
89
|
type: String,
|
|
88
|
-
value:
|
|
89
|
-
}
|
|
90
|
+
value: "重置",
|
|
91
|
+
},
|
|
90
92
|
},
|
|
91
93
|
data: {
|
|
92
94
|
years: [], // 年份数组
|
|
93
95
|
months: [], // 月份数组
|
|
94
96
|
days: [], // 天份数组
|
|
95
97
|
dateArr: [9999, 1, 1], // 下拉数组下标
|
|
96
|
-
dateValue:
|
|
97
|
-
dateStr:
|
|
98
|
+
dateValue: "", // 选中的日期值
|
|
99
|
+
dateStr: "", // 选中的日期显示字符
|
|
98
100
|
startDateArr: [], // 开始日期数组下标
|
|
99
|
-
startDateValue:
|
|
100
|
-
startDateStr:
|
|
101
|
+
startDateValue: "", // 开始日期选中值
|
|
102
|
+
startDateStr: "", // 开始日期字符
|
|
101
103
|
endDateArr: [], // 结束日期数组下标
|
|
102
|
-
endDateValue:
|
|
103
|
-
endDateStr:
|
|
104
|
-
defaultDate:
|
|
105
|
-
checkedType:
|
|
104
|
+
endDateValue: "", // 结束日期选中值
|
|
105
|
+
endDateStr: "", // 结束日期字符
|
|
106
|
+
defaultDate: "", // 默认日期(组件接收的|当前时间)
|
|
107
|
+
checkedType: "start", // 当前选择的日期类型
|
|
106
108
|
clickedEnd: false, // 点击结束时间
|
|
107
|
-
filtType:
|
|
109
|
+
filtType: "dateRange", // 选择器模式
|
|
108
110
|
typeEnums: {
|
|
109
|
-
date:
|
|
110
|
-
dateRange:
|
|
111
|
+
date: "按日筛选",
|
|
112
|
+
dateRange: "按月筛选",
|
|
111
113
|
},
|
|
112
|
-
indicatorSyle:
|
|
114
|
+
indicatorSyle: "font-size: 40rpx;font-weight: 800;height: 60px",
|
|
113
115
|
},
|
|
114
116
|
lifetimes: {
|
|
115
|
-
created() {
|
|
116
|
-
},
|
|
117
|
+
created() {},
|
|
117
118
|
async attached() {
|
|
118
119
|
await this.initPickerArr();
|
|
119
120
|
this.setDefaultDate();
|
|
120
|
-
await this.handelDays(
|
|
121
|
-
}
|
|
121
|
+
await this.handelDays("", true);
|
|
122
|
+
},
|
|
122
123
|
},
|
|
123
124
|
methods: {
|
|
124
125
|
// 初始化日期数组
|
|
125
126
|
initPickerArr(curSelDate, dateValue) {
|
|
126
|
-
const {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
127
|
+
const {
|
|
128
|
+
minYear,
|
|
129
|
+
maxYear,
|
|
130
|
+
minMonth,
|
|
131
|
+
maxMonth,
|
|
132
|
+
minDay,
|
|
133
|
+
maxDay,
|
|
134
|
+
selYearColum,
|
|
135
|
+
selMonthColum,
|
|
136
|
+
selDayColum,
|
|
137
|
+
} = this.getMinAndMaxDate(curSelDate, dateValue);
|
|
138
|
+
return new Promise((resolve) => {
|
|
139
|
+
if (selDayColum) {
|
|
131
140
|
resolve();
|
|
132
141
|
return;
|
|
133
142
|
}
|
|
134
|
-
const years = [],
|
|
135
|
-
|
|
143
|
+
const years = [],
|
|
144
|
+
months = [],
|
|
145
|
+
days = [];
|
|
146
|
+
|
|
136
147
|
for (let i = minYear; i <= maxYear; i++) {
|
|
137
148
|
years.push(i);
|
|
138
149
|
}
|
|
@@ -144,37 +155,55 @@ Component({
|
|
|
144
155
|
}
|
|
145
156
|
if (curSelDate) {
|
|
146
157
|
this.setData({
|
|
147
|
-
months
|
|
148
|
-
})
|
|
149
|
-
} else if (
|
|
158
|
+
months,
|
|
159
|
+
});
|
|
160
|
+
} else if (selMonthColum) {
|
|
150
161
|
this.setData({
|
|
151
|
-
days
|
|
152
|
-
})
|
|
162
|
+
days,
|
|
163
|
+
});
|
|
153
164
|
} else {
|
|
154
165
|
this.setData({
|
|
155
166
|
years,
|
|
156
167
|
months,
|
|
157
|
-
days
|
|
158
|
-
})
|
|
168
|
+
days,
|
|
169
|
+
});
|
|
159
170
|
}
|
|
160
171
|
resolve();
|
|
161
|
-
})
|
|
172
|
+
});
|
|
162
173
|
},
|
|
163
174
|
// 获取最小最大年月日, 当前所选择的列
|
|
164
175
|
getMinAndMaxDate(curSelDate, dateValue) {
|
|
165
|
-
let {
|
|
176
|
+
let {
|
|
177
|
+
data: { minDate, maxDate, currentDate, dateArr },
|
|
178
|
+
} = this;
|
|
166
179
|
currentDate = currentDate || getDefaultDate();
|
|
167
|
-
let minYear,
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
180
|
+
let minYear,
|
|
181
|
+
maxYear,
|
|
182
|
+
minMonth,
|
|
183
|
+
maxMonth,
|
|
184
|
+
minDay,
|
|
185
|
+
maxDay = 31;
|
|
186
|
+
const selYearColum =
|
|
187
|
+
dateValue && dateArr ? dateValue[0] !== dateArr[0] : false; // 选择的是年份列
|
|
188
|
+
const selMonthColum =
|
|
189
|
+
dateValue && dateArr ? dateValue[1] !== dateArr[1] : false; // 选择的是月份列
|
|
190
|
+
const selDayColum =
|
|
191
|
+
dateValue && dateArr ? dateValue[2] !== dateArr[2] : false; // 选择的是日份列
|
|
192
|
+
const curDateArr = this.transformToArr(
|
|
193
|
+
curSelDate ? curSelDate : currentDate
|
|
194
|
+
);
|
|
195
|
+
// 当前日期数组
|
|
196
|
+
const curYear = curDateArr[0],
|
|
197
|
+
curMonth = curDateArr[1],
|
|
198
|
+
curDay = curDateArr[2];
|
|
173
199
|
if (minDate && minDate.length) {
|
|
174
200
|
const minDateArr = this.transformToArr(minDate);
|
|
175
201
|
minYear = Number(minDateArr[0]);
|
|
176
|
-
minMonth =
|
|
177
|
-
minDay =
|
|
202
|
+
minMonth = curYear && curYear == minDateArr[0] ? minDateArr[1] : 1;
|
|
203
|
+
minDay =
|
|
204
|
+
curYear && curYear == minDateArr[0] && curMonth == minDateArr[1]
|
|
205
|
+
? minDateArr[2]
|
|
206
|
+
: 1;
|
|
178
207
|
} else {
|
|
179
208
|
minYear = 1990;
|
|
180
209
|
minMonth = 1;
|
|
@@ -183,45 +212,82 @@ Component({
|
|
|
183
212
|
if (maxDate && maxDate.length) {
|
|
184
213
|
const maxDateArr = this.transformToArr(maxDate);
|
|
185
214
|
maxYear = maxDateArr[0];
|
|
186
|
-
maxMonth =
|
|
187
|
-
maxDay =
|
|
215
|
+
maxMonth = curYear && curYear == maxDateArr[0] ? maxDateArr[1] : 12;
|
|
216
|
+
maxDay =
|
|
217
|
+
curYear && curYear == maxDateArr[0] && curMonth == maxDateArr[1]
|
|
218
|
+
? maxDateArr[2]
|
|
219
|
+
: 31;
|
|
188
220
|
} else {
|
|
189
221
|
maxYear = new Date().getFullYear();
|
|
190
222
|
maxMonth = 12;
|
|
191
|
-
maxDay = getDaysInMonth(curYear, curMonth)
|
|
223
|
+
maxDay = getDaysInMonth(curYear, curMonth);
|
|
192
224
|
}
|
|
193
|
-
return {
|
|
225
|
+
return {
|
|
226
|
+
minYear,
|
|
227
|
+
maxYear,
|
|
228
|
+
minMonth,
|
|
229
|
+
maxMonth,
|
|
230
|
+
minDay,
|
|
231
|
+
maxDay,
|
|
232
|
+
curYear,
|
|
233
|
+
curMonth,
|
|
234
|
+
curDay,
|
|
235
|
+
selYearColum,
|
|
236
|
+
selMonthColum,
|
|
237
|
+
selDayColum,
|
|
238
|
+
};
|
|
194
239
|
},
|
|
195
240
|
// 处理传入日期格式
|
|
196
241
|
transformToArr(dateStr) {
|
|
197
|
-
if (!dateStr) return null;
|
|
198
|
-
const dateArr = dateStr.split(
|
|
199
|
-
if (!dateArr.length) return null;
|
|
242
|
+
if (!dateStr) {return null;}
|
|
243
|
+
const dateArr = dateStr.split("-");
|
|
244
|
+
if (!dateArr.length) {return null;}
|
|
200
245
|
return dateArr;
|
|
201
246
|
},
|
|
202
247
|
// 设置默认年月日
|
|
203
248
|
setDefaultDate() {
|
|
204
249
|
const now = new Date();
|
|
205
|
-
let {
|
|
250
|
+
let {
|
|
251
|
+
data: {
|
|
252
|
+
dateValue,
|
|
253
|
+
currentDate,
|
|
254
|
+
dateStr,
|
|
255
|
+
dateArr,
|
|
256
|
+
defaultDate,
|
|
257
|
+
minDate,
|
|
258
|
+
},
|
|
259
|
+
} = this;
|
|
206
260
|
currentDate = currentDate || getDefaultDate();
|
|
207
|
-
let curDateArr = this.transformToArr(currentDate);
|
|
261
|
+
let curDateArr = this.transformToArr(currentDate); // 当前日期数组
|
|
208
262
|
const curYear = curDateArr[0];
|
|
209
|
-
const curMonth= curDateArr[1];
|
|
263
|
+
const curMonth = curDateArr[1];
|
|
210
264
|
const curDay = curDateArr[2];
|
|
211
265
|
const minDateArr = this.transformToArr(minDate); // 最小可选日期数组
|
|
212
266
|
const defaultYear = minDateArr ? minDateArr[0] : 1990;
|
|
213
|
-
const defaultMonth =
|
|
214
|
-
|
|
267
|
+
const defaultMonth =
|
|
268
|
+
minDateArr && curYear == minDateArr[0] ? minDateArr[1] : 1;
|
|
269
|
+
const defaultDay =
|
|
270
|
+
minDateArr && curYear == minDateArr[0] && curMonth == minDateArr[1]
|
|
271
|
+
? minDateArr[2]
|
|
272
|
+
: 1;
|
|
215
273
|
if (curDateArr && curDateArr.length) {
|
|
216
274
|
// 如果有设置当前日期,则数组下标选中当前日期
|
|
217
275
|
dateStr = `${curYear}年${curMonth}月${curDay}日`;
|
|
218
|
-
dateArr = [
|
|
276
|
+
dateArr = [
|
|
277
|
+
curYear - defaultYear,
|
|
278
|
+
curMonth - defaultMonth,
|
|
279
|
+
curDateArr[2] - defaultDay,
|
|
280
|
+
];
|
|
219
281
|
dateValue = `${curYear}-${curMonth}-${curDay}`;
|
|
220
282
|
} else {
|
|
221
283
|
// 如果有设置当前日期,则数组下标默认选中当前
|
|
222
|
-
dateStr = `${now.getFullYear()}年${
|
|
223
|
-
|
|
224
|
-
|
|
284
|
+
dateStr = `${now.getFullYear()}年${
|
|
285
|
+
now.getMonth() + 1
|
|
286
|
+
}月${now.getDate()}日`;
|
|
287
|
+
dateArr = [now.getFullYear() - 1990, now.getMonth(), now.getDate() - 1];
|
|
288
|
+
dateValue = `${now.getFullYear()}-${
|
|
289
|
+
now.getMonth() + 1
|
|
290
|
+
}-${now.getDate()}`;
|
|
225
291
|
}
|
|
226
292
|
// 储存当前传入的原始值
|
|
227
293
|
defaultDate = JSON.parse(JSON.stringify(dateValue));
|
|
@@ -232,122 +298,130 @@ Component({
|
|
|
232
298
|
defaultDate,
|
|
233
299
|
startDateArr: dateArr,
|
|
234
300
|
startDateStr: dateStr,
|
|
235
|
-
startDateValue: dateValue
|
|
301
|
+
startDateValue: dateValue,
|
|
236
302
|
});
|
|
237
303
|
},
|
|
238
304
|
// 处理当前月的天数
|
|
239
305
|
handelDays(value, isInitDate = false) {
|
|
240
|
-
return new Promise(resolve => {
|
|
241
|
-
let {
|
|
306
|
+
return new Promise((resolve) => {
|
|
307
|
+
let {
|
|
308
|
+
data: { days, dateArr, years, months, minDate, maxDate, dateValue },
|
|
309
|
+
} = this;
|
|
242
310
|
// 如果没有默认值
|
|
243
311
|
if (!value) {
|
|
244
312
|
const { minYear } = this.getMinAndMaxDate();
|
|
245
|
-
let {
|
|
313
|
+
let {
|
|
314
|
+
data: { currentDate },
|
|
315
|
+
} = this;
|
|
246
316
|
currentDate = currentDate || getDefaultDate();
|
|
247
|
-
value = this.transformToArr(currentDate);
|
|
248
|
-
value = [value[0] - minYear, value[1] - 1, value[2] - 1]
|
|
317
|
+
value = this.transformToArr(currentDate); // 当前日期数组
|
|
318
|
+
value = [value[0] - minYear, value[1] - 1, value[2] - 1];
|
|
249
319
|
}
|
|
250
320
|
const selYear = years[value?.[0]],
|
|
251
321
|
selMonth = months[value?.[1]],
|
|
252
|
-
selDay = days
|
|
253
|
-
let {
|
|
322
|
+
selDay = days[value?.[2]];
|
|
323
|
+
let {
|
|
324
|
+
minYear,
|
|
325
|
+
minMonth,
|
|
326
|
+
maxMonth,
|
|
327
|
+
minDay,
|
|
328
|
+
maxDay,
|
|
329
|
+
selYearColum,
|
|
330
|
+
selMonthColum,
|
|
331
|
+
selDayColum,
|
|
332
|
+
} = this.getMinAndMaxDate(`${selYear}-${selMonth}-${selDay}`, value);
|
|
254
333
|
// 获取当前日期数组,当前选中日期值
|
|
255
|
-
let newDaysArr = days,
|
|
256
|
-
|
|
257
|
-
if (value && value[2] >= maxDay && selMonthColum){
|
|
258
|
-
newDateArr = [newDateArr[0], value[1], maxDay - 1]
|
|
259
|
-
}
|
|
334
|
+
let newDaysArr = days,
|
|
335
|
+
newDateArr = value;
|
|
260
336
|
/** 处理月数组下拉列表 **/
|
|
261
337
|
// 1.后面插入:如果当前选中的是月份,并且是接近最大月,并且当前月份后面没有重复月份,处理月份下拉数组
|
|
262
|
-
const isMonthLastColum =
|
|
263
|
-
|
|
338
|
+
const isMonthLastColum =
|
|
339
|
+
selMonth >= maxMonth - 3 && (selMonthColum || selYearColum);
|
|
340
|
+
if (isMonthLastColum || (selMonth >= maxMonth - 3 && isInitDate)) {
|
|
264
341
|
for (let i = minMonth; i <= maxMonth; i++) {
|
|
265
342
|
months.push(i);
|
|
266
343
|
}
|
|
267
344
|
this.setData({
|
|
268
345
|
months,
|
|
269
|
-
})
|
|
346
|
+
});
|
|
270
347
|
}
|
|
271
348
|
// 2.前面插入:如果当前选中的是月份,并且是接近最小月,并且当前月份前面没有重复月份,处理月份下拉数组
|
|
272
|
-
const isMonthFirstColum =
|
|
273
|
-
|
|
349
|
+
const isMonthFirstColum =
|
|
350
|
+
selMonth <= maxMonth - 3 && newDateArr[1] < maxMonth && selMonthColum; // 当前选中的第一月
|
|
351
|
+
if (isMonthFirstColum || (selMonth <= maxMonth - 3 && isInitDate)) {
|
|
274
352
|
for (let i = maxMonth; i >= minMonth; i--) {
|
|
275
353
|
months.unshift(i);
|
|
276
354
|
}
|
|
277
|
-
newDateArr = [
|
|
278
|
-
newDateArr[0],
|
|
279
|
-
newDateArr[1] + maxMonth,
|
|
280
|
-
newDateArr[2]
|
|
281
|
-
];
|
|
355
|
+
newDateArr = [newDateArr[0], newDateArr[1] + maxMonth, newDateArr[2]];
|
|
282
356
|
this.setData({
|
|
283
|
-
months
|
|
284
|
-
})
|
|
357
|
+
months,
|
|
358
|
+
});
|
|
285
359
|
}
|
|
286
|
-
// console.log('newDateArr:', newDateArr);
|
|
287
|
-
// console.log('newMonths:', months);
|
|
288
360
|
/** 处理天数下拉列表 **/
|
|
289
|
-
const firstIndex = findSecondIndexOf(newDaysArr, el => el == 1
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
361
|
+
const firstIndex = findSecondIndexOf(newDaysArr, (el) => el == 1);
|
|
362
|
+
// 2.切换月份,更新天数组列表
|
|
363
|
+
if (selMonthColum || selYear) {
|
|
364
|
+
const newArray = [];
|
|
365
|
+
for (let j = 1; j <= 2; j++) {
|
|
366
|
+
for (let i = minDay; i <= maxDay; i++) {
|
|
367
|
+
newArray.push(i);
|
|
368
|
+
}
|
|
297
369
|
}
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
370
|
+
newDaysArr = newArray;
|
|
371
|
+
const beforeMonth = LASTMONTH;
|
|
372
|
+
const prevSelDateParams = this.getMinAndMaxDate(`${selYear}-${beforeMonth}-${selDay}`);
|
|
373
|
+
// 如果选中的是当月第一天,处理当前选中的下标逻辑
|
|
374
|
+
if (selDay == 1) {
|
|
375
|
+
// 获取切换之前的月数
|
|
376
|
+
const valueDay = maxDay - prevSelDateParams.maxDay;
|
|
377
|
+
newDateArr = [newDateArr[0], newDateArr[1], newDateArr[2] + valueDay];
|
|
378
|
+
}
|
|
379
|
+
// 如果选中的是当月最后一天,处理当前选中的下标逻辑
|
|
380
|
+
if (selDay == prevSelDateParams.maxDay) {
|
|
381
|
+
// 获取当前月天数
|
|
382
|
+
const curSelDateParams = this.getMinAndMaxDate(`${selYear}-${selMonth}-${selDay}`);
|
|
383
|
+
newDateArr = [newDateArr[0], newDateArr[1], curSelDateParams.maxDay - 1];
|
|
301
384
|
}
|
|
302
|
-
newDaysArr = apendDays.concat(newDaysArr);
|
|
303
|
-
newDateArr = [
|
|
304
|
-
newDateArr[0],
|
|
305
|
-
newDateArr[1],
|
|
306
|
-
maxDay - 1
|
|
307
|
-
];
|
|
308
385
|
}
|
|
309
|
-
//
|
|
310
|
-
|
|
386
|
+
// 天数列表上拉循环选择--后面插入
|
|
387
|
+
// 1.如果当前选中的是天数,并且是接近最大天数,并且当前天数后面没有重复天数,处理天数下拉数组
|
|
388
|
+
const isDayLastColum = selDayColum && selDay >= maxDay - 3;
|
|
311
389
|
// 获取上一个月的天数
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
console.log(222);
|
|
316
|
-
if (newDaysArr.length > 58) {
|
|
390
|
+
if (isDayLastColum || (isInitDate && selDay >= maxDay - 3)) {
|
|
391
|
+
// 如果当前选中的不是天数组最后三条数据,重新组装
|
|
392
|
+
if (newDaysArr.length > 58 && value[2] <= newDaysArr.length - 3) {
|
|
317
393
|
newDaysArr = newDaysArr.slice(firstIndex + 1, newDaysArr.length);
|
|
318
394
|
}
|
|
319
|
-
for (let i = minDay; i <=
|
|
395
|
+
for (let i = minDay; i <= maxDay; i++) {
|
|
320
396
|
newDaysArr.push(i);
|
|
321
397
|
}
|
|
398
|
+
this.setData({
|
|
399
|
+
days: newDaysArr,
|
|
400
|
+
});
|
|
322
401
|
}
|
|
323
402
|
// 天数列表上拉循环选择--前面插入
|
|
324
|
-
// 1
|
|
325
|
-
const isDayFirstColum =
|
|
326
|
-
|
|
403
|
+
// 1.当前选中天数列表,选中的接近最小天数,并且设置的天数小于最大天数
|
|
404
|
+
const isDayFirstColum =
|
|
405
|
+
selDay <= minDay + 3 && newDateArr[2] < maxDay && selDayColum; // 当前选中的第一日
|
|
327
406
|
// 2. 当前初始日期前面设置添加循环选择
|
|
328
|
-
if (isDayFirstColum || (isInitDate && selDay
|
|
329
|
-
for (let i =
|
|
407
|
+
if (isDayFirstColum || (isInitDate && selDay <= minDay + 3)) {
|
|
408
|
+
for (let i = maxDay; i >= minDay; i--) {
|
|
330
409
|
newDaysArr.unshift(i);
|
|
331
410
|
}
|
|
332
411
|
this.setData({
|
|
333
|
-
days: newDaysArr
|
|
412
|
+
days: newDaysArr,
|
|
334
413
|
});
|
|
335
|
-
let valueDay = Number(newDateArr[2] +
|
|
336
|
-
newDateArr = [
|
|
337
|
-
newDateArr[0],
|
|
338
|
-
newDateArr[1],
|
|
339
|
-
valueDay
|
|
340
|
-
];
|
|
414
|
+
let valueDay = Number(newDateArr[2] + maxDay);
|
|
415
|
+
newDateArr = [newDateArr[0], newDateArr[1], valueDay];
|
|
341
416
|
}
|
|
417
|
+
LASTMONTH = selMonth;// 储存当前选中的月份,为上次选中的月份
|
|
342
418
|
// 天数选择下拉循环选择
|
|
343
|
-
console.log('newDateArr:', newDateArr);
|
|
344
|
-
console.log('newDaysArr:', newDaysArr);
|
|
345
419
|
// 解决回弹动画延时问题
|
|
346
420
|
if ((isMonthFirstColum || isDayFirstColum) && !this.data.isRset) {
|
|
347
421
|
setTimeout(() => {
|
|
348
422
|
this.setData({
|
|
349
423
|
days: newDaysArr,
|
|
350
|
-
dateArr: newDateArr
|
|
424
|
+
dateArr: newDateArr,
|
|
351
425
|
});
|
|
352
426
|
resolve();
|
|
353
427
|
}, 1500);
|
|
@@ -355,71 +429,83 @@ Component({
|
|
|
355
429
|
this.setData({
|
|
356
430
|
days: newDaysArr,
|
|
357
431
|
dateArr: newDateArr,
|
|
358
|
-
isRset: false
|
|
359
|
-
})
|
|
432
|
+
isRset: false,
|
|
433
|
+
});
|
|
360
434
|
resolve();
|
|
361
435
|
}
|
|
362
436
|
});
|
|
363
437
|
},
|
|
364
438
|
// 滑动下拉列表
|
|
365
439
|
async bindChange(e) {
|
|
366
|
-
console.log('bindChange:', e);
|
|
367
440
|
const value = e?.detail?.value;
|
|
368
|
-
// const { data: { years: year, months: month, days: day } } = this;
|
|
369
|
-
// // 渲染下拉列表
|
|
370
|
-
// await this.initPickerArr(`${year[value[0]]}-${month[value[1]]}-${day[value[2]]}`, value);
|
|
371
441
|
// 处理每月可选天数
|
|
372
442
|
await this.handelDays(value);
|
|
373
|
-
let {
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
443
|
+
let {
|
|
444
|
+
data: {
|
|
445
|
+
years,
|
|
446
|
+
months,
|
|
447
|
+
days,
|
|
448
|
+
dateValue,
|
|
449
|
+
dateStr,
|
|
450
|
+
dateArr,
|
|
451
|
+
filtType,
|
|
452
|
+
checkedType,
|
|
453
|
+
startDateArr,
|
|
454
|
+
endDateArr,
|
|
455
|
+
startDateValue,
|
|
456
|
+
endDateValue,
|
|
457
|
+
startDateStr,
|
|
458
|
+
endDateStr,
|
|
459
|
+
},
|
|
460
|
+
} = this;
|
|
461
|
+
dateStr = `${years[dateArr[0]]}年${months[dateArr[1]]}月${
|
|
462
|
+
days[dateArr[2]]
|
|
463
|
+
}日`;
|
|
464
|
+
dateValue = `${years[dateArr[0]]}-${months[dateArr[1]]}-${
|
|
465
|
+
days[dateArr[2]]
|
|
466
|
+
}`;
|
|
467
|
+
if (filtType === "yearMonth") {
|
|
384
468
|
dateStr = `${years[dateArr[0]]}年${months[dateArr[1]]}月`;
|
|
385
469
|
dateValue = `${years[dateArr[0]]}-${months[dateArr[1]]}`;
|
|
386
470
|
// 如果是按年月筛选
|
|
387
471
|
this.setData({
|
|
388
472
|
dateStr,
|
|
389
|
-
dateValue
|
|
473
|
+
dateValue,
|
|
390
474
|
});
|
|
391
|
-
} else if (filtType ===
|
|
475
|
+
} else if (filtType === "date") {
|
|
392
476
|
// 如果是按年月日筛选
|
|
393
477
|
this.setData({
|
|
394
478
|
dateStr,
|
|
395
|
-
dateValue
|
|
479
|
+
dateValue,
|
|
480
|
+
});
|
|
481
|
+
} else if (checkedType === "start") {
|
|
482
|
+
this.setData({
|
|
483
|
+
startDateArr: dateArr,
|
|
484
|
+
startDateStr: dateStr,
|
|
485
|
+
startDateValue: dateValue,
|
|
396
486
|
});
|
|
397
|
-
} else if (checkedType === 'start') {
|
|
398
|
-
this.setData({
|
|
399
|
-
startDateArr: dateArr,
|
|
400
|
-
startDateStr: dateStr,
|
|
401
|
-
startDateValue: dateValue,
|
|
402
|
-
})
|
|
403
487
|
} else {
|
|
404
488
|
this.setData({
|
|
405
489
|
endDateArr: dateArr,
|
|
406
490
|
endDateStr: dateStr,
|
|
407
491
|
endDateValue: dateValue,
|
|
408
|
-
})
|
|
492
|
+
});
|
|
409
493
|
}
|
|
410
494
|
},
|
|
411
495
|
// 更改筛选类型
|
|
412
496
|
changeFiltType() {
|
|
413
|
-
const {
|
|
497
|
+
const {
|
|
498
|
+
data: { filtType, dateValue, dateStr, dateArr },
|
|
499
|
+
} = this;
|
|
414
500
|
this.setData({
|
|
415
|
-
filtType: filtType ===
|
|
416
|
-
})
|
|
417
|
-
if (filtType ===
|
|
418
|
-
this.setData({
|
|
501
|
+
filtType: filtType === "date" ? "dateRange" : "date",
|
|
502
|
+
});
|
|
503
|
+
if (filtType === "date") {
|
|
504
|
+
this.setData({
|
|
419
505
|
startDateValue: dateValue,
|
|
420
506
|
startDateStr: dateStr,
|
|
421
|
-
startDateArr: dateArr
|
|
422
|
-
|
|
507
|
+
startDateArr: dateArr,
|
|
508
|
+
});
|
|
423
509
|
return;
|
|
424
510
|
}
|
|
425
511
|
this.onReset();
|
|
@@ -427,76 +513,94 @@ Component({
|
|
|
427
513
|
// 切换日期类型
|
|
428
514
|
switchDateType(e) {
|
|
429
515
|
const checkedType = e.currentTarget.dataset.type;
|
|
430
|
-
const {
|
|
516
|
+
const {
|
|
517
|
+
data: { clickedEnd },
|
|
518
|
+
} = this;
|
|
431
519
|
this.setData({
|
|
432
520
|
checkedType,
|
|
433
|
-
clickedEnd: checkedType ===
|
|
521
|
+
clickedEnd: checkedType === "end" ? true : clickedEnd,
|
|
434
522
|
});
|
|
435
523
|
this.showCheckedPicker();
|
|
436
524
|
},
|
|
437
525
|
// 反显选中的日期下拉值
|
|
438
526
|
showCheckedPicker() {
|
|
439
|
-
let {
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
527
|
+
let {
|
|
528
|
+
data: {
|
|
529
|
+
startDateValue,
|
|
530
|
+
endDateValue,
|
|
531
|
+
checkedType,
|
|
532
|
+
startDateArr,
|
|
533
|
+
endDateArr,
|
|
534
|
+
dateArr,
|
|
535
|
+
startDateStr,
|
|
536
|
+
endDateStr,
|
|
537
|
+
},
|
|
538
|
+
} = this;
|
|
539
|
+
// 如果当前切换到结束时间选项
|
|
540
|
+
if (checkedType === "end") {
|
|
446
541
|
if (!endDateValue) {
|
|
447
542
|
// 如果当前没有选结束时间
|
|
448
543
|
endDateValue = startDateValue;
|
|
449
544
|
endDateArr = startDateArr;
|
|
450
545
|
endDateStr = startDateStr;
|
|
451
546
|
} else {
|
|
452
|
-
dateArr = [endDateArr[0],
|
|
547
|
+
dateArr = [endDateArr[0], endDateArr[1], endDateArr[2]];
|
|
453
548
|
}
|
|
454
549
|
}
|
|
455
|
-
if (checkedType ===
|
|
456
|
-
dateArr = [startDateArr[0],
|
|
550
|
+
if (checkedType === "start") {
|
|
551
|
+
dateArr = [startDateArr[0], startDateArr[1], startDateArr[2]];
|
|
457
552
|
}
|
|
458
553
|
this.setData({
|
|
459
554
|
endDateStr,
|
|
460
555
|
endDateValue,
|
|
461
556
|
endDateArr,
|
|
462
|
-
dateArr
|
|
463
|
-
})
|
|
557
|
+
dateArr,
|
|
558
|
+
});
|
|
464
559
|
},
|
|
465
560
|
// 重置时间
|
|
466
561
|
async onReset() {
|
|
467
|
-
this.setData({isRset: true});
|
|
562
|
+
this.setData({ isRset: true });
|
|
468
563
|
this.bindChange();
|
|
469
564
|
},
|
|
565
|
+
// 关闭选择器
|
|
566
|
+
async onClose() {
|
|
567
|
+
this.onReset();
|
|
568
|
+
this.setData({ show: false });
|
|
569
|
+
},
|
|
470
570
|
// 确认选择时间
|
|
471
571
|
onConfirm() {
|
|
472
|
-
const {
|
|
473
|
-
|
|
474
|
-
|
|
572
|
+
const {
|
|
573
|
+
data: { filtType, dateValue, dateStr, startDateValue, endDateValue },
|
|
574
|
+
} = this;
|
|
575
|
+
let pickerDate;
|
|
576
|
+
if (filtType === "date") {
|
|
475
577
|
// 如果按年月日筛选
|
|
476
|
-
|
|
477
|
-
} else if (filtType ===
|
|
578
|
+
pickerDate = `${dateValue} 00:00:00`;
|
|
579
|
+
} else if (filtType === "yearMonth") {
|
|
478
580
|
// 如果按年月筛选
|
|
479
|
-
|
|
581
|
+
pickerDate = dateValue;
|
|
480
582
|
} else {
|
|
481
583
|
if (!endDateValue) {
|
|
482
584
|
wx.showToast({
|
|
483
|
-
title:
|
|
484
|
-
icon:
|
|
485
|
-
})
|
|
585
|
+
title: "请选择结束时间",
|
|
586
|
+
icon: "none",
|
|
587
|
+
});
|
|
486
588
|
return;
|
|
487
589
|
}
|
|
488
590
|
if (new Date(startDateValue) > new Date(endDateValue)) {
|
|
489
591
|
wx.showToast({
|
|
490
|
-
title:
|
|
491
|
-
icon:
|
|
492
|
-
})
|
|
592
|
+
title: "开始时间不能大于结束时间",
|
|
593
|
+
icon: "none",
|
|
594
|
+
});
|
|
493
595
|
return;
|
|
494
596
|
}
|
|
495
|
-
|
|
597
|
+
pickerDate = [`${startDateValue} 00:00:00`, `${endDateValue} 23:59:59`];
|
|
496
598
|
}
|
|
497
|
-
|
|
498
|
-
this.
|
|
499
|
-
|
|
599
|
+
this.setData({ show: false });
|
|
600
|
+
this.triggerEvent("getDateValue", {
|
|
601
|
+
pickerDate,
|
|
602
|
+
pickerDateText: dateStr,
|
|
603
|
+
});
|
|
500
604
|
},
|
|
501
605
|
},
|
|
502
606
|
});
|