Skip to content

Commit 690f1a4

Browse files
committed
Improve search feature
1 parent 6bf5aac commit 690f1a4

File tree

2 files changed

+26
-28
lines changed

2 files changed

+26
-28
lines changed

src/components.d.ts

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -50,19 +50,11 @@ declare module 'vue' {
5050
NBreadcrumb: typeof import('naive-ui')['NBreadcrumb']
5151
NBreadcrumbItem: typeof import('naive-ui')['NBreadcrumbItem']
5252
NButton: typeof import('naive-ui')['NButton']
53-
NColorPicker: typeof import('naive-ui')['NColorPicker']
5453
NConfigProvider: typeof import('naive-ui')['NConfigProvider']
5554
NDataTable: typeof import('naive-ui')['NDataTable']
5655
NDialogProvider: typeof import('naive-ui')['NDialogProvider']
57-
NDrawer: typeof import('naive-ui')['NDrawer']
58-
NDrawerContent: typeof import('naive-ui')['NDrawerContent']
5956
NDropdown: typeof import('naive-ui')['NDropdown']
6057
NEmpty: typeof import('naive-ui')['NEmpty']
61-
NForm: typeof import('naive-ui')['NForm']
62-
NFormItem: typeof import('naive-ui')['NFormItem']
63-
NFormItemGi: typeof import('naive-ui')['NFormItemGi']
64-
NGi: typeof import('naive-ui')['NGi']
65-
NGrid: typeof import('naive-ui')['NGrid']
6658
NIcon: typeof import('naive-ui')['NIcon']
6759
NInput: typeof import('naive-ui')['NInput']
6860
NLayout: typeof import('naive-ui')['NLayout']
@@ -72,7 +64,6 @@ declare module 'vue' {
7264
NListItem: typeof import('naive-ui')['NListItem']
7365
NMenu: typeof import('naive-ui')['NMenu']
7466
NMessageProvider: typeof import('naive-ui')['NMessageProvider']
75-
NModal: typeof import('naive-ui')['NModal']
7667
NNotificationProvider: typeof import('naive-ui')['NNotificationProvider']
7768
Notifications: typeof import('./components/Navbar/Notifications.vue')['default']
7869
NPageHeader: typeof import('naive-ui')['NPageHeader']
@@ -81,18 +72,12 @@ declare module 'vue' {
8172
NRadioButton: typeof import('naive-ui')['NRadioButton']
8273
NRadioGroup: typeof import('naive-ui')['NRadioGroup']
8374
NScrollbar: typeof import('naive-ui')['NScrollbar']
84-
NSkeleton: typeof import('naive-ui')['NSkeleton']
8575
NSpace: typeof import('naive-ui')['NSpace']
86-
NSpin: typeof import('naive-ui')['NSpin']
8776
NSwitch: typeof import('naive-ui')['NSwitch']
88-
NTabPane: typeof import('naive-ui')['NTabPane']
89-
NTabs: typeof import('naive-ui')['NTabs']
9077
NTag: typeof import('naive-ui')['NTag']
9178
NText: typeof import('naive-ui')['NText']
9279
NThing: typeof import('naive-ui')['NThing']
9380
NTooltip: typeof import('naive-ui')['NTooltip']
94-
NTreeSelect: typeof import('naive-ui')['NTreeSelect']
95-
NUpload: typeof import('naive-ui')['NUpload']
9681
OrderManagement: typeof import('./components/Orders/OrderManagement.vue')['default']
9782
PersianIcon: typeof import('./components/CustomIcons/PersianIcon.vue')['default']
9883
ProductsManagement: typeof import('./components/Products/ProductsManagement.vue')['default']

src/components/Navbar/Search.vue

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,28 @@
11
<script setup lang="ts">
2+
import generatedRoutes from 'virtual:generated-pages'
23
import { Search24Regular as SearchIcon } from '@vicons/fluent'
34
import { useMagicKeys, whenever } from '@vueuse/core'
45
import type { InputInst } from 'naive-ui/es/input/src/interface'
5-
6+
import type { RouteRecordRaw } from 'vue-router'
67
const { t } = useI18n()
7-
const value = ref('')
8+
const searchTerm = ref('')
89
const focused = ref(false)
9-
const valueRef = ref('')
10-
11-
//TODO: implement features search
1210
const options = computed(() => {
13-
return ['@gmail.com', '@outlook.com', '@yahoo.com'].map((suffix) => {
14-
const prefix = valueRef.value.split('@')[0]
15-
return {
16-
label: prefix + suffix,
17-
value: prefix + suffix,
18-
}
19-
})
11+
return generatedRoutes
12+
.filter((x) => x.meta?.title !== undefined && x.meta?.title !== null)
13+
.filter(
14+
(x) =>
15+
searchTerm.value === '' ||
16+
(typeof x.meta?.title === 'string' &&
17+
x.meta.title.indexOf(searchTerm.value) >= 0),
18+
)
19+
.map((item) => {
20+
return {
21+
label: t(`menu.${item.meta?.title || item.name}`),
22+
value: item,
23+
key: item.name || item.path,
24+
}
25+
})
2026
})
2127
2228
const searchInput = ref<InputInst | null>(null)
@@ -27,12 +33,19 @@ const { ctrl_k } = useMagicKeys({
2733
},
2834
})
2935
whenever(ctrl_k, () => searchInput.value.focus())
36+
const router = useRouter()
37+
function gotoRoute(route: RouteRecordRaw) {
38+
if (route) {
39+
searchTerm.value = ''
40+
router.push(route.path)
41+
}
42+
}
3043
</script>
3144

3245
<template>
3346
<div class="hidden md:block md:me-2 md:w-40 transition-property-all transition-ease-in transition-duration-200"
3447
:class="{ 'md:w-60': focused }">
35-
<n-auto-complete v-model:value="value" :options="options">
48+
<n-auto-complete v-model:value="searchTerm" @select="gotoRoute" :options="options" blur-after-select>
3649
<template #default="{ value: slotValue, handleInput }">
3750
<n-input ref="searchInput" @input="handleInput" :value="slotValue" :placeholder="t('common.search')"
3851
@focus="focused = true" @blur="focused = false">

0 commit comments

Comments
 (0)