GZMachinesWeb/WebContent/static/plugins/vendor/jquery.selectbar.js

392 lines
18 KiB
JavaScript
Raw Normal View History

2024-10-21 15:02:16 +08:00
/**
* 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 += '<p>No data found</p>'
}
$(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 += '<li class="nav-node"><div class="nav-name" name="'+ids+'"> '+item_name+' </div>';
_breadcrumb += '<div class="nav-right nav-last">';
_breadcrumb += '<svg version="1.1" role="presentation" width="8" height="16" viewBox="0 0 8 16" class="octicon">';
_breadcrumb += '<path d="M7.5 8l-5 5L1 11.5 4.75 8 1 4.5 2.5 3z"></path>';
_breadcrumb += '</svg>';
_breadcrumb += '</div></li>';
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 += '<li><div class="selected-item">';
selected_item += '<span class="item-name" _id="'+ids+'">'+item_name+'</span>';
selected_item += '<span class="iconfont icon-cha remove-item"></span>';
selected_item += '</div></li>';
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 = '<option value="'+_database.id+'" selected="selected">'+_database.name+'</option>';
}else{
selectOption = '<option value="'+_database.id+'">'+_database.name+'</option>';
}
return selectOption;
};
self.selectItemDom=function (item,isDepartment) {
var gt = '',
checkbox= '',
flag = self.options.values.some(function (items) {
return items == item.id;
});
if(isDepartment){
checkbox = '<div class="item-status departments"><div class="status-box"><input class="status" type="checkbox" value="'+item.id+'"></div></div>';
gt = '<div class="item-group"><svg xmlns="http://www.w3.org/2000/svg" width="6" height="10" viewBox="0 0 6 10"><path fill="none" fill-rule="evenodd" stroke="#C3CBD9" stroke-linecap="round" stroke-linejoin="round" d="M1.322 9.16l4-4.16-4-4.16"></path></svg></div>';
}else{
gt = '';
if(!self.options.multiple){
if(flag){
checkbox = '<div class="item-status"><div class="status-box"><input class="status" name="'+self.selectbarId+'" checked="checked" type="radio" value="'+item.id+'"></div></div>';
}else{
checkbox = '<div class="item-status"><div class="status-box"><input class="status" name="'+self.selectbarId+'" type="radio" value="'+item.id+'"></div></div>';
}
}else{
if(flag) {
checkbox = '<div class="item-status"><div class="status-box"><input class="status" name="' + self.selectbarId + '" checked="checked" type="checkbox" value="' + item.id + '"></div></div>';
}else{
checkbox = '<div class="item-status"><div class="status-box"><input class="status" name="' + self.selectbarId + '" type="checkbox" value="' + item.id + '"></div></div>';
}
}
}
var _html = '<li class="select-item">'+checkbox+'<div class="item-ell"><span title="'+item.id+'" class="item-name">'+item.name+'</span>'+gt+'</div></li>';
return _html;
};
/**
* 创建clear 按钮
* @returns {Element}
*/
self.searchClear=function () {
var $clear = document.createElement('span');
$clear.className = 'search-clear';
$clear.innerHTML = '<i class="iconfont icon-cha"></i>';
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 = '<i class="iconfont icon-plus"></i><span class="trigger-text">'+self.options.title+'</span>';
$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 = '<div class="selector-search"><span class="search-icon"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><g fill="none" fill-rule="evenodd"><path data-v-501925db="" d="M0 0h16v16H0z"></path> <g transform="translate(1 1)"><circle cx="6" cy="6" r="5" stroke="#C3CBD9" stroke-width="2"></circle> <path fill="#C3CBD9" d="M9 10.414L10.414 9l2.952 2.952a.996.996 0 0 1-.002 1.412.995.995 0 0 1-1.412.002L9 10.414z"></path></g></g></svg></span><input placeholder="Search" class="search-input" /></div>',
switch_list_wrapper = '<div class="switch-list-wrapper"><div class="switch-content"><div class="tree-list"><div class="tree-nav-wrap"><ul class="tree-nav"><li class="nav-node"><div class="nav-name"> ALL </div><div class="nav-right"><svg version="1.1" role="presentation" width="8" height="16" viewBox="0 0 8 16" class="octicon"><path d="M7.5 8l-5 5L1 11.5 4.75 8 1 4.5 2.5 3z"></path></svg></div></li></ul></div><div class="tree-content"><div class="scroll-list"><ul class="list"></ul></div></div></div></div></div>';
$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 = '<span class="selected--text">Selected</span><span class="selected--num">'+(num ? num : 0)+'</span>';
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);