/** * 仿element-ui,级联选择器 * 已实现单选、多选、无关联选择 * 其他功能:组件禁用、节点禁用、自定义属性、自定义空面板提示,自定义无选择时的提示、多选标签折叠、回显、搜索、动态加载、最大选中数量限制、禁用项固定等操作。 * element-ui没有的功能:最大选中数量限制、禁用项固定 * author: yixiaco * gitee: https://gitee.com/yixiacoco/lay_cascader * github: https://github.com/yixiaco/lay_cascader */ layui.define(["jquery"],function(r){function n(a){a=a||window.event;a.stopPropagation?a.stopPropagation():a.cancelBubble=!0}function p(a,b,c,d){this.data=a;this.cascader=b;this.config=b.config;this.props=b.props;this.level=c;this.parentNode=d;this.icons=b.icons;this._checked=0;this._loading=!1;this.nodeId=b.data.nodeId++}function q(a){this.config=k.extend(!0,{elem:"",value:null,options:[],empty:"\u6682\u65e0\u6570\u636e",placeholder:"\u8bf7\u9009\u62e9",disabled:!1,clearable:!1,showAllLevels:!0,collapseTags:!1,minCollapseTagsNumber:1,separator:" / ",filterable:!1,filterMethod:function(a,c){return a.path.some(function(a){return-1!==a.label.indexOf(c)})},debounce:300,beforeFilter:function(a){return!0},popperClass:"",extendClass:!1,extendStyle:!1,disabledFixed:!1,maxSize:0,props:{strictMode:!1,expandTrigger:"click",multiple:!1,checkStrictly:!1,lazy:!1,lazyLoad:function(a,c){},value:"value",label:"label",children:"children",disabled:"disabled",leaf:"leaf"}},a);this.data={nodeId:1,nodes:[],menuData:[],activeNodeId:null,activeNode:null,checkedNodeIds:[],checkedNodes:[]};this.showPanel=!1;this.event={change:[],open:[],close:[]};this.filtering=!1;this._init();this.closeEventId=0;this._maxSizeMode=null}var k=layui.jquery;p.prototype={constructor:p,get topParentNode(){return!this.parentNode&&this||this.topParentNode},childrenNode:void 0,get loading(){return this._loading},set loading(a){var b=this.$li;if(b){var c=this.icons.right,d=this.icons.loading,b=b.find("i");a?(b.addClass(d),b.removeClass(c)):(b.addClass(c),b.removeClass(d))}return this._loading=a},get label(){return this.data[this.props.label]},get value(){return this.data[this.props.value]},get disabled(){var a=this.config.maxSize,b=this.cascader.data.checkedNodeIds,c=this.props.disabled,d=this.props.checkStrictly;return this.props.multiple&&0!==a&&b.length>=a&&-1===b.indexOf(this.nodeId)&&(d||!this.getAllLeafChildren().map(function(a){return a.nodeId}).some(function(a){return-1!==b.indexOf(a)}))?!0:d?this.data[c]:this.path.some(function(a){return a.data[c]})},get children(){return this.data[this.props.children]},set children(a){this.data[this.props.children]=a},get leaf(){var a=this.data[this.props.leaf];return"boolean"===typeof a?a:this.children?0>=this.children.length:!0},get activeNodeId(){return this.cascader.data.activeNodeId},get checkedNodeIds(){return this.cascader.data.checkedNodeIds},get path(){var a=this.parentNode;return a?a.path.concat([this]):[this]},get isFiltering(){return this.cascader.isFiltering},get $tag(){var a=this.cascader,b=this.config.disabled,c=this.disabled,d=this.config.disabledFixed,e=this.getPathLabel(this.config.showAllLevels),b=a.get$tag(e,!b&&(!c||!d)),f=this;b.find("i").click(function(b){n(b);f.selectedValue();a.removeTag(f.value,f)});return b},getPathLabel:function(a){var b=this.path,c=this.config.separator;return a?b.map(function(a){return a.label}).join(c):b[b.length-1].label},init:function(){var a=this.props.multiple,b=this.props.checkStrictly,c=this.icons.from,d=this.icons.right,e="",f=this.label;this.leaf||(e=d);this.$li=k('\x3cli role\x3d"menuitem" id\x3d"cascader-menu" tabindex\x3d"-1" class\x3d"el-cascader-node" aria-haspopup\x3d"true" aria-owns\x3d"cascader-menu"\x3e\x3cspan class\x3d"el-cascader-node__label"\x3e'+f+'\x3c/span\x3e\x3ci class\x3d"'+c+" "+e+'"\x3e\x3c/i\x3e\x3c/li\x3e');a||b?!a&&b?this._renderRadioCheckStrictly():a&&!b?this._renderMultiple():a&&b&&this._renderMultipleCheckStrictly():this._renderRadio()},initSuggestionLi:function(){var a=this.getPathLabel(!0);this.$suggestionLi=k('\x3cli tabindex\x3d"-1" class\x3d"el-cascader__suggestion-item"\x3e\x3cspan\x3e'+a+"\x3c/span\x3e\x3c/li\x3e");this._renderFiltering()},bind:function(a){this.init();a.append(this.$li)},bindSuggestion:function(a){this.initSuggestionLi();a.append(this.$suggestionLi)},_renderFiltering:function(){var a=this.$suggestionLi,b=this.nodeId,c=this,d=this.cascader,e=this.props.multiple,f='\x3ci class\x3d"'+this.icons.from+" "+this.icons.ok+' el-icon-check"\x3e\x3c/i\x3e';a.click(function(g){n(g);c.selectedValue();e?-1===c.checkedNodeIds.indexOf(b)?(a.removeClass("is-checked"),a.find(".el-icon-check").remove()):(a.addClass("is-checked"),a.append(f)):d.close()});if(e&&-1!==c.checkedNodeIds.indexOf(b)||!e&&c.activeNodeId===b)a.addClass("is-checked"),a.append(f)},_renderRadio:function(){var a=this.$li,b=this.nodeId,c=this.icons.from,d=this.icons.ok,e=this.level,f=this.leaf,g=this,h=this.cascader,l=this.cascader.data.activeNode,m=this.parentNode;g.activeNodeId&&l.path.some(function(a){return a.nodeId===b})&&(g.activeNodeId===b&&a.prepend('\x3ci class\x3d"'+c+" "+d+' el-cascader-node__prefix"\x3e\x3c/i\x3e'),a.addClass("is-active"),a.addClass("in-checked-path"));this.disabled?a.addClass("is-disabled"):(a.addClass("is-selectable"),m&&(m.$li.siblings().removeClass("in-active-path"),m.$li.addClass("in-active-path")),this._liClick(function(a){n(a);var b=g.childrenNode;f&&"click"===a.type&&(g.selectedValue(),h.close());h._appendMenu(b,e+1,g)}))},_renderRadioCheckStrictly:function(){var a=this.$li,b=this.nodeId,c=this.level,d=this.leaf,e=this,f=this.cascader,g=f.data.activeNode,h=this.parentNode;a.addClass("is-selectable");var l=k('\x3clabel role\x3d"radio" tabindex\x3d"0" class\x3d"el-radio"\x3e\x3cspan class\x3d"el-radio__input"\x3e\x3cspan class\x3d"el-radio__inner"\x3e\x3c/span\x3e\x3cinput type\x3d"radio" aria-hidden\x3d"true" tabindex\x3d"-1" class\x3d"el-radio__original" value\x3d"'+b+'"\x3e\x3c/span\x3e\x3cspan class\x3d"el-radio__label"\x3e\x3cspan\x3e\x3c/span\x3e\x3c/span\x3e\x3c/label\x3e');this.$radio=l;a.prepend(l);h&&(h.$li.siblings().removeClass("in-active-path"),h.$li.addClass("in-active-path"));this._liClick(function(a){n(a);var b=e.childrenNode;!e.disabled&&d&&"click"===a.type&&e.selectedValue();f._appendMenu(b,c+1,e)});e.activeNodeId&&g.path.some(function(a){return a.nodeId===b})&&(e.activeNodeId===b&&l.find(".el-radio__input").addClass("is-checked"),a.addClass("is-active"),a.addClass("in-checked-path"));this.disabled?(l.addClass("is-disabled"),l.find(".el-radio__input").addClass("is-disabled")):l.click(function(a){a.preventDefault();!d&&e.selectedValue()})},_renderMultiple:function(){var a=this.$li,b=this.level,c=this.leaf,d=this,e=this.cascader,f=this._checked,g=this.parentNode;a.addClass("el-cascader-node");var h=k('\x3clabel class\x3d"el-checkbox"\x3e\x3cspan class\x3d"el-checkbox__input"\x3e\x3cspan class\x3d"el-checkbox__inner"\x3e\x3c/span\x3e\x3cinput type\x3d"checkbox" aria-hidden\x3d"false" class\x3d"el-checkbox__original" value\x3d""\x3e\x3c/span\x3e\x3c/label\x3e');this.$checked=h;a.prepend(h);1===f?this.$checked.find(".el-checkbox__input").addClass("is-checked"):2===f&&this.$checked.find(".el-checkbox__input").addClass("is-indeterminate");g&&(g.$li.siblings().removeClass("in-active-path"),g.$li.addClass("in-active-path"));this._liClick(function(a){n(a);var f=d.childrenNode;!d.disabled&&c&&"click"===a.type&&d.selectedValue();e._appendMenu(f,b+1,d)});this.disabled?(a.addClass("is-disabled"),h.addClass("is-disabled"),h.find(".el-checkbox__input").addClass("is-disabled")):h.click(function(a){a.preventDefault();c||(a=d.childrenNode,d.selectedValue(),e._appendMenu(a,b+1,d))})},_renderMultipleCheckStrictly:function(){var a=this.$li,b=this.level,c=this.leaf,d=this,e=this.cascader,f=e.data.checkedNodeIds,g=e.data.checkedNodes,h=this.nodeId,l=this.parentNode;a.addClass("el-cascader-node is-selectable");var m=k('\x3clabel class\x3d"el-checkbox"\x3e\x3cspan class\x3d"el-checkbox__input"\x3e\x3cspan class\x3d"el-checkbox__inner"\x3e\x3c/span\x3e\x3cinput type\x3d"checkbox" aria-hidden\x3d"false" class\x3d"el-checkbox__original" value\x3d""\x3e\x3c/span\x3e\x3c/label\x3e');this.$checked=m;a.prepend(m);g.some(function(a){return a.path.some(function(a){return a.nodeId===h})})&&(a.addClass("in-checked-path"),-1!==f.indexOf(h)&&this.$checked.find(".el-checkbox__input").addClass("is-checked"));l&&(l.$li.siblings().removeClass("in-active-path"),l.$li.addClass("in-active-path"));this._liClick(function(a){n(a);var f=d.childrenNode;!d.disabled&&c&&"click"===a.type&&d.selectedValue();e._appendMenu(f,b+1,d)});this.disabled?(m.addClass("is-disabled"),m.find(".el-checkbox__input").addClass("is-disabled")):m.click(function(a){a.preventDefault();c||(d.selectedValue(),e._appendMenu(d.childrenNode,b+1,d))})},transferParent:function(a,b,c){c||(c=this);(this===c&&!b||!1!==(a&&a(this)))&&this.parentNode&&this.parentNode.transferParent(a,b,c)},transferChildren:function(a,b,c){c||(c=this);if(this===c&&!b||!1!==(a&&a(this))){var d=this.getChildren();if(d&&0a)throw Error("maxSize\u5e94\u662f\u4e00\u4e2a\u5927\u4e8e\u7b49\u4e8e0\u7684\u6709\u6548\u7684number\u503c");if(!Array.isArray(this.config.options))throw Error("options\u4e0d\u662f\u4e00\u4e2a\u6709\u6548\u7684\u6570\u7ec4");},_initRoot:function(){var a=this.props.lazy,b=this.props.lazyLoad,c=this,d=this.data.nodes;0f+20?(c.attr("x-placement","top-start"),c.css({top:b.top-20-f+"px",left:b.left+e+"px"})):(c.attr("x-placement","bottom-start"),c.css({top:b.top+h-Math.max(f-(d-a.y-h-15),0)+"px",left:b.left+e+"px"}));k.css("left",35-e+"px")}},get $menus(){return this.$panel&&this.$panel.find(".el-cascader-panel .el-cascader-menu")},_initInput:function(){var a=k(this.config.elem),b=this;null===this.config.value&&a.attr("value")&&(this.config.value=a.attr("value"));var c=this.config.placeholder,d=this.icons.from,e=this.icons.down,f=this.props.multiple,g=this.config.extendClass,h=this.config.extendStyle;this.$div=k('\x3cdiv class\x3d"el-cascader"\x3e\x3c/div\x3e');h&&(h=a.attr("style"))&&this.$div.attr("style",h);g&&(g=a.attr("class"))&&g.split(" ").forEach(function(a){b.$div.addClass(a)});this.$input=k('\x3cdiv class\x3d"el-input el-input--suffix"\x3e\x3cinput type\x3d"text" readonly\x3d"readonly" autocomplete\x3d"off" placeholder\x3d"'+c+'" class\x3d"el-input__inner"\x3e\x3cspan class\x3d"el-input__suffix"\x3e\x3cspan class\x3d"el-input__suffix-inner"\x3e\x3ci class\x3d"el-icon-arrow-down '+d+" "+e+'" style\x3d"font-size: 12px"\x3e\x3c/i\x3e\x3c/span\x3e\x3c/span\x3e\x3c/div\x3e');this.$div.append(this.$input);this.$inputRow=this.$input.find(".el-input__inner");f&&(this.$tags=k('\x3cdiv class\x3d"el-cascader__tags"\x3e\x3c!----\x3e\x3c/div\x3e'),this.$div.append(this.$tags));this._initHideElement(a).after(this.$div);this.$icon=this.$input.find("i");this._initFilterableInputEvent();this.disabled(this.config.disabled)},_initHideElement:function(a){if("input"===a.prop("tagName").toLowerCase())return a.hide(),a.attr("type","hidden"),this.$ec=a;var b=a[0].attributes,c=k("\x3cinput /\x3e"),d=Object.keys(b),e;for(e in d)d=b[e],c.attr(d.name,d.value);c.hide();c.attr("type","hidden");this.$ec=c;a.before(c);a.remove();return c},_initFilterableInputEvent:function(){function a(a){var d=this;b&&clearTimeout(b);b=setTimeout(function(){b=null;var a=k(d).val();if(a){if(h.open(),"function"===typeof e&&e(a)){h.isFiltering=!0;var c=h.getNodes().filter(function(b){var c;c=g?b.disabled:b.path.some(function(a){return a.disabled});return(b.leaf||g)&&!c&&"function"===typeof f&&f(b,a)?!0:!1});h._setSuggestionMenu(c)}}else h.isFiltering=!1},c)}if(this.config.filterable){var b,c=this.config.debounce,d=this.config.placeholder,e=this.config.beforeFilter,f=this.config.filterMethod,g=this.props.checkStrictly,h=this;this.props.multiple?(d=this.$tagsInput=k('\x3cinput type\x3d"text" autocomplete\x3d"off" placeholder\x3d"'+d+'" class\x3d"el-cascader__search-input"\x3e'),this.$tags.append(d),d.on("keydown",a),d.click(function(a){h.isFiltering&&n(a)})):(d=this.$inputRow,d.removeAttr("readonly"),d.on("keydown",a),d.click(function(a){h.isFiltering&&n(a)}))}},_initPanel:function(){var a=this.$panel,b=this.config.popperClass||"";a||(a=this.$panel=k('\x3cdiv class\x3d"el-popper el-cascader__dropdown '+b+'" style\x3d"position: absolute; z-index: 109891015;display: none;" x-placement\x3d"bottom-start"\x3e\x3cdiv class\x3d"el-cascader-panel"\x3e\x3c/div\x3e\x3cdiv class\x3d"popper__arrow" style\x3d"left: 35px;"\x3e\x3c/div\x3e\x3c/div\x3e'),a.appendTo("body"),a.click(function(a){n(a)}),this._initSuggestionPanel())},_appendMenu:function(a,b,c,d){this._removeMenu(b);if(!c||!c.leaf){var e=this.data.menuData,f=k('\x3cdiv class\x3d"el-scrollbar el-cascader-menu" role\x3d"menu" id\x3d"cascader-menu"\x3e\x3cdiv class\x3d"el-cascader-menu__wrap el-scrollbar__wrap" style\x3d"margin-bottom: -17px; margin-right: -17px;"\x3e\x3cul class\x3d"el-scrollbar__view el-cascader-menu__list"\x3e\x3c/ul\x3e\x3c/div\x3e\x3c/div\x3e');this.$panel.find(".el-cascader-panel").append(f);this._appendLi(f,a);a={nodes:a,level:b,parentNode:c,scrollbar:{top:0,left:0}};d&&(a.scrollbar=d.scrollbar);this._initScrollbar(f,a);this._resetXY();e.push(a)}},_removeMenu:function(a){var b=a-1;-1!==b?this.$panel.find(".el-cascader-panel .el-cascader-menu:gt("+b+")").remove():this.$panel.find(".el-cascader-panel .el-cascader-menu").remove();b=this.data.menuData;b.length>a&&b.splice(a,b.length-a)},_appendLi:function(a,b){var c=a.find(".el-cascader-menu__list");b&&0!==b.length?k.each(b,function(a,b){b.bind(c)}):c.append('\x3cdiv class\x3d"el-cascader-menu__empty-text"\x3e'+this.config.empty+"\x3c/div\x3e")},refreshMenu:function(){var a=this;this.data.menuData.concat([]).forEach(function(b){a._appendMenu(b.nodes,b.level,b.parentNode,b)})},_initSuggestionPanel:function(){if(this.config.filterable){var a=this.$suggestionPanel;a||(a=this.$suggestionPanel=k('\x3cdiv class\x3d"el-cascader__suggestion-panel el-scrollbar" style\x3d"display: none;"\x3e\x3cdiv class\x3d"el-scrollbar__wrap" style\x3d"margin-bottom: -17px; margin-right: -17px;"\x3e\x3cul class\x3d"el-scrollbar__view el-cascader__suggestion-list" style\x3d"min-width: 222px;"\x3e\x3c/ul\x3e\x3c/div\x3e\x3c/div\x3e'),this.$panel.find(".popper__arrow").before(a),a.click(function(a){n(a)}))}},_setSuggestionMenu:function(a){var b=this.$suggestionPanel,c=b.find(".el-cascader__suggestion-list");c.empty();b.find(".el-scrollbar__bar").remove();a&&0!==a.length?(k.each(a,function(a,b){b.bindSuggestion(c)}),this._initScrollbar(b,{scrollbar:{top:0,left:0}}),this._resetXY()):c.append('\x3cli class\x3d"el-cascader__empty-text"\x3e\u65e0\u5339\u914d\u6570\u636e\x3c/li\x3e')},initNodes:function(a,b,c){var d=[],e;for(e in a){var f=new p(a[e],this,b,c);d.push(f);f.children&&0=d?(a=a.slice(0,d),b=b.slice(0,d),d=!0):d=!1;this.data.checkedNodeIds=a||[];this.data.checkedNodes=b||[];var e=[],f=[];c.forEach(function(a){a.path.forEach(function(a){-1===f.indexOf(a.nodeId)&&(e.push(a),f.push(a.nodeId))})});b.forEach(function(a){a.path.forEach(function(a){-1===f.indexOf(a.nodeId)&&(e.push(a),f.push(a.nodeId))})});e.forEach(function(a){a.syncStyle()});this.change(b.map(function(a){return a.value}),b);this._setClear();this.maxSizeMode=d},setValue:function(a){(this.data.activeNodeId||0l&&(e.css("height",100*l+"%"),e.css("transform","translateY("+b/a.height()*100+"%)"));1>m&&(f.css("width",100*m+"%"),f.css("transform","translateY("+c/a.width()*100+"%)"))}var d=k('\x3cdiv class\x3d"el-scrollbar__bar is-onhoriztal"\x3e\x3cdiv class\x3d"el-scrollbar__thumb" style\x3d"transform: translateX(0%);"\x3e\x3c/div\x3e\x3c/div\x3e\x3cdiv class\x3d"el-scrollbar__bar is-vertical"\x3e\x3cdiv class\x3d"el-scrollbar__thumb" style\x3d"transform: translateY(0%);"\x3e\x3c/div\x3e\x3c/div\x3e');a.append(d);var e=k(d[1]).find(".el-scrollbar__thumb"),f=k(d[0]).find(".el-scrollbar__thumb"),g=a.find(".el-scrollbar__wrap"),d=this.$panel,h=a.find("li"),l=(Math.max(d.height(),a.height())-6)/(h.height()*h.length),m=d.width()/h.width();e.mousedown(function(a){a.stopImmediatePropagation();n(a);var b=function(){return!1};k(document).bind("selectstart",b);var c=a.clientY,d=g.scrollTop(),e=function(a){a.stopImmediatePropagation();g.scrollTop(d+(a.clientY-c)/l)};k(document).bind("mousemove",e);k(document).one("mouseup",function(a){n(a);a.stopImmediatePropagation();k(document).off("mousemove",e);k(document).off("selectstart",b)})});g.scroll(function(){var a=k(this);b.scrollbar.top=a.scrollTop();b.scrollbar.left=a.scrollLeft();c(b.scrollbar.top,b.scrollbar.left)});g.scrollTop(b.scrollbar.top);c(b.scrollbar.top,b.scrollbar.left)},_fillingPath:function(){var a=this.config.showAllLevels,b=this.config.separator,c=this.config.collapseTags,d=this.$inputRow,e=this.config.placeholder,f=this;if(this.props.multiple){this.$tags.find(".el-tag").remove();var g=this.$tagsInput;d.css("height","");a=this.data.checkedNodes;b=Math.max(this.config.minCollapseTagsNumber,1);if(0b&&h.push(f.get$tag("+ "+(a.length-b),!1));h.forEach(function(a){g?g.before(a):f.$tags.append(a)})}c=f.$tags.height();b=d.height();c>b&&d.css("height",c+4+"px");this._resetXY();0