{"version":3,"file":"page.mjs","sources":["../../../../../packages/components/page/src/page.tsx"],"sourcesContent":["import { ElGrid } from '@element-ultra/components/grid'\nimport { ElButton } from '@element-ultra/components/button'\nimport ElNodeRender from '@element-ultra/components/node-render'\nimport { ElScrollbar } from '@element-ultra/components/scrollbar'\nimport type { ElMultipleForm } from '@element-ultra/components/multiple-form'\nimport { useNamespace } from '@element-ultra/hooks'\nimport {\n  cloneVNode,\n  defineComponent,\n  getCurrentInstance,\n  isVNode,\n  provide,\n  shallowRef,\n  type VNode,\n  type VNodeArrayChildren\n} from 'vue'\nimport { formInjectionKey, type FormExposed } from '@element-ultra/tokens'\nimport { isFragment, isTemplate } from '@element-ultra/utils'\nimport type { Router } from 'vue-router'\nimport { debounce } from 'lodash'\n\ntype MultipleFormInst = InstanceType<typeof ElMultipleForm>\n\nexport interface PageExposed {\n  /** 校验表单 */\n  validate: () => Promise<boolean>\n}\n\nexport default defineComponent({\n  name: 'ElPage',\n\n  props: {\n    /** 隐藏底部 */\n    hideFooter: {\n      type: Boolean\n    },\n    /** 隐藏右侧导航 */\n    hideNav: {\n      type: Boolean\n    }\n  },\n\n  setup(props, { attrs, slots, expose }) {\n    const ns = useNamespace('page')\n\n    const currentNavIndex = shallowRef(0)\n\n    const instance = getCurrentInstance()!\n    const router = instance.appContext.config.globalProperties.$router as Router\n    const handleBack = () => {\n      if (router) {\n        router.go(-1)\n      } else {\n        console.warn(\n          '当前环境下没有使用路由,详情请查看https://router.vuejs.org/zh/'\n        )\n      }\n    }\n\n    /** 获取默认插槽 */\n    const getDefaultSlots = () => {\n      let defaultNodes = slots.default?.() || []\n      let navList: string[] = []\n      let children: VNode[] = []\n\n      const isCard = (node: VNode) => {\n        const { type } = node\n        return typeof type === 'object' && (type as any).name === 'ElCard'\n      }\n\n      //  ns.em('card-item', 'hidden')\n      const cardItemClass = [ns.e('card-item')]\n\n      function recursive(nodeList: VNodeArrayChildren) {\n        nodeList.forEach(node => {\n          if (!isVNode(node)) return\n\n          if (isFragment(node) || isTemplate(node)) {\n            Array.isArray(node.children) && recursive(node.children)\n            return\n          }\n\n          if (isCard(node)) {\n            const { header } = node.props || {}\n\n            if (header) {\n              children.push(\n                cloneVNode(node, {\n                  'data-index': navList.length,\n                  class: cardItemClass\n                })\n              )\n              navList.push(header)\n            } else {\n              children.push(node)\n            }\n          } else {\n            children.push(node)\n          }\n        })\n      }\n\n      recursive(defaultNodes)\n      return {\n        navList,\n        children\n      }\n    }\n\n    // 索引的优先级应该以点击为准， 每次点击建立一个点击锁，observer触发后首先要先解锁\n    let clicked = false\n    const handleClickNavItem = (nav: string, n: number) => {\n      navTo(nav)\n      clicked = true\n      currentNavIndex.value = n\n    }\n\n    // 当滚动停止时表示滚动完成\n    const onScrollStopped = debounce((rect: any) => {\n      if (clicked) {\n        clicked = false\n      }\n      const pageDom = pageRef.value.$el as HTMLElement\n      if (!pageDom) return\n\n      // const pageRect = pageDom.getBoundingClientRect()\n\n      // const cards = Array.prototype.slice.call(\n      //   pageDom.getElementsByClassName('el-page__card-item'),\n      //   0\n      // )\n\n      // cards.forEach(card => {\n      //   console.log(card.getBoundingClientRect())\n      // })\n    }, 200)\n\n    const pageRef = shallowRef()\n\n    // 用来监听el-card\n    // const observer = new IntersectionObserver(entries => {\n\n    // entries.forEach(entry => {\n    //   const { target, intersectionRatio } = entry\n    //   if (intersectionRatio > 0 && target.classList.contains(hiddenClass)) {\n    //     target.classList.remove(hiddenClass)\n    //   }\n    // })\n    // // 对于点击定位, 点击中的位置不进行更新\n    // if (clicked) return\n    // const entry = entries[0]\n    // // intersectionRatio > 0表示在视口中开始出现\n    // if (!entry || entry.intersectionRatio === 0) return\n    // currentNavIndex.value = Number(\n    //   entry.target.getAttribute('data-index') || 0\n    // )\n    // })\n\n    // onMounted(() => {\n    //   pageRef.value.$el && observer.observe(pageRef.value.$el)\n    // })\n\n    const exposedFormList = new Set<FormExposed>()\n    const exposedMultipleFormList = new Set<MultipleFormInst>()\n\n    // 注入给form使用\n    provide(formInjectionKey, {\n      addForm(formExposed: FormExposed) {\n        exposedFormList.add(formExposed)\n      },\n      deleteForm(formExposed: FormExposed) {\n        exposedFormList.delete(formExposed)\n      },\n      addMultipleForm(form: MultipleFormInst) {\n        exposedMultipleFormList.add(form)\n      },\n      deleteMultipleForm(form: MultipleFormInst) {\n        exposedMultipleFormList.delete(form)\n      }\n    })\n\n    /** 当前处于定位中的dom */\n    let currentDom: HTMLElement | null = null\n\n    /** 跳转至 */\n    const navTo = (nav: string) => {\n      let dom = document.getElementById(nav)\n      if (!dom) return\n      const cls = ns.em('card-item', 'blink')\n      currentDom?.classList.remove(cls)\n\n      currentDom = dom\n      dom.scrollIntoView({\n        behavior: 'smooth',\n        block: 'start'\n      })\n      dom.classList.add(cls)\n    }\n\n    /** 校验所有的表单和多行表单 */\n    const validate = async () => {\n      for (const form of exposedFormList) {\n        await form.validate()\n      }\n      for (const form of exposedMultipleFormList) {\n        await form.validate()\n      }\n\n      return true\n    }\n\n    expose({\n      validate\n    } as PageExposed)\n\n    return () => {\n      const { children, navList } = getDefaultSlots()\n      let hasNav = !!navList.length && !props.hideNav\n      return (\n        <ElGrid\n          {...attrs}\n          class={ns.b()}\n          ref={pageRef}\n          rows='100%'\n          gap='0'\n          cols={`minmax(0, 1fr) ${hasNav ? '100px' : '0'}`}\n        >\n          <div class={ns.e('main')}>\n            <ElScrollbar\n              style={{\n                height: props.hideFooter ? '100%' : 'calc(100% - 40px)'\n              }}\n              class={ns.e('content')}\n              onScroll={onScrollStopped}\n            >\n              <ElNodeRender nodes={children} />\n            </ElScrollbar>\n\n            {props.hideFooter ? null : (\n              <section class={ns.e('footer')}>\n                {slots.back?.() || (\n                  <ElButton onClick={handleBack}>返回</ElButton>\n                )}\n\n                <div>{slots.footer?.()}</div>\n              </section>\n            )}\n          </div>\n\n          {hasNav ? (\n            <ul class={[ns.e('aside'), ns.e('nav')]}>\n              {navList.map((nav, index) => {\n                return (\n                  <li\n                    class={ns.is('active', currentNavIndex.value === index)}\n                    key='nav'\n                    onClick={() => handleClickNavItem(nav, index)}\n                  >\n                    {nav}\n                  </li>\n                )\n              })}\n            </ul>\n          ) : null}\n        </ElGrid>\n      )\n    }\n  }\n})\n"],"names":["name","props","hideFooter","type","Boolean","hideNav","setup","attrs","slots","expose","ns","useNamespace","currentNavIndex","shallowRef","instance","getCurrentInstance","router","appContext","config","globalProperties","$router","handleBack","go","console","warn","getDefaultSlots","defaultNodes","default","navList","children","isCard","node","cardItemClass","e","recursive","nodeList","forEach","isVNode","isFragment","isTemplate","Array","isArray","header","push","cloneVNode","length","class","clicked","handleClickNavItem","nav","n","navTo","value","onScrollStopped","debounce","rect","pageDom","pageRef","$el","exposedFormList","Set","exposedMultipleFormList","provide","formInjectionKey","addForm","formExposed","add","deleteForm","delete","addMultipleForm","form","deleteMultipleForm","currentDom","dom","document","getElementById","cls","em","classList","remove","scrollIntoView","behavior","block","validate","hasNav","_createVNode","ElGrid","_mergeProps","b","ElScrollbar","height","ElNodeRender","back","ElButton","_createTextVNode","footer","map","index","is","onClick"],"mappings":"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"}