/** * Created by zhangxin on 2018/1/13. */ (function ($) { 'use strict'; $.selectbar = function (element, options) { if(!(this instanceof $.selectbar)){ return new $.selectbar(element, option); } var self = this; self.$container = $(element); self.$container.data('selectbar', self); self.init=function () { self.options = $.extend({},$.selectbar.defaultOptions,options); self.elem = element; self.selectbarId = '#'+ self.elem.attr('id'); self.className = 'selectbar'; self.initSelectDatabaseDom(); self.initDatabase(); self.initSelectSelected(); self.addEvent(); }, self.initDatabase = function () { self.select_item(-1); }; self.select_item= function (first) { var _html = ''; self.options.database.department.forEach(function (item,index) { if(item.parentId == first){ var selectItemDom = self.selectItemDom(item,true); _html+=selectItemDom; } }); self.options.database.employees.forEach(function (item,index) { if(item.parentId == first){ var selectItemDom = self.selectItemDom(item,false); _html+=selectItemDom; } }); self.elem.parent().find('.tree-list .tree-content .list').empty().append(_html); }; self.initSelectSelected=function () { var _selectOption=""; /* * 初始化select * */ if(self.options.database.employees&&self.options.database.employees.length>0){ self.options.database.employees.forEach(function (item,index) { var selectOptionDom = self.selectOptionDom(item); _selectOption+=selectOptionDom; }); } self.elem.parent().find('select.form-control').empty().append(_selectOption); self.elem.parent().find('.selector-input-list-wrap .selected-list').empty(); self.options.values.forEach(function (item,index) { self.options.database.employees.forEach(function (it,ind) { if(item == it.id){ self.addSelected(item,it.name); } }); }); }; self.addEvent=function () { var selectbar = self.elem.parent(); selectbar.on("click",function (e) { selectbar.find('.vue-selector-input-wrap').show().css({top: selectbar.height()}); $(document).one("click", function(){ if($(this).parents(self.selectbarId).length<=0){ selectbar.find('.vue-selector-input-wrap').hide(); } }); e.stopPropagation() }); selectbar.on("click",'.select-item',function () { var $this = $(this), item_name = $this.find('.item-name').text(), checkbox = $this.find(".item-status input"), ids = checkbox.val(); if($this.find('.item-status').hasClass('departments')){ self.select_item(ids); self.add_breadcrumb(ids,item_name) }else{ var arr=selectbar.find('.selector-input-list-wrap .selected-list .selected-item'); var flag = true; arr.each(function (index,item) { if( $(this).find('.item-name').attr('_id')==ids){ self.removeSelected(ids); flag =false; return; } }); if(flag){ self.addSelected(ids,item_name); } } }); selectbar.on("click",".tree-list .tree-nav .old-node",function () { var ids = ''; if($(this).find(".nav-name").text().trim() == 'ALL'){ ids = -1; }else{ ids = $(this).find('.nav-name').attr('name'); } $(this).removeClass('old-node').nextAll().remove(); self.select_item(ids); }); selectbar.on('click','.selected-list>li .remove-item',function () { var ids = $(this).prev().attr('_id'); self.removeSelected(ids); }); selectbar.on('keyup','.selector-search .search-input',function () { var kwd = $(this).val(); if(kwd!=''&&kwd!=null&&kwd!=undefined){ var _html = ''; var newdepartment = self.options.database.department.filter(function (item) { return item.name.indexOf(kwd)>=0; }); newdepartment.forEach(function (item,index) { var selectItemDom = self.selectItemDom(item,true); _html+=selectItemDom; }); var newemployees = self.options.database.employees.filter(function (item) { return item.name.indexOf(kwd)>=0; }); newemployees.forEach(function (item,index) { var selectItemDom = self.selectItemDom(item,false); _html+=selectItemDom; }); if(_html==""){ _html += '

No data found!

' } $(this).next('.search-clear').show().one('click',function () { $(this).hide().prev('input').val(''); self.select_item(-1); }); self.elem.parent().find('.tree-list .tree-nav>li').eq(0).nextAll().remove(); self.elem.parent().find('.tree-list .tree-content .list').empty().append(_html); }else{ self.select_item(-1); } }); }; self.add_breadcrumb = function (ids,item_name) { var selectbar = self.elem.parent(), _breadcrumb = ''; _breadcrumb += ''; selectbar.find('.tree-list .tree-nav .nav-node').addClass("old-node"); selectbar.find('.tree-list .tree-nav').append(_breadcrumb); }; self.addSelected=function (ids,item_name) { var ids = ids, selectbar = self.elem.parent(), selected_item = ""; selected_item += '
  • '; selected_item += ''+item_name+''; selected_item += ''; selected_item += '
  • '; var select_num_ele = selectbar.find('.selected-num .selected--num'), select_num = parseInt(select_num_ele.text()); var flag = false; flag = self.options.values.some(function (item) { return item === ids; }); if(self.options.multiple){ selectbar.find('.selector-input-list-wrap .selected-list').append(selected_item); self.elem.find('option[value='+ids+']').attr('selected','selected'); select_num++; if(!flag){ self.options.values.push(ids); } }else{ selectbar.find('.selector-input-list-wrap .selected-list').empty().append(selected_item); self.elem.find('option').removeAttr('selected'); self.elem.find('option[value='+ids+']').attr('selected','selected'); select_num = 1; self.options.values = []; self.options.values.push(ids); } selectbar.find('.item-status input[value='+ids+']').prop('checked',true); selectbar.find(".selector-input-list-wrap").find('.search-clear').show().one('click',function () { $(this).hide(); selectbar.find('.selector-input-list-wrap .selected-list .selected-item').each(function (inde,ite) { var id = $(this).find('.item-name').attr('_id'); self.removeSelected(id); }); }); select_num_ele.text(select_num); }; self.removeSelected=function (id) { var selectbar=self.elem.parent(); selectbar.find('.item-status input[value='+id+']').prop('checked',false); selectbar.find('.selector-input-list-wrap .selected-list .selected-item .item-name[_id='+id+']').parents("li").remove(); self.elem.find('option[value='+id+']').removeAttr('selected'); self.options.values = self.options.values.filter(function (item) { return item !=id; }); var select_num_ele = selectbar.find('.selected-num .selected--num'), select_num = parseInt(select_num_ele.text()); select_num--; select_num_ele.text(select_num); }; self.selectOptionDom=function (database) { var _database = database, selectOption = '', flag = self.options.values.some(function (item) { return item == _database.id; }); if(flag){ selectOption = ''; }else{ selectOption = ''; } return selectOption; }; self.selectItemDom=function (item,isDepartment) { var gt = '', checkbox= '', flag = self.options.values.some(function (items) { return items == item.id; }); if(isDepartment){ checkbox = '
    '; gt = '
    '; }else{ gt = ''; if(!self.options.multiple){ if(flag){ checkbox = '
    '; }else{ checkbox = '
    '; } }else{ if(flag) { checkbox = '
    '; }else{ checkbox = '
    '; } } } var _html = '
  • '+checkbox+'
    '+item.name+''+gt+'
  • '; return _html; }; /** * 创建clear 按钮 * @returns {Element} */ self.searchClear=function () { var $clear = document.createElement('span'); $clear.className = 'search-clear'; $clear.innerHTML = ''; return $clear; }; self.initSelectDatabaseDom=function () { var wrapDom = document.createElement('div'); var now = new Date().getTime(); self.elem.hide().wrap(wrapDom).parent().addClass(self.className+" "+ now); if(self.options.multiple) self.elem.attr('multiple','multiple'); var $selectBar_div = self.elem.parent(), $selector_input_list_wrap = $(document.createElement('div')), $btn_trigger = $(document.createElement('div')), $selectedVal = $(document.createElement('ul')), $triggerHtml = ''+self.options.title+''; $btn_trigger.addClass('btn-trigger').append($triggerHtml); $selectedVal.addClass('selected-list'); $selector_input_list_wrap.addClass('selector-input-list-wrap').addClass(self.elem.attr('class')).append([$selectedVal,$btn_trigger,self.searchClear()]); $selectBar_div.append([$selector_input_list_wrap,self.initSelectPanelWrapDom()]); $selectBar_div.find('.selector-search').append(self.searchClear()); }; self.initSelectPanelWrapDom= function () { var $vue_selector_input_wrap = document.createElement('div'); $vue_selector_input_wrap.className = 'vue-selector-input-wrap'; $vue_selector_input_wrap.appendChild(self.initSelectPanelDom()); $vue_selector_input_wrap.appendChild(self.initSelectedCountDom()); return $vue_selector_input_wrap; }; self.initSelectPanelDom= function () { var $selector_panel = document.createElement('div'); $selector_panel.className = 'selector-panel'; var search_input = '', switch_list_wrapper = '
      '; $selector_panel.innerHTML = search_input+switch_list_wrapper; return $selector_panel; }; /** * @param num * @returns {Element} */ self.initSelectedCountDom = function (num) { var $selectedCount = document.createElement('div'); $selectedCount.className = 'selected-num'; $selectedCount.innerHTML = 'Selected'+(num ? num : 0)+''; return $selectedCount; }; self.getSelectVal=function(){ var result = []; $(self.elem).find('option[selected=selected]').each(function (index,item) { result.push($(this).val()); }); return result; }; self.getSelectName=function(){ var result = []; $(self.elem).find('option[selected=selected]').each(function (index,item) { result.push($(this).text()); }); return result; }; self.setSelectVal=function(opts){ var selectValues = []; if(!(opts instanceof Array)){ selectValues.push(opts); }else{ selectValues=opts; } self.options.values=selectValues; self.elem.parent().find('.selected-num .selected--num').text(0); self.initSelectSelected(); return self; }; self.callMethod = function (method, options) { switch (method) { case 'getSelectVal': return self.getSelectVal(); case 'getSelectName': return self.getSelectName(); case 'setSelectVal': return self.setSelectVal(options); case 'destroy': self.$container.empty(); self.$container.removeData('selectbar'); break; default : throw new Error('[selectbar] method "' + method + '" does not exist'); } return self.$container; }; self.init(); return self; }; $.selectbar.defaultOptions = { title: '请选择……', database: { department:[], employees:[] }, values: [] }; $.fn.selectbar = function () { var self = this, args = Array.prototype.slice.call(arguments); if(typeof args === undefined || args.length == 0){ var $instance = $(self).data('selectbar'); if (!$instance) { throw new Error('[selectbar] the element is not instantiated'); } else { return $instance; } } if (typeof args[0] === 'string') { var $instance = $(self).data('selectbar'); if (!$instance) { throw new Error('[selectbar] the element is not instantiated'); } else { return $instance.callMethod(args[0], args[1]); } } else { return new $.selectbar(this, args[0]); } }; })(jQuery);