@paris-ias/list 1.0.138 → 1.0.140
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/module.json +1 -1
- package/dist/runtime/components/list/molecules/GlobalSearchInput.vue +12 -14
- package/dist/runtime/components/list/molecules/Header.vue +1 -1
- package/dist/runtime/components/list/molecules/ResultsContainer.vue +5 -2
- package/dist/runtime/components/list/organisms/List.vue +21 -6
- package/dist/runtime/components/list/organisms/Results.vue +31 -17
- package/package.json +1 -1
package/dist/module.json
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
<div class="d-flex flex-grow-1 flex-column">
|
|
3
3
|
<div class="d-flex align-center">
|
|
4
4
|
<v-text-field
|
|
5
|
+
:id="`global-search-input-${type}`"
|
|
5
6
|
v-model.trim="search"
|
|
6
7
|
:placeholder="
|
|
7
8
|
type === 'all'
|
|
@@ -24,11 +25,7 @@
|
|
|
24
25
|
$store.state.scrolled }" -->
|
|
25
26
|
<template v-if="!search" #label>
|
|
26
27
|
<div class="searchLabel">
|
|
27
|
-
{{
|
|
28
|
-
type === "all"
|
|
29
|
-
? $t("search")
|
|
30
|
-
: $t("list.search-type", [$t("items." + type, 2)])
|
|
31
|
-
}}
|
|
28
|
+
{{ $t("search") }}
|
|
32
29
|
</div>
|
|
33
30
|
</template>
|
|
34
31
|
</v-text-field>
|
|
@@ -78,16 +75,14 @@
|
|
|
78
75
|
</v-card>
|
|
79
76
|
</v-menu>
|
|
80
77
|
<v-btn
|
|
81
|
-
v-bind="attrs"
|
|
82
78
|
:rounded="0"
|
|
83
|
-
variant="
|
|
79
|
+
variant="outlined"
|
|
84
80
|
size="large"
|
|
85
81
|
height="56"
|
|
86
|
-
v-on="on"
|
|
87
82
|
@keyup.enter="$router.push(localePath('/search'))"
|
|
88
83
|
@click="$router.push(localePath('/search'))"
|
|
89
84
|
>
|
|
90
|
-
<v-icon>mdi-magnify</v-icon>
|
|
85
|
+
<v-icon size="large">mdi-magnify</v-icon>
|
|
91
86
|
<v-tooltip activator="parent" location="start">{{
|
|
92
87
|
$t("click-here-to-search")
|
|
93
88
|
}}</v-tooltip>
|
|
@@ -99,15 +94,14 @@
|
|
|
99
94
|
<script setup>
|
|
100
95
|
import { useDebounceFn } from "@vueuse/core"
|
|
101
96
|
import { useRootStore } from "../../../stores/root"
|
|
102
|
-
import { computed, useI18n, ref } from "#imports"
|
|
97
|
+
import { computed, useI18n, ref, useLocalePath } from "#imports"
|
|
98
|
+
const localePath = useLocalePath()
|
|
103
99
|
const { locale, t } = useI18n()
|
|
104
100
|
const rootStore = useRootStore()
|
|
105
101
|
|
|
106
102
|
// Utility function to capitalize first letter
|
|
107
103
|
const capitalize = (str) => str.charAt(0).toUpperCase() + str.slice(1)
|
|
108
|
-
|
|
109
104
|
const emit = defineEmits(["filter-change"])
|
|
110
|
-
|
|
111
105
|
const props = defineProps({
|
|
112
106
|
type: {
|
|
113
107
|
type: String,
|
|
@@ -162,8 +156,12 @@ const search = computed({
|
|
|
162
156
|
get() {
|
|
163
157
|
return rootStore.search
|
|
164
158
|
},
|
|
165
|
-
set:
|
|
166
|
-
|
|
159
|
+
set: useDebounceFn(function (v) {
|
|
160
|
+
emit("change", {
|
|
161
|
+
name: "search",
|
|
162
|
+
value: v,
|
|
163
|
+
})
|
|
164
|
+
rootStore.updateSearch({
|
|
167
165
|
type: props.type,
|
|
168
166
|
search: v || "",
|
|
169
167
|
lang: locale.value,
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
size="large"
|
|
7
7
|
class=""
|
|
8
8
|
@click="$emit('toggle', type)"
|
|
9
|
+
:disabled="$rootStore.results[type]?.total === 0"
|
|
9
10
|
>
|
|
10
11
|
<v-icon size="large">{{
|
|
11
12
|
open ? "mdi-chevron-down" : "mdi-chevron-right"
|
|
@@ -16,9 +17,9 @@
|
|
|
16
17
|
@click="$emit('toggle', type)"
|
|
17
18
|
>
|
|
18
19
|
<div
|
|
19
|
-
class="text-
|
|
20
|
+
class="text-h5 font-weight-medium"
|
|
20
21
|
:class="
|
|
21
|
-
$rootStore.results[type].total > 0 ? '' : 'text-grey darken-2'
|
|
22
|
+
$rootStore.results[type].total > 0 ? 'black' : 'text-grey darken-2'
|
|
22
23
|
"
|
|
23
24
|
>
|
|
24
25
|
{{ capitalize($t("items." + props.type, 2)) }}
|
|
@@ -53,11 +54,13 @@
|
|
|
53
54
|
color="default"
|
|
54
55
|
variant="text"
|
|
55
56
|
rounded="0"
|
|
57
|
+
v-if="$rootStore.results[type]?.total > 0"
|
|
56
58
|
:to="localePath(type === 'people' ? '/people' : '/activities/' + type)"
|
|
57
59
|
>
|
|
58
60
|
{{ $t("list.pls-x-more", [$rootStore.results[type].total]) }}
|
|
59
61
|
</v-btn>
|
|
60
62
|
</div>
|
|
63
|
+
<v-divider></v-divider>
|
|
61
64
|
</template>
|
|
62
65
|
<script setup>
|
|
63
66
|
import { useNuxtApp, useLocalePath } from "#imports"
|
|
@@ -34,13 +34,17 @@
|
|
|
34
34
|
</template>
|
|
35
35
|
|
|
36
36
|
<script setup>
|
|
37
|
-
import { computed, onUpdated, onMounted, watch } from "vue"
|
|
38
37
|
import { useRootStore } from "../../../stores/root"
|
|
39
38
|
import { capitalize } from "../../../composables/useUtils"
|
|
40
39
|
import {
|
|
41
40
|
useNuxtApp,
|
|
42
41
|
resolveComponent,
|
|
42
|
+
computed,
|
|
43
|
+
onUpdated,
|
|
44
|
+
onMounted,
|
|
45
|
+
watch,
|
|
43
46
|
onBeforeUnmount,
|
|
47
|
+
nextTick,
|
|
44
48
|
useI18n,
|
|
45
49
|
useRoute,
|
|
46
50
|
useLocalePath,
|
|
@@ -171,19 +175,30 @@ onMounted(() => {
|
|
|
171
175
|
onBeforeUnmount(() => {
|
|
172
176
|
rootStore.resetState(props.type, locale.value)
|
|
173
177
|
})
|
|
174
|
-
|
|
175
178
|
async function onPageChange(newPage) {
|
|
176
179
|
console.log("onPageChange: ", newPage)
|
|
180
|
+
|
|
181
|
+
// Set loading state first
|
|
182
|
+
rootStore.setLoading(true, props.type)
|
|
183
|
+
|
|
184
|
+
// Update the page in the store
|
|
177
185
|
rootStore.updatePage({
|
|
178
186
|
page: newPage,
|
|
179
187
|
type: props.type,
|
|
180
188
|
lang: locale.value,
|
|
181
189
|
})
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
190
|
+
|
|
191
|
+
// Wait for the next tick to ensure DOM updates
|
|
192
|
+
await nextTick()
|
|
193
|
+
|
|
194
|
+
// Use setTimeout to ensure the scroll happens after route transition completes
|
|
195
|
+
setTimeout(() => {
|
|
196
|
+
if (typeof window !== "undefined") {
|
|
197
|
+
window.scrollTo({ top: 0, behavior: "smooth" })
|
|
198
|
+
}
|
|
199
|
+
}, 0)
|
|
185
200
|
}
|
|
186
|
-
/*
|
|
201
|
+
/*
|
|
187
202
|
onUpdated(() => {
|
|
188
203
|
console.log("STOP local loading from updated")
|
|
189
204
|
rootStore.setLoading(false, props.type)
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
:placeholder="$t('search')"
|
|
5
5
|
variant="outlined"
|
|
6
6
|
:categories="selectedCategories"
|
|
7
|
+
@change="updateSearch($event)"
|
|
7
8
|
@filter-change="handleFilterChange"
|
|
8
9
|
/>
|
|
9
10
|
<ListMoleculesResultsContainer
|
|
@@ -31,8 +32,9 @@ import {
|
|
|
31
32
|
useAppConfig,
|
|
32
33
|
ref,
|
|
33
34
|
computed,
|
|
35
|
+
watch,
|
|
34
36
|
} from "#imports"
|
|
35
|
-
|
|
37
|
+
import SEARCH from "../../../graphql/list/search.gql"
|
|
36
38
|
// Component name for linting
|
|
37
39
|
defineOptions({
|
|
38
40
|
name: "SearchResults",
|
|
@@ -70,24 +72,36 @@ const filteredSortedModules = computed(() => {
|
|
|
70
72
|
)
|
|
71
73
|
})
|
|
72
74
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
75
|
+
// Apollo GraphQL query with proper reactivity
|
|
76
|
+
const { data, pending, error, refresh } = await useAsyncQuery(
|
|
77
|
+
SEARCH,
|
|
78
|
+
{ search: $rootStore.search, appId: "iea", locale: locale.value },
|
|
79
|
+
{
|
|
80
|
+
key: `search-${$rootStore.search}`, // Unique key for caching
|
|
81
|
+
server: true, // Enable SSR
|
|
82
|
+
},
|
|
83
|
+
)
|
|
84
|
+
if (error.value) {
|
|
85
|
+
console.error("GraphQL query error: ", error.value)
|
|
86
|
+
} else {
|
|
87
|
+
console.log("Query result data: ", data.value.items?.length)
|
|
88
|
+
}
|
|
79
89
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
90
|
+
// Apply data to store immediately if available
|
|
91
|
+
if (data.value) {
|
|
92
|
+
console.log("Applying data to store directly [first load scenario]")
|
|
93
|
+
$rootStore.applyListResult("all", data.value)
|
|
94
|
+
}
|
|
95
|
+
const updateSearch = async (newSearch) => {
|
|
96
|
+
console.log("update search")
|
|
97
|
+
if (newSearch !== $rootStore.search) {
|
|
98
|
+
await refresh()
|
|
99
|
+
if (data.value) {
|
|
100
|
+
console.log("Applying data to store directly [first load scenario]")
|
|
101
|
+
$rootStore.applyListResult("all", data.value)
|
|
102
|
+
}
|
|
88
103
|
}
|
|
89
|
-
}
|
|
90
|
-
|
|
104
|
+
}
|
|
91
105
|
onBeforeUnmount(() => {
|
|
92
106
|
/* rootStore.resetState("all", locale.value) */
|
|
93
107
|
})
|