mirror of https://github.com/layui/layui
feat(laydate): 新增 `disabledDate`, `disabledTime` 选项
parent
3bced33798
commit
a3f7b28e3a
|
@ -137,6 +137,7 @@ html #layuicss-laydate{display: none; position: absolute; width: 1989px;}
|
||||||
.layui-laydate .layui-this,.layui-laydate .layui-this>div{background-color: #16baaa !important; color: #fff !important;}
|
.layui-laydate .layui-this,.layui-laydate .layui-this>div{background-color: #16baaa !important; color: #fff !important;}
|
||||||
.layui-laydate .laydate-disabled,
|
.layui-laydate .laydate-disabled,
|
||||||
.layui-laydate .laydate-disabled:hover{background:none !important; color: #d2d2d2 !important; cursor: not-allowed !important; -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none;}
|
.layui-laydate .laydate-disabled:hover{background:none !important; color: #d2d2d2 !important; cursor: not-allowed !important; -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none;}
|
||||||
|
.layui-laydate .layui-this.laydate-disabled,.layui-laydate .layui-this.laydate-disabled>div{background-color: #eee !important}
|
||||||
.layui-laydate-content td>div{padding: 7px 0;height: 100%;}
|
.layui-laydate-content td>div{padding: 7px 0;height: 100%;}
|
||||||
|
|
||||||
/* 墨绿/自定义背景色主题 */
|
/* 墨绿/自定义背景色主题 */
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/** laydate 日期与时间控件 | MIT Licensed */
|
/** laydate 日期与时间控件 | MIT Licensed */
|
||||||
|
// @ts-expect-error
|
||||||
;!function(window, document){ // gulp build: laydate-header
|
;!function(window, document){ // gulp build: laydate-header
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
@ -1087,7 +1087,71 @@
|
||||||
return that;
|
return that;
|
||||||
};
|
};
|
||||||
|
|
||||||
// 无效日期范围的标记
|
/**
|
||||||
|
* @typedef limitOptions
|
||||||
|
* @prop {JQuery} [elem] - 检测的元素, 例如面板中年月日时分秒元素,“现在”,“确认” 按钮等
|
||||||
|
* @prop {number} [index] - 元素集合中,当前检测元素的索引,years:0,month:0,data: 0-41 ,hms:0
|
||||||
|
* @prop {['hours', 'minutes', 'seconds'] | ['hours', 'minutes'] | ['hours']} [time] - 是否比较时分秒
|
||||||
|
* @prop {'year'|'month'|string} [type] - 面板类型?
|
||||||
|
* @prop {0 | 1} [rangeType] - 面板索引, 0 表示 start, 1 表示 end
|
||||||
|
* @prop {Partial<{year:number,month: number,date:number,hours:number,minutes:number,seconds:number}>} [date] - 检测的日期时间对象
|
||||||
|
* @prop {'date' | 'time' | 'datetime'} disabledType - 禁用类型,按钮应使用 datetime
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* 不可选取的日期时间
|
||||||
|
* @param {limitOptions} opts
|
||||||
|
* @param {number} currentDataTime 当前检测的日期的时间戳
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
Class.prototype.disabledDateTime = function(opts, currentDataTime){
|
||||||
|
opts = opts || {};
|
||||||
|
|
||||||
|
var that = this;
|
||||||
|
var options = that.config;
|
||||||
|
var position = options.range ? (opts.rangeType === 0 ? 'start' : 'end') : 'start'
|
||||||
|
|
||||||
|
var isDisabledDate = function(date){
|
||||||
|
if(!options.disabledDate) return;
|
||||||
|
if(options.type === 'time')return;
|
||||||
|
if(!(opts.disabledType === 'date' || opts.disabledType === 'datetime'))return;
|
||||||
|
// 切换到年月面板时不检测(更好的方案是检测面板年/月中所有的日期,以判断是否禁用当前的年/月)
|
||||||
|
if(!(options.type === 'year' || options.type === 'month') && (opts.type === 'year' || opts.type === 'month'))return;
|
||||||
|
if(options.type === 'month' && opts.type === 'year')return;
|
||||||
|
|
||||||
|
return options.disabledDate.call(options, that.newDate({year: date.year, month: date.month, date: date.date}), position);
|
||||||
|
}
|
||||||
|
|
||||||
|
var isDisabledItem = function(val, rangeFn){
|
||||||
|
return (rangeFn && rangeFn() || []).indexOf(val) !== -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
var isDisabledTime = function(date){
|
||||||
|
if(!options.disabledTime) return;
|
||||||
|
if(!(options.type === "time" || options.type === "datetime")) return;
|
||||||
|
if(!(opts.disabledType === 'time' || opts.disabledType === 'datetime'))return;
|
||||||
|
var disabledTime = options.disabledTime.length <= 2
|
||||||
|
? options.disabledTime.call(options, that.newDate(date), position)
|
||||||
|
: options.disabledTime.call(options, date.hours, date.minutes, date.seconds, position);
|
||||||
|
|
||||||
|
return opts.disabledType === 'datetime'
|
||||||
|
? isDisabledItem(date.hours, disabledTime.disabledHours)
|
||||||
|
|| isDisabledItem(date.minutes, disabledTime.disabledMinutes)
|
||||||
|
|| isDisabledItem(date.seconds, disabledTime.disabledSeconds)
|
||||||
|
: [isDisabledItem(date.hours, disabledTime.disabledHours),
|
||||||
|
isDisabledItem(date.minutes, disabledTime.disabledMinutes),
|
||||||
|
isDisabledItem(date.seconds, disabledTime.disabledSeconds)][opts.time.length - 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
var datetimeObj = that.systemDate(new Date(currentDataTime))
|
||||||
|
return isDisabledDate(datetimeObj) || isDisabledTime(datetimeObj);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 无效日期范围的标记
|
||||||
|
* @param {limitOptions} opts
|
||||||
|
*
|
||||||
|
*/
|
||||||
Class.prototype.limit = function(opts){
|
Class.prototype.limit = function(opts){
|
||||||
opts = opts || {};
|
opts = opts || {};
|
||||||
|
|
||||||
|
@ -1115,7 +1179,7 @@
|
||||||
}())).getTime(); //time:是否比较时分秒
|
}())).getTime(); //time:是否比较时分秒
|
||||||
});
|
});
|
||||||
|
|
||||||
isOut = timestamp.now < timestamp.min || timestamp.now > timestamp.max;
|
isOut = timestamp.now < timestamp.min || timestamp.now > timestamp.max || that.disabledDateTime(opts, timestamp.now);
|
||||||
opts.elem && opts.elem[isOut ? 'addClass' : 'removeClass'](DISABLED);
|
opts.elem && opts.elem[isOut ? 'addClass' : 'removeClass'](DISABLED);
|
||||||
|
|
||||||
return isOut;
|
return isOut;
|
||||||
|
@ -1185,7 +1249,9 @@
|
||||||
month: YMD[1] - 1,
|
month: YMD[1] - 1,
|
||||||
date: YMD[2]
|
date: YMD[2]
|
||||||
},
|
},
|
||||||
index: index_
|
index: index_,
|
||||||
|
rangeType: index,
|
||||||
|
disabledType: 'date'
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -1246,13 +1312,15 @@
|
||||||
elem: lay(that.footer).find(ELEM_NOW),
|
elem: lay(that.footer).find(ELEM_NOW),
|
||||||
date: that.systemDate(/^(datetime|time)$/.test(options.type) ? new Date() : null),
|
date: that.systemDate(/^(datetime|time)$/.test(options.type) ? new Date() : null),
|
||||||
index: 0,
|
index: 0,
|
||||||
time: timeParams
|
time: timeParams,
|
||||||
|
disabledType: 'datetime'
|
||||||
});
|
});
|
||||||
// 确认按钮
|
// 确认按钮
|
||||||
that.limit({
|
that.limit({
|
||||||
elem: lay(that.footer).find(ELEM_CONFIRM),
|
elem: lay(that.footer).find(ELEM_CONFIRM),
|
||||||
index: 0,
|
index: 0,
|
||||||
time: timeParams
|
time: timeParams,
|
||||||
|
disabledType: 'datetime'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1328,7 +1396,9 @@
|
||||||
elem: lay(li),
|
elem: lay(li),
|
||||||
date: ymd,
|
date: ymd,
|
||||||
index: index,
|
index: index,
|
||||||
type: type
|
type: type,
|
||||||
|
rangeType: index,
|
||||||
|
disabledType: 'date'
|
||||||
});
|
});
|
||||||
yearNum++;
|
yearNum++;
|
||||||
});
|
});
|
||||||
|
@ -1365,7 +1435,9 @@
|
||||||
elem: lay(li),
|
elem: lay(li),
|
||||||
date: ymd,
|
date: ymd,
|
||||||
index: index,
|
index: index,
|
||||||
type: type
|
type: type,
|
||||||
|
rangeType: index,
|
||||||
|
disabledType: 'date'
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -1392,6 +1464,8 @@
|
||||||
,seconds: ii
|
,seconds: ii
|
||||||
}][i],
|
}][i],
|
||||||
index: index,
|
index: index,
|
||||||
|
rangeType: index,
|
||||||
|
disabledType: 'time',
|
||||||
time: [
|
time: [
|
||||||
['hours'],
|
['hours'],
|
||||||
['hours', 'minutes'],
|
['hours', 'minutes'],
|
||||||
|
@ -1405,7 +1479,9 @@
|
||||||
elem: lay(that.footer).find(ELEM_CONFIRM),
|
elem: lay(that.footer).find(ELEM_CONFIRM),
|
||||||
date: that[startEnd],
|
date: that[startEnd],
|
||||||
index: 0,
|
index: 0,
|
||||||
time: ['hours', 'minutes', 'seconds']
|
time: ['hours', 'minutes', 'seconds'],
|
||||||
|
rangeType: index,
|
||||||
|
disabledType: 'datetime'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -1570,17 +1646,25 @@
|
||||||
var that = this
|
var that = this
|
||||||
,options = that.config
|
,options = that.config
|
||||||
,lang = that.lang()
|
,lang = that.lang()
|
||||||
,isOut, elemBtn = lay(that.footer).find(ELEM_CONFIRM);
|
,isOut
|
||||||
if(options.range && options.type !== 'time'){
|
,elemBtn = lay(that.footer).find(ELEM_CONFIRM)
|
||||||
|
,timeParams = options.type === 'datetime' || options.type === 'time' ? ['hours', 'minutes', 'seconds'] : undefined;
|
||||||
|
if(options.range){
|
||||||
start = start || (that.rangeLinked ? that.startDate : options.dateTime);
|
start = start || (that.rangeLinked ? that.startDate : options.dateTime);
|
||||||
end = end || that.endDate;
|
end = end || that.endDate;
|
||||||
isOut = !that.endState || that.newDate(start).getTime() > that.newDate(end).getTime();
|
isOut = !that.endState || that.newDate(start).getTime() > that.newDate(end).getTime();
|
||||||
|
|
||||||
//如果不在有效日期内,直接禁用按钮,否则比较开始和结束日期
|
//如果不在有效日期内,直接禁用按钮,否则比较开始和结束日期
|
||||||
(that.limit({
|
(that.limit({
|
||||||
date: start
|
date: start,
|
||||||
|
disabledType: 'datetime',
|
||||||
|
time: timeParams,
|
||||||
|
rangeType: 0
|
||||||
}) || that.limit({
|
}) || that.limit({
|
||||||
date: end
|
date: end,
|
||||||
|
disabledType: 'datetime',
|
||||||
|
time: timeParams,
|
||||||
|
rangeType: 1
|
||||||
}))
|
}))
|
||||||
? elemBtn.addClass(DISABLED)
|
? elemBtn.addClass(DISABLED)
|
||||||
: elemBtn[isOut ? 'addClass' : 'removeClass'](DISABLED);
|
: elemBtn[isOut ? 'addClass' : 'removeClass'](DISABLED);
|
||||||
|
@ -1854,7 +1938,7 @@
|
||||||
that.startDate = lay.extend({}, dateTime); // 同步startDate
|
that.startDate = lay.extend({}, dateTime); // 同步startDate
|
||||||
}
|
}
|
||||||
// 校验另外一个日期是否在有效的范围内
|
// 校验另外一个日期是否在有效的范围内
|
||||||
if (that.endState && !that.limit({date: that.thisDateTime(1 - index)})) {
|
if (that.endState && !that.limit({date: that.thisDateTime(1 - index), disabledType:'datetime'})) {
|
||||||
// 根据选择之后判断是否需要切换模式
|
// 根据选择之后判断是否需要切换模式
|
||||||
var isChange;
|
var isChange;
|
||||||
if (that.endState && that.autoCalendarModel.auto) {
|
if (that.endState && that.autoCalendarModel.auto) {
|
||||||
|
@ -2012,7 +2096,9 @@
|
||||||
elem: lay(that.footer).find(ELEM_CONFIRM),
|
elem: lay(that.footer).find(ELEM_CONFIRM),
|
||||||
date: {
|
date: {
|
||||||
year: listYM[0]
|
year: listYM[0]
|
||||||
}
|
},
|
||||||
|
rangeType: index,
|
||||||
|
disabledType: 'datetime'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue