From 9ea878915e49fbbd424ad9d122d9e865c907341f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=87=95=E5=8D=9A=E6=96=87?= <349952469@qq.com> Date: Wed, 6 Mar 2024 10:59:40 +0800 Subject: [PATCH 1/3] feat(components): add GlobalSearch components --- src/layouts/modules/global-header/index.vue | 2 + .../components/search-footer.vue | 30 +++++ .../global-search/components/search-modal.vue | 115 ++++++++++++++++++ .../components/search-result.vue | 57 +++++++++ src/layouts/modules/global-search/index.vue | 20 +++ src/store/modules/route/index.ts | 3 + src/store/modules/route/shared.ts | 19 +++ src/typings/components.d.ts | 9 ++ 8 files changed, 255 insertions(+) create mode 100644 src/layouts/modules/global-search/components/search-footer.vue create mode 100644 src/layouts/modules/global-search/components/search-modal.vue create mode 100644 src/layouts/modules/global-search/components/search-result.vue create mode 100644 src/layouts/modules/global-search/index.vue diff --git a/src/layouts/modules/global-header/index.vue b/src/layouts/modules/global-header/index.vue index 705b41c6..ae372c49 100644 --- a/src/layouts/modules/global-header/index.vue +++ b/src/layouts/modules/global-header/index.vue @@ -7,6 +7,7 @@ import { useRouteStore } from '@/store/modules/route'; import HorizontalMenu from '../global-menu/base-menu.vue'; import GlobalLogo from '../global-logo/index.vue'; import GlobalBreadcrumb from '../global-breadcrumb/index.vue'; +import GlobalSearch from '../global-search/index.vue'; import { useMixMenuContext } from '../../hooks/use-mix-menu'; import ThemeButton from './components/theme-button.vue'; import UserAvatar from './components/user-avatar.vue'; @@ -54,6 +55,7 @@ const headerMenus = computed(() => {
+ +defineOptions({ name: 'SearchFooter' }); + + + + + diff --git a/src/layouts/modules/global-search/components/search-modal.vue b/src/layouts/modules/global-search/components/search-modal.vue new file mode 100644 index 00000000..3ebf78e2 --- /dev/null +++ b/src/layouts/modules/global-search/components/search-modal.vue @@ -0,0 +1,115 @@ + + + + + diff --git a/src/layouts/modules/global-search/components/search-result.vue b/src/layouts/modules/global-search/components/search-result.vue new file mode 100644 index 00000000..830391ad --- /dev/null +++ b/src/layouts/modules/global-search/components/search-result.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/src/layouts/modules/global-search/index.vue b/src/layouts/modules/global-search/index.vue new file mode 100644 index 00000000..bb925582 --- /dev/null +++ b/src/layouts/modules/global-search/index.vue @@ -0,0 +1,20 @@ + + + + + diff --git a/src/store/modules/route/index.ts b/src/store/modules/route/index.ts index 94a374c4..04e41699 100644 --- a/src/store/modules/route/index.ts +++ b/src/store/modules/route/index.ts @@ -19,6 +19,7 @@ import { getSelectedMenuKeyPathByKey, isRouteExistByRouteName, sortRoutesByOrder, + transformMenuToSearchMenus, updateLocaleOfGlobalMenus } from './shared'; @@ -52,6 +53,7 @@ export const useRouteStore = defineStore(SetupStoreId.Route, () => { /** Global menus */ const menus = ref([]); + const searchMenus = computed(() => transformMenuToSearchMenus(menus.value)); /** Get global menus */ function getGlobalMenus(routes: ElegantConstRoute[]) { @@ -275,6 +277,7 @@ export const useRouteStore = defineStore(SetupStoreId.Route, () => { resetStore, routeHome, menus, + searchMenus, updateGlobalMenusByLocale, cacheRoutes, reCacheRoutesByKey, diff --git a/src/store/modules/route/shared.ts b/src/store/modules/route/shared.ts index c7cfb821..4212f7fe 100644 --- a/src/store/modules/route/shared.ts +++ b/src/store/modules/route/shared.ts @@ -310,3 +310,22 @@ export function getBreadcrumbsByRoute( return []; } + +/** + * Transform menu to searchMenus + * + * @param menus - menus + * @param treeMap + */ +export function transformMenuToSearchMenus(menus: App.Global.Menu[], treeMap: App.Global.Menu[] = []) { + if (menus && menus.length === 0) return []; + return menus.reduce((acc, cur) => { + if (!cur.children) { + acc.push(cur); + } + if (cur.children && cur.children.length > 0) { + transformMenuToSearchMenus(cur.children, treeMap); + } + return acc; + }, treeMap); +} diff --git a/src/typings/components.d.ts b/src/typings/components.d.ts index 8f0d632f..afeb02d0 100644 --- a/src/typings/components.d.ts +++ b/src/typings/components.d.ts @@ -14,6 +14,7 @@ declare module 'vue' { DarkModeContainer: typeof import('./../components/common/dark-mode-container.vue')['default'] ExceptionBase: typeof import('./../components/common/exception-base.vue')['default'] FullScreen: typeof import('./../components/common/full-screen.vue')['default'] + IconAntDesignEnterOutlined: typeof import('~icons/ant-design/enter-outlined')['default'] IconAntDesignReloadOutlined: typeof import('~icons/ant-design/reload-outlined')['default'] IconAntDesignSettingOutlined: typeof import('~icons/ant-design/setting-outlined')['default'] IconGridiconsFullscreen: typeof import('~icons/gridicons/fullscreen')['default'] @@ -24,8 +25,13 @@ declare module 'vue' { IconIcRoundSearch: typeof import('~icons/ic/round-search')['default'] IconLocalBanner: typeof import('~icons/local/banner')['default'] IconLocalLogo: typeof import('~icons/local/logo')['default'] + IconMdiArrowDownThin: typeof import('~icons/mdi/arrow-down-thin')['default'] + IconMdiArrowUpThin: typeof import('~icons/mdi/arrow-up-thin')['default'] IconMdiDrag: typeof import('~icons/mdi/drag')['default'] + IconMdiKeyboardEsc: typeof import('~icons/mdi/keyboard-esc')['default'] + IconMdiKeyboardReturn: typeof import('~icons/mdi/keyboard-return')['default'] IconMdiRefresh: typeof import('~icons/mdi/refresh')['default'] + IconUilSearch: typeof import('~icons/uil/search')['default'] LangSwitch: typeof import('./../components/common/lang-switch.vue')['default'] LookForward: typeof import('./../components/custom/look-forward.vue')['default'] MenuToggler: typeof import('./../components/common/menu-toggler.vue')['default'] @@ -43,6 +49,7 @@ declare module 'vue' { NDrawer: typeof import('naive-ui')['NDrawer'] NDrawerContent: typeof import('naive-ui')['NDrawerContent'] NDropdown: typeof import('naive-ui')['NDropdown'] + NEmpty: typeof import('naive-ui')['NEmpty'] NForm: typeof import('naive-ui')['NForm'] NFormItem: typeof import('naive-ui')['NFormItem'] NFormItemGi: typeof import('naive-ui')['NFormItemGi'] @@ -56,11 +63,13 @@ declare module 'vue' { NLoadingBarProvider: typeof import('naive-ui')['NLoadingBarProvider'] NMenu: typeof import('naive-ui')['NMenu'] NMessageProvider: typeof import('naive-ui')['NMessageProvider'] + NModal: typeof import('naive-ui')['NModal'] NNotificationProvider: typeof import('naive-ui')['NNotificationProvider'] NPopconfirm: typeof import('naive-ui')['NPopconfirm'] NPopover: typeof import('naive-ui')['NPopover'] NRadio: typeof import('naive-ui')['NRadio'] NRadioGroup: typeof import('naive-ui')['NRadioGroup'] + NScrollbar: typeof import('naive-ui')['NScrollbar'] NSelect: typeof import('naive-ui')['NSelect'] NSpace: typeof import('naive-ui')['NSpace'] NStatistic: typeof import('naive-ui')['NStatistic'] From 04aa10b4771f4267e534218f9d989336c955a9be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=87=95=E5=8D=9A=E6=96=87?= <349952469@qq.com> Date: Wed, 6 Mar 2024 11:05:54 +0800 Subject: [PATCH 2/3] perf(components): components name is converted to uppercase --- .../global-search/components/search-modal.vue | 16 ++++++++-------- .../global-search/components/search-result.vue | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/layouts/modules/global-search/components/search-modal.vue b/src/layouts/modules/global-search/components/search-modal.vue index 3ebf78e2..c3cc546f 100644 --- a/src/layouts/modules/global-search/components/search-modal.vue +++ b/src/layouts/modules/global-search/components/search-modal.vue @@ -82,7 +82,7 @@ onKeyStroke('ArrowDown', handleDown); diff --git a/src/layouts/modules/global-search/components/search-result.vue b/src/layouts/modules/global-search/components/search-result.vue index 830391ad..844c7c09 100644 --- a/src/layouts/modules/global-search/components/search-result.vue +++ b/src/layouts/modules/global-search/components/search-result.vue @@ -31,7 +31,7 @@ function handleTo() { From 0126da47782b90c98feeb9fef2e57e47ac5df9a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=87=95=E5=8D=9A=E6=96=87?= <349952469@qq.com> Date: Wed, 6 Mar 2024 11:43:27 +0800 Subject: [PATCH 3/3] feat(projects): globalSearch add i18n --- .../modules/global-search/components/search-footer.vue | 8 +++++--- .../modules/global-search/components/search-modal.vue | 6 +++--- src/layouts/modules/global-search/index.vue | 3 ++- src/locales/langs/en-us.ts | 4 ++++ src/locales/langs/zh-cn.ts | 4 ++++ src/typings/app.d.ts | 4 ++++ 6 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/layouts/modules/global-search/components/search-footer.vue b/src/layouts/modules/global-search/components/search-footer.vue index 056c7bd2..ec5d810a 100644 --- a/src/layouts/modules/global-search/components/search-footer.vue +++ b/src/layouts/modules/global-search/components/search-footer.vue @@ -1,4 +1,6 @@ @@ -6,16 +8,16 @@ defineOptions({ name: 'SearchFooter' });
- 确认 + {{ $t('common.confirm') }} - 切换 + {{ $t('common.switch') }} - 关闭 + {{ $t('common.close') }}
diff --git a/src/layouts/modules/global-search/components/search-modal.vue b/src/layouts/modules/global-search/components/search-modal.vue index c3cc546f..7259f935 100644 --- a/src/layouts/modules/global-search/components/search-modal.vue +++ b/src/layouts/modules/global-search/components/search-modal.vue @@ -94,16 +94,16 @@ onKeyStroke('ArrowDown', handleDown); @after-leave="handleClose" > - + - 取消 + {{ $t('common.cancel') }}
- +