From 974935bd5abd7ebfa04719d881340b412c998e51 Mon Sep 17 00:00:00 2001 From: lamlib Date: Sat, 6 Jun 2026 20:08:18 +0700 Subject: [PATCH] fix index path unique values --- dist/index.d.ts | 5 +- dist/index.js | 2 +- index.d.ts | 5 +- index.js | 2 +- src/index.ts | 182 +++++++++++++++++++++++++----------------------- 5 files changed, 104 insertions(+), 92 deletions(-) diff --git a/dist/index.d.ts b/dist/index.d.ts index 854e382..41a6e2b 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -25,6 +25,7 @@ export default class Cascader { private query; private queryAll; private getSiblings; + private isPrefixPath; private menusShow; private menusHide; private calculateElementWidth; @@ -37,8 +38,8 @@ export default class Cascader { constructor(container: string, options: CascaderOptions); init(): void; setValue(value?: any[]): void; - get value(): any[]; + get value(): any; get labelValue(): any; - get indexValue(): any; + get indexValue(): any[]; } export type CascaderInstance = InstanceType; diff --git a/dist/index.js b/dist/index.js index f28c0c8..95b9a99 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1 +1 @@ -!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(e="undefined"!=typeof globalThis?globalThis:e||self).Cascader=n()}(this,(function(){"use strict";function e(e,n,t){if(t||2===arguments.length)for(var a,r=0,i=n.length;r>>0;arguments.length>1&&(t=n);for(var i=0;i>>0;arguments.length>1&&(t=n);for(var i=0;ii&&(null===(r=this.query(".cascader-container_menus"))||void 0===r||r.removeChild(u))}},n.prototype.renderValue=function(n){var t,a,r,i=this;void 0===n&&(n=[]);var o=this.options,l=o.displayRender,c=o.mode,u=void 0===c?"single":c,s=o.placeholder,d=void 0===s?"":s,v=[],f=[];if("multiple"===u){for(var m=null!==(t=this.queryAll(".cascader-container_menus_menu_item"))&&void 0!==t?t:[],p=0;p"));var S=this.transformValue("getLabelValue",n),L=function(e){return"function"==typeof l?l(e):e.join("/")};if("multiple"===u){var x=[],q=function(e){var t=n[e],a=S[e];if(v.filter((function(e){return 1===e.length})).find((function(e){return-1!==t.join(i.splitStr).indexOf(e.join(""))}))&&(a=a.slice(0,1)),-1!==x.map((function(e){return e.join(i.splitStr)})).indexOf(a.join("")))return"continue";x.push(a)};for(p=0;p"),T=w+this.calculateElementWidth(E)+5;if(!(T<=A)){j+='
...
';break}j+=E,w=T}b.innerHTML=j}else b.innerHTML=L(S)}},n.prototype.getNextLevelData=function(e){void 0===e&&(e=[]);var n=this.options.data,t=void 0===n?[]:n;return e.reduce((function(e,n){var t,a;return null!==(a=null===(t=e.find((function(e){return e.value===n})))||void 0===t?void 0:t.children)&&void 0!==a?a:[]}),t)},n.prototype.transformValue=function(n,t){void 0===t&&(t=[]);var a=this.options,r=a.data,i=void 0===r?[]:r,o=a.mode,l=function(t){for(var a,r,o,l,c,u,s=[],d=e([],i,!0),v=function(e){var i=t[e];if("getValue"===n)s.push(null===(a=d[i])||void 0===a?void 0:a.value),d=null!==(o=null===(r=d[i])||void 0===r?void 0:r.children)&&void 0!==o?o:[];else if("getLabelValue"===n){var v=d.find((function(e){return e.value===i}));s.push(null==v?void 0:v.label),d=null!==(l=null==v?void 0:v.children)&&void 0!==l?l:[]}else"getIndexValue"===n&&(s.push(d.findIndex((function(e){return e.value===i}))),d=null!==(u=null===(c=d.find((function(e){return e.value===i})))||void 0===c?void 0:c.children)&&void 0!==u?u:[])},f=0;f'),l=0;l\n
\n \n
\n \n '):"";o+='\n
\n ').concat(y,'\n \n ").concat(m,'\n
\n
\n ').concat(f.length?">":"","\n
\n \n ")}o+="",null===(a=this.query(".cascader-container_menus"))||void 0===a||a.insertAdjacentHTML("beforeend",o)},n.prototype.event=function(){var n=this,t=this.options.mode,a=void 0===t?"single":t,r=this.query(".cascader-container_".concat(this.uuid),!0);document.addEventListener("click",(function(e){var t=e.target;(null==r?void 0:r.contains(t))||t.classList.contains("cascader-container_value_placeholder")||n.menusHide()})),r&&(r.onclick=function(t){var r,i,o,l,c=t.target,u=c.classList;if(u.contains("cascader-container_".concat(n.uuid))||u.contains("cascader-container_value")||u.contains("cascader-container_value_placeholder")||u.contains("cascader-container_value_item")||u.contains("cascader-container_arrow")||u.contains("cascader-container_arrow_icon"))n.menusShow();else if(c.closest(".cascader-container_clear"))n.setValue([]);else{var s=c.closest(".cascader-container_menus_menu_item:not(.cascader-container_menus_menu_item_disabled)");if(s){var d=null!==(r=s.dataset.tag)&&void 0!==r?r:"",v=d.split(n.splitStr),f=n.getNextLevelData(v);if(c.closest(".cascader-container_menus_menu_item_multiple:not(.cascader-container_menus_menu_item_multiple_disabled)")&&0!==f.length){if(n.valValue=e([],n.valValue.filter((function(e){return-1===e.join(n.splitStr).indexOf(d)})),!0),!s.classList.contains("cascader-container_menus_menu_item_full")){for(var m=function(n,t){var a=null!=n?n:{},r=a.value,i=a.children;if(i){for(var o=[],l=0;l\n
\n ').concat(l?'
×
':"",'\n
\n
\n
\n
\n
\n \n '),this.createMenu(r),this.event(),this.setValue(i)}else console.error("can not find container")},n.prototype.setValue=function(n){var t,a,r=this;if(void 0===n&&(n=[]),Array.isArray(n)){var i=this.options,o=i.data,l=void 0===o?[]:o,c=i.mode,u=void 0===c?"single":c;if("multiple"!==u||n.every((function(e){return Array.isArray(e)}))){for(var s=null!==(t=this.queryAll(".cascader-container_menus_menu"))&&void 0!==t?t:[],d=0;d>>0;arguments.length>1&&(t=n);for(var i=0;i>>0;arguments.length>1&&(t=n);for(var i=0;in.length)&&e.every(function(e,t){return e===n[t]})},n.prototype.menusShow=function(){var e,n,t=this.options.mode;"multiple"!==(void 0===t?"single":t)&&this.setValue(this.value),null===(e=this.query(".cascader-container_".concat(this.uuid),!0))||void 0===e||e.classList.add("cascader-container_active"),null===(n=this.query(".cascader-container_menus"))||void 0===n||n.classList.add("cascader-container_menus_active")},n.prototype.menusHide=function(){var e,n;null===(e=this.query(".cascader-container_".concat(this.uuid),!0))||void 0===e||e.classList.remove("cascader-container_active"),null===(n=this.query(".cascader-container_menus"))||void 0===n||n.classList.remove("cascader-container_menus_active")},n.prototype.calculateElementWidth=function(e){var n,t=document.createElement("div");t.style.position="absolute",t.style.top="-10000px",t.innerHTML=e;var a=null===(n=t.children)||void 0===n?void 0:n[0];a.style.boxSizing="border-box",a.style.fontSize="14px",document.body.appendChild(t);var r=a.offsetWidth;return document.body.removeChild(t),r},n.prototype.selectItem=function(e){for(var n,t,a,r,i=parseInt(null!==(n=e.dataset.parentLevel)&&void 0!==n?n:"0"),o=this.getSiblings(e),l=0;li&&(null===(r=this.query(".cascader-container_menus"))||void 0===r||r.removeChild(s))}},n.prototype.renderValue=function(n){var t,a,r,i=this;void 0===n&&(n=[]);var o=this.options,l=o.displayRender,c=o.mode,s=void 0===c?"single":c,u=o.placeholder,d=void 0===u?"":u,v=[],f=[];if("multiple"===s){for(var m=null!==(t=this.queryAll(".cascader-container_menus_menu_item"))&&void 0!==t?t:[],p=0;p0){for(var o=0,l=0;l"));var L=this.transformValue("getLabelValue",n),S=function(e){return"function"==typeof l?l(e):e.join("/")};if("multiple"===s){var q=[],x=function(e){var t=n[e],a=L[e];if(v.filter(function(e){return 1===e.length}).find(function(e){return i.isPrefixPath(e,t)})&&(a=a.slice(0,1)),-1!==q.map(function(e){return e.join(i.splitStr)}).indexOf(a.join("")))return"continue";q.push(a)};for(p=0;p"),T=w+this.calculateElementWidth(E)+5;if(!(T<=j)){A+='
...
';break}A+=E,w=T}V.innerHTML=A}else V.innerHTML=S(L)}},n.prototype.getNextLevelData=function(e){void 0===e&&(e=[]);var n=this.options.data,t=void 0===n?[]:n;return e.reduce(function(e,n){var t,a;return null!==(a=null===(t=e[n])||void 0===t?void 0:t.children)&&void 0!==a?a:[]},t)},n.prototype.transformValue=function(n,t){void 0===t&&(t=[]);var a=this.options,r=a.data,i=void 0===r?[]:r,o=a.mode,l=function(t){for(var a,r,o,l,c,s,u,d,v=[],f=e([],i,!0),m=0;m'),l=0;l\n
\n \n
\n \n '):"";o+='\n
\n ').concat(y,'\n \n ").concat(m,'\n
\n
\n ').concat(f.length?">":"","\n
\n \n ")}o+="",null===(a=this.query(".cascader-container_menus"))||void 0===a||a.insertAdjacentHTML("beforeend",o)},n.prototype.event=function(){var n=this,t=this.options.mode,a=void 0===t?"single":t,r=this.query(".cascader-container_".concat(this.uuid),!0);document.addEventListener("click",function(e){var t=e.target;(null==r?void 0:r.contains(t))||t.classList.contains("cascader-container_value_placeholder")||n.menusHide()}),r&&(r.onclick=function(t){var r,i,o,l,c=t.target,s=c.classList;if(s.contains("cascader-container_".concat(n.uuid))||s.contains("cascader-container_value")||s.contains("cascader-container_value_placeholder")||s.contains("cascader-container_value_item")||s.contains("cascader-container_arrow")||s.contains("cascader-container_arrow_icon"))n.menusShow();else if(c.closest(".cascader-container_clear"))n.setValue([]);else{var u=c.closest(".cascader-container_menus_menu_item:not(.cascader-container_menus_menu_item_disabled)");if(u){var d=null!==(r=u.dataset.tag)&&void 0!==r?r:"",v=d.split(n.splitStr).map(Number),f=n.getNextLevelData(v);if(c.closest(".cascader-container_menus_menu_item_multiple:not(.cascader-container_menus_menu_item_multiple_disabled)")&&0!==f.length){if(n.valValue=e([],n.valValue.filter(function(e){return!n.isPrefixPath(v,e)}),!0),!u.classList.contains("cascader-container_menus_menu_item_full")){for(var m=function(n,t){var a=(null!=n?n:{}).children;if(a&&a.length>0){for(var r=[],i=0;i\n
\n ').concat(l?'
×
':"",'\n
\n
\n
\n
\n
\n \n '),this.createMenu(r),this.event(),this.setValue(i)}else console.error("can not find container")},n.prototype.setValue=function(n){var t,a,r=this;if(void 0===n&&(n=[]),Array.isArray(n)){var i=this.options,o=i.data,l=void 0===o?[]:o,c=i.mode,s=void 0===c?"single":c;if("multiple"!==s||n.every(function(e){return Array.isArray(e)})){for(var u=null!==(t=this.queryAll(".cascader-container_menus_menu"))&&void 0!==t?t:[],d=0;d; diff --git a/index.js b/index.js index 57da572..4867895 100644 --- a/index.js +++ b/index.js @@ -1 +1 @@ -function e(e,n,t){if(t||2===arguments.length)for(var a,r=0,i=n.length;r>>0;arguments.length>1&&(t=n);for(var i=0;i>>0;arguments.length>1&&(t=n);for(var i=0;ii&&(null===(r=this.query(".cascader-container_menus"))||void 0===r||r.removeChild(u))}},n.prototype.renderValue=function(n){var t,a,r,i=this;void 0===n&&(n=[]);var o=this.options,l=o.displayRender,c=o.mode,u=void 0===c?"single":c,s=o.placeholder,d=void 0===s?"":s,v=[],m=[];if("multiple"===u){for(var f=null!==(t=this.queryAll(".cascader-container_menus_menu_item"))&&void 0!==t?t:[],p=0;p"));var S=this.transformValue("getLabelValue",n),L=function(e){return"function"==typeof l?l(e):e.join("/")};if("multiple"===u){var q=[],x=function(e){var t=n[e],a=S[e];if(v.filter((function(e){return 1===e.length})).find((function(e){return-1!==t.join(i.splitStr).indexOf(e.join(""))}))&&(a=a.slice(0,1)),-1!==q.map((function(e){return e.join(i.splitStr)})).indexOf(a.join("")))return"continue";q.push(a)};for(p=0;p"),I=w+this.calculateElementWidth(E)+5;if(!(I<=A)){j+='
...
';break}j+=E,w=I}b.innerHTML=j}else b.innerHTML=L(S)}},n.prototype.getNextLevelData=function(e){void 0===e&&(e=[]);var n=this.options.data,t=void 0===n?[]:n;return e.reduce((function(e,n){var t,a;return null!==(a=null===(t=e.find((function(e){return e.value===n})))||void 0===t?void 0:t.children)&&void 0!==a?a:[]}),t)},n.prototype.transformValue=function(n,t){void 0===t&&(t=[]);var a=this.options,r=a.data,i=void 0===r?[]:r,o=a.mode,l=function(t){for(var a,r,o,l,c,u,s=[],d=e([],i,!0),v=function(e){var i=t[e];if("getValue"===n)s.push(null===(a=d[i])||void 0===a?void 0:a.value),d=null!==(o=null===(r=d[i])||void 0===r?void 0:r.children)&&void 0!==o?o:[];else if("getLabelValue"===n){var v=d.find((function(e){return e.value===i}));s.push(null==v?void 0:v.label),d=null!==(l=null==v?void 0:v.children)&&void 0!==l?l:[]}else"getIndexValue"===n&&(s.push(d.findIndex((function(e){return e.value===i}))),d=null!==(u=null===(c=d.find((function(e){return e.value===i})))||void 0===c?void 0:c.children)&&void 0!==u?u:[])},m=0;m'),l=0;l\n
\n \n
\n \n '):"";o+='\n
\n ').concat(y,'\n \n ").concat(f,'\n
\n
\n ').concat(m.length?">":"","\n
\n \n ")}o+="",null===(a=this.query(".cascader-container_menus"))||void 0===a||a.insertAdjacentHTML("beforeend",o)},n.prototype.event=function(){var n=this,t=this.options.mode,a=void 0===t?"single":t,r=this.query(".cascader-container_".concat(this.uuid),!0);document.addEventListener("click",(function(e){var t=e.target;(null==r?void 0:r.contains(t))||t.classList.contains("cascader-container_value_placeholder")||n.menusHide()})),r&&(r.onclick=function(t){var r,i,o,l,c=t.target,u=c.classList;if(u.contains("cascader-container_".concat(n.uuid))||u.contains("cascader-container_value")||u.contains("cascader-container_value_placeholder")||u.contains("cascader-container_value_item")||u.contains("cascader-container_arrow")||u.contains("cascader-container_arrow_icon"))n.menusShow();else if(c.closest(".cascader-container_clear"))n.setValue([]);else{var s=c.closest(".cascader-container_menus_menu_item:not(.cascader-container_menus_menu_item_disabled)");if(s){var d=null!==(r=s.dataset.tag)&&void 0!==r?r:"",v=d.split(n.splitStr),m=n.getNextLevelData(v);if(c.closest(".cascader-container_menus_menu_item_multiple:not(.cascader-container_menus_menu_item_multiple_disabled)")&&0!==m.length){if(n.valValue=e([],n.valValue.filter((function(e){return-1===e.join(n.splitStr).indexOf(d)})),!0),!s.classList.contains("cascader-container_menus_menu_item_full")){for(var f=function(n,t){var a=null!=n?n:{},r=a.value,i=a.children;if(i){for(var o=[],l=0;l\n
\n ').concat(l?'
×
':"",'\n
\n
\n
\n
\n
\n \n '),this.createMenu(r),this.event(),this.setValue(i)}else console.error("can not find container")},n.prototype.setValue=function(n){var t,a,r=this;if(void 0===n&&(n=[]),Array.isArray(n)){var i=this.options,o=i.data,l=void 0===o?[]:o,c=i.mode,u=void 0===c?"single":c;if("multiple"!==u||n.every((function(e){return Array.isArray(e)}))){for(var s=null!==(t=this.queryAll(".cascader-container_menus_menu"))&&void 0!==t?t:[],d=0;d>>0;arguments.length>1&&(t=n);for(var i=0;i>>0;arguments.length>1&&(t=n);for(var i=0;in.length)&&e.every(function(e,t){return e===n[t]})},n.prototype.menusShow=function(){var e,n,t=this.options.mode;"multiple"!==(void 0===t?"single":t)&&this.setValue(this.value),null===(e=this.query(".cascader-container_".concat(this.uuid),!0))||void 0===e||e.classList.add("cascader-container_active"),null===(n=this.query(".cascader-container_menus"))||void 0===n||n.classList.add("cascader-container_menus_active")},n.prototype.menusHide=function(){var e,n;null===(e=this.query(".cascader-container_".concat(this.uuid),!0))||void 0===e||e.classList.remove("cascader-container_active"),null===(n=this.query(".cascader-container_menus"))||void 0===n||n.classList.remove("cascader-container_menus_active")},n.prototype.calculateElementWidth=function(e){var n,t=document.createElement("div");t.style.position="absolute",t.style.top="-10000px",t.innerHTML=e;var a=null===(n=t.children)||void 0===n?void 0:n[0];a.style.boxSizing="border-box",a.style.fontSize="14px",document.body.appendChild(t);var r=a.offsetWidth;return document.body.removeChild(t),r},n.prototype.selectItem=function(e){for(var n,t,a,r,i=parseInt(null!==(n=e.dataset.parentLevel)&&void 0!==n?n:"0"),o=this.getSiblings(e),l=0;li&&(null===(r=this.query(".cascader-container_menus"))||void 0===r||r.removeChild(s))}},n.prototype.renderValue=function(n){var t,a,r,i=this;void 0===n&&(n=[]);var o=this.options,l=o.displayRender,c=o.mode,s=void 0===c?"single":c,u=o.placeholder,d=void 0===u?"":u,v=[],m=[];if("multiple"===s){for(var h=null!==(t=this.queryAll(".cascader-container_menus_menu_item"))&&void 0!==t?t:[],f=0;f0){for(var o=0,l=0;l"));var L=this.transformValue("getLabelValue",n),S=function(e){return"function"==typeof l?l(e):e.join("/")};if("multiple"===s){var q=[],x=function(e){var t=n[e],a=L[e];if(v.filter(function(e){return 1===e.length}).find(function(e){return i.isPrefixPath(e,t)})&&(a=a.slice(0,1)),-1!==q.map(function(e){return e.join(i.splitStr)}).indexOf(a.join("")))return"continue";q.push(a)};for(f=0;f"),M=j+this.calculateElementWidth(E)+5;if(!(M<=w)){A+='
...
';break}A+=E,j=M}V.innerHTML=A}else V.innerHTML=S(L)}},n.prototype.getNextLevelData=function(e){void 0===e&&(e=[]);var n=this.options.data,t=void 0===n?[]:n;return e.reduce(function(e,n){var t,a;return null!==(a=null===(t=e[n])||void 0===t?void 0:t.children)&&void 0!==a?a:[]},t)},n.prototype.transformValue=function(n,t){void 0===t&&(t=[]);var a=this.options,r=a.data,i=void 0===r?[]:r,o=a.mode,l=function(t){for(var a,r,o,l,c,s,u,d,v=[],m=e([],i,!0),h=0;h'),l=0;l\n
\n \n
\n \n '):"";o+='\n
\n ').concat(y,'\n \n ").concat(h,'\n
\n
\n ').concat(m.length?">":"","\n
\n \n ")}o+="",null===(a=this.query(".cascader-container_menus"))||void 0===a||a.insertAdjacentHTML("beforeend",o)},n.prototype.event=function(){var n=this,t=this.options.mode,a=void 0===t?"single":t,r=this.query(".cascader-container_".concat(this.uuid),!0);document.addEventListener("click",function(e){var t=e.target;(null==r?void 0:r.contains(t))||t.classList.contains("cascader-container_value_placeholder")||n.menusHide()}),r&&(r.onclick=function(t){var r,i,o,l,c=t.target,s=c.classList;if(s.contains("cascader-container_".concat(n.uuid))||s.contains("cascader-container_value")||s.contains("cascader-container_value_placeholder")||s.contains("cascader-container_value_item")||s.contains("cascader-container_arrow")||s.contains("cascader-container_arrow_icon"))n.menusShow();else if(c.closest(".cascader-container_clear"))n.setValue([]);else{var u=c.closest(".cascader-container_menus_menu_item:not(.cascader-container_menus_menu_item_disabled)");if(u){var d=null!==(r=u.dataset.tag)&&void 0!==r?r:"",v=d.split(n.splitStr).map(Number),m=n.getNextLevelData(v);if(c.closest(".cascader-container_menus_menu_item_multiple:not(.cascader-container_menus_menu_item_multiple_disabled)")&&0!==m.length){if(n.valValue=e([],n.valValue.filter(function(e){return!n.isPrefixPath(v,e)}),!0),!u.classList.contains("cascader-container_menus_menu_item_full")){for(var h=function(n,t){var a=(null!=n?n:{}).children;if(a&&a.length>0){for(var r=[],i=0;i\n
\n ').concat(l?'
×
':"",'\n
\n
\n
\n
\n
\n \n '),this.createMenu(r),this.event(),this.setValue(i)}else console.error("can not find container")},n.prototype.setValue=function(n){var t,a,r=this;if(void 0===n&&(n=[]),Array.isArray(n)){var i=this.options,o=i.data,l=void 0===o?[]:o,c=i.mode,s=void 0===c?"single":c;if("multiple"!==s||n.every(function(e){return Array.isArray(e)})){for(var u=null!==(t=this.queryAll(".cascader-container_menus_menu"))&&void 0!==t?t:[],d=0;d path.length) return false; + return prefix.every((v, i) => v === path[i]); + } private menusShow() { const { mode = "single" } = this.options; if (mode !== "multiple") { - this.setValue(this.valValue); + this.setValue(this.value); } this.query(`.cascader-container_${this.uuid}`, true)?.classList.add("cascader-container_active"); @@ -179,8 +183,8 @@ export default class Cascader { private renderValue(value: any[] = []) { const { displayRender, mode = "single", placeholder = "" } = this.options; - const fullItemTagValue = []; - const checkedItemTagValue = []; + const fullItemTagValue: number[][] = []; + const checkedItemTagValue: number[][] = []; if (mode === "multiple") { const allItem = this.queryAll(".cascader-container_menus_menu_item") ?? []; @@ -191,55 +195,52 @@ export default class Cascader { } for (let index = 0; index < this.valValue.length; index++) { - const element = this.valValue[index]; + const element = this.valValue[index] as number[]; const item = this.query(`.cascader-container_menus_menu_item[data-tag="${element.join(this.splitStr)}"]`); item?.classList.add("cascader-container_menus_menu_item_full"); for (let index = 0; index < element.length - 1; index++) { - const parentValue = element.slice(0, element.length - 1 - index); + const parentPath = element.slice(0, element.length - 1 - index) as number[]; - if (checkedItemTagValue.map((ele) => ele.join(this.splitStr)).indexOf(parentValue.join(this.splitStr)) !== -1) { + if (checkedItemTagValue.map((ele) => ele.join(this.splitStr)).indexOf(parentPath.join(this.splitStr)) !== -1) { continue; } - const parentChild = this.getNextLevelData(parentValue); + const parentChild = this.getNextLevelData(parentPath); - const recursion = (data: CascaderOptionsData, tag: string[]) => { - const { value, children } = data ?? {}; + const recursion = (data: CascaderOptionsData, tag: number[]): boolean => { + const { children } = data ?? {}; - if (children) { + if (children && children.length > 0) { let fullCount = 0; - - for (let index = 0; index < children.length; index++) { - if (recursion(children[index], [...tag, value])) { + for (let i = 0; i < children.length; i++) { + if (recursion(children[i], [...tag, i])) { fullCount++; } } - return fullCount === children.length; } - return this.valValue.findIndex((ele) => ele.join(this.splitStr) === `${tag.join(this.splitStr)}${this.splitStr}${value}`) !== -1; + return this.valValue.findIndex((ele: number[]) => ele.join(this.splitStr) === tag.join(this.splitStr)) !== -1; }; - const fullCount = parentChild.reduce((acc, cur) => { - if (recursion(cur, parentValue)) { - return acc + 1; + let fullCount = 0; + for (let i = 0; i < parentChild.length; i++) { + if (recursion(parentChild[i], [...parentPath, i])) { + fullCount++; } + } - return acc; - }, 0); - - const parentItem = this.query(`.cascader-container_menus_menu_item[data-tag="${parentValue.join(this.splitStr)}"]`); + const parentItem = this.query(`.cascader-container_menus_menu_item[data-tag="${parentPath.join(this.splitStr)}"]`); if (fullCount === parentChild.length) { parentItem?.classList.add("cascader-container_menus_menu_item_full"); - fullItemTagValue.push(parentValue); + fullItemTagValue.push(parentPath); } else { parentItem?.classList.add("cascader-container_menus_menu_item_half"); } - checkedItemTagValue.push(parentValue); + checkedItemTagValue.push(parentPath); } } } @@ -270,10 +271,10 @@ export default class Cascader { const labelArr: any[] = []; for (let index = 0; index < value.length; index++) { - const element = value[index]; + const element = value[index] as number[]; let label = labelValue[index]; - if (fullItemTagValue.filter((ele) => ele.length === 1).find((ele) => element.join(this.splitStr).indexOf(ele.join("")) !== -1)) { + if (fullItemTagValue.filter((ele: number[]) => ele.length === 1).find((ele: number[]) => this.isPrefixPath(ele, element))) { label = label.slice(0, 1); } @@ -309,33 +310,32 @@ export default class Cascader { } } } - private getNextLevelData(value: string[] = []) { + private getNextLevelData(indexPath: number[] = []) { const { data = [] } = this.options; - return value.reduce((acc, cur) => { - return acc.find((ele) => ele.value === cur)?.children ?? []; - }, data); + return indexPath.reduce((acc: CascaderOptionsData[], cur) => { + return acc[cur]?.children ?? []; + }, data as CascaderOptionsData[]); } private transformValue(type: "getValue" | "getLabelValue" | "getIndexValue", value: any[] = []) { const { data = [], mode = "single" } = this.options; - const getValue = (values: any[]) => { + const getValue = (values: number[]) => { const result: any = []; let treeData: CascaderOptionsData[] = [...data]; - for (let index = 0; index < values.length; index++) { - const element = values[index]; + for (let i = 0; i < values.length; i++) { + const idx = values[i]; if (type === "getValue") { - result.push(treeData[element]?.value); - treeData = treeData[element]?.children ?? []; + result.push(treeData[idx]?.value); + treeData = treeData[idx]?.children ?? []; } else if (type === "getLabelValue") { - const target = treeData.find((ele) => ele.value === element); - result.push(target?.label); - treeData = target?.children ?? []; + result.push(treeData[idx]?.label); + treeData = treeData[idx]?.children ?? []; } else if (type === "getIndexValue") { - result.push(treeData.findIndex((ele) => ele.value === element)); - treeData = treeData.find((ele) => ele.value === element)?.children ?? []; + result.push(idx); + treeData = treeData[idx]?.children ?? []; } } @@ -365,7 +365,7 @@ export default class Cascader { const otherClass = `${className ? ` ${className}` : ""}${disabled ? " cascader-container_menus_menu_item_disabled" : ""}`; - const tagStr = tag ? `${tag}${this.splitStr}${value}` : value; + const tagStr = tag ? `${tag}${this.splitStr}${index}` : String(index); const multipleisDisabled = disabled ? "cascader-container_menus_menu_item_multiple_disabled" : ""; @@ -433,38 +433,38 @@ export default class Cascader { if (currentItem) { const currentItemTag = currentItem.dataset.tag ?? ""; - const currentValue = currentItemTag.split(this.splitStr); - const nextLevelData = this.getNextLevelData(currentValue); + const currentIndexPath = currentItemTag.split(this.splitStr).map(Number); + const nextLevelData = this.getNextLevelData(currentIndexPath); const currentMultipleItem = target.closest( ".cascader-container_menus_menu_item_multiple:not(.cascader-container_menus_menu_item_multiple_disabled)", ) as HTMLElement; if (currentMultipleItem && nextLevelData.length !== 0) { - this.valValue = [...this.valValue.filter((ele) => ele.join(this.splitStr).indexOf(currentItemTag) === -1)]; + this.valValue = [...this.valValue.filter((ele: number[]) => !this.isPrefixPath(currentIndexPath, ele))]; if (!currentItem.classList.contains("cascader-container_menus_menu_item_full")) { - const recursion = (data: CascaderOptionsData, values: string[]) => { - const { value, children } = data ?? {}; + const recursion = (data: CascaderOptionsData, values: number[]): number[][] => { + const { children } = data ?? {}; - if (children) { - const arr: string[][] = []; + if (children && children.length > 0) { + const arr: number[][] = []; - for (let index = 0; index < children.length; index++) { - arr.push(...recursion(children[index], [...values, value])); + for (let i = 0; i < children.length; i++) { + arr.push(...recursion(children[i], [...values, i])); } return arr; } - return [[...values, value]]; + return [values]; }; - const valueArr: any[] = []; + const valueArr: number[][] = []; for (let index = 0; index < nextLevelData.length; index++) { const element = nextLevelData[index]; - valueArr.push(...recursion(element, currentValue)); + valueArr.push(...recursion(element, [...currentIndexPath, index])); } this.valValue = [...this.valValue, ...valueArr]; @@ -474,14 +474,14 @@ export default class Cascader { if (nextLevelData.length === 0) { if (mode === "multiple") { - if (this.valValue.map((ele) => ele.join(this.splitStr)).indexOf(currentValue.join(this.splitStr)) !== -1) { - const index = this.valValue.map((ele) => ele.join(this.splitStr)).findIndex((ele) => ele === currentValue.join(this.splitStr)); - this.valValue.splice(index, 1); + const existingIdx = this.valValue.findIndex((ele: number[]) => ele.join(this.splitStr) === currentIndexPath.join(this.splitStr)); + if (existingIdx !== -1) { + this.valValue.splice(existingIdx, 1); } else { - this.valValue.push(currentValue); + this.valValue.push(currentIndexPath); } } else { - this.valValue = [...currentValue]; + this.valValue = [...currentIndexPath]; this.menusHide(); } } else { @@ -491,7 +491,7 @@ export default class Cascader { } this.renderValue(this.valValue); - this.options.onChange?.(this.valValue, this.transformValue("getLabelValue", this.valValue), this.transformValue("getIndexValue", this.valValue)); + this.options.onChange?.(this.transformValue("getValue", this.valValue), this.transformValue("getLabelValue", this.valValue), this.valValue); } } }; @@ -577,59 +577,69 @@ export default class Cascader { } this.createMenu(data); - const getValue = (value: any[]) => { - let valueArr: any[] = []; + const toIndexPath = (val: any[]): number[] => { + if (val.every((item) => typeof item === "number")) { + return [...val]; + } - if (value.every((item) => typeof item === "string") || value.every((item) => typeof item === "number")) { - if (value.every((item) => typeof item === "number")) { - valueArr = [...this.transformValue("getValue", value)]; - } else { - valueArr = [...value]; + if (val.every((item) => typeof item === "string")) { + const result: number[] = []; + let treeData: CascaderOptionsData[] = data; + for (const v of val) { + const idx = treeData.findIndex((ele) => ele.value === v); + if (idx === -1) break; + result.push(idx); + treeData = treeData[idx]?.children ?? []; } + return result; + } - for (let index = 0; index < valueArr.length; index++) { - const levelValue = valueArr.slice(0, index + 1); - const tagStr = levelValue.join(this.splitStr); - const currentItem = this.query(`.cascader-container_menus_menu_item[data-tag="${tagStr}"]`); - const nextLevelData = this.getNextLevelData(levelValue); + return []; + }; - if (nextLevelData.length !== 0) { - const menu = this.query(`.cascader-container_menus_menu[data-level="${index + 1}"]`); + const applyIndexPath = (indexPath: number[]) => { + for (let index = 0; index < indexPath.length; index++) { + const levelIndices = indexPath.slice(0, index + 1); + const tagStr = levelIndices.join(this.splitStr); + const currentItem = this.query(`.cascader-container_menus_menu_item[data-tag="${tagStr}"]`); + const nextLevelData = this.getNextLevelData(levelIndices); - if (menu) { - this.query(`.cascader-container_menus`)?.removeChild(menu); - } + if (nextLevelData.length !== 0) { + const menu = this.query(`.cascader-container_menus_menu[data-level="${index + 1}"]`); - this.createMenu(nextLevelData, index + 1, tagStr); + if (menu) { + this.query(`.cascader-container_menus`)?.removeChild(menu); } - if (mode !== "multiple") { - currentItem?.classList.add("cascader-container_menus_menu_item_active"); - } + this.createMenu(nextLevelData, index + 1, tagStr); + } + + if (mode !== "multiple") { + currentItem?.classList.add("cascader-container_menus_menu_item_active"); } } - return valueArr; + return indexPath; }; if (mode === "multiple") { - const valueArr = []; + const valueArr: number[][] = []; for (let index = 0; index < value.length; index++) { const element = value[index]; - valueArr.push(getValue(element)); + valueArr.push(applyIndexPath(toIndexPath(element))); } this.valValue = [...valueArr]; } else { - this.valValue = [...getValue(value)]; + this.valValue = [...applyIndexPath(toIndexPath(value))]; } this.renderValue(this.valValue); } get value() { - return this.valValue; + return this.transformValue("getValue", this.valValue); } get labelValue() { @@ -637,7 +647,7 @@ export default class Cascader { } get indexValue() { - return this.transformValue("getIndexValue", this.valValue); + return this.valValue; } }