2个文件已删除
4个文件已添加
45个文件已修改
1 文件已重命名
| | |
| | | .js: kebab-case | PascalCase |
| | | .vue: PascalCase | regex:^index |
| | | .ts: camelCase | PascalCase |
| | | .tsx: camelCase | PascalCase |
| | | .d.ts: kebab-case |
| | | .mock.ts: kebab-case |
| | | .data.ts: camelCase | kebab-case |
| | |
| | | :locale="antConfigLocale" |
| | | :transform-cell-text="transformCellText" |
| | | > |
| | | <router-view /> |
| | | <AppProvider> |
| | | <router-view /> |
| | | </AppProvider> |
| | | </ConfigProvider> |
| | | </template> |
| | | |
| | |
| | | import { useLockPage } from '/@/hooks/web/useLockPage'; |
| | | import { useLocale } from '/@/hooks/web/useLocale'; |
| | | |
| | | import { AppProvider } from '/@/components/Application'; |
| | | |
| | | export default defineComponent({ |
| | | name: 'App', |
| | | components: { ConfigProvider }, |
| | | components: { ConfigProvider, AppProvider }, |
| | | setup() { |
| | | // Initialize vuex internal system configuration |
| | | initAppConfigStore(); |
| | |
| | | import AppLocalePickerLib from './src/AppLocalePicker.vue'; |
| | | import AppLogoLib from './src/AppLogo.vue'; |
| | | import AppLocalePicker from './src/AppLocalePicker.vue'; |
| | | import AppLogo from './src/AppLogo.vue'; |
| | | import AppProvider from './src/AppProvider.vue'; |
| | | import { withInstall } from '../util'; |
| | | |
| | | export const AppLocalePicker = withInstall(AppLocalePickerLib); |
| | | export const AppLogo = withInstall(AppLogoLib); |
| | | withInstall(AppLocalePicker, AppLogo, AppProvider); |
| | | |
| | | export { useAppProviderContext } from './src/useAppContext'; |
| | | |
| | | export { AppLocalePicker, AppLogo, AppProvider }; |
| | |
| | | }); |
| | | </script> |
| | | |
| | | <style lang="less"> |
| | | .app-locale-picker-overlay { |
| | | <style lang="less" scoped> |
| | | :global(.app-locale-picker-overlay) { |
| | | .ant-dropdown-menu-item { |
| | | min-width: 160px; |
| | | } |
| | |
| | | --> |
| | | <template> |
| | | <div |
| | | class="app-logo anticon" |
| | | :class="{ theme, 'collapsed-show-title': getCollapsedShowTitle }" |
| | | class="anticon" |
| | | :class="[prefixCls, theme, { 'collapsed-show-title': getCollapsedShowTitle }]" |
| | | @click="handleGoHome" |
| | | > |
| | | <img src="/@/assets/images/logo.png" /> |
| | | <div class="app-logo__title ml-2 ellipsis" v-show="showTitle">{{ globSetting.title }}</div> |
| | | <div class="ml-2 ellipsis" :class="[`${prefixCls}__title`]" v-show="showTitle"> |
| | | {{ globSetting.title }} |
| | | </div> |
| | | </div> |
| | | </template> |
| | | <script lang="ts"> |
| | |
| | | |
| | | import { propTypes } from '/@/utils/propTypes'; |
| | | |
| | | import { useDesign } from '/@/hooks/web/useDesign'; |
| | | |
| | | export default defineComponent({ |
| | | name: 'AppLogo', |
| | | props: { |
| | |
| | | showTitle: propTypes.bool.def(true), |
| | | }, |
| | | setup() { |
| | | const { prefixCls } = useDesign('app-logo'); |
| | | |
| | | const { getCollapsedShowTitle } = useMenuSetting(); |
| | | |
| | | const globSetting = useGlobSetting(); |
| | |
| | | handleGoHome, |
| | | globSetting, |
| | | getCollapsedShowTitle, |
| | | prefixCls, |
| | | }; |
| | | }, |
| | | }); |
| | | </script> |
| | | <style lang="less" scoped> |
| | | @import (reference) '../../../design/index.less'; |
| | | @prefix-cls: ~'@{namespace}-app-logo'; |
| | | |
| | | .app-logo { |
| | | .@{prefix-cls} { |
| | | display: flex; |
| | | align-items: center; |
| | | padding-left: 10px; |
| | | padding-left: 12px; |
| | | cursor: pointer; |
| | | |
| | | &.collapsed-show-title { |
New file |
| | |
| | | <template> |
| | | <slot /> |
| | | </template> |
| | | <script lang="ts"> |
| | | import type { PropType } from 'vue'; |
| | | import { defineComponent, toRefs } from 'vue'; |
| | | |
| | | import { createAppProviderContext } from './useAppContext'; |
| | | export default defineComponent({ |
| | | name: 'AppProvider', |
| | | inheritAttrs: false, |
| | | props: { |
| | | prefixCls: { |
| | | type: String as PropType<string>, |
| | | default: 'vben', |
| | | }, |
| | | }, |
| | | setup(props) { |
| | | const { prefixCls } = toRefs(props); |
| | | createAppProviderContext({ prefixCls }); |
| | | return {}; |
| | | }, |
| | | }); |
| | | </script> |
New file |
| | |
| | | import { InjectionKey, Ref } from 'vue'; |
| | | import { createContext, useContext } from '/@/hooks/core/useContext'; |
| | | |
| | | export interface AppProviderContextProps { |
| | | prefixCls: Ref<string>; |
| | | } |
| | | |
| | | const key: InjectionKey<AppProviderContextProps> = Symbol(); |
| | | |
| | | export function createAppProviderContext(context: AppProviderContextProps) { |
| | | return createContext<AppProviderContextProps>(context, key); |
| | | } |
| | | |
| | | export function useAppProviderContext() { |
| | | return useContext<AppProviderContextProps>(key); |
| | | } |
| | |
| | | import AuthorityLib from './src/index.vue'; |
| | | import Authority from './src/index.vue'; |
| | | |
| | | import { withInstall } from '../util'; |
| | | |
| | | export const Authority = withInstall(AuthorityLib); |
| | | withInstall(Authority); |
| | | |
| | | export { Authority }; |
| | |
| | | import BasicArrowLib from './src/BasicArrow.vue'; |
| | | import BasicHelpLib from './src/BasicHelp.vue'; |
| | | import BasicTitleLib from './src/BasicTitle.vue'; |
| | | import BasicArrow from './src/BasicArrow.vue'; |
| | | import BasicHelp from './src/BasicHelp.vue'; |
| | | import BasicTitle from './src/BasicTitle.vue'; |
| | | |
| | | import { withInstall } from '../util'; |
| | | |
| | | export const BasicArrow = withInstall(BasicArrowLib); |
| | | export const BasicHelp = withInstall(BasicHelpLib); |
| | | export const BasicTitle = withInstall(BasicTitleLib); |
| | | withInstall(BasicArrow, BasicHelp, BasicTitle); |
| | | |
| | | export { BasicArrow, BasicHelp, BasicTitle }; |
| | |
| | | import ButtonLib from './src/BasicButton.vue'; |
| | | import Button from './src/BasicButton.vue'; |
| | | import { withInstall } from '../util'; |
| | | |
| | | export const Button = withInstall(ButtonLib); |
| | | withInstall(Button); |
| | | |
| | | export { Button }; |
| | |
| | | import ClickOutSideLib from './src/index.vue'; |
| | | import ClickOutSide from './src/index.vue'; |
| | | import { withInstall } from '../util'; |
| | | |
| | | export const ClickOutSide = withInstall(ClickOutSideLib); |
| | | withInstall(ClickOutSide); |
| | | |
| | | export { ClickOutSide }; |
| | |
| | | import ScrollContainerLib from './src/ScrollContainer.vue'; |
| | | import CollapseContainerLib from './src/collapse/CollapseContainer.vue'; |
| | | import LazyContainerLib from './src/LazyContainer.vue'; |
| | | import ScrollContainer from './src/ScrollContainer.vue'; |
| | | import CollapseContainer from './src/collapse/CollapseContainer.vue'; |
| | | import LazyContainer from './src/LazyContainer.vue'; |
| | | import { withInstall } from '../util'; |
| | | |
| | | withInstall(ScrollContainer, CollapseContainer, LazyContainer); |
| | | |
| | | export * from './src/types'; |
| | | |
| | | export const ScrollContainer = withInstall(ScrollContainerLib); |
| | | export const CollapseContainer = withInstall(CollapseContainerLib); |
| | | export const LazyContainer = withInstall(LazyContainerLib); |
| | | export { ScrollContainer, CollapseContainer, LazyContainer }; |
| | |
| | | // Transform vue-count-to to support vue3 version |
| | | |
| | | import CountToLib from './src/index.vue'; |
| | | import CountTo from './src/index.vue'; |
| | | import { withInstall } from '../util'; |
| | | |
| | | export const CountTo = withInstall(CountToLib); |
| | | withInstall(CountTo); |
| | | export { CountTo }; |
| | |
| | | import DescriptionLib from './src/index'; |
| | | import Description from './src/index'; |
| | | |
| | | import { withInstall } from '../util'; |
| | | |
| | | withInstall(Description); |
| | | |
| | | export * from './src/types'; |
| | | export { useDescription } from './src/useDescription'; |
| | | |
| | | export const Description = withInstall(DescriptionLib); |
| | | export { Description }; |
| | |
| | | import BasicDrawerLib from './src/BasicDrawer'; |
| | | import BasicDrawer from './src/BasicDrawer'; |
| | | import { withInstall } from '../util'; |
| | | |
| | | withInstall(BasicDrawer); |
| | | export * from './src/types'; |
| | | export { useDrawer, useDrawerInner } from './src/useDrawer'; |
| | | export const BasicDrawer = withInstall(BasicDrawerLib); |
| | | export { BasicDrawer }; |
| | |
| | | import DropdownLib from './src/Dropdown'; |
| | | import Dropdown from './src/Dropdown'; |
| | | import { withInstall } from '../util'; |
| | | |
| | | withInstall(Dropdown); |
| | | export * from './src/types'; |
| | | |
| | | export const Dropdown = withInstall(DropdownLib); |
| | | export { Dropdown }; |
| | |
| | | import ImportExcelLib from './src/ImportExcel.vue'; |
| | | import ExportExcelModelLib from './src/ExportExcelModel.vue'; |
| | | import ImportExcel from './src/ImportExcel.vue'; |
| | | import ExportExcelModel from './src/ExportExcelModel.vue'; |
| | | |
| | | import { withInstall } from '../util'; |
| | | |
| | | withInstall(ImportExcel, ExportExcelModel); |
| | | |
| | | export * from './src/types'; |
| | | |
| | | export { jsonToSheetXlsx, aoaToSheetXlsx } from './src/Export2Excel'; |
| | | |
| | | export const ImportExcel = withInstall(ImportExcelLib); |
| | | export const ExportExcelModel = withInstall(ExportExcelModelLib); |
| | | export { ImportExcel, ExportExcelModel }; |
| | |
| | | import BasicFormLib from './src/BasicForm.vue'; |
| | | import BasicForm from './src/BasicForm.vue'; |
| | | import { withInstall } from '../util'; |
| | | |
| | | withInstall(BasicForm); |
| | | |
| | | export * from './src/types/form'; |
| | | export * from './src/types/formItem'; |
| | |
| | | export { useComponentRegister } from './src/hooks/useComponentRegister'; |
| | | export { useForm } from './src/hooks/useForm'; |
| | | |
| | | export const BasicForm = withInstall(BasicFormLib); |
| | | export { BasicForm }; |
| | |
| | | import './src/indicator'; |
| | | import LoadingLib from './src/index.vue'; |
| | | import Loading from './src/index.vue'; |
| | | import { withInstall } from '../util'; |
| | | |
| | | withInstall(Loading); |
| | | export { useLoading } from './src/useLoading'; |
| | | export { createLoading } from './src/createLoading'; |
| | | |
| | | export const Loading = withInstall(LoadingLib); |
| | | export { Loading }; |
| | |
| | | import MarkDownLib from './src/index.vue'; |
| | | import MarkDown from './src/index.vue'; |
| | | |
| | | import { withInstall } from '../util'; |
| | | |
| | | withInstall(MarkDown); |
| | | |
| | | export * from './src/types'; |
| | | |
| | | export const MarkDown = withInstall(MarkDownLib); |
| | | export { MarkDown }; |
| | |
| | | import BasicMenuLib from './src/BasicMenu'; |
| | | import BasicMenu from './src/BasicMenu'; |
| | | import { withInstall } from '../util'; |
| | | |
| | | export const BasicMenu = withInstall(BasicMenuLib); |
| | | withInstall(BasicMenu); |
| | | export { BasicMenu }; |
| | |
| | | ComputedRef, |
| | | } from 'vue'; |
| | | import { Menu } from 'ant-design-vue'; |
| | | import SearchInput from './SearchInput.vue'; |
| | | import MenuContent from './MenuContent'; |
| | | // import { ScrollContainer } from '/@/components/Container'; |
| | | |
| | |
| | | |
| | | import { appStore } from '/@/store/modules/app'; |
| | | |
| | | import { useSearchInput } from './hooks/useSearchInput'; |
| | | import { useOpenKeys } from './hooks/useOpenKeys'; |
| | | import { useOpenKeys } from './useOpenKeys'; |
| | | import { useRouter } from 'vue-router'; |
| | | |
| | | import { isFunction } from '/@/utils/is'; |
| | |
| | | emits: ['menuClick'], |
| | | setup(props, { slots, emit }) { |
| | | const currentParentPath = ref(''); |
| | | |
| | | const menuState = reactive<MenuState>({ |
| | | defaultSelectedKeys: [], |
| | | mode: props.mode, |
| | | theme: computed(() => props.theme) as ComputedRef<ThemeEnum>, |
| | | openKeys: [], |
| | | searchValue: '', |
| | | selectedKeys: [], |
| | | collapsedOpenKeys: [], |
| | | }); |
| | | |
| | | const { getCollapsed } = useMenuSetting(); |
| | | |
| | | const { currentRoute } = useRouter(); |
| | | |
| | | const { items, flatItems, isAppMenu, mode, accordion } = toRefs(props); |
| | | |
| | | const { handleInputChange, handleInputClick } = useSearchInput({ |
| | | flatMenusRef: flatItems, |
| | | emit: emit, |
| | | menuState, |
| | | handleMenuChange, |
| | | }); |
| | | const { items, flatItems, mode, accordion } = toRefs(props); |
| | | |
| | | const { handleOpenChange, resetKeys, setOpenKeys } = useOpenKeys( |
| | | menuState, |
| | | items, |
| | | flatItems, |
| | | isAppMenu, |
| | | mode, |
| | | accordion |
| | | ); |
| | | |
| | | const getOpenKeys = computed(() => { |
| | | if (props.isAppMenu) { |
| | | return unref(getCollapsed) ? menuState.collapsedOpenKeys : menuState.openKeys; |
| | | } |
| | | return menuState.openKeys; |
| | | return unref(getCollapsed) ? menuState.collapsedOpenKeys : menuState.openKeys; |
| | | }); |
| | | |
| | | // menu外层样式 |
| | | const getMenuWrapStyle = computed((): any => { |
| | | const { showLogo, search } = props; |
| | | const { showLogo } = props; |
| | | let offset = 0; |
| | | if (search) { |
| | | offset += 54; |
| | | } |
| | | |
| | | if (showLogo) { |
| | | offset += 46; |
| | | } |
| | |
| | | cls.push('basic-menu__sidebar-hor'); |
| | | } |
| | | |
| | | if (!props.isHorizontal && props.isAppMenu && appStore.getProjectConfig.menuSetting.split) { |
| | | if (!props.isHorizontal && appStore.getProjectConfig.menuSetting.split) { |
| | | cls.push('basic-menu__second'); |
| | | } |
| | | return cls; |
| | |
| | | level={index} |
| | | isHorizontal={props.isHorizontal} |
| | | showTitle={unref(showTitle)} |
| | | searchValue={menuState.searchValue} |
| | | />, |
| | | ]} |
| | | </Menu.Item> |
| | |
| | | item={menu} |
| | | level={index} |
| | | isHorizontal={props.isHorizontal} |
| | | searchValue={menuState.searchValue} |
| | | />, |
| | | ], |
| | | default: () => renderMenuItem(menu.children, index + 1), |
| | |
| | | const { selectedKeys, defaultSelectedKeys, mode, theme } = menuState; |
| | | |
| | | const inlineCollapsedObj = isInline |
| | | ? props.isAppMenu |
| | | ? { |
| | | inlineCollapsed: unref(getCollapsed), |
| | | } |
| | | : { inlineCollapsed: props.inlineCollapsed } |
| | | ? { |
| | | inlineCollapsed: unref(getCollapsed), |
| | | } |
| | | : {}; |
| | | return ( |
| | | <Menu |
| | |
| | | ) : ( |
| | | <section class={[`basic-menu-wrap`, !unref(showTitle) && 'hide-title']}> |
| | | {getSlot(slots, 'header')} |
| | | <SearchInput |
| | | class={!props.search ? 'hidden' : ''} |
| | | theme={props.theme as ThemeEnum} |
| | | onChange={handleInputChange} |
| | | onClick={handleInputClick} |
| | | collapsed={unref(getCollapsed)} |
| | | /> |
| | | |
| | | {/* <section style={unref(getMenuWrapStyle)}> */} |
| | | <section style={unref(getMenuWrapStyle)} class="basic-menu__content"> |
| | | {/* <ScrollContainer>{() => renderMenu()}</ScrollContainer> */} |
| | | {renderMenu()} |
| | | </section> |
| | | </section> |
New file |
| | |
| | | <template> |
| | | <div> </div> |
| | | </template> |
| | | <script lang="ts"> |
| | | import { defineComponent } from 'vue'; |
| | | export default defineComponent({ |
| | | setup() { |
| | | return {}; |
| | | }, |
| | | }); |
| | | </script> |
| | |
| | | export default defineComponent({ |
| | | name: 'MenuContent', |
| | | props: { |
| | | searchValue: { |
| | | type: String as PropType<string>, |
| | | default: '', |
| | | }, |
| | | |
| | | item: { |
| | | type: Object as PropType<MenuType>, |
| | | default: null, |
| | |
| | | setup(props) { |
| | | const { t } = useI18n(); |
| | | |
| | | const getI18nName = computed(() => { |
| | | const { name } = props.item; |
| | | |
| | | return t(name); |
| | | }); |
| | | const getI18nName = computed(() => t(props.item?.name)); |
| | | /** |
| | | * @description: 渲染图标 |
| | | */ |
| | |
| | | const { showTitle } = props; |
| | | const { icon } = props.item; |
| | | const name = unref(getI18nName); |
| | | const searchValue = props.searchValue || ''; |
| | | const index = name.indexOf(searchValue); |
| | | |
| | | const beforeStr = name.substr(0, index); |
| | | const afterStr = name.substr(index + searchValue.length); |
| | | const cls = showTitle ? ['show-title'] : ['basic-menu__name']; |
| | | |
| | | return ( |
| | | <> |
| | | {renderIcon(icon!)} |
| | | {index > -1 && searchValue ? ( |
| | | <span class={cls}> |
| | | {beforeStr} |
| | | <span class={`basic-menu__keyword`}>{searchValue}</span> |
| | | {afterStr} |
| | | </span> |
| | | ) : ( |
| | | { |
| | | <span class={[cls]}> |
| | | {name} |
| | | {renderTag()} |
| | | </span> |
| | | )} |
| | | } |
| | | </> |
| | | ); |
| | | }; |
| | |
| | | type: Boolean as PropType<boolean>, |
| | | default: false, |
| | | }, |
| | | // 是否显示搜索框 |
| | | search: { |
| | | type: Boolean as PropType<boolean>, |
| | | default: true, |
| | | }, |
| | | |
| | | // 最好是4 倍数 |
| | | inlineIndent: { |
| | | type: Number as PropType<number>, |
| | |
| | | type: Boolean as PropType<boolean>, |
| | | default: false, |
| | | }, |
| | | isAppMenu: { |
| | | type: Boolean as PropType<boolean>, |
| | | default: true, |
| | | }, |
| | | |
| | | isHorizontal: { |
| | | type: Boolean as PropType<boolean>, |
| | | default: false, |
| | |
| | | // 展开数组 |
| | | openKeys: string[]; |
| | | |
| | | // 搜索值 |
| | | searchValue: string; |
| | | |
| | | // 当前选中的菜单项 key 数组 |
| | | selectedKeys: string[]; |
| | | |
File was renamed from src/components/Menu/src/hooks/useOpenKeys.ts |
| | |
| | | import { MenuModeEnum } from '/@/enums/menuEnum'; |
| | | import type { Menu as MenuType } from '/@/router/types'; |
| | | import type { MenuState } from '../types'; |
| | | import type { MenuState } from './types'; |
| | | import type { Ref } from 'vue'; |
| | | |
| | | import { unref } from 'vue'; |
| | |
| | | menuState: MenuState, |
| | | menus: Ref<MenuType[]>, |
| | | flatMenusRef: Ref<MenuType[]>, |
| | | isAppMenu: Ref<boolean>, |
| | | mode: Ref<MenuModeEnum>, |
| | | accordion: Ref<boolean> |
| | | ) { |
| | | const { getCollapsed } = useMenuSetting(); |
| | | /** |
| | | * @description:设置展开 |
| | | */ |
| | | |
| | | function setOpenKeys(menu: MenuType) { |
| | | const flatMenus = unref(flatMenusRef); |
| | | if (!unref(accordion)) { |
| | |
| | | rootSubMenuKeys.push(path); |
| | | } |
| | | } |
| | | if (!unref(getCollapsed) || !unref(isAppMenu)) { |
| | | if (!unref(getCollapsed)) { |
| | | const latestOpenKey = openKeys.find((key) => menuState.openKeys.indexOf(key) === -1); |
| | | if (rootSubMenuKeys.indexOf(latestOpenKey as string) === -1) { |
| | | menuState.openKeys = openKeys; |
| | |
| | | import './src/index.less'; |
| | | import BasicModalLib from './src/BasicModal'; |
| | | import BasicModal from './src/BasicModal'; |
| | | import { withInstall } from '../util'; |
| | | |
| | | withInstall(BasicModal); |
| | | |
| | | export { useModalContext } from './src/useModalContext'; |
| | | export { useModal, useModalInner } from './src/useModal'; |
| | | export * from './src/types'; |
| | | export const BasicModal = withInstall(BasicModalLib); |
| | | export { BasicModal }; |
| | |
| | | import PageFooterLib from './src/PageFooter.vue'; |
| | | import PageFooter from './src/PageFooter.vue'; |
| | | import { withInstall } from '../util'; |
| | | |
| | | export const PageFooter = withInstall(PageFooterLib); |
| | | withInstall(PageFooter); |
| | | export { PageFooter }; |
| | |
| | | import StrengthMeterLib from './src/index'; |
| | | import StrengthMeter from './src/index'; |
| | | import { withInstall } from '../util'; |
| | | |
| | | export const StrengthMeter = withInstall(StrengthMeterLib); |
| | | withInstall(StrengthMeter); |
| | | export { StrengthMeter }; |
| | |
| | | import TinymceLib from './src/Editor.vue'; |
| | | import Tinymce from './src/Editor.vue'; |
| | | import { withInstall } from '../util'; |
| | | |
| | | export const Tinymce = withInstall(TinymceLib); |
| | | withInstall(Tinymce); |
| | | export { Tinymce }; |
| | |
| | | import type { App } from 'vue'; |
| | | import BasicUpload from './src/BasicUpload.vue'; |
| | | import { withInstall } from '../util'; |
| | | |
| | | export default (app: App): void => { |
| | | app.component(BasicUpload.name, BasicUpload); |
| | | }; |
| | | |
| | | withInstall(BasicUpload); |
| | | export { BasicUpload }; |
| | |
| | | import BasicDragVerifyLib from './src/DragVerify'; |
| | | import RotateDragVerifyLib from './src/ImgRotate'; |
| | | import BasicDragVerify from './src/DragVerify'; |
| | | import RotateDragVerify from './src/ImgRotate'; |
| | | import { withInstall } from '../util'; |
| | | |
| | | withInstall(BasicDragVerify, RotateDragVerify); |
| | | |
| | | export * from './src/types'; |
| | | |
| | | export const RotateDragVerify = withInstall(RotateDragVerifyLib); |
| | | export const BasicDragVerify = withInstall(BasicDragVerifyLib); |
| | | export { BasicDragVerify, RotateDragVerify }; |
| | |
| | | import VirtualScrollLib from './src/index'; |
| | | import VirtualScroll from './src/index'; |
| | | import { withInstall } from '../util'; |
| | | |
| | | export const VirtualScroll = withInstall(VirtualScrollLib); |
| | | withInstall(VirtualScroll); |
| | | export { VirtualScroll }; |
| | |
| | | import type { VNodeChild, Plugin } from 'vue'; |
| | | import type { VNodeChild } from 'vue'; |
| | | import type { App } from 'vue'; |
| | | |
| | | export function withInstall<T>(component: T) { |
| | | const comp = component as any; |
| | | comp.install = (app: App) => { |
| | | app.component(comp.displayName || comp.name, comp); |
| | | }; |
| | | return comp as T & Plugin; |
| | | export function withInstall(...components: any[]) { |
| | | components.forEach((comp) => { |
| | | comp.install = (app: App) => { |
| | | app.component(comp.displayName || comp.name, comp); |
| | | }; |
| | | }); |
| | | } |
| | | |
| | | export function convertToUnit( |
| | |
| | | @import 'easing'; |
| | | @import 'breakpoint'; |
| | | |
| | | @namespace: vben; |
| | | |
| | | // tabs |
| | | @multiple-height: 30px; |
| | | |
| | |
| | | import { InjectionKey, provide, inject, reactive, readonly } from 'vue'; |
| | | import { |
| | | InjectionKey, |
| | | provide, |
| | | inject, |
| | | reactive, |
| | | readonly as defineReadonly, |
| | | defineComponent, |
| | | UnwrapRef, |
| | | } from 'vue'; |
| | | |
| | | export const createContext = <T>( |
| | | context: any, |
| | | contextInjectKey: InjectionKey<T> = Symbol(), |
| | | _readonly = true |
| | | ) => { |
| | | const state = reactive({ ...context }); |
| | | export interface CreateContextOptions { |
| | | readonly?: boolean; |
| | | createProvider?: boolean; |
| | | } |
| | | |
| | | const provideData = _readonly ? readonly(state) : state; |
| | | provide(contextInjectKey, provideData); |
| | | type ShallowUnwrap<T> = { |
| | | [P in keyof T]: UnwrapRef<T[P]>; |
| | | }; |
| | | |
| | | export function createContext<T>( |
| | | context: any, |
| | | key: InjectionKey<T> = Symbol(), |
| | | options: CreateContextOptions = {} |
| | | ) { |
| | | const { readonly = true, createProvider = false } = options; |
| | | |
| | | const state = reactive(context); |
| | | |
| | | const provideData = readonly ? defineReadonly(state) : state; |
| | | !createProvider && provide(key, provideData); |
| | | |
| | | const Provider = createProvider |
| | | ? defineComponent({ |
| | | name: 'Provider', |
| | | inheritAttrs: false, |
| | | setup(_, { slots }) { |
| | | provide(key, provideData); |
| | | return () => slots.default?.(); |
| | | }, |
| | | }) |
| | | : null; |
| | | |
| | | return { Provider, state }; |
| | | } |
| | | |
| | | export const useContext = <T>( |
| | | contextInjectKey: InjectionKey<T> = Symbol(), |
| | | key: InjectionKey<T> = Symbol(), |
| | | defaultValue?: any, |
| | | _readonly = true |
| | | ): T => { |
| | | const state = inject(contextInjectKey, defaultValue || {}); |
| | | return _readonly ? readonly(state) : state; |
| | | readonly = false |
| | | ): ShallowUnwrap<T> => { |
| | | const state = inject(key, defaultValue || {}); |
| | | |
| | | return readonly ? defineReadonly(state) : state; |
| | | }; |
| | |
| | | |
| | | const getCollapsedShowTitle = computed(() => unref(getMenuSetting).collapsedShowTitle); |
| | | |
| | | const getCollapsedShowSearch = computed(() => unref(getMenuSetting).collapsedShowSearch); |
| | | |
| | | const getTopMenuAlign = computed(() => unref(getMenuSetting).topMenuAlign); |
| | | |
| | | const getIsSidebarType = computed(() => unref(getMenuType) === MenuTypeEnum.SIDEBAR); |
| | |
| | | } |
| | | |
| | | return unref(getTrigger) === TriggerEnum.HEADER; |
| | | }); |
| | | |
| | | const getShowSearch = computed(() => { |
| | | return ( |
| | | unref(getMenuSetting).showSearch && |
| | | !(unref(getMenuType) === MenuTypeEnum.MIX && unref(getMenuMode) === MenuModeEnum.HORIZONTAL) |
| | | ); |
| | | }); |
| | | |
| | | const getIsHorizontal = computed(() => { |
| | |
| | | getMenuTheme, |
| | | getCanDrag, |
| | | getIsHorizontal, |
| | | getShowSearch, |
| | | getCollapsedShowTitle, |
| | | getCollapsedShowSearch, |
| | | getIsSidebarType, |
| | | getAccordion, |
| | | getShowTopMenu, |
New file |
| | |
| | | import { useAppProviderContext } from '/@/components/Application'; |
| | | import { computed } from 'vue'; |
| | | // import { useCssModule, reactive } from 'vue'; |
| | | export function useDesign(scope: string) { |
| | | const values = useAppProviderContext(); |
| | | // const style = cssModule ? useCssModule() : {}; |
| | | |
| | | // if (cssModule) { |
| | | // Object.keys(style).forEach((key) => { |
| | | // const moduleCls = style[key]; |
| | | // style[key] = `${cls}-${moduleCls}`; |
| | | // }); |
| | | // } |
| | | return { |
| | | prefixCls: computed(() => `${values.prefixCls}-${scope}`), |
| | | prefixVar: values.prefixCls, |
| | | // style, |
| | | }; |
| | | } |
| | |
| | | setLocalSetting({ lang }); |
| | | // i18n.global.setLocaleMessage(locale, messages); |
| | | |
| | | antConfigLocaleRef.value = { a: 1 }; |
| | | switch (lang) { |
| | | // Simplified Chinese |
| | | case 'zh_CN': |
| | |
| | | theme={unref(getHeaderTheme)} |
| | | splitType={unref(getSplitType)} |
| | | menuMode={unref(getMenuMode)} |
| | | showSearch={false} |
| | | /> |
| | | </div> |
| | | )} |
| | |
| | | default: MenuSplitTyeEnum.NONE, |
| | | }, |
| | | |
| | | // Whether to show search box |
| | | showSearch: propTypes.bool.def(true), |
| | | |
| | | isHorizontal: propTypes.bool, |
| | | // menu Mode |
| | | menuMode: { |
| | |
| | | |
| | | const { |
| | | setMenuSetting, |
| | | getShowSearch, |
| | | getMenuMode, |
| | | getMenuType, |
| | | getCollapsedShowTitle, |
| | | getCollapsedShowSearch, |
| | | getIsSidebarType, |
| | | getMenuTheme, |
| | | getCollapsed, |
| | |
| | | const getComputedMenuTheme = computed(() => props.theme || unref(getMenuTheme)); |
| | | |
| | | const appendClass = computed(() => props.splitType === MenuSplitTyeEnum.TOP); |
| | | |
| | | const showSearch = computed(() => { |
| | | return ( |
| | | unref(getShowSearch) && |
| | | props.showSearch && |
| | | (unref(getCollapsedShowSearch) ? true : !unref(getCollapsed)) |
| | | ); |
| | | }); |
| | | |
| | | /** |
| | | * click menu |
| | |
| | | collapsedShowTitle={unref(getCollapsedShowTitle)} |
| | | theme={unref(getComputedMenuTheme)} |
| | | showLogo={unref(showLogo)} |
| | | search={unref(showSearch)} |
| | | items={unref(menusRef)} |
| | | flatItems={unref(flatMenusRef)} |
| | | accordion={unref(getAccordion)} |
| | |
| | | MENU_SHOW_SIDEBAR, |
| | | MENU_THEME, |
| | | MENU_SPLIT, |
| | | MENU_SHOW_SEARCH, |
| | | MENU_FIXED, |
| | | |
| | | // header |
| | |
| | | case HandlerEnum.MENU_FIXED: |
| | | return { menuSetting: { fixed: value } }; |
| | | |
| | | case HandlerEnum.MENU_SHOW_SEARCH: |
| | | return { menuSetting: { showSearch: value } }; |
| | | |
| | | // ============transition================== |
| | | case HandlerEnum.OPEN_PAGE_LOADING: |
| | | appStore.commitPageLoadingState(false); |
| | |
| | | } |
| | | |
| | | &:not(.ant-layout-sider-dark) { |
| | | // border-right: 1px solid @border-color-light; |
| | | box-shadow: 2px 0 8px 0 rgba(29, 35, 41, 0.05); |
| | | } |
| | | |
| | |
| | | export const PAGE_NOT_FOUND_ROUTE: AppRouteRecordRaw = { |
| | | path: '/:path(.*)*', |
| | | name: 'ErrorPage', |
| | | redirect: '/error/404', |
| | | component: LAYOUT, |
| | | meta: { |
| | | title: 'ErrorPage', |
| | |
| | | }, |
| | | children: [ |
| | | { |
| | | path: '/error/404', |
| | | path: '/:path(.*)*', |
| | | name: 'ErrorPage', |
| | | component: EXCEPTION_COMPONENT, |
| | | meta: { |
| | |
| | | // =========================== |
| | | // ==========Helper=========== |
| | | // =========================== |
| | | const isBackMode = () => { |
| | | return appStore.getProjectConfig.permissionMode === PermissionModeEnum.BACK; |
| | | }; |
| | | |
| | | const staticMenus: Menu[] = []; |
| | | (() => { |
| | |
| | | staticMenus.push(transformMenuModule(menu)); |
| | | } |
| | | })(); |
| | | |
| | | const isBackMode = () => { |
| | | return appStore.getProjectConfig.permissionMode === PermissionModeEnum.BACK; |
| | | }; |
| | | |
| | | async function getAsyncMenus() { |
| | | // 前端角色控制菜单 直接取菜单文件 |
| | |
| | | export const SIDE_BAR_BG_COLOR_LIST: string[] = [ |
| | | '#273352', |
| | | '#ffffff', |
| | | '#191b24', |
| | | '#191a23', |
| | | '#001529', |
| | | '#304156', |
| | | '#001628', |
| | | '#28333E', |
| | | '#344058', |
| | | ]; |
| | |
| | | show: true, |
| | | // Whether to show dom |
| | | hidden: true, |
| | | // Whether to show search box |
| | | showSearch: true, |
| | | // Menu width |
| | | menuWidth: 210, |
| | | // Menu mode |
| | |
| | | collapsed: boolean; |
| | | collapsedShowTitle: boolean; |
| | | canDrag: boolean; |
| | | showSearch: boolean; |
| | | show: boolean; |
| | | hidden: boolean; |
| | | split: boolean; |