{"version":3,"file":"hooks.mjs","sources":["../../../components/tree/hooks.ts"],"sourcesContent":["import { isNull, toFalse } from '@vexip-ui/utils'\r\n\r\nexport interface CascadedNode {\r\n  checked: boolean,\r\n  partial: boolean,\r\n  parent?: string | number | symbol,\r\n  children: CascadedNode[],\r\n}\r\n\r\nexport function useCascadedChecked<T extends CascadedNode>(options: {\r\n  getNode: (key: string | number | symbol) => T | null | undefined | void,\r\n  disableNode?: (node: T) => boolean,\r\n}) {\r\n  function updateCheckedUpward(key: string | number | symbol) {\r\n    let node = options.getNode(key)\r\n\r\n    if (!node) return\r\n\r\n    while (!isNull(node.parent)) {\r\n      const parentId = node.parent\r\n      const parent = options.getNode(parentId)\r\n\r\n      if (!parent) break\r\n\r\n      if (node.checked === parent.checked && node.partial === parent.partial) {\r\n        break\r\n      }\r\n\r\n      if (node.checked) {\r\n        parent.checked = parent.children.every(item => item.checked)\r\n        parent.partial = !parent.checked\r\n      } else {\r\n        parent.checked = false\r\n        parent.partial = parent.children.some(item => item.checked || item.partial)\r\n      }\r\n\r\n      node = parent\r\n    }\r\n  }\r\n\r\n  function updateCheckedDown(key: string | number | symbol) {\r\n    const originNode = options.getNode(key)\r\n\r\n    if (!originNode) return\r\n\r\n    const disable = typeof options.disableNode === 'function' ? options.disableNode : toFalse\r\n    const checked = originNode.checked\r\n    const partial = originNode.partial\r\n\r\n    const loop = [...(originNode.children as T[])]\r\n\r\n    let node: T\r\n\r\n    while (loop.length) {\r\n      node = loop.shift()!\r\n\r\n      if (disable(node)) continue\r\n\r\n      node.checked = checked\r\n      node.partial = partial\r\n\r\n      if (node.children.length) {\r\n        loop.push(...(node.children as T[]))\r\n      }\r\n    }\r\n  }\r\n\r\n  return {\r\n    updateCheckedUpward,\r\n    updateCheckedDown,\r\n  }\r\n}\r\n"],"names":["useCascadedChecked","options","updateCheckedUpward","key","node","isNull","parentId","parent","item","updateCheckedDown","originNode","disable","toFalse","checked","partial","loop"],"mappings":";AASO,SAASA,EAA2CC,GAGxD;AACD,WAASC,EAAoBC,GAA+B;AACtD,QAAAC,IAAOH,EAAQ,QAAQE,CAAG;AAE9B,QAAKC;AAEL,aAAO,CAACC,EAAOD,EAAK,MAAM,KAAG;AAC3B,cAAME,IAAWF,EAAK,QAChBG,IAASN,EAAQ,QAAQK,CAAQ;AAIvC,YAFI,CAACC,KAEDH,EAAK,YAAYG,EAAO,WAAWH,EAAK,YAAYG,EAAO;AAC7D;AAGF,QAAIH,EAAK,WACPG,EAAO,UAAUA,EAAO,SAAS,MAAM,CAAAC,MAAQA,EAAK,OAAO,GACpDD,EAAA,UAAU,CAACA,EAAO,YAEzBA,EAAO,UAAU,IACVA,EAAA,UAAUA,EAAO,SAAS,KAAK,OAAQC,EAAK,WAAWA,EAAK,OAAO,IAGrEJ,IAAAG;AAAA,MAAA;AAAA,EACT;AAGF,WAASE,EAAkBN,GAA+B;AAClD,UAAAO,IAAaT,EAAQ,QAAQE,CAAG;AAEtC,QAAI,CAACO,EAAY;AAEjB,UAAMC,IAAU,OAAOV,EAAQ,eAAgB,aAAaA,EAAQ,cAAcW,GAC5EC,IAAUH,EAAW,SACrBI,IAAUJ,EAAW,SAErBK,IAAO,CAAC,GAAIL,EAAW,QAAgB;AAEzC,QAAAN;AAEJ,WAAOW,EAAK;AAGN,MAFJX,IAAOW,EAAK,MAAM,GAEd,CAAAJ,EAAQP,CAAI,MAEhBA,EAAK,UAAUS,GACfT,EAAK,UAAUU,GAEXV,EAAK,SAAS,UACXW,EAAA,KAAK,GAAIX,EAAK,QAAgB;AAAA,EAEvC;AAGK,SAAA;AAAA,IACL,qBAAAF;AAAA,IACA,mBAAAO;AAAA,EACF;AACF;"}