Merge pull request #1128 from sunxiaobin89/main

修复 table 和 laydate 的一些问题以及新增一些功能
This commit is contained in:
贤心 2022-09-01 00:03:38 +08:00 committed by GitHub
commit d29f9326c5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 153 additions and 67 deletions

View File

@ -55,7 +55,7 @@ html #layuicss-laydate{display: none; position: absolute; width: 1989px;}
.layui-laydate-content{position: relative; padding: 10px; -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none;}
.layui-laydate-content table{border-collapse: collapse; border-spacing: 0;}
.layui-laydate-content th,
.layui-laydate-content td{width: 36px; height: 30px; padding: 5px; text-align: center;}
.layui-laydate-content td{width: 36px; height: 30px; padding: 0; text-align: center;}
.layui-laydate-content th{font-weight: 400;}
.layui-laydate-content td{position: relative; cursor: pointer;}
.laydate-day-mark{position: absolute; left: 0; top: 0; width: 100%; line-height: 30px; font-size: 12px; overflow: hidden;}
@ -107,7 +107,7 @@ html #layuicss-laydate{display: none; position: absolute; width: 1989px;}
.layui-laydate-content td{color: #666;}
.layui-laydate-content td.laydate-selected{background-color: #B5FFF8;}
.laydate-selected:hover{background-color: #00F7DE !important;}
.layui-laydate-content td:hover,
.layui-laydate-content td>div:hover,
.layui-laydate-list li:hover{background-color: #eee; color: #333;}
.laydate-time-list li ol{margin: 0; padding: 0; border: 1px solid #e2e2e2; border-left-width: 0;}
.laydate-time-list li:first-child ol{border-left-width: 1px;}
@ -124,6 +124,7 @@ html #layuicss-laydate{display: none; position: absolute; width: 1989px;}
.layui-laydate .layui-this{background-color: #009688 !important; color: #fff !important;}
.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-content td>div{padding: 7px 0;height: 100%;}
/* 墨绿/自定义背景色主题 */
.laydate-theme-molv{border: none;}
@ -153,4 +154,19 @@ html #layuicss-laydate{display: none; position: absolute; width: 1989px;}
.laydate-theme-grid .laydate-month-list>li{margin: 0 -1px -1px 0;}
.laydate-theme-grid .laydate-year-list>li{height: 43px; line-height: 43px;}
.laydate-theme-grid .laydate-month-list>li{height: 71px; line-height: 71px;}
.laydate-theme-grid .layui-laydate-content td>div{height: 29px;margin-top: -1px;}
/* 圆圈高亮主题 */
.laydate-theme-circle .layui-laydate-content td>div,
.laydate-theme-circle .layui-laydate-content td.layui-this>div{width: 28px;height: 28px;line-height: 28px;border-radius: 14px;margin: 0 4px;padding: 0;}
.layui-laydate.laydate-theme-circle .layui-laydate-content table td.layui-this{background-color: transparent !important;}
.laydate-theme-grid.laydate-theme-circle .layui-laydate-content td>div{margin: 0 3.5px;}
/* 全面板 */
.laydate-theme-fullpanel .layui-laydate-main {width: 526px;}
.laydate-theme-fullpanel .layui-laydate-list {width: 252px;left: 272px;}
.laydate-theme-fullpanel .laydate-set-ym span {display: none;}
.laydate-theme-fullpanel .laydate-time-show .layui-laydate-header .layui-icon,
.laydate-theme-fullpanel .laydate-time-show .laydate-set-ym span[lay-type="year"],
.laydate-theme-fullpanel .laydate-time-show .laydate-set-ym span[lay-type="month"] {display: inline-block !important;}
.laydate-theme-fullpanel .laydate-btns-time{display: none;}

View File

@ -194,6 +194,18 @@ layui.define('jquery', function(exports){
that.slide(type);
});
};
// 跳转到特定下标
Class.prototype.jump = function(index){
var that = this;
var options = that.config;
if(index > options.index){
that.slide('add', index - options.index);
} else if(index < options.index){
that.slide('sub', options.index - index);
}
}
//指示器
Class.prototype.indicator = function(){
@ -226,13 +238,7 @@ layui.define('jquery', function(exports){
//事件
tplInd.find('li').on(options.trigger === 'hover' ? 'mouseover' : options.trigger, function(){
var othis = $(this)
,index = othis.index();
if(index > options.index){
that.slide('add', index - options.index);
} else if(index < options.index){
that.slide('sub', options.index - index);
}
that.jump($(this).index());
});
};

View File

@ -61,8 +61,8 @@
,id = options.id;
thisModule.that[id] = that; //记录当前实例对象
return {
return that.inst = {
//提示框
hint: function(content){
that.hint.call(that, content);
@ -85,8 +85,8 @@
// 若 elem 非唯一,则拆分为多个实例
var elem = lay(options.elem || that.config.elem);
if(elem.length > 1){
layui.each(elem, function(){
laydate.render(lay.extend({}, that.config, {
lay.each(elem, function(){
laydate.render(lay.extend({}, that.config, lay.options(this),{
elem: this
}));
});
@ -207,7 +207,18 @@
options.eventElem = lay(options.eventElem);
if(!options.elem[0]) return;
var thatTemp = thisModule.that[options.elem.attr('lay-key')]
thatTemp && thatTemp.destroy && thatTemp.destroy(); // 销毁上一个实例以便重新渲染
layui.type(options.theme) !== 'array' && (options.theme = [options.theme]);
// 设置了全面版模式
if (options.fullPanel) {
if (options.type !== 'datetime' || options.range) {
// 目前只支持datetime的全面版
delete options.fullPanel;
}
}
//日期范围分隔符
that.rangeStr = options.range ? (
typeof options.range === 'string' ? options.range : '-'
@ -279,11 +290,9 @@
}
//设置唯一KEY
if(!options.elem.attr('lay-key')){
options.elem.attr('lay-key', that.index);
options.eventElem.attr('lay-key', that.index);
}
options.elem.attr('lay-key', that.index);
options.eventElem.attr('lay-key', that.index);
//记录重要日期
options.mark = lay.extend({}, (options.calendar && options.lang === 'cn') ? {
'0-1-1': '元旦'
@ -364,7 +373,17 @@
'layui-laydate'
,options.range ? ' layui-laydate-range' : ''
,isStatic ? (' '+ ELEM_STATIC) : ''
,options.theme && options.theme !== 'default' && !/^#/.test(options.theme) ? (' laydate-theme-' + options.theme) : ''
,options.fullPanel ? ' laydate-theme-fullpanel' : '' // 全面版
// ,options.theme && options.theme !== 'default' && !/^#/.test(options.theme) ? (' laydate-theme-' + options.theme) : ''
,(function () {
var themeStr = '';
lay.each(options.theme, function (index, theme) {
if (theme !== 'default' && !/^#/.test(theme)) {
themeStr += ' laydate-theme-' + theme;
}
})
return themeStr;
})()
].join('')
})
@ -472,7 +491,7 @@
if(options.type === 'datetime'){
html.push('<span lay-type="datetime" class="'+ ELEM_TIME_BTN +'">'+ lang.timeTips +'</span>');
}
if(!(!options.range && options.type === 'datetime')){
if(!(!options.range && options.type === 'datetime') || options.fullPanel){
html.push('<span class="'+ ELEM_PREVIEW +'" title="'+ lang.preview +'"></span>')
}
@ -493,13 +512,20 @@
options.showBottom && elem.appendChild(divFooter);
//生成自定义主题
if(/^#/.test(options.theme)){
var style = lay.elem('style')
,styleText = [
'#{{id}} .layui-laydate-header{background-color:{{theme}};}'
,'#{{id}} .layui-this{background-color:{{theme}} !important;}'
].join('').replace(/{{id}}/g, that.elemID).replace(/{{theme}}/g, options.theme);
var style;
var styleText = [];
lay.each(options.theme, function (index, theme) {
if(/^#/.test(theme)){
style = style || lay.elem('style');
styleText.push([
'#{{id}} .layui-laydate-header{background-color:{{theme}};}'
,'#{{id}} li.layui-this,#{{id}} td.layui-this>div{background-color:{{theme}} !important;}'
,options.theme.indexOf('circle') !== -1 ? '' : '#{{id}} .layui-this{background-color:{{theme}} !important;}'
].join('').replace(/{{id}}/g, that.elemID).replace(/{{theme}}/g, theme));
}
});
if (style) {
styleText = styleText.join('');
if('styleSheet' in style){
style.setAttribute('type', 'text/css');
style.styleSheet.cssText = styleText;
@ -528,6 +554,7 @@
Class.thisElemDate = that.elemID;
that.renderAdditional()
typeof options.ready === 'function' && options.ready(lay.extend({}, options.dateTime, {
month: options.dateTime.month + 1
}));
@ -828,7 +855,7 @@
mark = title || YMD[2];
}
});
mark && td.html('<span class="laydate-day-mark">'+ mark +'</span>');
mark && td.find('div').html('<span class="laydate-day-mark">'+ mark +'</span>');
return that;
};
@ -844,7 +871,7 @@
lay.each(options.holidays, function(idx, item) {
lay.each(item, function(i, dayStr) {
if(dayStr === td.attr('lay-ymd')){
td.html('<span class="laydate-day-holidays"' + (
td.find('div').html('<span class="laydate-day-holidays"' + (
type[idx] ? ('type="'+ type[idx] +'"') : ''
) + '>' + YMD[2] + '</span>');
}
@ -855,7 +882,7 @@
};
//无效日期范围的标记
Class.prototype.limit = function(elem, date, index, time){
Class.prototype.limit = function(elem, date, index, time, type){
var that = this
,options = that.config, timestrap = {}
,dateTime = index > (time ? 0 : 41) ? that.endDate : options.dateTime
@ -868,8 +895,8 @@
}, function(key, item){
timestrap[key] = that.newDate(lay.extend({
year: item.year
,month: item.month
,date: item.date
,month: type === 'year' ? 0 : item.month // 年份的时候只比较年
,date: (type === 'year' || type === 'month') ? 1 : item.date // 年月只比较年月不与最大最小比日期
}, function(){
var hms = {};
lay.each(time, function(i, keys){
@ -938,7 +965,7 @@
}
YMD[1]++;
YMD[2] = st + 1;
item.attr('lay-ymd', YMD.join('-')).html(YMD[2]);
item.attr('lay-ymd', YMD.join('-')).html('<div>' + YMD[2] + '</div>');
that.mark(item, YMD).holidays(item, YMD).limit(item, {
year: YMD[0]
,month: YMD[1] - 1
@ -1053,7 +1080,7 @@
}
*/
that.limit(lay(li), ymd, index);
that.limit(lay(li), ymd, index, null, type);
yearNum++;
});
@ -1085,7 +1112,7 @@
}
*/
that.limit(lay(li), ymd, index);
that.limit(lay(li), ymd, index, null, type);
});
lay(elemYM[isCN ? 0 : 1]).attr('lay-ym', listYM[0] + '-' + listYM[1])
@ -1376,7 +1403,18 @@
});
}, 300);
};
// 附加的渲染处理在ready和change的时候调用
Class.prototype.renderAdditional = function(){
var that = this;
var options = that.config;
// 处理全面板
if (options.fullPanel) {
that.list('time', 0);
}
};
//执行 done/change 回调
Class.prototype.done = function(param, type){
var that = this
@ -1394,6 +1432,7 @@
that.preview();
param = param || [that.parse(), start, end];
type === 'change' && that.renderAdditional();
typeof options[type || 'done'] === 'function' && options[type || 'done'].apply(options, param);
return that;
@ -1670,24 +1709,31 @@
//绑定的元素事件处理
Class.prototype.events = function(){
var that = this
,options = that.config
var options = that.config
//绑定呼出控件事件
,showEvent = function(elem, bind){
elem.on(options.trigger, function(){
//已经打开的面板避免重新渲染
if(laydate.thisId === options.id) return;
bind && (that.bindElem = this);
that.render();
});
};
if(!options.elem[0] || options.elem[0].eventHandler) return;
showEvent(options.elem, 'bind');
showEvent(options.eventElem);
var showEvent = function(){
// 已经打开的面板避免重新渲染
if(laydate.thisId === options.id) return;
that.bindElem = this;
that.render();
}
//绑定呼出控件事件
options.elem.on(options.trigger, showEvent);
options.elem[0].eventHandler = true;
options.eventElem.on(options.trigger, showEvent);
that.destroy = function () {
that.remove();
options.elem.off(options.trigger, showEvent);
options.elem.removeAttr('lay-key');
options.elem[0].eventHandler = false;
options.eventElem.off(options.trigger, showEvent);
options.eventElem.removeAttr('lay-key');
delete thisModule.that[options.id];
}
};
//记录所有实例
@ -1752,7 +1798,15 @@
var inst = new Class(options);
return thisModule.call(inst);
};
// 获取
laydate.getInst = function (key) {
var that = thisModule.getThis(key);
if (that) {
return that.inst;
}
}
//将指定对象转化为日期值
laydate.parse = function(dateTime, format, one){
dateTime = dateTime || {};
@ -1802,7 +1856,14 @@
if(!that) return;
return that.remove();
};
// 销毁实例
laydate.destroy = function(id){
var that = thisModule.getThis(id || laydate.thisId);
if(!that) return;
return that.destroy();
};
//加载方式
isLayui ? (
laydate.ready()

View File

@ -370,7 +370,7 @@ layui.define(['lay', 'laytpl', 'laypage', 'form', 'util'], function(exports){
// 初始化索引
options.index = that.index;
that.key = options.id || options.index;
//初始化一些其他参数
that.setInit();
@ -403,7 +403,7 @@ layui.define(['lay', 'laytpl', 'laypage', 'form', 'util'], function(exports){
data: options
,index: that.index //索引
}));
//生成替代元素
hasRender[0] && hasRender.remove(); //如果已经渲染则Rerender
othis.after(reElem);
@ -665,7 +665,7 @@ layui.define(['lay', 'laytpl', 'laypage', 'form', 'util'], function(exports){
// 获取表头组合
var groups = that.layHeader.find((
// 根据当前活动的表头 parentkey 属性查找其组合表头
// 根据当前活动的表头 parentkey 属性查找其组合表头
th ? ('th[data-key='+ th.data('parentkey') +']>') : ''
) + '.' + ELEM_GROUP).get().reverse(); // 若无指向当前活动表头,则自下而上获取所有组合表头
@ -787,7 +787,10 @@ layui.define(['lay', 'laytpl', 'laypage', 'form', 'util'], function(exports){
// 给设定百分比的列分配列宽
else if(/\d+%$/.test(item3.width)){
that.getCssRule(item3.key, function(item){
item.style.width = Math.floor((parseFloat(item3.width) / 100) * cntrWidth) + 'px';
var width = Math.floor((parseFloat(item3.width) / 100) * cntrWidth);
width < minWidth && (width = minWidth);
width > maxWidth && (width = maxWidth);
item.style.width = width + 'px';
});
}
@ -1321,7 +1324,7 @@ layui.define(['lay', 'laytpl', 'laypage', 'form', 'util'], function(exports){
}() +'">'
,'<div class="layui-table-cell laytable-cell-'+ function(){ // 返回对应的CSS类标识
var key = item3.key;
return item3.type === 'normal' ? key
return item3.type === 'normal' ? key
: (key + ' laytable-cell-' + item3.type);
}() +'"'+ function(){
var attr = [];
@ -1695,12 +1698,12 @@ layui.define(['lay', 'laytpl', 'laypage', 'form', 'util'], function(exports){
that.elem.find('*[data-key="'+ key +'"]')[
checked ? 'removeClass' : 'addClass'
](HIDE);
// 根据列的显示隐藏,同步多级表头的父级相关属性值
if(hide != col.hide){
that.setParentCol(!checked, parentKey);
}
// 重新适配尺寸
that.resize();
@ -2049,7 +2052,7 @@ layui.define(['lay', 'laytpl', 'laypage', 'form', 'util'], function(exports){
};
// 渲染单元格编辑状态
var renderGridEdit = function(othis, e){
var renderGridEdit = function(othis, e){
othis = $(othis);
if(othis.data('off')) return; // 不触发事件
@ -2111,18 +2114,18 @@ layui.define(['lay', 'laytpl', 'laypage', 'form', 'util'], function(exports){
});
}
});
// 更新缓存中的值
var obj = {}; //变更的键值
obj[field] = value;
params.update(obj);
// 执行 API 编辑事件
layui.event.call(td[0], MOD_NAME, 'edit('+ filter +')', params);
}).on('blur', '.'+ ELEM_EDIT, function(){ // 单元格编辑 - 恢复非编辑状态事件
$(this).remove(); // 移除编辑状态
});
// 单元格触发编辑的事件
that.layBody.on(options.editTrigger, 'td', function(e){
renderGridEdit(this, e)
@ -2249,8 +2252,8 @@ layui.define(['lay', 'laytpl', 'laypage', 'form', 'util'], function(exports){
settings = settings || {};
var that = this;
var inst = null;
var elemTable = filter
? $('table[lay-filter="'+ filter +'"]')
var elemTable = filter
? $('table[lay-filter="'+ filter +'"]')
: $(ELEM + '[lay-data],'+ ELEM + '[lay-options]');
var errorTips = 'Table element property lay-data configuration item has a syntax error: ';