{"version":3,"file":"CompositePanel.jsx","sourceRoot":"lib/","sources":["panels/CompositePanel.tsx"],"names":[],"mappings":"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","sourcesContent":["import { isValid } from '@designable/shared'\nimport cls from 'classnames'\nimport { IconWidget, TextWidget } from '../widgets'\nimport { usePrefix } from '../hooks'\nimport { composeExport } from '@jeamn/formily-components/src/__builtins__'\nimport { FragmentComponent, VueComponent } from '@formily/vue'\nimport {\n  defineComponent,\n  getCurrentInstance,\n  ref,\n  unref,\n  watch,\n  VNode,\n  markRaw\n} from 'vue-demi'\n\nexport interface ICompositePanelProps {\n  direction?: 'left' | 'right'\n  showNavTitle?: boolean\n  defaultOpen?: boolean\n  defaultPinning?: boolean\n  defaultActiveKey?: number\n  activeKey?: number | string\n  onChange?: (activeKey: number | string) => void\n}\nexport interface ICompositePanelItemProps {\n  shape?: 'tab' | 'button' | 'link'\n  title?: VNode\n  icon?: VNode\n  key?: number | string\n  href?: string\n  // React.MouseEvent<HTMLDivElement, MouseEvent>\n  onClick?: (e: MouseEvent) => void\n  extra?: VNode\n}\n\nconst parseItems = (children: VNode[]): Array<any> => {\n  const items: any[] = []\n  children.forEach((item, index) => {\n    items.push({\n      key: item.key ?? index,\n      ...item?.props,\n      children: item\n    })\n  })\n  return items\n}\n\nconst findItem = (items: any[], key: string | number) => {\n  for (let index = 0; index < items.length; index++) {\n    const item = items[index]\n    if (key === index) return item\n    if (key === item.key) return item\n  }\n}\n\nconst getDefaultKey = (children: VNode[]) => {\n  const items = parseItems(children)\n  return items?.[0]?.key\n}\n// : VueComponent<ICompositePanelProps>\nexport const CompositePanelComponent =\n  defineComponent({\n    name: 'CompositePanel',\n    props: {\n      activeKey: [Number, String],\n      defaultActiveKey: Number,\n      defaultPinning: Boolean,\n      showNavTitle: Boolean,\n      defaultOpen: { type: Boolean, default: true },\n      direction: String,\n      onChange: Function,\n    },\n    setup(props, { slots }) {\n      // : VueComponent<ICompositePanelProps>\n      const prefixRef = usePrefix('composite-panel')\n\n      const children = slots.default?.()\n\n      const activeKey = ref(\n        props.defaultActiveKey ??\n        getDefaultKey(children as unknown as VNode[])\n      )\n\n      // 获取所有子组件\n      const items = parseItems(children as unknown as VNode[])\n      const pinning = ref(props.defaultPinning ?? false)\n      const visible = ref(props.defaultOpen ?? true)\n\n      watch(\n        () => props.activeKey,\n        () => {\n          if (isValid(props.activeKey)) {\n            if (props.activeKey !== activeKey.value) {\n              activeKey.value = props.activeKey\n            }\n          }\n        },\n        { immediate: true }\n      )\n\n      const renderContent = () => {\n        const prefix = unref(prefixRef)\n        const currentItem = findItem(items, unref(activeKey))\n        const content = currentItem?.children\n        if (!unref(visible) || !content) return\n        return (\n          <div\n            class={cls(prefix + '-tabs-content', {\n              pinning: unref(pinning),\n            })}\n          >\n            <div class={prefix + '-tabs-header'}>\n              <div class={prefix + '-tabs-header-title'}>\n                <TextWidget>{currentItem.title}</TextWidget>\n              </div>\n              <div class={prefix + '-tabs-header-actions'}>\n                <div class={prefix + '-tabs-header-extra'}>\n                  {currentItem?.extra}\n                </div>\n                {!pinning.value ?\n                  (\n                    <IconWidget\n                      key={prefix + '-tabs-header-pin'}\n                      class={prefix + '-tabs-header-pin'}\n                      infer='PushPinOutlined'\n                      onClick={() => {\n                        pinning.value = !pinning.value\n                      }}\n                    />\n                  ) :\n                  <IconWidget\n                    key={prefix + '-tabs-header-pin-filled'}\n                    class={prefix + '-tabs-header-pin-filled'}\n                    infer='PushPinFilled'\n                    onClick={() => {\n                      pinning.value = !pinning.value\n                    }}\n                  />}\n                <IconWidget\n                  class={prefix + '-tabs-header-close'}\n                  infer='Close'\n                  onClick={() => {\n                    visible.value = false\n                  }}\n                />\n              </div>\n            </div>\n            <div class={prefix + '-tabs-body'} key={unref(activeKey)}>{content}</div>\n          </div>\n        )\n      }\n\n      return () => {\n        const prefix = unref(prefixRef)\n        return (\n          <div\n            class={cls(prefix, {\n              [`direction-${props.direction}`]: !!props.direction,\n            })}\n          >\n            <div class={prefix + '-tabs'}>\n              {items.map((item, index) => {\n                const takeTab = () => {\n                  if (item.href) {\n                    return <a href={item.href}>{item.icon}</a>\n                  }\n                  return (\n                    <IconWidget\n                      tooltip={\n                        props.showNavTitle\n                          ? null\n                          : {\n                            content: markRaw(<TextWidget>{item.title}</TextWidget>),\n                            placement:\n                              props.direction === 'right' ? 'left' : 'right',\n                          }\n                      }\n                      infer={item.icon}\n                    />\n                  )\n                }\n                const shape = item.shape ?? 'tab'\n                const Comp = shape === 'link' ? 'a' : 'div'\n                return (\n                  <Comp\n                    key={index}\n                    href={item.href}\n                    class={cls(prefix + '-tabs-pane', {\n                      active: unref(activeKey) === item.key,\n                    })}\n                    onClick={(e: MouseEvent) => {\n                      if (shape === 'tab') {\n                        if (unref(activeKey) === item.key) {\n                          visible.value = !visible.value\n                        } else {\n                          visible.value = true\n                        }\n                        if (!props?.activeKey || !props?.onChange)\n                          activeKey.value = item.key\n                      }\n                      item.onClick?.(e)\n                      props.onChange?.(item.key as string)\n                    }}\n                  >\n                    {takeTab()}\n                    {props.showNavTitle && item.title ? (\n                      <div class={prefix + '-tabs-pane-title'}>\n                        <TextWidget>{item.title}</TextWidget>\n                      </div>\n                    ) : null}\n                  </Comp>\n                )\n              })}\n            </div>\n            {renderContent()}\n          </div>\n        )\n      }\n    },\n  })\n\n/**\n *  shape?: 'tab' | 'button' | 'link'\n    title?: VNode\n    icon?: VNode\n    key?: number | string\n    href?: string\n    // React.MouseEvent<HTMLDivElement, MouseEvent>\n    onClick?: (e: any) => void\n    extra?: VNode\n */\nconst Item = defineComponent({\n  name: 'CompositePanel.Item',\n  // key is reserved\n  props: ['shape', 'title', 'icon', 'href', 'extra', 'onClick'],\n  setup(props, { slots }) {\n    return () => {\n      return (\n        slots.default?.()\n      )\n    }\n  },\n})\n// : VueComponent<ICompositePanelProps> & {\n//   Item: VueComponent<ICompositePanelItemProps>\n// }\nexport const CompositePanel = composeExport(CompositePanelComponent, {\n  Item: composeExport(Item, { type: Item }),\n})\n"]}