refactor: ปรับ interface การค้นหา

This commit is contained in:
puri-ph4tt 2024-01-17 13:08:38 +07:00
parent 4cd95143d8
commit 7ac589d95c

View file

@ -12,6 +12,21 @@ import { useFileInfoStore } from '@/stores/file-info-data'
import AdvancedSearch from '@/modules/01_user/components/AdvancedSearch.vue' import AdvancedSearch from '@/modules/01_user/components/AdvancedSearch.vue'
import useStorage from '@/stores/storage' import useStorage from '@/stores/storage'
interface SearchInfo {
field: string
value: string
exact?: boolean
}
interface SearchOperator {
AND?: (SearchInfo | SearchOperator)[]
OR?: (SearchInfo | SearchOperator)[]
}
interface Search extends SearchOperator {
recursive?: boolean
path?: string[]
exact?: boolean
}
const loaderStore = useLoader() const loaderStore = useLoader()
const storageStore = useStorage() const storageStore = useStorage()
const { currentInfo } = storeToRefs(storageStore) const { currentInfo } = storeToRefs(storageStore)
@ -26,24 +41,12 @@ const {
advSearchDataRow, advSearchDataRow,
} = storeToRefs(useSearchDataStore()) } = storeToRefs(useSearchDataStore())
const { getFoundFile } = useSearchDataStore() const { getFoundFile } = useSearchDataStore()
const submitSearchData = ref<{
AND: { const submitSearchData = ref<Search>({
field: string
value: string
exact?: boolean
}[]
OR: {
field: string
value: string
exact?: boolean
}[]
exact?: boolean
recursive?: boolean
path?: string[]
}>({
AND: [], AND: [],
OR: [], OR: [],
}) })
const props = defineProps<{ const props = defineProps<{
mode: 'admin' | 'user' mode: 'admin' | 'user'
}>() }>()
@ -60,24 +63,24 @@ async function submitSearch() {
.filter(Boolean) .filter(Boolean)
optionsField.value.forEach((option) => { optionsField.value.forEach((option) => {
submitSearchData.value.OR.push({ submitSearchData.value.OR?.push({
field: option.value, field: option.value,
value: searchData.value.value, value: searchData.value.value,
}) })
}) })
submitSearchData.value.OR.push({ submitSearchData.value.OR?.push({
field: 'fileName', field: 'fileName',
value: searchData.value.value, value: searchData.value.value,
}) })
submitSearchData.value.OR.push({ submitSearchData.value.OR?.push({
field: 'metadata.author', field: 'metadata.author',
value: searchData.value.value, value: searchData.value.value,
}) })
submitSearchData.value.OR.push({ submitSearchData.value.OR?.push({
field: 'metadata.subject', field: 'metadata.subject',
value: searchData.value.value, value: searchData.value.value,
}) })
submitSearchData.value.OR.push({ submitSearchData.value.OR?.push({
field: 'fileType', field: 'fileType',
value: mime.getType(searchData.value.value) || '', value: mime.getType(searchData.value.value) || '',
}) })
@ -85,20 +88,18 @@ async function submitSearch() {
submitSearchData.value.recursive = true submitSearchData.value.recursive = true
submitSearchData.value.path = [] submitSearchData.value.path = []
if (searchData.value.field == 'title') { if (searchData.value.field == 'title') {
submitSearchData.value.OR.push({ submitSearchData.value.OR?.push({
field: 'metadata.subject', field: 'metadata.subject',
value: searchData.value.value, value: searchData.value.value,
exact: isExact.value,
}) })
} }
if (searchData.value.field == 'author') { if (searchData.value.field == 'author') {
submitSearchData.value.OR.push({ submitSearchData.value.OR?.push({
field: 'metadata.author', field: 'metadata.author',
value: searchData.value.value, value: searchData.value.value,
exact: isExact.value,
}) })
} }
submitSearchData.value.OR.push({ submitSearchData.value.OR?.push({
field: searchData.value.field, field: searchData.value.field,
value: searchData.value.value, value: searchData.value.value,
exact: isExact.value, exact: isExact.value,
@ -111,31 +112,56 @@ async function submitSearch() {
(d: { field: string; value: string; op: string; exact: boolean }) => { (d: { field: string; value: string; op: string; exact: boolean }) => {
if (d.field && d.value.trim() !== '') { if (d.field && d.value.trim() !== '') {
const op = d.op === 'AND' ? 'AND' : 'OR' const op = d.op === 'AND' ? 'AND' : 'OR'
if (d.field == 'title') { if (
submitSearchData.value[op].push({ (op === 'AND' && d.field === 'title') ||
field: 'metadata.subject', d.field === 'author'
) {
console.log('and title author')
if (d.field === 'title') {
submitSearchData.value[op]?.push({
OR: [
{
field: d.field,
value: d.value,
exact: d.exact,
},
{
field: 'metadata.subject',
value: d.value,
exact: d.exact,
},
],
})
}
if (d.field === 'author') {
submitSearchData.value[op]?.push({
OR: [
{
field: d.field,
value: d.value,
exact: d.exact,
},
{
field: 'metadata.author',
value: d.value,
exact: d.exact,
},
],
})
}
} else {
submitSearchData.value[op]?.push({
field: d.field,
value: d.value, value: d.value,
exact: d.exact, exact: d.exact,
}) })
} }
if (d.field == 'author') {
submitSearchData.value[op].push({
field: 'metadata.author',
value: d.value,
exact: d.exact,
})
}
submitSearchData.value[op].push({
field: d.field,
value: d.value,
exact: d.exact,
})
} }
}, },
) )
if (advField.keyword.length > 0) { if (advField.keyword.length > 0) {
for (let i = 0; i < advField.keyword.length; i++) { for (let i = 0; i < advField.keyword.length; i++) {
submitSearchData.value.AND.push({ submitSearchData.value.AND?.push({
field: 'keyword', field: 'keyword',
value: advField.keyword[i], value: advField.keyword[i],
exact: true, exact: true,
@ -143,7 +169,7 @@ async function submitSearch() {
} }
} }
if (advField.description.trim() !== '') { if (advField.description.trim() !== '') {
submitSearchData.value.AND.push({ submitSearchData.value.AND?.push({
field: 'description', field: 'description',
value: advField.description, value: advField.description,
exact: true, exact: true,