{"version":3,"file":"node.mjs","sources":["../../../../../../packages/components/cascader-panel/src/node.vue"],"sourcesContent":["<template>\n  <li\n    :id=\"`${menuId}-${node.uid}`\"\n    role=\"menuitem\"\n    :aria-haspopup=\"!isLeaf\"\n    :aria-owns=\"isLeaf ? null : menuId\"\n    :aria-expanded=\"inExpandingPath\"\n    :tabindex=\"expandable ? -1 : undefined\"\n    :class=\"[\n      'cascader-node',\n      checkStrictly && 'is-selectable',\n      inExpandingPath && 'in-active-path',\n      inCheckedPath && 'in-checked-path',\n      node.checked && 'is-active',\n      !expandable && 'is-disabled'\n    ]\"\n    @mouseenter=\"handleHoverExpand\"\n    @focus=\"handleHoverExpand\"\n    @click=\"handleClick\"\n  >\n    <!-- prefix -->\n    <hl-checkbox\n      v-if=\"multiple\"\n      :model-value=\"node.checked\"\n      :indeterminate=\"node.indeterminate\"\n      :disabled=\"isDisabled\"\n      @click.stop\n      @update:model-value=\"handleSelectCheck\"\n    />\n    <hl-radio\n      v-else-if=\"checkStrictly\"\n      :model-value=\"checkedNodeId\"\n      :label=\"node.uid\"\n      :disabled=\"isDisabled\"\n      @update:model-value=\"handleSelectCheck\"\n      @click.stop\n    >\n      <!--\n        Add an empty element to avoid render label,\n        do not use empty fragment here for https://github.com/vuejs/vue-next/pull/2485\n      -->\n      <span></span>\n    </hl-radio>\n    <hl-icon v-else-if=\"isLeaf && node.checked\" :class=\"['cascader-item-prefix checked']\">\n      <system-checked />\n    </hl-icon>\n\n    <!-- content -->\n    <node-content />\n\n    <!-- postfix -->\n    <template v-if=\"!isLeaf\">\n      <hl-spinner v-if=\"node.loading\" class=\"cascader-item-suffix\" />\n      <hl-icon v-else class=\"cascader-item-suffix\">\n        <system-arrow-right />\n      </hl-icon>\n    </template>\n  </li>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject } from 'vue'\nimport HlCheckbox from '@hongluan-ui/components/checkbox'\nimport HlRadio from '@hongluan-ui/components/radio'\nimport HlSpinner from '@hongluan-ui/components/spinner'\nimport HlIcon from '@hongluan-ui/components/icon'\nimport { SystemArrowRight, SystemChecked } from '@hongluan-ui/components/system-icon'\nimport NodeContent from './node-content'\nimport { CASCADER_PANEL_INJECTION_KEY } from './types'\n\nimport type { CascaderNode } from './types'\nimport type { PropType } from 'vue'\n\nexport default defineComponent({\n  name: 'CascaderNode',\n\n  components: {\n    HlCheckbox,\n    HlRadio,\n    HlSpinner,\n    HlIcon,\n    SystemArrowRight,\n    SystemChecked,\n    NodeContent,\n  },\n\n  props: {\n    node: {\n      type: Object as PropType<CascaderNode>,\n      required: true,\n    },\n    menuId: String,\n  },\n\n  emits: ['expand'],\n\n  setup (props, { emit }) {\n    const panel = inject(CASCADER_PANEL_INJECTION_KEY)\n\n    const isHoverMenu = computed(() => panel.isHoverMenu)\n    const multiple = computed(() => panel.config.multiple)\n    const checkStrictly = computed(() => panel.config.checkStrictly)\n    const checkedNodeId = computed(() => panel.checkedNodes[0]?.uid)\n    const isDisabled = computed(() => props.node.isDisabled)\n    const isLeaf = computed(() => props.node.isLeaf)\n    const expandable = computed(() => checkStrictly.value && !isLeaf.value || !isDisabled.value)\n    const inExpandingPath = computed(() => isInPath(panel.expandingNode))\n    // only useful in check-strictly mode\n    const inCheckedPath = computed(() => checkStrictly.value && panel.checkedNodes.some(isInPath))\n\n    const isInPath = (node: CascaderNode) => {\n      const { level, uid } = props.node\n      return node?.pathNodes[level - 1]?.uid === uid\n    }\n\n    const doExpand = () => {\n      if (inExpandingPath.value) return\n      panel.expandNode(props.node)\n    }\n\n    const doCheck = (checked: boolean) => {\n      const { node } = props\n      if (checked === node.checked) return\n      panel.handleCheckChange(node, checked)\n    }\n\n    const doLoad = () => {\n      panel.lazyLoad(props.node, () => {\n        if (!isLeaf.value) doExpand()\n      })\n    }\n\n    const handleHoverExpand = (e: Event) => {\n      if (!isHoverMenu.value) return\n      handleExpand()\n      !isLeaf.value && emit('expand', e)\n    }\n\n    const handleExpand = () => {\n      const { node } = props\n      // do not exclude leaf node because the menus expanded might have to reset\n      if (!expandable.value || node.loading) return\n      node.loaded ? doExpand() : doLoad()\n    }\n\n    const handleClick = () => {\n      if (isHoverMenu.value && !isLeaf.value) return\n\n      if (isLeaf.value && !isDisabled.value && !checkStrictly.value && !multiple.value) {\n        handleCheck(true)\n      } else {\n        handleExpand()\n      }\n    }\n\n    const handleSelectCheck = (checked: boolean) => {\n      if (checkStrictly.value) {\n        doCheck(checked)\n        if (props.node.loaded) {\n          doExpand()\n        }\n      } else {\n        handleCheck(checked)\n      }\n    }\n\n    const handleCheck = (checked: boolean) => {\n      if (!props.node.loaded) {\n        doLoad()\n      } else {\n        doCheck(checked)\n        !checkStrictly.value && doExpand()\n      }\n    }\n\n    return {\n      panel,\n      isHoverMenu,\n      multiple,\n      checkStrictly,\n      checkedNodeId,\n      isDisabled,\n      isLeaf,\n      expandable,\n      inExpandingPath,\n      inCheckedPath,\n      handleHoverExpand,\n      handleExpand,\n      handleClick,\n      handleCheck,\n      handleSelectCheck,\n    }\n  },\n})\n</script>\n"],"names":[],"mappings":";;;;;;;;;;;;AAyEA,MAAK,YAAa,gBAAa;AAAA,EAC7B,MAAM;AAAA,EAEN,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AACF,EAEA,OAAO;AAAA,IACL,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,UAAU;AAAA;AACZ,IACA,QAAQ;AAAA;AACV,EAEA,OAAO,CAAC,QAAQ;AAAA,EAEhB,MAAO,OAAO,EAAE,QAAQ;AACtB,UAAM,QAAQ,OAAO,4BAA4B;AAEjD,UAAM,cAAc,SAAS,MAAM,MAAM,WAAW;AACpD,UAAM,WAAW,SAAS,MAAM,MAAM,OAAO,QAAQ;AACrD,UAAM,gBAAgB,SAAS,MAAM,MAAM,OAAO,aAAa;AAC/D,UAAM,gBAAgB,SAAS,MAAM;AACrC,UAAM;AACN,mBAAe,qBAAqB,KAAK;AACzC;AACA,UAAM,iCAAiC;AAEvC,UAAM;AAEN,UAAM,qBAAmC;AACvC;AACA,yCAAmC;AAAQ,IAC7C;AAEA,UAAM;AACJ,0BAAoB;AAAO;AAC3B;AAA2B,IAC7B;AAEA,UAAM;AACJ;AACA,sBAAgB;AAAc;AAC9B;AAAqC;AAGvC,UAAM;AACJ;AACE,YAAI;AAAe;AAAS;AAC7B;AAGH;AACE,UAAI;AAAoB;AACxB;AACA;AAAiC;AAGnC;AACE;AAEA,oCAA8B;AAAS;AACvC;AAAkC;AAGpC,UAAM;AACJ;AAAwC;AAExC;AACE,wBAAgB;AAAA,MAClB;AACE;AAAa,MACf;AAAA;AAGF;AACE;AACE;AACA;AACE;AAAS;AACX;AAEA;AAAmB;AACrB;AAGF;AACE;AACE;AAAO,MACT;AACE;AACA;AAAiC;AACnC;AAGF;AAAO;AACL;AACA,MACA;AAAA;AACA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AACF;AAEJ;;;;;;;;;;AAxIO,QAvDA;AAAoB;AAClB;AACY;AACW,IAC3B;AAAe,IACf;AAA4B,IAC5B;AAAK;;AAA8C;AAA0C;AAAyC,MAA6B;AAAY;AAAkC;;AAQrM;AACL;AACA;IAER;AAAA,IAEQ,+BADR;AAOE;;AALmB;AACE;AACV,MACV;AAAD;AAAW,MACV;AAAoB;AAeZ;;AAXK,MACb;AAAY,gBACF;AAAA,MACV;AAAoB,MACpB;AAAD;AAAW;;AAKR;AAHH;AAIa;;;AAIL;;AAF0E;wBAClF;AAAkB;AAAA;;;;AAGpB;AACgB;AAEhB,KACiB;AAKN;AAJsD;;AAAzB;AAG5B;QAFM;AAAM;;AACE;AAAA;;;;;;;;;;;;;;"}