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