Skip to content

Commit 74822c4

Browse files
committed
add backend search
1 parent ee30a41 commit 74822c4

File tree

2 files changed

+31
-20
lines changed

2 files changed

+31
-20
lines changed

components/ResourceExplorer/ResourceExplorer.vue

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,30 @@
1313
:resources="allResources"
1414
:selected-resource-id="selectedResource?.id ?? null"
1515
:collapsed="sidebarCollapsed"
16+
:search="search"
1617
@select="selectResource"
1718
@update:collapsed="sidebarCollapsed = $event"
19+
@update:search="search = $event"
1820
/>
1921
</div>
2022
</div>
23+
<div
24+
v-else
25+
class="flex flex-col items-center py-12"
26+
>
27+
<nuxt-img
28+
src="/illustrations/dataset.svg"
29+
class="h-20"
30+
/>
31+
<p class="fr-text--bold fr-my-3v">
32+
{{ $t('Ce jeu de données ne contient aucune ressource.') }}
33+
</p>
34+
</div>
2135
</template>
2236

2337
<script setup lang="ts">
2438
import { RESOURCE_TYPE, type DatasetV2, type Resource, type ResourceType } from '@datagouv/components-next'
39+
import { refDebounced } from '@vueuse/core'
2540
import type { PaginatedArray } from '~/types/types'
2641
import type { ResourceGroup } from './ResourceExplorerSidebar.vue'
2742
@@ -31,16 +46,23 @@ const props = defineProps<{
3146
3247
const route = useRoute()
3348
const router = useRouter()
49+
const config = useRuntimeConfig()
3450
const { $api } = useNuxtApp()
3551
3652
const sidebarCollapsed = ref(false)
53+
const search = ref('')
54+
const searchDebounced = refDebounced(search, config.public.searchDebounce)
3755
3856
const url = computed(() => `/api/2/datasets/${props.dataset.id}/resources/`)
3957
4058
const rawResourcesByTypes = await Promise.all(
4159
RESOURCE_TYPE.map(type =>
4260
useAPI<PaginatedArray<Resource>>(url, {
43-
query: { type, page_size: 50 },
61+
query: computed(() => ({
62+
type,
63+
page_size: 50,
64+
q: searchDebounced.value || undefined,
65+
})),
4466
}),
4567
),
4668
)

components/ResourceExplorer/ResourceExplorerSidebar.vue

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<template>
22
<aside
33
v-if="!collapsed"
4-
class="w-72 shrink-0 border-l border-gray-default pl-4"
4+
class="w-72 shrink-0 pl-4"
55
>
66
<div class="flex items-center justify-between mb-3">
77
<h3 class="text-sm font-bold uppercase mb-0">
@@ -24,16 +24,17 @@
2424
>{{ $t('Rechercher') }}</label>
2525
<input
2626
:id="searchId"
27-
v-model="search"
27+
:value="search"
2828
type="search"
2929
class="w-full border border-gray-default rounded px-2.5 py-1.5 text-sm"
3030
:placeholder="$t('Rechercher')"
31+
@input="$emit('update:search', ($event.target as HTMLInputElement).value)"
3132
>
3233
</div>
3334

3435
<div class="space-y-4 overflow-y-auto max-h-[60vh]">
3536
<div
36-
v-for="group in filteredGroups"
37+
v-for="group in resources"
3738
:key="group.type"
3839
>
3940
<div class="text-xs text-gray-plain font-bold uppercase mb-1.5 border-b border-gray-default pb-1">
@@ -80,7 +81,7 @@
8081
</template>
8182

8283
<script setup lang="ts">
83-
import { computed, useId } from 'vue'
84+
import { useId } from 'vue'
8485
import { ResourceIcon, getResourceLabel, type Resource, type ResourceType } from '@datagouv/components-next'
8586
import { RiArrowRightSLine, RiArrowLeftSLine } from '@remixicon/vue'
8687
@@ -89,30 +90,18 @@ export interface ResourceGroup {
8990
items: Resource[]
9091
}
9192
92-
const props = defineProps<{
93+
defineProps<{
9394
resources: ResourceGroup[]
9495
selectedResourceId: string | null
9596
collapsed: boolean
97+
search: string
9698
}>()
9799
98100
defineEmits<{
99101
'select': [resource: Resource]
100102
'update:collapsed': [value: boolean]
103+
'update:search': [value: string]
101104
}>()
102105
103106
const searchId = useId()
104-
const search = ref('')
105-
106-
const filteredGroups = computed(() => {
107-
const q = search.value.toLowerCase().trim()
108-
if (!q) return props.resources.filter(g => g.items.length > 0)
109-
return props.resources
110-
.map(group => ({
111-
...group,
112-
items: group.items.filter(r =>
113-
(r.title || '').toLowerCase().includes(q),
114-
),
115-
}))
116-
.filter(g => g.items.length > 0)
117-
})
118107
</script>

0 commit comments

Comments
 (0)