| | |
| | | <template> |
| | | <PageWrapper :class="`${prefixCls}`" dense contentFullHeight fixedHeight> |
| | | |
| | | <Splitpanes class="default-theme" :push-other-panes="false" style="height: 100%"> |
| | | <Pane min-size="12" size="12"> |
| | | <LeftNav></LeftNav> |
| | | </Pane> |
| | | <Pane min-size="50" size="88" > |
| | | <ScrollContainer class="p-4"> |
| | | <Editor></Editor> |
| | | </ScrollContainer> |
| | | </Pane> |
| | | <!-- <Pane min-size="5" size="15">右</Pane> --> |
| | | </Splitpanes> |
| | | </PageWrapper> |
| | | |
| | | <template> |
| | | <div> |
| | | <a-layout class="default-theme" style="display: flex; height: 100%; background-color: #fff"> |
| | | <a-layout-sider width="250" style="border-inline-end: 1px solid rgb(5 5 5 / 6%)" :style="siderStyle" v-show="collapseStore.isOpen"> |
| | | <LeftNav></LeftNav> |
| | | </a-layout-sider> |
| | | <a-layout> |
| | | <a-layout-content :style="contentStyle"> |
| | | <RouterView> |
| | | <template #default="{ Component, route }"> |
| | | <transition |
| | | :name=" |
| | | getTransitionName({ |
| | | route, |
| | | openCache, |
| | | enableTransition: getEnableTransition, |
| | | cacheTabs: getCaches, |
| | | def: getBasicTransition, |
| | | }) |
| | | " |
| | | mode="out-in" |
| | | appear |
| | | > |
| | | <keep-alive v-if="openCache" :include="getCaches"> |
| | | <component :is="Component" :key="route.fullPath" /> |
| | | </keep-alive> |
| | | <component v-else :is="Component" :key="route.fullPath" /> |
| | | </transition> |
| | | </template> |
| | | </RouterView> |
| | | </a-layout-content> |
| | | </a-layout> |
| | | </a-layout> |
| | | <div @click="fuToggleContent(!collapseStore.isOpen)" class="toggle-btn" :class="collapseStore.isOpen ? 'iconOpen' : 'onIconOpen'"> |
| | | <LeftOutlined v-if="collapseStore.isOpen" /> |
| | | <RightOutlined v-else /> |
| | | </div> |
| | | <FrameLayout v-if="getCanEmbedIFramePage" /> |
| | | </div> |
| | | </template> |
| | | |
| | | <script lang="ts" setup> |
| | | import {PageWrapper} from '@/components/Page'; |
| | | import {onMounted} from 'vue'; |
| | | import {useDesign} from "@/hooks/web/useDesign"; |
| | | import {Splitpanes, Pane} from 'splitpanes'; |
| | | import 'splitpanes/dist/splitpanes.css'; |
| | | import LeftNav from './components/LeftNav.vue'; |
| | | import Editor from './components/Editor.vue'; |
| | | import ScrollContainer from "@/components/Container/src/ScrollContainer.vue"; |
| | | import { PageWrapper } from '@/components/Page'; |
| | | import { LeftOutlined, RightOutlined } from '@ant-design/icons-vue'; |
| | | import LeftNav from '@/views/email/components/LeftNav.vue'; |
| | | import { computed, unref, ref } from 'vue'; |
| | | |
| | | onMounted(() => { |
| | | Logger.log('Hello, Logger!1'); |
| | | }); |
| | | const {prefixCls} = useDesign('email'); |
| | | import FrameLayout from '@/layouts/iframe/index.vue'; |
| | | |
| | | </script> |
| | | import { useRootSetting } from '@/hooks/setting/useRootSetting'; |
| | | |
| | | <style lang="less" scoped> |
| | | @prefix-cls: ~'@{namespace}-email'; |
| | | .@{prefix-cls} { |
| | | .splitpanes__pane { |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | background-color: var(--component-background-color) |
| | | import { useTransitionSetting } from '@/hooks/setting/useTransitionSetting'; |
| | | import { useMultipleTabSetting } from '@/hooks/setting/useMultipleTabSetting'; |
| | | |
| | | import { useMultipleTabStore } from '@/store/modules/multipleTab'; |
| | | |
| | | defineOptions({ name: 'PageLayout' }); |
| | | import type { FunctionalComponent } from 'vue'; |
| | | import type { RouteLocation } from 'vue-router'; |
| | | |
| | | export interface DefaultContext { |
| | | Component: FunctionalComponent & { type: Recordable }; |
| | | route: RouteLocation; |
| | | } |
| | | } |
| | | const siderStyle = { |
| | | lineHeight: '120px', |
| | | backgroundColor:'#fff', |
| | | }; |
| | | const contentStyle = { |
| | | lineHeight: '120px', |
| | | backgroundColor:'#fff', |
| | | |
| | | }; |
| | | function getTransitionName({ |
| | | route, |
| | | openCache, |
| | | cacheTabs, |
| | | enableTransition, |
| | | def, |
| | | }: Pick<DefaultContext, 'route'> & { |
| | | enableTransition: boolean; |
| | | openCache: boolean; |
| | | def: string; |
| | | cacheTabs: string[]; |
| | | }): string | undefined { |
| | | if (!enableTransition) { |
| | | return undefined; |
| | | } |
| | | |
| | | const isInCache = cacheTabs.includes(route.name as string); |
| | | const transitionName = 'fade-slide'; |
| | | let name: string | undefined = transitionName; |
| | | |
| | | if (openCache) { |
| | | name = isInCache && route.meta.loaded ? transitionName : undefined; |
| | | } |
| | | return name || (route.meta.transitionName as string) || def; |
| | | } |
| | | |
| | | const { getShowMultipleTab } = useMultipleTabSetting(); |
| | | const tabStore = useMultipleTabStore(); |
| | | |
| | | const { getOpenKeepAlive, getCanEmbedIFramePage } = useRootSetting(); |
| | | |
| | | const { getBasicTransition, getEnableTransition } = useTransitionSetting(); |
| | | |
| | | const openCache = computed(() => unref(getOpenKeepAlive) && unref(getShowMultipleTab)); |
| | | |
| | | const getCaches = computed((): string[] => { |
| | | if (!unref(getOpenKeepAlive)) { |
| | | return []; |
| | | } |
| | | return tabStore.getCachedTabList; |
| | | }); |
| | | import { useDesign } from '@/hooks/web/useDesign'; |
| | | |
| | | const { prefixCls } = useDesign('email'); |
| | | |
| | | |
| | | import { useCollapseStore } from '@/store/modules/useCollapseStore'; |
| | | const collapseStore = useCollapseStore(); |
| | | function fuToggleContent(is) { |
| | | collapseStore.toggle(is); |
| | | } |
| | | </script> |
| | | <style lang="less" scoped> |
| | | @prefix-cls: ~'@{namespace}-email'; |
| | | .@{prefix-cls} { |
| | | .splitpanes__pane { |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | background-color: #fff; |
| | | } |
| | | } |
| | | |
| | | |
| | | .toggle-btn { |
| | | display: flex; |
| | | position: absolute; |
| | | z-index: 99; |
| | | top: 45%; |
| | | width: 20px; /* 原始宽度 */ |
| | | height: 54px; |
| | | transform: translateY(-50%); |
| | | border-left: none; |
| | | border-radius: 0 10px 10px 0; |
| | | background: #dfe1e5; |
| | | } |
| | | |
| | | .onOpen { |
| | | width: 86vw; |
| | | } |
| | | |
| | | .isOpen { |
| | | width: 100vw; |
| | | } |
| | | |
| | | .iconOpen { |
| | | left: 250px; |
| | | } |
| | | |
| | | .onIconOpen { |
| | | left: 0%; |
| | | } |
| | | </style> |