From 5c853ef594ad44bcae9915c877163ac3b48e0c80 Mon Sep 17 00:00:00 2001
From: Remi  PLANEL <rplanel@pasteur.fr>
Date: Wed, 10 Jan 2024 13:33:56 +0100
Subject: [PATCH] simply a bit algo

---
 components/AutocompleteMeiliFacets.vue |  2 +-
 components/ServerDbTable.vue           | 53 +++++++++-----------------
 composables/useMeiliFilters.ts         | 44 ++++++---------------
 3 files changed, 29 insertions(+), 70 deletions(-)

diff --git a/components/AutocompleteMeiliFacets.vue b/components/AutocompleteMeiliFacets.vue
index 2ef7c384..029d0ce5 100644
--- a/components/AutocompleteMeiliFacets.vue
+++ b/components/AutocompleteMeiliFacets.vue
@@ -226,7 +226,7 @@ function isItemFilter(type: string | undefined) {
 
 </script>
 <template>
-    <v-autocomplete :model-value="props.modelValue" class="mx-2" @click:clear="clearFilters" v-bind="autocompleteProps"
+    <v-autocomplete :model-value="props.modelValue" @click:clear="clearFilters" v-bind="autocompleteProps"
         @update:focused="updateAutocompleteFocused" @update:modelValue="emitUpdateModelValue" :loading="!hasFacetDistribution" :disabled="!hasFacetDistribution">
         <template #item="{ props, item }">
             <v-list-item v-if="isItemFilter(item?.raw?.type)" v-bind="{ ...props, active: false }" :title="item.title"
diff --git a/components/ServerDbTable.vue b/components/ServerDbTable.vue
index e1e90ea3..6826c00d 100644
--- a/components/ServerDbTable.vue
+++ b/components/ServerDbTable.vue
@@ -310,49 +310,30 @@ function focusedOrBlur(isFocused: boolean) {
             :items-per-page-options="itemsPerPage" :height="computedTableHeight" class="elevation-1 mt-2">
 
             <template #top>
-                <template v-if="mobile">
-                    <v-toolbar> <v-badge :content="totalHits" color="primary" class="mx-2">
-                            <v-btn prepend-icon="md:download" :loading="pendingDownloadData" variant="text" color="primary"
-                                @click="downloadData()">{{
-                                    props.title }}
-                            </v-btn>
-                        </v-badge></v-toolbar>
-                    <v-toolbar>
-                        <v-text-field v-model="search" label="Search..." hide-details="auto"
-                            prepend-inner-icon="mdi-magnify" single-line clearable :disabled="pendingDownloadData"
-                            class="mx-2" @update:focused="focusedOrBlur"></v-text-field>
-                    </v-toolbar>
-                    <v-toolbar>
-                        <AutocompleteMeiliFacets v-model:modelValue="msFilterCompo"
-                            v-bind="props.autocompleteMeiliFacetsProps" :is-valid-filters="isValidFilters">
-                        </AutocompleteMeiliFacets>
-                    </v-toolbar>
-                </template>
-                <template v-else>
-                    <v-toolbar>
+                <v-card variant="flat" color="transparent">
+                    <v-card-title>
                         <v-badge :content="totalHits" color="primary" class="mr-3">
                             <v-btn prepend-icon="md:download" :loading="pendingDownloadData" variant="text" color="primary"
                                 @click="downloadData()">{{
                                     props.title }}
                             </v-btn>
                         </v-badge>
-                        <v-spacer></v-spacer>
-                        <v-col>
-                            <v-card variant="flat" color="transparent" :min-width="400" class="mx-2" :rounded="false">
-                                <v-text-field v-model="search" label="Search..." hide-details="auto"
-                                    :disabled="pendingDownloadData" prepend-inner-icon="mdi-magnify" single-line clearable
-                                    @update:focused="focusedOrBlur"></v-text-field>
-                            </v-card>
-                        </v-col><v-col>
-                            <v-card variant="flat" color="transparent" :min-width="600" class="mx-2" :rounded="false">
-                                <AutocompleteMeiliFacets v-model="msFilterCompo" v-bind="props.autocompleteMeiliFacetsProps"
-                                    :is-valid-filters="isValidFilters">
-                                </AutocompleteMeiliFacets>
-                            </v-card>
-                        </v-col>
-                    </v-toolbar>
-                </template>
+                    </v-card-title>
+                    <v-card-title>
+                        <v-text-field v-model="search" label="Search..." hide-details="auto" :disabled="pendingDownloadData"
+                            prepend-inner-icon="mdi-magnify" single-line clearable
+                            @update:focused="focusedOrBlur"></v-text-field>
+                    </v-card-title>
+                    <v-card-title>
+                        <AutocompleteMeiliFacets v-model="msFilterCompo" v-bind="props.autocompleteMeiliFacetsProps"
+                            :is-valid-filters="isValidFilters">
+                        </AutocompleteMeiliFacets>
+
+
+                    </v-card-title>
+
 
+                </v-card>
             </template>
 
             <template v-for="(slot, index) of Object.keys(slots)" :key="index" v-slot:[slot]="data">
diff --git a/composables/useMeiliFilters.ts b/composables/useMeiliFilters.ts
index d4574037..e56dd7cb 100644
--- a/composables/useMeiliFilters.ts
+++ b/composables/useMeiliFilters.ts
@@ -20,63 +20,41 @@ export function useMeiliFilters(filters: MaybeRef<FilterItem[] | undefined>) {
         const position = index + 1
         switch (position % 4) {
           case 0:
-
+            // if this is the first time pass by an outeroperator
             if (previousOperator === undefined) {
               const newFilter = acc.splice(-3).join("")
-              if (sanitizedValue === 'AND') {
-                acc.push(newFilter)
+              if (sanitizedValue === 'OR') {
+                acc = [[newFilter]]
               }
               else {
-                acc.push([newFilter])
+                acc.push(newFilter)
               }
             }
-
             previousOperator = sanitizedValue
             break;
           case 3:
-            // if last element
             acc.push(`'${sanitizedValue}'`)
-
-            if (previousOperator === undefined) {
-              const newFilter = acc.splice(-3).join("")
+            const newFilter = acc.splice(-3).join("")
+            if (previousOperator === 'AND') {
               acc.push(newFilter)
             }
             else {
-              const newFilter = acc.splice(-3).join("")
-              console.log("new filter:", newFilter)
-              if (previousOperator === 'AND') {
-                acc.push(newFilter)
+              const previousElem = acc.slice(-1)[0]
+              if (Array.isArray(previousElem)) {
+                acc.slice(-1)[0].push(newFilter)
               }
               else {
-                console.log("previous operator is OR")
-                const previousElem = acc.slice(-1)[0]
-                console.log(previousElem)
-                if (Array.isArray(previousElem)) {
-                  acc.slice(-1)[0].push(newFilter)
-                }
-                else {
-
-                  const previousElem = acc.splice(-1)[0]
-                  console.log(previousElem)
-                  console.log([...acc])
-                  acc.push([previousElem, newFilter])
-                }
-
+                const previousElem = acc.splice(-1)[0]
+                acc.push([previousElem, newFilter])
               }
-
             }
-
-
             break
           default:
             acc.push(sanitizedValue)
             break;
         }
-        console.log(position)
-        console.log([...acc])
         return acc
       }, [])
-      console.log(arrayFilters)
       return arrayFilters
 
     } else {
-- 
GitLab