做过日报周报月报需求的童鞋就会发现,这块需求好复杂,心想为啥不在提交表单的时候,直接验证就好了,为啥要在选择的时候,难为前端,无奈~~,产品童鞋说用户体验会更好,用户至上!!!
直接上效果图:
每天开始时间、截止时间选项联动规则:
a.时间范围:1小时 ≤ 时间 ≤ 24小时;
b.时间联动规则:当用户先设置开始时间,选择开始时间为 “当日 9时 15分” 时,截止时间可选范围为 “当日 10时 15分” 至 “次日 9时 15分”;当用户先设置截止时间,选择截止时间 “当日 20时 0分”时,开始时间可选范围为“当日 0时 0分” 至“当日 19时 0分”;
每周开始时间、截止时间选项联动规则:
a.时间范围:1小时 ≤ 时间 ≤ 7天;
b.时间联动规则:当用户先设置开始时间,选择开始时间为 “周三 10时 0分” 时,截止时间可选范围为 “周三 11时 0分” 至 “次周三 10时 0分”;当用户先设置截止时间,选择截止时间 “周三 11时 0分”时,开始时间可选范围为“周一 0时 0分” 至“周三 10时 0分”;
直接上代码:
<template>
<div class="fill-time-select">
<!-- 填写频率 -->
<li class="template-setting__content">
<span class="setting-item">
填写频率
</span>
<div class="template-setting-period setting-value">
<el-select v-model="defultSubmitCycle" @change="handlePeriodChange" popper-class="template-period-popper">
<el-option v-for="item in timeOptions" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
</div>
</li>
<!-- 提交时间段 -->
<li class="template-setting__content">
<span class="setting-item">
开始时间
</span>
<div class="template-setting-time-solt setting-value">
<el-cascader id="sub-startTime" ref="subStartTime" v-model="subStartTime" :options="optionsStartDate" :separator="' '" :placeholder="''" @change="handleStartDateChange" popper-class="template-time-popper log-template-setting">
</el-cascader>
</div>
</li>
<li class="template-setting__content">
<span class="setting-item">
截止时间
</span>
<div class="template-setting-time-solt setting-value">
<el-cascader id="sub-endTime" ref="subEndTime" v-model="subEndTime" :options="optionsEndDate" :separator="' '" :placeholder="''" @change="handleEndDateChange" popper-class="template-time-popper log-template-setting">
</el-cascader>
</div>
</li>
</div>
</template>
<script>
let submitCycle = 1; //1 日报 2周报
let submitWeek = [
'周一',
'周二',
'周三',
'周四',
'周五',
'周六',
'周日',
'次周一',
'次周二',
'次周三',
'次周四',
'次周五',
'次周六',
'次周日',
];
let timeOptions = [
{
value: 1,
label: '每天',
},
{
value: 2,
label: '每周',
},
// {
// value: 3,
// label: '每月',
// },
// {
// value: 4,
// label: '不重复',
// },
];
let startWeekOptions = [
{
value: '周一',
label: '周一',
children: [],
},
{
value: '周二',
label: '周二',
children: [],
},
{
value: '周三',
label: '周三',
children: [],
},
{
value: '周四',
label: '周四',
children: [],
},
{
value: '周五',
label: '周五',
children: [],
},
{
value: '周六',
label: '周六',
children: [],
},
{
value: '周日',
label: '周日',
children: [],
},
];
let endWeekOptions = [
{
value: '周二',
label: '周二',
children: [],
},
{
value: '周三',
label: '周三',
children: [],
},
{
value: '周四',
label: '周四',
children: [],
},
{
value: '周五',
label: '周五',
children: [],
},
{
value: '周六',
label: '周六',
children: [],
},
{
value: '周日',
label: '周日',
children: [],
},
{
value: '次周一',
label: '次周一',
children: [],
},
{
value: '次周二',
label: '次周二',
children: [],
},
];
let minutesArr = [
{ value: '0', label: '0分' },
{ value: '15', label: '15分' },
{ value: '30', label: '30分' },
{ value: '45', label: '45分' },
];
export default {
data() {
return {
submitPeriod: submitWeek.slice(5),
minutes: [0, 15, 30, 45],
optionsStartDate: [],
optionsEndDate: [],
defultSubmitCycle: '1',
subStartTime: ['当日', 0, 0],
subEndTime: ['次日', 0, 0],
timeOptions: timeOptions,
startFirstOptions: [
{
value: '当日',
label: '当日',
children: [],
},
],
endFirstOptions: [
{
value: '当日',
label: '当日',
children: [],
},
{
value: '次日',
label: '次日',
children: [],
},
],
};
},
created() {
this.optionsStartDate = this.getStartDateOptionsDayList(24, 45); //24个小时4个分钟选择
this.optionsEndDate = this.getEndDateOptionsDayList(0, 0);
this.defultSubmitCycle = submitCycle;
},
components: {},
computed: {},
methods: {
getStartDateOptionsDayList(currentHour, currentMinute) {
currentHour = currentHour * 1;
currentMinute = currentMinute * 1;
let optionsDay = JSON.parse(JSON.stringify(this.startFirstOptions));
let tempMinArr = []; //开始 当日0时15分,则结束 当日1时15分---次日0时15分
const len = optionsDay.length;
let tempWeekArr = JSON.parse(JSON.stringify(submitWeek));
if (
tempWeekArr.reverse().slice(7).includes(this.subEndTime[0]) ||
this.subEndTime[0] == '当日'
) {
for (let i = 0; i < currentHour; i++) {
if (i === currentHour - 1) {
tempMinArr = JSON.parse(JSON.stringify(minutesArr));
tempMinArr.splice(this.minutes.indexOf(currentMinute) + 1);
} else {
tempMinArr = minutesArr;
}
//最后一天设置
optionsDay[len - 1].children.push({
value: i + '',
label: i + '时',
children: tempMinArr,
});
}
} else {
for (let i = 0; i < 24; i++) {
//最后一天设置
optionsDay[len - 1].children.push({
value: i + '',
label: i + '时',
children: minutesArr,
});
}
}
if (optionsDay[0].value !== '当日') {
for (let i = 0; i < 24; i++) {
//开始时间第一天到倒数第二天设置
optionsDay.map((v, index) => {
if (index == len - 1) return;
v.children.push({
value: i + '',
label: i + '时',
children: minutesArr,
});
});
}
}
return optionsDay;
},
getEndDateOptionsDayList(currentHour, currentMinute) {
currentHour = currentHour * 1;
currentMinute = currentMinute * 1;
let optionsDay = JSON.parse(JSON.stringify(this.endFirstOptions));
let tempMinArr = []; //开始 当日0时15分,则结束 当日1时15分---次日0时15分
for (let i = currentHour + 1; i < 24; i++) {
//结束时间首项设置
if (i === currentHour + 1) {
tempMinArr = JSON.parse(JSON.stringify(minutesArr));
tempMinArr = tempMinArr.slice(this.minutes.indexOf(currentMinute));
} else {
tempMinArr = minutesArr;
}
optionsDay[0].children.push({
value: i + '',
label: i + '时',
children: tempMinArr,
});
}
for (let i = 0; i < currentHour + 1; i++) {
//结束时间末项设置
if (i === currentHour) {
tempMinArr = JSON.parse(JSON.stringify(minutesArr));
tempMinArr.splice(this.minutes.indexOf(currentMinute) + 1);
} else {
tempMinArr = minutesArr;
}
optionsDay[optionsDay.length - 1].children.push({
value: i + '',
label: i + '时',
children: tempMinArr,
});
}
if (optionsDay[0].value !== '当日') {
for (let i = 0; i < 24; i++) {
const lastIndex = optionsDay.length - 1;
optionsDay.map((v, index) => {
if (index === 0 || index === lastIndex) return;
v.children.push({
value: i + '',
label: i + '时',
children: minutesArr,
});
});
}
}
return optionsDay;
},
handleStartDateChange(value) {
this.subStartTime = value;
console.log(this.subStartTime);
const day = this.subStartTime[0];
const hour = this.subStartTime[1];
const min = this.subStartTime[2];
const endDay = this.subEndTime[0];
const endHour = this.subEndTime[1];
const endMin = this.subEndTime[2];
let needResetEndTime = false;
switch (this.defultSubmitCycle) {
case 1:
needResetEndTime =
endHour > hour || (endHour === hour && endMin > min);
if (endDay === '次日' && needResetEndTime) {
//保证默认值在范围内
this.subEndTime[1] = hour;
this.subEndTime[2] = min;
}
break;
case 2:
//刷新结束时间选择
let startIndex = 0;
this.startFirstOptions.map((item, index) => {
if (item.value === day) {
startIndex = index;
}
});
let tempWeeks = JSON.parse(JSON.stringify(submitWeek));
tempWeeks = tempWeeks.splice(startIndex);
this.endFirstOptions = [];
for (let i = 0; i < 8; i++) {
this.endFirstOptions.push({
value: tempWeeks[i],
label: tempWeeks[i],
children: [],
});
}
//刷新结束时间默认值,保证默认值在范围内
const endIndex = submitWeek.indexOf(this.subEndTime[0]);
needResetEndTime =
startIndex + 7 < endIndex ||
(startIndex + 7 === endIndex && endHour > hour) ||
(startIndex + 7 === endIndex && endHour === hour && endMin > min);
if (needResetEndTime) {
this.subEndTime[0] = submitWeek[startIndex + 7];
this.subEndTime[1] = hour;
this.subEndTime[2] = min;
}
break;
}
this.optionsEndDate = this.getEndDateOptionsDayList(hour, min);
},
handleEndDateChange(value) {
this.subEndTime = value;
console.log(this.subEndTime);
const day = this.subEndTime[0];
let hour = this.subEndTime[1];
const min = this.subEndTime[2];
hour = day === '次日' ? 24 : hour;
switch (this.defultSubmitCycle) {
case 1:
break;
case 2:
let tempWeeks = JSON.parse(JSON.stringify(submitWeek));
let endIndex = tempWeeks.indexOf(day);
endIndex = endIndex > 6 ? 6 : endIndex;
this.startFirstOptions = [];
for (let i = 0; i < endIndex + 1; i++) {
this.startFirstOptions.push({
value: tempWeeks[i],
label: tempWeeks[i],
children: [],
});
}
break;
}
this.optionsStartDate = this.getStartDateOptionsDayList(hour, min);
},
handlePeriodChange(value) {
this.defultSubmitCycle = value;
switch (value) {
default:
case 1:
this.startFirstOptions = [
{
value: '当日',
label: '当日',
children: [],
},
];
this.endFirstOptions = [
{
value: '当日',
label: '当日',
children: [],
},
{
value: '次日',
label: '次日',
children: [],
},
];
this.subStartTime = ['当日', '0', '0'];
this.subEndTime = ['次日', '0', '0'];
this.optionsStartDate = this.getStartDateOptionsDayList(24, 45); //24个小时4个分钟选择
this.optionsEndDate = this.getEndDateOptionsDayList(0, 0);
break;
case 2:
this.startFirstOptions = startWeekOptions;
this.endFirstOptions = endWeekOptions;
this.subStartTime = ['周二', '10', '0'];
this.subEndTime = ['次周一', '10', '0'];
this.optionsStartDate = this.getStartDateOptionsDayList(24, 45); //24个小时4个分钟选择
this.optionsEndDate = this.getEndDateOptionsDayList(10, 0);
break;
}
},
},
};
</script>
<style lang="scss" scoped>
.setting-subtitle {
font-size: 18px;
font-family: PingFangSC-Semibold, PingFang SC;
font-weight: 600;
color: #2f3033;
line-height: 25px;
margin-bottom: 28px;
margin-top: 28px;
}
.setting-item {
font-size: 14px;
font-family: PingFangSC-Medium, PingFang SC;
color: #2f3033;
line-height: 20px;
margin-bottom: 10px;
display: block;
}
.setting-value {
font-size: 14px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #2f3033;
line-height: 22px;
margin-bottom: 24px;
}
.template-setting-period {
/deep/ .el-select {
width: 100%;
height: 40px;
&:hover .el-input__inner {
border-color: #0181ff;
}
.el-input__inner {
padding-left: 12px;
}
.el-icon-arrow-up:before {
color: #b6c5d3;
}
}
}
.template-setting-time-solt {
display: flex;
justify-content: space-between;
align-items: center;
width: 100%;
#sub-startTime {
width: 100%;
height: 40px;
border-radius: 4px;
}
#sub-endTime {
width: 100%;
height: 40px;
border-radius: 4px;
}
span {
margin: auto 14px;
width: 17px;
font-size: 14px;
font-family: PingFangSC, PingFangSC-Regular;
color: #2f3033;
}
/deep/ .el-cascader .el-input .el-icon-arrow-down.is-reverse {
transform: rotateZ(0);
}
}
</style>
体验传送门:
点击免费使用,进入企业用户端,点击头像出现下拉列表选择管理后台,点击应用服务,日志模板管理,新建模板里的填写要求开关打开,然后就体验啦!!!