diff --git a/components/AutocompleteMeiliFacets.vue b/components/AutocompleteMeiliFacets.vue
index f29026ef51f02845753330107f3dd03ae4b5ea85..2133accd3baaa7c848f9eb6d033afa86d3830fa7 100644
--- a/components/AutocompleteMeiliFacets.vue
+++ b/components/AutocompleteMeiliFacets.vue
@@ -8,33 +8,33 @@ export interface FilterItem {
props: Record<string, any>
}
+export interface FacetItem {
+ title: string
+ value: string
+}
+
+export interface FacetCategory {
+ title: string
+ icon: string
+}
+
+export type FacetInputItem = FacetItem | FacetCategory
+
export interface Props {
db: string
modelValue: string | undefined
+ facets: MaybeRef<FacetInputItem[]>
}
const emit = defineEmits(['update:modelValue'])
-// const emit = defineEmits(["refresh:search"])
-const msfilter = defineModel<string>("msfilter", { default: "" })
const props = withDefaults(defineProps<Props>(), {
modelValue: ""
});
const filterItems = ref<FilterItem[] | undefined>(undefined)
const { result: msResult } = useMeiliSearch(props.db)
-
-
-
-
-const reactiveParams = reactive({
- facets: ["*"],
- filter: [],
- sort: ["type:asc"],
-})
-
-
const isAutocompleteFocused = ref<boolean>(false)
-const facets = computed(() => {
+const computedFacets = computed(() => {
const toValMsResult = toValue(msResult)
if (toValMsResult?.facetDistribution) {
return Object.keys(toValMsResult?.facetDistribution)
@@ -42,6 +42,17 @@ const facets = computed(() => {
else { return undefined }
})
+const allFacets = ref(undefined)
+onMounted(() => {
+
+ // get the facets and keep it
+ const toValMsResult = toValue(msResult)
+ if (toValMsResult?.facetDistribution) {
+ allFacets.value = { ...toValMsResult?.facetDistribution }
+ }
+})
+
+
const filterStep = computed(() => {
const toValFilterItems = toValue(filterItems)
if (toValFilterItems !== undefined) {
@@ -76,13 +87,12 @@ const outerOperatorItems = ref<FilterItem[]>([
},
])
-const autocompleteItems = computed(() => {
+const autocompleteItems = computed(() => {
const toValFilterItems = toValue(filterItems)
-
const index = toValFilterItems?.length ?? 0
if (filterStep.value === undefined || filterStep.value === 0) {
- return toValue(facets)?.map(value => {
+ return toValue(computedFacets)?.map(value => {
return {
type: "facet",
value: `${value}-${index}`,
@@ -104,7 +114,8 @@ const autocompleteItems = computed(() => {
const { type, value } = toValFilterItems?.slice(-2, -1)[0]
const sanitizedValue = value.split("-")[0]
// console.log("compute new facets")
- const facetDistri = msResult.value?.facetDistribution
+ // const facetDistri = msResult.value?.facetDistribution
+ const facetDistri = allFacets.value
// console.log(facetDistri)
return facetDistri?.[sanitizedValue] ? Object.entries(facetDistri[sanitizedValue]).map(([key, val]) => {
return {
@@ -137,7 +148,8 @@ const isValidFilters = computed(() => {
else {
const toValLastFilterItem = toValue(lastFilterItem)
if (toValLastFilterItem !== undefined) {
- return toValLastFilterItem.type === 'value' && isAutocompleteFocused.value === false
+ return toValLastFilterItem.type === 'value'
+ // && isAutocompleteFocused.value === false
// || (toValFilterStep === 0 && toValLastFilterItem.type === "outerOperator" && toValLastFilterItem.value.split("-")[0] === "AND")
}
}
@@ -169,33 +181,34 @@ function updateAutocompleteFocused(isFocused: boolean) {
isAutocompleteFocused.value = isFocused
}
-watchEffect(() => {
- console.log("watch effect")
-
- const toValFilterStep = toValue(filterStep)
- const toValLastFilterItem = toValue(lastFilterItem)
- console.log(toValFilterStep)
- console.log(toValLastFilterItem?.type)
- console.log(toValLastFilterItem?.value)
-
+function emitUpdateModelValue() {
if (toValue(isValidFilters)) {
- console.log("should refresh the search in compo")
const meiliFilter = toMeiliFilter(toValue(filterItems))
- console.log(meiliFilter)
emit('update:modelValue', meiliFilter)
}
+}
+
+function clearFilters() {
+ filterItems.value = undefined
+ emitUpdateModelValue()
+}
-})
</script>
<template>
<v-autocomplete v-model:model-value="filterItems" :items="autocompleteItems" auto-select-first chips clearable multiple
- return-object label="Filter results..." prepend-inner-icon="md:search" single-line item-value="value"
- item-title="title" class="mx-2" @update:focused="updateAutocompleteFocused">
+ return-object label="Filter results..." prepend-inner-icon="md:filter_alt" hide-details="auto" single-line
+ item-value="value" item-title="title" class="mx-2" @click:clear="clearFilters"
+ @update:focused="updateAutocompleteFocused">
<template #item="{ props, item }">
<v-list-item v-bind="{ ...props, active: false }" :title="item.title"
:subtitle="item.raw?.count ? item.raw.count : ''" :value="props.value">
</v-list-item>
- </template></v-autocomplete>
+ </template>
+ <template #append>
+ <v-btn variant="text" icon="md:filter_alt" @click="emitUpdateModelValue" :disabled="!isValidFilters"></v-btn>
+ </template>
+
+ </v-autocomplete>
</template>
\ No newline at end of file
diff --git a/components/ServerDbTable.vue b/components/ServerDbTable.vue
index 765978e8a337eaf45df1402fbc4a0c02387dbf3b..4135b068f52875fded218842d61608bd020dfe05 100644
--- a/components/ServerDbTable.vue
+++ b/components/ServerDbTable.vue
@@ -4,7 +4,7 @@ import { useCsvDownload } from "@/composables/useCsvDownload"
import { useSlots } from 'vue'
import { useDisplay } from "vuetify";
import { useThrottleFn } from '@vueuse/core'
-
+import type { FacetInputItem } from '@/components/AutocompleteMeiliFacets.vue'
import { useMeiliSearch } from "#imports"
// import { saveAs } from "file-saver";
import { useFileSystemAccess } from '@vueuse/core'
@@ -26,7 +26,7 @@ export interface Props {
title?: string
db?: string
sortBy?: SortItem[]
- facets: MaybeRef<string[]>
+ facets: MaybeRef<FacetInputItem[]>
numericalFilters?: MaybeRef<string | undefined>
dataTableServerProps: Record<string, any>
columnsToDownload?: MaybeRef<string[] | undefined>
@@ -168,6 +168,9 @@ const throttleSearch = useThrottleFn(async () => {
searchOrFilter()
emitRefreshRes()
}, 300)
+
+
+
async function searchOrFilter() {
// do something, it will be called at most 1 time per second
@@ -187,12 +190,11 @@ async function searchOrFilter() {
}
function emitRefreshRes() {
- console.log("emit refresh:search")
const q = search.value
emit("refresh:search", {
index: props.db,
query: q,
- params: { ...notPaginatedParams.value, filter: toValue(computedFilter), sort: msSortBy.value }
+ params: { ...notPaginatedParams.value, filter: toValue(msFilterCompo), sort: msSortBy.value }
})
}
@@ -375,8 +377,8 @@ function focusedOrBlur(isFocused: boolean) {
</v-autocomplete>
</v-toolbar>
<v-toolbar>
- <AutocompleteMeiliFacets v-model="msFilterCompo" :db="props.db"
- @refresh:search="() => console.log('refresh the search new compo')">
+ <AutocompleteMeiliFacets v-model="msFilterCompo" :db="props.db" :facets="$props.facets"
+ @update:modelValue="emitRefreshRes">
</AutocompleteMeiliFacets>
</v-toolbar>
</template>
@@ -395,8 +397,8 @@ function focusedOrBlur(isFocused: boolean) {
:disabled="pendingDownloadData" prepend-inner-icon="mdi-magnify" single-line clearable
@update:focused="focusedOrBlur"></v-text-field>
</v-card>
- <v-card variant="flat" color="transparent" :min-width="500" class="mx-2" :rounded="false">
- <!-- <v-autocomplete ref="autocompleteInput" hide-details v-model:model-value="filterOrSearch"
+ <!--<v-card variant="flat" color="transparent" :min-width="500" class="mx-2" :rounded="false">
+ <v-autocomplete ref="autocompleteInput" hide-details v-model:model-value="filterOrSearch"
auto-select-first chips clearable label="Filter results..." :items="autocompleteItems"
single-line item-value="value" item-title="title" multiple return-object
:disabled="pendingDownloadData" prepend-inner-icon="md:search"
@@ -413,12 +415,12 @@ function focusedOrBlur(isFocused: boolean) {
</v-list-item>
</template>
- </v-autocomplete> -->
+ </v-autocomplete>
- </v-card>
- <v-card>
- <AutocompleteMeiliFacets v-model="msFilterCompo" :db="props.db"
- @refresh:search="() => console.log('refresh the search new compo')">
+ </v-card>-->
+ <v-card variant="flat" color="transparent" :min-width="500" class="mx-2" :rounded="false">
+ <AutocompleteMeiliFacets v-model="msFilterCompo" :db="props.db" :facets="props.facets"
+ @update:modelValue="emitRefreshRes">
</AutocompleteMeiliFacets>
</v-card>
diff --git a/components/content/RefseqDb.vue b/components/content/RefseqDb.vue
index dc75fe8209616ca8e7589a1db52722c805801459..4dea55627f11d82c1f97e67c7169eb3adad2685c 100644
--- a/components/content/RefseqDb.vue
+++ b/components/content/RefseqDb.vue
@@ -10,6 +10,7 @@ import { useDownloadBlob } from '@/composables/useDownloadBlob';
import type { ComponentPublicInstance } from 'vue'
+import type { FacetInputItem } from '@/components/AutocompleteMeiliFacets.vue'
const sortBy: Ref<SortItem[]> = ref([{ key: 'type', order: "asc" }])
const itemValue = ref("id");
@@ -21,16 +22,18 @@ const { serialize } = useSerialize()
const { rasterize } = useRasterize()
const { download } = useDownloadBlob()
-const facets = ref([
- "replicon",
- "type",
- "subtype",
- "Superkingdom",
- "phylum",
- "order",
- "family",
- "genus",
- "species",
+const facets = ref<FacetInputItem[]>([
+ { title: "Replicon", value: "replicon", icon: "" },
+ { title: "Defense System", icon: "" },
+ { title: "System", value: "type", icon: "" },
+ { title: "Subsystem", value: "subtype", icon: "" },
+ { title: "Taxonomy", icon: "", },
+ { title: "Superkingdom", value: "Superkingdom", icon: "" },
+ { title: "", value: "phylum", icon: "" },
+ { title: "", value: "order", icon: "" },
+ { title: "", value: "family", icon: "" },
+ { title: "", value: "genus", icon: "" },
+ { title: "", value: "species", icon: "" },
])
const availableTaxo: Ref<string[]> = ref([
"species",