Squashed commit of the following:

commit e5aa6c3a87
Author: morning-star <1453017105@qq.com>
Date:   Tue Dec 26 22:32:10 2023 +0800

    feat(transfer): 新增 `dblclick` 选项 (#1491)

    * feat(transfer): 新增 `dblclick` 选项

    * style(transfer): 优化代码书写风格

    ---------

    Co-authored-by: 贤心 <3277200+sentsim@users.noreply.github.com>

commit ed3bab52e5
Author: morning-star <1453017105@qq.com>
Date:   Mon Dec 25 14:53:55 2023 +0800

    chore(select): 优化搜索面板打开逻辑 (#1498)

commit 5db18c6f00
Author: 贤心 <3277200+sentsim@users.noreply.github.com>
Date:   Mon Dec 25 14:52:52 2023 +0800

    docs: 优化 issue 模板提示文案 (#1500)

commit 567a1e70c1
Author: morning-star <1453017105@qq.com>
Date:   Mon Dec 25 13:22:50 2023 +0800

    feat(upload): 加强 data 选项的函数写法,支持获取文件相关数据 (#1494)

    close https://gitee.com/layui/layui/issues/I8JAC1

commit 6abb1eedd8
Author: 贤心 <3277200+sentsim@users.noreply.github.com>
Date:   Mon Dec 25 12:15:51 2023 +0800

    ci: 优化 issue 被创建和被编辑时的 action 校验逻辑 (#1496)

    * ci(issue): 增加 duplicate 标签的定时关闭任务

    * docs(issue): 优化 discussion 标签文案

    * ci: 优化 issue 被创建和被编辑时的 action 校验逻辑

    * refactor(issue-opened): 简化语句
pull/1510/head
贤心 2023-12-26 22:45:36 +08:00
parent 4af1b5b7d6
commit 5321441cdb
6 changed files with 161 additions and 116 deletions

View File

@ -37,7 +37,7 @@ body:
- type: textarea
attributes:
label: 业务代码
description: 请提供与该问题对应的业务代码片段,以便我们更好地排查问题。此处直接粘贴代码到文本框即可,无需书写 `Markdown`
description: 即你在调用组件时编写的代码片段。直接将你的代码粘贴到文本框即可,此处无需书写 `Markdown`
render: auto
validations:
required: true

View File

@ -163,6 +163,30 @@ onchange: function(data, index){
`false`
</td>
</tr>
<tr>
<td>dblclick <sup>2.9.3+</sup></td>
<td>
双击时的回调函数。返回的参数如下:
```
dblclick: function(obj){
console.log(obj.elem); // 点击的元素
console.log(obj.data); // 得到点击项的数据
console.log(obj.index); // 如果数据来自左边index 为 0否则为 1
return false // 返回 false 会阻止穿梭
}
```
</td>
<td>function</td>
<td>
`null`
</td>
</tr>
<tr>

View File

@ -74,6 +74,11 @@ data: {
data: {
id: function(){
return $('#id').val();
},
id2: function(index, file){ // 参数支持。2.9.3+
// 注:当 unified:true 和 ie8/9 下,参数无效
console.log(index); // 得到文件索引
console.log(file); // 得到文件对象
}
}
```

View File

@ -562,6 +562,8 @@ layui.define(['lay', 'layer', 'util'], function(exports){
e.preventDefault();
dl.children('dd.'+THIS).trigger('click');
}
}).on('paste', function(){
showDown();
});
// 检测值是否不属于 select 项

View File

@ -73,39 +73,39 @@ layui.define(['laytpl', 'form'], function(exports){
// 穿梭框模板
var TPL_BOX = function(obj){
obj = obj || {};
return ['<div class="layui-transfer-box" data-index="'+ obj.index +'">'
,'<div class="layui-transfer-header">'
,'<input type="checkbox" name="'+ obj.checkAllName +'" lay-filter="layTransferCheckbox" lay-type="all" lay-skin="primary" title="{{= d.data.title['+ obj.index +'] || \'list'+ (obj.index + 1) +'\' }}">'
,'</div>'
,'{{# if(d.data.showSearch){ }}'
,'<div class="layui-transfer-search">'
,'<i class="layui-icon layui-icon-search"></i>'
,'<input type="text" class="layui-input" placeholder="关键词搜索">'
,'</div>'
,'{{# } }}'
,'<ul class="layui-transfer-data"></ul>'
,'</div>'].join('');
return ['<div class="layui-transfer-box" data-index="'+ obj.index +'">',
'<div class="layui-transfer-header">',
'<input type="checkbox" name="'+ obj.checkAllName +'" lay-filter="layTransferCheckbox" lay-type="all" lay-skin="primary" title="{{= d.data.title['+ obj.index +'] || \'list'+ (obj.index + 1) +'\' }}">',
'</div>',
'{{# if(d.data.showSearch){ }}',
'<div class="layui-transfer-search">',
'<i class="layui-icon layui-icon-search"></i>',
'<input type="text" class="layui-input" placeholder="关键词搜索">',
'</div>',
'{{# } }}',
'<ul class="layui-transfer-data"></ul>',
'</div>'].join('');
};
// 主模板
var TPL_MAIN = ['<div class="layui-transfer layui-form layui-border-box" lay-filter="LAY-transfer-{{= d.index }}">'
,TPL_BOX({
index: 0
,checkAllName: 'layTransferLeftCheckAll'
})
,'<div class="layui-transfer-active">'
,'<button type="button" class="layui-btn layui-btn-sm layui-btn-primary layui-btn-disabled" data-index="0">'
,'<i class="layui-icon layui-icon-next"></i>'
,'</button>'
,'<button type="button" class="layui-btn layui-btn-sm layui-btn-primary layui-btn-disabled" data-index="1">'
,'<i class="layui-icon layui-icon-prev"></i>'
,'</button>'
,'</div>'
,TPL_BOX({
index: 1
,checkAllName: 'layTransferRightCheckAll'
})
,'</div>'].join('');
var TPL_MAIN = ['<div class="layui-transfer layui-form layui-border-box" lay-filter="LAY-transfer-{{= d.index }}">',
TPL_BOX({
index: 0,
checkAllName: 'layTransferLeftCheckAll'
}),
'<div class="layui-transfer-active">',
'<button type="button" class="layui-btn layui-btn-sm layui-btn-primary layui-btn-disabled" data-index="0">',
'<i class="layui-icon layui-icon-next"></i>',
'</button>',
'<button type="button" class="layui-btn layui-btn-sm layui-btn-primary layui-btn-disabled" data-index="1">',
'<i class="layui-icon layui-icon-prev"></i>',
'</button>',
'</div>',
TPL_BOX({
index: 1,
checkAllName: 'layTransferRightCheckAll'
}),
'</div>'].join('');
// 构造器
var Class = function(options){
@ -147,8 +147,8 @@ layui.define(['laytpl', 'form'], function(exports){
open: '{{', // 标签符前缀
close: '}}' // 标签符后缀
}).render({
data: options
,index: that.index //索引
data: options,
index: that.index // 索引
}));
var othis = options.elem = $(options.elem);
@ -176,8 +176,8 @@ layui.define(['laytpl', 'form'], function(exports){
// 初始化尺寸
that.layBox.css({
width: options.width
,height: options.height
width: options.width,
height: options.height
});
that.layData.css({
height: function(){
@ -240,20 +240,21 @@ layui.define(['laytpl', 'form'], function(exports){
// 同步复选框和按钮状态
Class.prototype.renderCheckBtn = function(obj){
var that = this
,options = that.config;
var that = this;
var options = that.config;
obj = obj || {};
that.layBox.each(function(_index){
var othis = $(this)
,thisDataElem = othis.find('.'+ ELEM_DATA)
,allElemCheckbox = othis.find('.'+ ELEM_HEADER).find('input[type="checkbox"]')
,listElemCheckbox = thisDataElem.find('input[type="checkbox"]');
var othis = $(this);
var thisDataElem = othis.find('.'+ ELEM_DATA);
var allElemCheckbox = othis.find('.'+ ELEM_HEADER).find('input[type="checkbox"]');
var listElemCheckbox = thisDataElem.find('input[type="checkbox"]');
// 同步复选框和按钮状态
var nums = 0
,haveChecked = false;
var nums = 0;
var haveChecked = false;
listElemCheckbox.each(function(){
var isHide = $(this).data('hide');
if(this.checked || this.disabled || isHide){
@ -288,9 +289,10 @@ layui.define(['laytpl', 'form'], function(exports){
// 同步 value 属性值
Class.prototype.setValue = function(){
var that = this
,options = that.config
,arr = [];
var that = this;
var options = that.config;
var arr = [];
that.layBox.eq(1).find('.'+ ELEM_DATA +' input[type="checkbox"]').each(function(){
var isHide = $(this).data('hide');
isHide || arr.push(this.value);
@ -302,9 +304,9 @@ layui.define(['laytpl', 'form'], function(exports){
// 解析数据
Class.prototype.parseData = function(callback){
var that = this
,options = that.config
,newData = [];
var that = this;
var options = that.config;
var newData = [];
layui.each(options.data, function(index, item){
// 解析格式
@ -328,9 +330,9 @@ layui.define(['laytpl', 'form'], function(exports){
// 获得右侧面板数据
Class.prototype.getData = function(value){
var that = this
,options = that.config
,selectedData = [];
var that = this;
var options = that.config;
var selectedData = [];
that.setValue();
@ -347,21 +349,21 @@ layui.define(['laytpl', 'form'], function(exports){
// 执行穿梭
Class.prototype.transfer = function (_index, elem) {
var that = this
,options = that.config
,thisBoxElem = that.layBox.eq(_index)
,arr = []
var that = this;
var options = that.config;
var thisBoxElem = that.layBox.eq(_index);
var arr = [];
if (!elem) {
// 通过按钮触发找到选中的进行移动
thisBoxElem.each(function(_index){
var othis = $(this)
,thisDataElem = othis.find('.'+ ELEM_DATA);
var othis = $(this);
var thisDataElem = othis.find('.'+ ELEM_DATA);
thisDataElem.children('li').each(function(){
var thisList = $(this)
,thisElemCheckbox = thisList.find('input[type="checkbox"]')
,isHide = thisElemCheckbox.data('hide');
var thisList = $(this);
var thisElemCheckbox = thisList.find('input[type="checkbox"]');
var isHide = thisElemCheckbox.data('hide');
if(thisElemCheckbox[0].checked && !isHide){
thisElemCheckbox[0].checked = false;
@ -377,8 +379,8 @@ layui.define(['laytpl', 'form'], function(exports){
});
} else {
// 双击单条记录移动
var thisList = elem
,thisElemCheckbox = thisList.find('input[type="checkbox"]')
var thisList = elem;
var thisElemCheckbox = thisList.find('input[type="checkbox"]');
thisElemCheckbox[0].checked = false;
thisBoxElem.siblings('.'+ ELEM_BOX).find('.'+ ELEM_DATA).append(thisList.clone());
@ -402,14 +404,14 @@ layui.define(['laytpl', 'form'], function(exports){
// 事件
Class.prototype.events = function(){
var that = this
,options = that.config;
var that = this;
var options = that.config;
// 左右复选框
that.elem.on('click', 'input[lay-filter="layTransferCheckbox"]+', function(){
var thisElemCheckbox = $(this).prev()
,checked = thisElemCheckbox[0].checked
,thisDataElem = thisElemCheckbox.parents('.'+ ELEM_BOX).eq(0).find('.'+ ELEM_DATA);
var thisElemCheckbox = $(this).prev();
var checked = thisElemCheckbox[0].checked;
var thisDataElem = thisElemCheckbox.parents('.'+ ELEM_BOX).eq(0).find('.'+ ELEM_DATA);
if(thisElemCheckbox[0].disabled) return;
@ -428,22 +430,32 @@ layui.define(['laytpl', 'form'], function(exports){
// 双击穿梭
that.elem.on('dblclick', '.' + ELEM_DATA + '>li', function(event){
var elemThis = $(this)
,thisElemCheckbox = elemThis.children('input[type="checkbox"]')
,thisDataElem = elemThis.parent()
,thisBoxElem = thisDataElem.parent()
var elemThis = $(this);
var thisElemCheckbox = elemThis.children('input[type="checkbox"]');
var thisDataElem = elemThis.parent();
var thisBoxElem = thisDataElem.parent();
var index = thisBoxElem.data('index');
if(thisElemCheckbox[0].disabled) return;
that.transfer(thisBoxElem.data('index'), elemThis);
// 根据 dblclick 回调函数返回值决定是否执行穿梭 --- 2.9.3+
var ret = typeof options.dblclick === 'function' ? options.dblclick({
elem: elemThis,
data: that.getData([thisElemCheckbox[0].value])[0],
index: index
}) : null;
if(ret === false) return;
that.transfer(index, elemThis);
})
// 穿梭按钮事件
that.layBtn.on('click', function(){
var othis = $(this)
,_index = othis.data('index')
if(othis.hasClass(DISABLED)) return;
var othis = $(this);
var _index = othis.data('index');
if(othis.hasClass(DISABLED)) return;
that.transfer(_index);
});

View File

@ -279,7 +279,9 @@ layui.define(['lay', 'layer'], function(exports){
// 追加额外的参数
layui.each(options.data, function(key, value){
value = typeof value === 'function' ? value() : value;
value = typeof value === 'function'
? sets.unified ? value() : value(sets.index, sets.file)
: value;
formData.append(key, value);
});