Showing
4 changed files
with
632 additions
and
28 deletions
| @@ -909,8 +909,6 @@ class Seller extends Common | @@ -909,8 +909,6 @@ class Seller extends Common | ||
| 909 | $data['sdtime'] = $dtime ? strtotime(date($dtime[0],time())) : ''; | 909 | $data['sdtime'] = $dtime ? strtotime(date($dtime[0],time())) : ''; |
| 910 | $data['edtime'] = $dtime ? strtotime(date($dtime[1],time())) : ''; | 910 | $data['edtime'] = $dtime ? strtotime(date($dtime[1],time())) : ''; |
| 911 | 911 | ||
| 912 | - //$parame = '&offset='.$data["page"].'&limit='.$data["limit"].'&sellername='.@$sellername.'&stime='.@$stime.'&etime='.@$etime.'&channel='.@$data['channel'].'&id='.$id.'&status='.@$data['status'].'&sdtime='.$sdtime.'&edtime='.$edtime; | ||
| 913 | - | ||
| 914 | //////////////////////////////// | 912 | //////////////////////////////// |
| 915 | $arr = array(); | 913 | $arr = array(); |
| 916 | $where = ''; | 914 | $where = ''; |
| @@ -965,9 +963,9 @@ class Seller extends Common | @@ -965,9 +963,9 @@ class Seller extends Common | ||
| 965 | $where .= $data['status']==2 ? ' AND r.cdate <= UNIX_TIMESTAMP(date_add(NOW(), interval -5 minute)) AND r.cdate BETWEEN '.$data['stime'].' AND '.$data['etime'] : ' AND r.cdate BETWEEN '.$data['stime'].' AND '.$data['etime']; | 963 | $where .= $data['status']==2 ? ' AND r.cdate <= UNIX_TIMESTAMP(date_add(NOW(), interval -5 minute)) AND r.cdate BETWEEN '.$data['stime'].' AND '.$data['etime'] : ' AND r.cdate BETWEEN '.$data['stime'].' AND '.$data['etime']; |
| 966 | } | 964 | } |
| 967 | 965 | ||
| 968 | - $data['channel'] = $data['channel'] ? $data['channel'] : 1; | ||
| 969 | - $where .= $data['channel'] == -1 ? '' : ' AND re.type_id = '.$data['channel']; | 966 | + $data['channel'] = $data['channel'] ? implode(',',$data['channel']) : 1; |
| 970 | 967 | ||
| 968 | + $where .= $data['channel'] == -1 ? '' : ' AND re.type_id in ('.$data['channel'].')'; | ||
| 971 | #key | 969 | #key |
| 972 | $where .= $data['key'] ? ' AND s.sellername like "%'.$data['key'].'%"' : ''; //商家名称 | 970 | $where .= $data['key'] ? ' AND s.sellername like "%'.$data['key'].'%"' : ''; //商家名称 |
| 973 | #ID | 971 | #ID |
| @@ -33,6 +33,7 @@ | @@ -33,6 +33,7 @@ | ||
| 33 | </select> | 33 | </select> |
| 34 | </div> | 34 | </div> |
| 35 | </div> | 35 | </div> |
| 36 | + <!-- | ||
| 36 | 商家来源: | 37 | 商家来源: |
| 37 | <div class="layui-input-inline layui-form"> | 38 | <div class="layui-input-inline layui-form"> |
| 38 | <div class="layui-input-8"> | 39 | <div class="layui-input-8"> |
| @@ -43,7 +44,13 @@ | @@ -43,7 +44,13 @@ | ||
| 43 | <option value="3">测试</option> | 44 | <option value="3">测试</option> |
| 44 | </select> | 45 | </select> |
| 45 | </div> | 46 | </div> |
| 47 | + </div>--> | ||
| 48 | + 商家来源:<div class="layui-input-inline layui-form"> | ||
| 49 | + <div class="layui-input-8"> | ||
| 50 | + <span class="" id="channel"></span> | ||
| 51 | + </div> | ||
| 46 | </div> | 52 | </div> |
| 53 | + | ||
| 47 | 订单类型: | 54 | 订单类型: |
| 48 | <div class="layui-input-inline layui-form"> | 55 | <div class="layui-input-inline layui-form"> |
| 49 | <div class="layui-input-8"> | 56 | <div class="layui-input-8"> |
| @@ -54,6 +61,7 @@ | @@ -54,6 +61,7 @@ | ||
| 54 | </select> | 61 | </select> |
| 55 | </div> | 62 | </div> |
| 56 | </div> | 63 | </div> |
| 64 | + | ||
| 57 | <button class="layui-btn" id="search" data-type="reload">查询统计</button> | 65 | <button class="layui-btn" id="search" data-type="reload">查询统计</button> |
| 58 | </div> | 66 | </div> |
| 59 | <br> | 67 | <br> |
| @@ -121,6 +129,61 @@ | @@ -121,6 +129,61 @@ | ||
| 121 | ,limit:15 | 129 | ,limit:15 |
| 122 | }); | 130 | }); |
| 123 | 131 | ||
| 132 | + /************** 下拉框多选 ****************/ | ||
| 133 | + var tagData = [{"id":1,"name":"合作"},{"id":2,"name":"推广"},{"id":3,"name":"测试"}]; | ||
| 134 | + layui.config({ | ||
| 135 | + base : '../' | ||
| 136 | + }).extend({ | ||
| 137 | + //selectN: '../static/plugins/layui/layui_extends/selectN', | ||
| 138 | + selectM: '../static/plugins/layui/layui_extends/selectM', | ||
| 139 | + }).use(['selectM'],function(){ | ||
| 140 | + $ = layui.jquery; | ||
| 141 | + var form = layui.form | ||
| 142 | + ,selectN = layui.selectN | ||
| 143 | + ,selectM = layui.selectM | ||
| 144 | + | ||
| 145 | + //多选标签-基本配置 | ||
| 146 | + var tagIns1 = selectM({ | ||
| 147 | + //元素容器【必填】 | ||
| 148 | + elem: '#channel' | ||
| 149 | + //候选数据【必填】 | ||
| 150 | + ,data: tagData | ||
| 151 | + //最大可选 | ||
| 152 | + ,max:3 | ||
| 153 | + //宽度 | ||
| 154 | + ,width:240 | ||
| 155 | + //默认值 | ||
| 156 | + ,selected: [1] | ||
| 157 | + //添加验证 | ||
| 158 | + ,verify:'required' | ||
| 159 | + }); | ||
| 160 | + | ||
| 161 | + //搜索 | ||
| 162 | + $('#search').on('click', function() { | ||
| 163 | + //ID | ||
| 164 | + var nokey = $('#nokey').val(); | ||
| 165 | + //关键字 | ||
| 166 | + var key = $('#key').val(); | ||
| 167 | + | ||
| 168 | + var time = $('#time').val(); | ||
| 169 | + console.log(time); | ||
| 170 | + | ||
| 171 | + var dtime = $('#dtime').val(); | ||
| 172 | + //商家来源 | ||
| 173 | + var channel = tagIns1.values; | ||
| 174 | + console.log(channel); | ||
| 175 | + //筛选条件:订单状态 | ||
| 176 | + var status = $('#status').val(); | ||
| 177 | + console.log(status); | ||
| 178 | + //筛选条件:订单类型 | ||
| 179 | + var order = $('#order').val(); | ||
| 180 | + //传参 | ||
| 181 | + tableIn.reload({ page: {page: 1},where: {nokey: nokey,key: key,status: status,time: time,dtime:dtime,channel: channel,order: order}}); | ||
| 182 | + }); | ||
| 183 | + }); | ||
| 184 | + /************** 下拉框多选 ****************/ | ||
| 185 | + | ||
| 186 | + | ||
| 124 | //监听行双击事件 | 187 | //监听行双击事件 |
| 125 | table.on('rowDouble(list)', function(obj){ | 188 | table.on('rowDouble(list)', function(obj){ |
| 126 | //table.on('row(list)', function(obj){ 双击事件 | 189 | //table.on('row(list)', function(obj){ 双击事件 |
| @@ -155,30 +218,6 @@ | @@ -155,30 +218,6 @@ | ||
| 155 | ,range: true | 218 | ,range: true |
| 156 | }); | 219 | }); |
| 157 | 220 | ||
| 158 | - //搜索 | ||
| 159 | - $('#search').on('click', function() { | ||
| 160 | - //ID | ||
| 161 | - var nokey = $('#nokey').val(); | ||
| 162 | - //关键字 | ||
| 163 | - var key = $('#key').val(); | ||
| 164 | - | ||
| 165 | - var time = $('#time').val(); | ||
| 166 | - console.log(time); | ||
| 167 | - | ||
| 168 | - var dtime = $('#dtime').val(); | ||
| 169 | - | ||
| 170 | - //商家来源 | ||
| 171 | - var channel = $('#channel').val(); | ||
| 172 | - console.log(channel); | ||
| 173 | - //筛选条件:订单状态 | ||
| 174 | - var status = $('#status').val(); | ||
| 175 | - console.log(status); | ||
| 176 | - //筛选条件:订单类型 | ||
| 177 | - var order = $('#order').val(); | ||
| 178 | - //传参 | ||
| 179 | - tableIn.reload({ page: {page: 1},where: {nokey: nokey,key: key,status: status,time: time,dtime:dtime,channel: channel,order: order}}); | ||
| 180 | - }); | ||
| 181 | - | ||
| 182 | var $ = layui.$, active = { | 221 | var $ = layui.$, active = { |
| 183 | reload: function(){ | 222 | reload: function(){ |
| 184 | var nokey = $('#nokey'); | 223 | var nokey = $('#nokey'); |
| 1 | +/* | ||
| 2 | +* @version: 2.0 | ||
| 3 | +* @Author: tomato | ||
| 4 | +* @Date: 2018-5-5 11:29:57 | ||
| 5 | +* @Last Modified by: tomato | ||
| 6 | +* @Last Modified time: 2018-5-26 18:08:43 | ||
| 7 | +*/ | ||
| 8 | +//多选下拉框 | ||
| 9 | +layui.define(['jquery', 'layer'], function(exports){ | ||
| 10 | + var MOD_NAME = 'selectM'; | ||
| 11 | + var $ = layui.jquery,layer=layui.layer; | ||
| 12 | + var obj = function(config){ | ||
| 13 | + this.disabledIndex =[]; | ||
| 14 | + //当前选中的值名数据 | ||
| 15 | + this.selected = []; | ||
| 16 | + //当前选中的值 | ||
| 17 | + this.values =[]; | ||
| 18 | + //当前选中的名称 | ||
| 19 | + this.names =[]; | ||
| 20 | + | ||
| 21 | + //初始化设置参数 | ||
| 22 | + this.config = { | ||
| 23 | + //选择器id或class | ||
| 24 | + elem: '', | ||
| 25 | + //候选项数据[{id:"1",name:"名称1",status:0},{id:"2",name:"名称2",status:1}] | ||
| 26 | + data: [], | ||
| 27 | + | ||
| 28 | + //默认选中值 | ||
| 29 | + selected: [], | ||
| 30 | + | ||
| 31 | + //空值项提示,支持将{max}替换为max | ||
| 32 | + tips: '请选择 最多 {max} 个', | ||
| 33 | + | ||
| 34 | + //最多选中个数,默认5 | ||
| 35 | + max : 5, | ||
| 36 | + | ||
| 37 | + //选择框宽度 | ||
| 38 | + width:null, | ||
| 39 | + | ||
| 40 | + //值验证,与lay-verify一致 | ||
| 41 | + verify: '', | ||
| 42 | + | ||
| 43 | + //input的name 不设置与选择器相同(去#.) | ||
| 44 | + name: '', | ||
| 45 | + | ||
| 46 | + //值的分隔符 | ||
| 47 | + delimiter: ',', | ||
| 48 | + | ||
| 49 | + //候选项数据的键名 status=0为禁用状态 | ||
| 50 | + field: {idName:'id',titleName:'name',statusName:'status'} | ||
| 51 | + } | ||
| 52 | + | ||
| 53 | + this.config = $.extend(this.config,config); | ||
| 54 | + //创建选项元素 | ||
| 55 | + this.createOption = function(){ | ||
| 56 | + var o=this,c=o.config,f=c.field,d = c.data; | ||
| 57 | + var s = c.selected; | ||
| 58 | + $E = $(c.elem); | ||
| 59 | + var tips = c.tips.replace('{max}',c.max); | ||
| 60 | + var inputName = c.name=='' ? c.elem.replace('#','').replace('.','') : c.name; | ||
| 61 | + var verify = c.verify=='' ? '' : 'lay-verify="'+c.verify+'" '; | ||
| 62 | + var html = ''; | ||
| 63 | + html += '<div class="layui-unselect layui-form-select">'; | ||
| 64 | + html += '<div class="layui-select-title">'; | ||
| 65 | + html += '<input '+verify+'name="'+inputName+'" type="text" readonly="" class="layui-input layui-unselect">'; | ||
| 66 | + html += '</div>'; | ||
| 67 | + html += '<div class="layui-input multiple">'; | ||
| 68 | + html += '</div>'; | ||
| 69 | + html += '<dl class="layui-anim layui-anim-upbit">'; | ||
| 70 | + html += '<dd lay-value="" class="layui-select-tips">'+tips+'</dd>'; | ||
| 71 | + for(var i=0;i<d.length;i++){ | ||
| 72 | + var disabled1='',disabled2=''; | ||
| 73 | + if(d[i][f.statusName]==0){ | ||
| 74 | + o.disabledIndex[d[i][f.idName]] = d[i][f.titleName]; | ||
| 75 | + disabled1 = d[i][f.statusName]==0 ? 'layui-disabled' : ''; | ||
| 76 | + disabled2 = d[i][f.statusName]==0 ? ' layui-checkbox-disbaled layui-disabled' : ''; | ||
| 77 | + } | ||
| 78 | + html +='<dd lay-value="'+d[i][f.idName]+'" class="'+disabled1+'">'; | ||
| 79 | + html += '<div class="layui-unselect layui-form-checkbox'+disabled2+'" lay-skin="primary">'; | ||
| 80 | + html += '<span>'+d[i][f.titleName]+'</span><i class="layui-icon"></i>'; | ||
| 81 | + html += '</div>'; | ||
| 82 | + html +='</dd>'; | ||
| 83 | + } | ||
| 84 | + html += '</dl>'; | ||
| 85 | + html += '</div>'; | ||
| 86 | + $E.html(html); | ||
| 87 | + } | ||
| 88 | + | ||
| 89 | + //设置选中值 | ||
| 90 | + this.set = function(selected){ | ||
| 91 | + var o=this,c=o.config; | ||
| 92 | + var s = typeof selected=='undefined' ? c.selected : selected; | ||
| 93 | + $E = $(c.elem); | ||
| 94 | + $E.find('.layui-form-checkbox').removeClass('layui-form-checked'); | ||
| 95 | + $E.find('dd').removeClass('layui-this'); | ||
| 96 | + //为默认选中值添加类名 | ||
| 97 | + var max = s.length>c.max ? c.max : s.length; | ||
| 98 | + for(var i=0;i<max;i++){ | ||
| 99 | + if(s[i] && !o.disabledIndex.hasOwnProperty(s[i])){ | ||
| 100 | + $E.find('dd[lay-value='+s[i]+']').addClass('layui-this'); | ||
| 101 | + } | ||
| 102 | + } | ||
| 103 | + $E.find('dd.layui-this').each(function(){ | ||
| 104 | + $(this).find('div').addClass('layui-form-checked'); | ||
| 105 | + }); | ||
| 106 | + o.setSelected(selected); | ||
| 107 | + } | ||
| 108 | + | ||
| 109 | + //设置选中值 每次点击操作后执行 | ||
| 110 | + this.setSelected = function(first){ | ||
| 111 | + var o=this,c=o.config,f=c.field; | ||
| 112 | + $E = $(c.elem); | ||
| 113 | + var values=[],names=[],selected = [],spans = []; | ||
| 114 | + var items = $E.find('dd.layui-this'); | ||
| 115 | + if(items.length==0){ | ||
| 116 | + var tips = c.tips.replace('{max}',c.max); | ||
| 117 | + spans.push('<span class="tips">'+tips+'</span>'); | ||
| 118 | + } | ||
| 119 | + else{ | ||
| 120 | + items.each(function(){ | ||
| 121 | + $this = $(this); | ||
| 122 | + var item ={}; | ||
| 123 | + var v = $this.attr('lay-value'); | ||
| 124 | + var n = $this.find('span').text(); | ||
| 125 | + item[f.idName] = v; | ||
| 126 | + item[f.titleName] = n; | ||
| 127 | + values.push(v); | ||
| 128 | + names.push(n); | ||
| 129 | + spans.push('<a href="javascript:;"><span lay-value="'+v+'">'+n+'</span><i class="layui-icon">ဆ</i></a>'); | ||
| 130 | + selected.push(item); | ||
| 131 | + }); | ||
| 132 | + } | ||
| 133 | + spans.push('<i class="layui-edge" style="pointer-events: none;"></i>'); | ||
| 134 | + $E.find('.multiple').html(spans.join('')); | ||
| 135 | + $E.find('.layui-select-title').find('input').each(function(){ | ||
| 136 | + if(typeof first=='undefined'){ | ||
| 137 | + this.defaultValue = values.join(c.delimiter); | ||
| 138 | + } | ||
| 139 | + this.value = values.join(c.delimiter); | ||
| 140 | + }); | ||
| 141 | + | ||
| 142 | + var h = $E.find('.multiple').height()+14; | ||
| 143 | + $E.find('.layui-form-select dl').css('top',h+'px'); | ||
| 144 | + o.values=values,o.names=names,o.selected = selected; | ||
| 145 | + } | ||
| 146 | + //ajax方式获取候选数据 | ||
| 147 | + this.getData = function(url){ | ||
| 148 | + var d; | ||
| 149 | + $.ajax({ | ||
| 150 | + url:url, | ||
| 151 | + dataType:'json', | ||
| 152 | + async:false, | ||
| 153 | + success:function(json){ | ||
| 154 | + d=json; | ||
| 155 | + }, | ||
| 156 | + error: function(){ | ||
| 157 | + console.error(MOD_NAME+' hint:候选数据ajax请求错误 '); | ||
| 158 | + d = false; | ||
| 159 | + } | ||
| 160 | + }); | ||
| 161 | + return d; | ||
| 162 | + } | ||
| 163 | + }; | ||
| 164 | + //渲染一个实例 | ||
| 165 | + obj.prototype.render = function(){ | ||
| 166 | + var o=this,c=o.config,f=c.field; | ||
| 167 | + $E = $(c.elem); | ||
| 168 | + if($E.length==0){ | ||
| 169 | + console.error(MOD_NAME+' hint:找不到容器 ' +c.elem); | ||
| 170 | + return false; | ||
| 171 | + } | ||
| 172 | + if(Object.prototype.toString.call(c.data)!='[object Array]'){ | ||
| 173 | + var data = o.getData(c.data); | ||
| 174 | + if(data===false){ | ||
| 175 | + console.error(MOD_NAME+' hint:缺少分类数据'); | ||
| 176 | + return false; | ||
| 177 | + } | ||
| 178 | + o.config.data = data; | ||
| 179 | + } | ||
| 180 | + | ||
| 181 | + //给容器添加一个类名 | ||
| 182 | + $E.addClass('lay-ext-mulitsel'); | ||
| 183 | + if(/^\d+$/.test(c.width)){ | ||
| 184 | + $E.css('width',c.width+'px'); | ||
| 185 | + } | ||
| 186 | + //添加专属的style | ||
| 187 | + if($('#lay-ext-mulitsel-style').length==0){ | ||
| 188 | + var style = '.lay-ext-mulitsel .layui-form-select dl dd div{margin-top:0px!important;}.lay-ext-mulitsel .layui-form-select dl dd.layui-this{background-color:#fff}.lay-ext-mulitsel .layui-input.multiple{line-height:auto;height:auto;padding:4px 10px 4px 10px;overflow:hidden;min-height:38px;margin-top:-38px;left:0;z-index:99;position:relative;background:#fff;}.lay-ext-mulitsel .layui-input.multiple a{padding:2px 5px;background:#5FB878;border-radius:2px;color:#fff;display:block;line-height:20px;height:20px;margin:2px 5px 2px 0;float:left;}.lay-ext-mulitsel .layui-input.multiple a i{margin-left:4px;font-size:14px;} .lay-ext-mulitsel .layui-input.multiple a i:hover{background-color:#009E94;border-radius:2px;}.lay-ext-mulitsel .danger{border-color:#FF5722!important}.lay-ext-mulitsel .tips{pointer-events: none;position: absolute;left: 10px;top: 10px;color:#757575;}'; | ||
| 189 | + $('<style id="lay-ext-mulitsel-style"></style>').text(style).appendTo($('head')); | ||
| 190 | + }; | ||
| 191 | + | ||
| 192 | + //创建选项 | ||
| 193 | + o.createOption(); | ||
| 194 | + //设置选中值 | ||
| 195 | + o.set(); | ||
| 196 | + | ||
| 197 | + //展开/收起选项 | ||
| 198 | + $E.on('click','.layui-select-title,.multiple,.multiple.layui-edge',function(e){ | ||
| 199 | + //隐藏其他实例显示的弹层 | ||
| 200 | + $('.lay-ext-mulitsel').not(c.elem).removeClass('layui-form-selected'); | ||
| 201 | + if($(c.elem).is('.layui-form-selected')){ | ||
| 202 | + $(c.elem).removeClass('layui-form-selected'); | ||
| 203 | + | ||
| 204 | + $(document).off('click',mEvent); | ||
| 205 | + } | ||
| 206 | + else{ | ||
| 207 | + $(c.elem).addClass('layui-form-selected'); | ||
| 208 | + | ||
| 209 | + $(document).on('click',mEvent=function(e){ | ||
| 210 | + if(e.target.id!==c.elem && e.target.className!=='layui-input multiple'){ | ||
| 211 | + $(c.elem).removeClass('layui-form-selected'); | ||
| 212 | + $(document).off('click',mEvent); | ||
| 213 | + } | ||
| 214 | + }); | ||
| 215 | + } | ||
| 216 | + }); | ||
| 217 | + | ||
| 218 | + //点击选项 | ||
| 219 | + $E.on('click','dd',function(e){ | ||
| 220 | + var _dd = $(this); | ||
| 221 | + if(_dd.hasClass('layui-disabled')){ | ||
| 222 | + return false; | ||
| 223 | + } | ||
| 224 | + //点 请选择 | ||
| 225 | + if(_dd.is('.layui-select-tips')){ | ||
| 226 | + _dd.siblings().removeClass('layui-this'); | ||
| 227 | + $(c.elem).find('.layui-form-checkbox').removeClass('layui-form-checked'); | ||
| 228 | + } | ||
| 229 | + //取消选中 | ||
| 230 | + else if(_dd.is('.layui-this')){ | ||
| 231 | + _dd.removeClass('layui-this'); | ||
| 232 | + _dd.find('.layui-form-checkbox').removeClass('layui-form-checked'); | ||
| 233 | + e.stopPropagation(); | ||
| 234 | + } | ||
| 235 | + //选中 | ||
| 236 | + else{ | ||
| 237 | + if(o.selected.length >= c.max){ | ||
| 238 | + $(c.elem+' .multiple').addClass('danger'); | ||
| 239 | + layer.tips('最多只能选择 '+c.max+' 个', c.elem+' .multiple', { | ||
| 240 | + tips: 3, | ||
| 241 | + time: 1000, | ||
| 242 | + end:function(){ | ||
| 243 | + $(c.elem+' .multiple').removeClass('danger'); | ||
| 244 | + } | ||
| 245 | + }); | ||
| 246 | + return false; | ||
| 247 | + } | ||
| 248 | + else{ | ||
| 249 | + _dd.addClass('layui-this'); | ||
| 250 | + _dd.find('.layui-form-checkbox').addClass('layui-form-checked'); | ||
| 251 | + e.stopPropagation(); | ||
| 252 | + } | ||
| 253 | + } | ||
| 254 | + | ||
| 255 | + o.setSelected(); | ||
| 256 | + }); | ||
| 257 | + | ||
| 258 | + //删除选项 | ||
| 259 | + $E.on('click','a i',function(e){ | ||
| 260 | + var _this = $(this).prev('span'); | ||
| 261 | + var v = _this.attr('lay-value'); | ||
| 262 | + if(v){ | ||
| 263 | + var _dd = $(c.elem).find('dd[lay-value='+v+']'); | ||
| 264 | + _dd.removeClass('layui-this'); | ||
| 265 | + _dd.find('.layui-form-checkbox').removeClass('layui-form-checked'); | ||
| 266 | + } | ||
| 267 | + o.setSelected(); | ||
| 268 | + _this.parent().remove(); | ||
| 269 | + e.stopPropagation(); | ||
| 270 | + | ||
| 271 | + }); | ||
| 272 | + | ||
| 273 | + //验证失败样式 | ||
| 274 | + $E.find('input').focus(function(){ | ||
| 275 | + $(c.elem+' .multiple').addClass('danger'); | ||
| 276 | + setTimeout(function(){ | ||
| 277 | + $(c.elem+' .multiple').removeClass('danger'); | ||
| 278 | + },3000); | ||
| 279 | + }); | ||
| 280 | + } | ||
| 281 | + | ||
| 282 | + //输出模块 | ||
| 283 | + exports(MOD_NAME, function (config) { | ||
| 284 | + var _this = new obj(config); | ||
| 285 | + _this.render(); | ||
| 286 | + return _this; | ||
| 287 | + }); | ||
| 288 | +}); |
| 1 | +/* | ||
| 2 | +* @version: 1.2 | ||
| 3 | +* @Author: tomato | ||
| 4 | +* @Date: 2018-4-24 22:56:00 | ||
| 5 | +* @Last Modified by: tomato | ||
| 6 | +* @Last Modified time: 2018-5-26 18:08:43 | ||
| 7 | +*/ | ||
| 8 | +//无限级下拉框 | ||
| 9 | +layui.define(['jquery', 'form'], function(exports){ | ||
| 10 | + var MOD_NAME = 'selectN'; | ||
| 11 | + var $ = layui.jquery; | ||
| 12 | + var form = layui.form; | ||
| 13 | + var obj = function(config){ | ||
| 14 | + //当前选中数据值名数据 | ||
| 15 | + this.selected =[]; | ||
| 16 | + //当前选中的值 | ||
| 17 | + this.values = []; | ||
| 18 | + //当前选中的名 | ||
| 19 | + this.names = []; | ||
| 20 | + //当前选中最后一个值 | ||
| 21 | + this.lastValue = ''; | ||
| 22 | + //当前选中最后一个值 | ||
| 23 | + this.lastName = ''; | ||
| 24 | + //是否已选 | ||
| 25 | + this.isSelected = false; | ||
| 26 | + //初始化配置 | ||
| 27 | + this.config = { | ||
| 28 | + //选择器id或class | ||
| 29 | + elem: '', | ||
| 30 | + //无限级分类数据 | ||
| 31 | + data: [], | ||
| 32 | + //默认选中值 | ||
| 33 | + selected: [], | ||
| 34 | + //空值项提示,可设置为数组['请选择省','请选择市','请选择县'] | ||
| 35 | + tips: '请选择', | ||
| 36 | + //是否允许搜索,可设置为数组[true,true,true] | ||
| 37 | + search:false, | ||
| 38 | + //选择项宽度,可设置为数组['80','90','100'] | ||
| 39 | + width:null, | ||
| 40 | + //为真只取最后一个值 | ||
| 41 | + last: false, | ||
| 42 | + //值验证,与lay-verify一致 | ||
| 43 | + verify: '', | ||
| 44 | + //事件过滤器,lay-filter名 | ||
| 45 | + filter: '', | ||
| 46 | + //input的name 不设置与选择器相同(去#.) | ||
| 47 | + name: '', | ||
| 48 | + //数据分隔符 | ||
| 49 | + delimiter: ',', | ||
| 50 | + //数据的键名 status=0为禁用状态 | ||
| 51 | + field:{idName:'id',titleName:'name',statusName:'status',childName:'children'}, | ||
| 52 | + //多表单区分 form.render(type, filter); 为class="layui-form" 所在元素的 lay-filter="" 的值 | ||
| 53 | + formFilter: null | ||
| 54 | + } | ||
| 55 | + | ||
| 56 | + //实例化配置 | ||
| 57 | + this.config = $.extend(this.config,config); | ||
| 58 | + | ||
| 59 | + //“请选择”文字 | ||
| 60 | + this.setTips = function(){ | ||
| 61 | + var o = this,c = o.config; | ||
| 62 | + if(Object.prototype.toString.call(c.tips)!='[object Array]'){ | ||
| 63 | + return c.tips; | ||
| 64 | + } | ||
| 65 | + else{ | ||
| 66 | + var i=$(c.elem).find('select').length; | ||
| 67 | + return c.tips.hasOwnProperty(i) ? c.tips[i] : '请选择'; | ||
| 68 | + } | ||
| 69 | + } | ||
| 70 | + | ||
| 71 | + //设置是否允许搜索 | ||
| 72 | + this.setSearch = function(){ | ||
| 73 | + var o = this,c = o.config; | ||
| 74 | + if(Object.prototype.toString.call(c.search)!='[object Array]'){ | ||
| 75 | + return c.search===true ? 'lay-search ' : ' '; | ||
| 76 | + } | ||
| 77 | + else{ | ||
| 78 | + var i=$(c.elem).find('select').length; | ||
| 79 | + if(c.search.hasOwnProperty(i)){ | ||
| 80 | + return c.search[i]===true ? 'lay-search ' : ' '; | ||
| 81 | + } | ||
| 82 | + } | ||
| 83 | + return ' '; | ||
| 84 | + } | ||
| 85 | + | ||
| 86 | + //设置是否允许搜索 | ||
| 87 | + this.setWidth = function(){ | ||
| 88 | + var o = this,c = o.config; | ||
| 89 | + if(Object.prototype.toString.call(c.width)!='[object Array]'){ | ||
| 90 | + return /^\d+$/.test(c.width) ? 'style="width:'+c.width+'px;" ' : ' '; | ||
| 91 | + } | ||
| 92 | + else{ | ||
| 93 | + var i=$(c.elem).find('select').length; | ||
| 94 | + if(c.width.hasOwnProperty(i)){ | ||
| 95 | + return /^\d+$/.test(c.width[i]) ? 'style="width:'+c.width[i]+'px;" ' : ' '; | ||
| 96 | + } | ||
| 97 | + } | ||
| 98 | + } | ||
| 99 | + | ||
| 100 | + //创建一个Select | ||
| 101 | + this.createSelect = function(optionData){ | ||
| 102 | + var o = this,c = o.config,f=c.field; | ||
| 103 | + var html = ''; | ||
| 104 | + html+= '<div class="layui-input-inline" '+o.setWidth()+'>'; | ||
| 105 | + html+= ' <select '+o.setSearch()+'lay-filter="'+c.filter+'">'; | ||
| 106 | + html+= ' <option value="">'+o.setTips()+'</option>'; | ||
| 107 | + for(var i=0;i<optionData.length;i++){ | ||
| 108 | + var disabled = optionData[i][f.statusName]==0 ? 'disabled="" ' : ''; | ||
| 109 | + html+= ' <option '+disabled+'value="'+optionData[i][f.idName]+'">'+optionData[i][f.titleName]+'</option>'; | ||
| 110 | + } | ||
| 111 | + html+= ' </select>'; | ||
| 112 | + html+= '</div>'; | ||
| 113 | + return html; | ||
| 114 | + }; | ||
| 115 | + | ||
| 116 | + //获取当前option的数据 | ||
| 117 | + this.getOptionData=function(catData,optionIndex){ | ||
| 118 | + var f = this.config.field; | ||
| 119 | + var item = catData; | ||
| 120 | + for(var i=0;i<optionIndex.length;i++){ | ||
| 121 | + if('undefined' == typeof item[optionIndex[i]]){ | ||
| 122 | + item = null; | ||
| 123 | + break; | ||
| 124 | + } | ||
| 125 | + else if('undefined' == typeof item[optionIndex[i]][f.childName]){ | ||
| 126 | + item = null; | ||
| 127 | + break; | ||
| 128 | + } | ||
| 129 | + else{ | ||
| 130 | + item = item[optionIndex[i]][f.childName]; | ||
| 131 | + } | ||
| 132 | + } | ||
| 133 | + return item; | ||
| 134 | + }; | ||
| 135 | + | ||
| 136 | + //初始化 | ||
| 137 | + this.set = function(selected){ | ||
| 138 | + var o = this,c = o.config; | ||
| 139 | + $E = $(c.elem); | ||
| 140 | + //创建顶级select | ||
| 141 | + var verify = c.verify=='' ? '' : 'lay-verify="'+c.verify+'" '; | ||
| 142 | + var html = '<div style="height:0px;width:0px;overflow:hidden"><input '+verify+'name="'+c.name+'"></div>'; | ||
| 143 | + html += o.createSelect(c.data); | ||
| 144 | + $E.html(html); | ||
| 145 | + selected = typeof selected=='undefined' ? c.selected : selected; | ||
| 146 | + var index=[]; | ||
| 147 | + for(var i=0;i<selected.length;i++){ | ||
| 148 | + //设置最后一个select的选中值 | ||
| 149 | + $E.find('select:last').val(selected[i]); | ||
| 150 | + //获取该选中值的索引 | ||
| 151 | + var lastIndex = $E.find('select:last').get(0).selectedIndex-1; | ||
| 152 | + index.push(lastIndex); | ||
| 153 | + //取出下级的选项值 | ||
| 154 | + var childItem = o.getOptionData(c.data,index); | ||
| 155 | + //下级选项值存在则创建select | ||
| 156 | + if(childItem){ | ||
| 157 | + var html = o.createSelect(childItem); | ||
| 158 | + $E.append(html); | ||
| 159 | + } | ||
| 160 | + } | ||
| 161 | + form.render('select',c.formFilter); | ||
| 162 | + o.getSelected(); | ||
| 163 | + }; | ||
| 164 | + | ||
| 165 | + //下拉事件 | ||
| 166 | + this.change = function(elem){ | ||
| 167 | + var o = this,c = o.config; | ||
| 168 | + var $thisItem = elem.parent(); | ||
| 169 | + //移除后面的select | ||
| 170 | + $thisItem.nextAll('div.layui-input-inline').remove(); | ||
| 171 | + var index=[]; | ||
| 172 | + //获取所有select,取出选中项的值和索引 | ||
| 173 | + $thisItem.parent().find('select').each(function(){ | ||
| 174 | + index.push($(this).get(0).selectedIndex-1); | ||
| 175 | + }); | ||
| 176 | + | ||
| 177 | + var childItem = o.getOptionData(c.data,index); | ||
| 178 | + if(childItem){ | ||
| 179 | + var html = o.createSelect(childItem); | ||
| 180 | + $thisItem.after(html); | ||
| 181 | + form.render('select',c.formFilter); | ||
| 182 | + } | ||
| 183 | + o.getSelected(); | ||
| 184 | + }; | ||
| 185 | + | ||
| 186 | + //获取所有值-数组 每次选择后执行 | ||
| 187 | + this.getSelected=function(){ | ||
| 188 | + var o = this,c = o.config; | ||
| 189 | + var values =[]; | ||
| 190 | + var names =[]; | ||
| 191 | + var selected =[]; | ||
| 192 | + $E = $(c.elem); | ||
| 193 | + $E.find('select').each(function(){ | ||
| 194 | + var item = {}; | ||
| 195 | + var v = $(this).val() | ||
| 196 | + var n = $(this).find('option:selected').text(); | ||
| 197 | + item.value = v; | ||
| 198 | + item.name = n; | ||
| 199 | + values.push(v); | ||
| 200 | + names.push(n); | ||
| 201 | + selected.push(item); | ||
| 202 | + }); | ||
| 203 | + o.selected =selected; | ||
| 204 | + o.values = values; | ||
| 205 | + o.names = names; | ||
| 206 | + o.lastValue = $E.find('select:last').val(); | ||
| 207 | + o.lastName = $E.find('option:selected:last').text(); | ||
| 208 | + | ||
| 209 | + o.isSelected = o.lastValue=='' ? false : true; | ||
| 210 | + var inputVal = c.last===true ? o.lastValue : o.values.join(c.delimiter); | ||
| 211 | + $E.find('input[name='+c.name+']').val(inputVal); | ||
| 212 | + }; | ||
| 213 | + //ajax方式获取候选数据 | ||
| 214 | + this.getData = function(url){ | ||
| 215 | + var d; | ||
| 216 | + $.ajax({ | ||
| 217 | + url:url, | ||
| 218 | + dataType:'json', | ||
| 219 | + async:false, | ||
| 220 | + success:function(json){ | ||
| 221 | + d=json; | ||
| 222 | + }, | ||
| 223 | + error: function(){ | ||
| 224 | + console.error(MOD_NAME+' hint:候选数据ajax请求错误 '); | ||
| 225 | + d = false; | ||
| 226 | + } | ||
| 227 | + }); | ||
| 228 | + return d; | ||
| 229 | + } | ||
| 230 | + | ||
| 231 | + | ||
| 232 | + }; | ||
| 233 | + | ||
| 234 | + //渲染一个实例 | ||
| 235 | + obj.prototype.render = function(){ | ||
| 236 | + var o=this,c=o.config; | ||
| 237 | + $E = $(c.elem); | ||
| 238 | + if($E.length==0){ | ||
| 239 | + console.error(MOD_NAME+' hint:找不到容器 '+c.elem); | ||
| 240 | + return false; | ||
| 241 | + } | ||
| 242 | + if(Object.prototype.toString.call(c.data)!='[object Array]'){ | ||
| 243 | + var data = o.getData(c.data); | ||
| 244 | + if(data===false){ | ||
| 245 | + console.error(MOD_NAME+' hint:缺少分类数据'); | ||
| 246 | + return false; | ||
| 247 | + } | ||
| 248 | + o.config.data = data; | ||
| 249 | + } | ||
| 250 | + | ||
| 251 | + c.filter = c.filter=='' ? c.elem.replace('#','').replace('.','') : c.filter; | ||
| 252 | + c.name = c.name=='' ? c.elem.replace('#','').replace('.','') : c.name; | ||
| 253 | + o.config = c; | ||
| 254 | + | ||
| 255 | + //初始化 | ||
| 256 | + o.set(); | ||
| 257 | + | ||
| 258 | + //监听下拉事件 | ||
| 259 | + form.on('select('+c.filter+')',function(data){ | ||
| 260 | + o.change($(data.elem)); | ||
| 261 | + }); | ||
| 262 | + //验证失败样式 | ||
| 263 | + $E.find('input[name='+c.name+']').focus(function(){ | ||
| 264 | + var t = $(c.elem).offset().top; | ||
| 265 | + $('html,body').scrollTop(t-200); | ||
| 266 | + $(c.elem).find('select:last').addClass('layui-form-danger'); | ||
| 267 | + setTimeout(function(){ | ||
| 268 | + $(c.elem).find('select:last').removeClass('layui-form-danger'); | ||
| 269 | + },3000); | ||
| 270 | + }); | ||
| 271 | + } | ||
| 272 | + | ||
| 273 | + //输出模块 | ||
| 274 | + exports(MOD_NAME, function (config) { | ||
| 275 | + var _this = new obj(config); | ||
| 276 | + _this.render(); | ||
| 277 | + return _this; | ||
| 278 | + }); | ||
| 279 | +}); |
-
Please register or login to post a comment