{"version":3,"file":"node.mjs","sources":["../../../../../packages/components/cascade-panel/src/node.ts"],"sourcesContent":["import { isFunction } from '@vue/shared'\nimport { capitalize, isUndefined, isEmpty } from '@element-ultra/utils'\nimport type { VNode } from 'vue'\n\nexport type CascadeNodeValue = string | number\nexport type CascadeNodePathValue = CascadeNodeValue[]\nexport type CascadeValue =\n  | CascadeNodeValue\n  | CascadeNodePathValue\n  | (CascadeNodeValue | CascadeNodePathValue)[]\nexport type CascadeConfig = Required<CascadeProps>\nexport enum ExpandTrigger {\n  CLICK = 'click',\n  HOVER = 'hover'\n}\nexport type isDisabled = (data: CascadeOption, node: Node) => boolean\nexport type isLeaf = (data: CascadeOption, node: Node) => boolean\nexport type Resolve = (dataList?: CascadeOption[]) => void\nexport type LazyLoad = (node: Node, resolve: Resolve) => void\nexport type RenderLabel = ({\n  node: Node,\n  data: CascadeOption\n}) => VNode | VNode[]\nexport interface CascadeOption extends Record<string, unknown> {\n  label?: string\n  value?: CascadeNodeValue\n  children?: CascadeOption[]\n  disabled?: boolean\n  leaf?: boolean\n}\n\nexport interface CascadeProps {\n  expandTrigger?: ExpandTrigger\n  multiple?: boolean\n  checkStrictly?: boolean\n  emitPath?: boolean\n  lazy?: boolean\n  lazyLoad?: LazyLoad\n  value?: string\n  label?: string\n  children?: string\n  disabled?: string | isDisabled\n  leaf?: string | isLeaf\n  hoverThreshold?: number\n}\n\nexport type Nullable<T> = null | T\n\ntype ChildrenData = CascadeOption[] | undefined\n\nlet uid = 0\n\nconst calculatePathNodes = (node: Node) => {\n  const nodes = [node]\n  let { parent } = node\n\n  while (parent) {\n    nodes.unshift(parent)\n    parent = parent.parent\n  }\n\n  return nodes\n}\n\nclass Node {\n  readonly uid: number = uid++\n  readonly level: number\n  readonly value: CascadeNodeValue\n  readonly label: string\n  readonly pathNodes: Node[]\n  readonly pathValues: CascadeNodePathValue\n  readonly pathLabels: string[]\n\n  childrenData: ChildrenData\n  children: Node[]\n  text: string\n  loaded: boolean\n  checked = false\n  indeterminate = false\n  loading = false\n\n  constructor(\n    readonly data: Nullable<CascadeOption>,\n    readonly config: CascadeConfig,\n    readonly parent?: Node,\n    readonly root = false\n  ) {\n    const { value: valueKey, label: labelKey, children: childrenKey } = config\n\n    const childrenData = data[childrenKey] as ChildrenData\n    const pathNodes = calculatePathNodes(this)\n\n    this.level = root ? 0 : parent ? parent.level + 1 : 1\n    this.value = data[valueKey] as CascadeNodeValue\n    this.label = data[labelKey] as string\n    this.pathNodes = pathNodes\n    this.pathValues = pathNodes.map(node => node.value)\n    this.pathLabels = pathNodes.map(node => node.label)\n    this.childrenData = childrenData\n    this.children = (childrenData || []).map(\n      child => new Node(child, config, this)\n    )\n    this.loaded = !config.lazy || this.isLeaf || !isEmpty(childrenData)\n  }\n\n  get isDisabled(): boolean {\n    const { data, parent, config } = this\n    const { disabled, checkStrictly } = config\n    const isDisabled = isFunction(disabled)\n      ? disabled(data, this)\n      : !!data[disabled]\n    return isDisabled || (!checkStrictly && parent?.isDisabled)\n  }\n\n  get isLeaf(): boolean {\n    const { data, config, childrenData, loaded } = this\n    const { lazy, leaf } = config\n    const isLeaf = isFunction(leaf) ? leaf(data, this) : data[leaf]\n\n    return isUndefined(isLeaf)\n      ? lazy && !loaded\n        ? false\n        : !(Array.isArray(childrenData) && childrenData.length)\n      : !!isLeaf\n  }\n\n  get valueByOption() {\n    return this.config.emitPath ? this.pathValues : this.value\n  }\n  get labelByOption() {\n    return this.config.emitPath ? this.pathLabels : this.label\n  }\n  get nodeByOption() {\n    return this.config.emitPath\n      ? this.pathNodes.map(node => node.data)\n      : this.data\n  }\n\n  appendChild(childData: CascadeOption) {\n    const { childrenData, children } = this\n    const node = new Node(childData, this.config, this)\n\n    if (Array.isArray(childrenData)) {\n      childrenData.push(childData)\n    } else {\n      this.childrenData = [childData]\n    }\n\n    children.push(node)\n\n    return node\n  }\n\n  calcText(allLevels: boolean, separator: string) {\n    const text = allLevels ? this.pathLabels.join(separator) : this.label\n    this.text = text\n    return text\n  }\n\n  broadcast(event: string, ...args: unknown[]) {\n    const handlerName = `onParent${capitalize(event)}`\n    this.children.forEach(child => {\n      if (child) {\n        // bottom up\n        child.broadcast(event, ...args)\n        child[handlerName] && child[handlerName](...args)\n      }\n    })\n  }\n\n  emit(event: string, ...args: unknown[]) {\n    const { parent } = this\n    const handlerName = `onChild${capitalize(event)}`\n    if (parent) {\n      parent[handlerName] && parent[handlerName](...args)\n      parent.emit(event, ...args)\n    }\n  }\n\n  onParentCheck(checked: boolean) {\n    if (!this.isDisabled) {\n      this.setCheckState(checked)\n    }\n  }\n\n  onChildCheck() {\n    const { children } = this\n    const validChildren = children.filter(child => !child.isDisabled)\n    const checked = validChildren.length\n      ? validChildren.every(child => child.checked)\n      : false\n\n    this.setCheckState(checked)\n  }\n\n  setCheckState(checked: boolean) {\n    const totalNum = this.children.length\n    const checkedNum = this.children.reduce((c, p) => {\n      const num = p.checked ? 1 : p.indeterminate ? 0.5 : 0\n      return c + num\n    }, 0)\n\n    this.checked =\n      this.loaded &&\n      this.children.every(child => child.loaded && child.checked) &&\n      checked\n    this.indeterminate =\n      this.loaded && checkedNum !== totalNum && checkedNum > 0\n  }\n\n  doCheck(checked: boolean) {\n    if (this.checked === checked) return\n\n    const { checkStrictly, multiple } = this.config\n    if (checkStrictly || !multiple) {\n      this.checked = checked\n    } else {\n      // bottom up to unify the calculation of the indeterminate state\n      this.broadcast('check', checked)\n      this.setCheckState(checked)\n      this.emit('check')\n    }\n  }\n}\n\nexport default Node\n"],"names":["ExpandTrigger"],"mappings":"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"}