From 44dc3c5d076d3403c2da03981d4bd5a25ce24d10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexandre=20Bult=C3=A9?= Date: Wed, 2 Apr 2025 08:23:58 +0200 Subject: [PATCH 01/71] useSearchPageRoutes --- .../bouquets/BouquetDatasetCard.vue | 2 +- src/components/datasets/DatasetList.vue | 6 +- .../forms/dataset/DatasetEditModal.vue | 2 +- .../forms/dataset/DatasetPropertiesFields.vue | 2 +- .../sections/SubSectionDatasets.vue | 2 +- .../components/indicators/IndicatorCard.vue | 2 +- .../indicators/IndicatorDatasetCard.vue | 2 +- src/custom/ecospheres/routes.ts | 123 +++++++++--------- .../views/indicators/IndicatorDetailView.vue | 2 +- src/router/index.ts | 27 +--- src/router/utils.ts | 52 ++++++++ src/utils/tags.ts | 38 +++--- src/views/datasets/DatasetDetailView.vue | 2 +- src/views/datasets/DatasetsListView.vue | 4 +- .../organizations/OrganizationDetailView.vue | 2 +- 15 files changed, 149 insertions(+), 119 deletions(-) diff --git a/src/components/bouquets/BouquetDatasetCard.vue b/src/components/bouquets/BouquetDatasetCard.vue index 4c62ee92f..fca908089 100644 --- a/src/components/bouquets/BouquetDatasetCard.vue +++ b/src/components/bouquets/BouquetDatasetCard.vue @@ -49,7 +49,7 @@ onMounted(async () => { :key="datasetContent.id" :dataset="datasetContent" :dataset-url="{ - name: 'dataset_detail', + name: 'datasets_detail', params: { did: datasetContent.id } }" :show-description="false" diff --git a/src/components/datasets/DatasetList.vue b/src/components/datasets/DatasetList.vue index 8f9d5d9fb..e83f8b12e 100644 --- a/src/components/datasets/DatasetList.vue +++ b/src/components/datasets/DatasetList.vue @@ -26,7 +26,7 @@ const route = useRoute() const meta = route.meta as RouteMeta const store = useSearchStore() -const pageConf = usePageConf(meta.filterKey || 'datasets') +const pageConf = usePageConf(meta.pageKey || 'datasets') const { datasets, pagination, total, maxTotal } = storeToRefs(store) const numberOfResultMsg: ComputedRef = computed(() => { @@ -40,7 +40,7 @@ const numberOfResultMsg: ComputedRef = computed(() => { }) const getDatasetPage = (id: string) => { - return { name: 'dataset_detail', params: { did: id } } + return { name: 'datasets_detail', params: { item_id: id } } } const getOrganizationPage = (id: string | undefined) => { @@ -88,7 +88,7 @@ const executeQuery = async () => { {} as Record ) return store - .query({ ...route.query, ...props, ...filtersArgs }, meta.filterKey) + .query({ ...route.query, ...props, ...filtersArgs }, meta.pageKey) .finally(() => loader.hide()) } diff --git a/src/components/forms/dataset/DatasetEditModal.vue b/src/components/forms/dataset/DatasetEditModal.vue index c6709804b..16d4ae6cf 100644 --- a/src/components/forms/dataset/DatasetEditModal.vue +++ b/src/components/forms/dataset/DatasetEditModal.vue @@ -147,7 +147,7 @@ const submit = async (modalData: DatasetModalData) => { if (dataset !== undefined) { modalData.dataset.availability = Availability.LOCAL_AVAILABLE const resolved = router.resolve({ - name: 'dataset_detail', + name: 'datasets_detail', params: { did: dataset.id } }) modalData.dataset.uri = resolved.href diff --git a/src/components/forms/dataset/DatasetPropertiesFields.vue b/src/components/forms/dataset/DatasetPropertiesFields.vue index 1d4a95998..18668ecaf 100644 --- a/src/components/forms/dataset/DatasetPropertiesFields.vue +++ b/src/components/forms/dataset/DatasetPropertiesFields.vue @@ -92,7 +92,7 @@ const onSelectDataset = (value: DatasetV2 | undefined) => { datasetProperties.value.availability = Availability.LOCAL_AVAILABLE datasetProperties.value.id = value.id const resolved = router.resolve({ - name: 'dataset_detail', + name: 'datasets_detail', params: { did: value.id } }) datasetProperties.value.uri = resolved.href diff --git a/src/components/sections/SubSectionDatasets.vue b/src/components/sections/SubSectionDatasets.vue index 21e2c1b0b..7edc8691d 100644 --- a/src/components/sections/SubSectionDatasets.vue +++ b/src/components/sections/SubSectionDatasets.vue @@ -29,7 +29,7 @@ const zIndex = (key: number) => { } const getDatasetPage = (id: string) => { - return { name: 'dataset_detail', params: { did: id } } + return { name: 'datasets_detail', params: { did: id } } } const getOrganizationPage = (id: string) => { diff --git a/src/custom/ecospheres/components/indicators/IndicatorCard.vue b/src/custom/ecospheres/components/indicators/IndicatorCard.vue index 010e716c9..25e6287cf 100644 --- a/src/custom/ecospheres/components/indicators/IndicatorCard.vue +++ b/src/custom/ecospheres/components/indicators/IndicatorCard.vue @@ -18,7 +18,7 @@ defineProps({

{{ dataset.title }}

diff --git a/src/custom/ecospheres/components/indicators/IndicatorDatasetCard.vue b/src/custom/ecospheres/components/indicators/IndicatorDatasetCard.vue index 80dfe48f5..cf9de082f 100644 --- a/src/custom/ecospheres/components/indicators/IndicatorDatasetCard.vue +++ b/src/custom/ecospheres/components/indicators/IndicatorDatasetCard.vue @@ -57,7 +57,7 @@ const ownerName = useOwnerName(props.dataset)

await import('./views/HomeView.vue') }, - { - path: '/datasets', - children: [ - { - path: '', - name: 'datasets', - meta: { - title: 'Données', - filtersComponent: async () => - await import( - '@/custom/ecospheres/components/datasets/EcospheresDatasetSearch.vue' - ) - } as RouteMeta, - component: async () => - await import('@/views/datasets/DatasetsListView.vue'), - props: (route: RouteLocationNormalizedLoaded) => ({ - query: route.query.q, - page: route.query.page - }) - }, - { - path: ':did', - name: 'dataset_detail', - component: async () => - await import('@/views/datasets/DatasetDetailView.vue') - } - ] - }, - { - path: '/indicators', - children: [ - { - path: '', - name: 'indicators', - meta: { - title: 'Indicateurs', - cardComponent: async () => - await import( - '@/custom/ecospheres/components/indicators/IndicatorCard.vue' - ), - cardClass: 'fr-col fr-col-lg-6 fr-col-md-12', - filterKey: 'indicators' - } as RouteMeta, - component: async () => - await import('@/views/datasets/DatasetsListView.vue'), - props: (route: RouteLocationNormalizedLoaded) => ({ - // this forces the component to be recreated when switching from datasets to indicators - key: 'indicators', - query: route.query.q, - page: route.query.page - }) - }, - { - path: ':iid', - name: 'indicator_detail', - component: async () => - await import('./views/indicators/IndicatorDetailView.vue') - } - ] - } + useSearchPageRoutes({ + slug: 'datasets', + metaTitle: 'Données', + pageKey: 'datasets', + filtersComponent: async () => + await import('./components/datasets/EcospheresDatasetSearch.vue') + }), + useSearchPageRoutes({ + slug: 'indicators', + metaTitle: 'Indicateurs', + pageKey: 'indicators', + cardClass: 'fr-col fr-col-lg-6 fr-col-md-12', + filtersComponent: async () => + await import('./components/datasets/EcospheresDatasetSearch.vue'), + cardComponent: async () => + await import( + '@/custom/ecospheres/components/indicators/IndicatorCard.vue' + ) + }) + // { + // path: '/bouquets', + // children: [ + // { + // path: '', + // name: 'bouquets', + // meta: { + // title: 'Bouquets' + // }, + // component: async () => + // await import('@/views/bouquets/BouquetsListView.vue'), + // props: (route: RouteLocationNormalizedLoaded) => ({ + // query: route.query.q || null, + // page: route.query.page || null, + // sort: route.query.sort || '-last_modified' + // }) + // }, + // { + // path: ':tid', + // name: 'bouquet_detail', + // props: (route: RouteLocationNormalizedLoaded) => ({ + // topicId: route.params.tid + // }), + // component: async () => + // await import('@/views/bouquets/BouquetDetailView.vue') + // } + // ] + // }, + // { + // path: '/admin/bouquet/add', + // name: 'bouquet_add', + // component: async () => await import('@/views/bouquets/BouquetFormView.vue'), + // meta: { requiresAuth: true }, + // props: { isCreate: true } + // }, + // { + // path: '/admin/bouquet/edit/:bid', + // name: 'bouquet_edit', + // component: async () => await import('@/views/bouquets/BouquetFormView.vue'), + // meta: { requiresAuth: true }, + // props: { isCreate: false } + // }, ] diff --git a/src/custom/ecospheres/views/indicators/IndicatorDetailView.vue b/src/custom/ecospheres/views/indicators/IndicatorDetailView.vue index 021000cb7..13a02c287 100644 --- a/src/custom/ecospheres/views/indicators/IndicatorDetailView.vue +++ b/src/custom/ecospheres/views/indicators/IndicatorDetailView.vue @@ -25,7 +25,7 @@ import type { Indicator } from '../../model/indicator' import { UNFILLED_LABEL, useIndicatorExtras } from '../../utils/indicator' const route = useRouteParamsAsString() -const indicatorId = route.params.iid +const indicatorId = route.params.item_id const datasetStore = useDatasetStore() const userStore = useUserStore() diff --git a/src/router/index.ts b/src/router/index.ts index 98d791466..700df7333 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -19,7 +19,7 @@ export interface RouteMeta { filtersComponent?: () => Promise<{ default: Component }> cardComponent?: () => Promise<{ default: Component }> cardClass?: string - filterKey?: string + pageKey?: string } const { topicsSlug, topicsName } = useTopicsConf() @@ -36,31 +36,6 @@ const defaultRoutes: RouteRecordRaw[] = [ }, component: async () => await import('@/views/HomeView.vue') }, - // datasets - { - path: '/datasets', - children: [ - { - path: '', - name: 'datasets', - meta: { - title: 'Données' - }, - component: async () => - await import('@/views/datasets/DatasetsListView.vue'), - props: (route: RouteLocationNormalizedLoaded) => ({ - query: route.query.q, - page: route.query.page - }) - }, - { - path: ':did', - name: 'dataset_detail', - component: async () => - await import('@/views/datasets/DatasetDetailView.vue') - } - ] - }, // organizations { path: '/organizations', diff --git a/src/router/utils.ts b/src/router/utils.ts index ea252568c..bb33f9bbe 100644 --- a/src/router/utils.ts +++ b/src/router/utils.ts @@ -1,3 +1,4 @@ +import type { RouteMeta } from '@/router' import { useRoute, type RouteLocationNormalizedLoaded } from 'vue-router' export type QueryAsString = Record @@ -41,3 +42,54 @@ export const useRouteQueryAsString = (): RouteLocationQueryAsString => { ) return { ...route, query } } + +export const useSearchPageRoutes = ({ + slug, + metaTitle, + pageKey, + cardClass, + filtersComponent, + cardComponent, + detailViewComponent +}: { + // FIXME: merge slug and pageKey + slug: string + metaTitle: string + pageKey: string + cardClass?: string + filtersComponent?: () => Promise<{ default: Component }> + cardComponent?: () => Promise<{ default: Component }> + detailViewComponent?: () => Promise<{ default: Component }> +}) => { + return { + path: `/${slug}`, + children: [ + { + path: '', + name: slug, + meta: { + title: metaTitle, + pageKey, + cardClass, + filtersComponent, + cardComponent + } as RouteMeta, + component: async () => + await import('@/views/datasets/DatasetsListView.vue'), + props: (route: RouteLocationNormalizedLoaded) => ({ + // this forces the component to be recreated when switching page type + key: pageKey, + query: route.query.q, + page: route.query.page + }) + }, + { + path: ':item_id', + name: `${slug}_detail`, + component: + detailViewComponent ?? + (async () => await import('@/views/datasets/DatasetDetailView.vue')) + } + ] + } +} diff --git a/src/utils/tags.ts b/src/utils/tags.ts index 6f5a03700..5cf57fe28 100644 --- a/src/utils/tags.ts +++ b/src/utils/tags.ts @@ -11,12 +11,12 @@ interface HasTags { * Extract and denormalize tags from an object */ export const useTags = ( - filterKey: string, + pageKey: string, object: T | undefined | null, filterId?: string, exclude?: string[] ): ComputedRef => { - const pageConf = usePageConf(filterKey) + const pageConf = usePageConf(pageKey) const tagPrefix = pageConf.tag_prefix const filters = pageConf.filters @@ -52,22 +52,22 @@ export const useTags = ( } export const useTag = ( - filterKey: string, + pageKey: string, object: Ref, filterId: string ): ComputedRef => { return computed(() => { - const tags = useTags(filterKey, object.value, filterId) + const tags = useTags(pageKey, object.value, filterId) return tags.value[0] }) } export const getTagOptions = ( - filterKey: string, + pageKey: string, filterId: string, parentTagId?: string ): TagSelectOption[] => { - const filter = getFilterConf(filterKey, filterId) + const filter = getFilterConf(pageKey, filterId) if (!filter) return [] return filter.values.filter((value) => { if (!parentTagId) return true @@ -76,28 +76,28 @@ export const getTagOptions = ( } export const getFilterConf = ( - filterKey: string, + pageKey: string, filterId: string ): PageFilterConf | undefined => { - const pageConf = usePageConf(filterKey) + const pageConf = usePageConf(pageKey) return pageConf.filters.find((filter) => filter.id === filterId) } export const useTagOptions = ( - filterKey: string, + pageKey: string, tagId: Ref, tagType: string ): { tagOptions: TagSelectOption[] subTagOptions: ComputedRef } => { - const tagOptions = getTagOptions(filterKey, tagType) + const tagOptions = getTagOptions(pageKey, tagType) const subTagOptions = computed(() => { if (!tagId) return [] - const filter = getFilterConf(filterKey, tagType) + const filter = getFilterConf(pageKey, tagType) if (!filter || !filter.child) return [] - return getTagOptions(filterKey, filter.child, tagId.value) + return getTagOptions(pageKey, filter.child, tagId.value) }) return { @@ -111,13 +111,13 @@ export interface QueryArgs { } export const useTagSlug = ( - filterKey: string, + pageKey: string, filterId: string, tagId?: string, useTagPrefix = true ): string => { if (!useTagPrefix) return tagId || '' - const pageConf = usePageConf(filterKey) + const pageConf = usePageConf(pageKey) return `${pageConf.tag_prefix}-${filterId}-${tagId || ''}` } @@ -125,17 +125,17 @@ export const useTagSlug = ( * Build an array of normalized tags from query components and clean the original QueryArgs */ export const useTagsQuery = ( - filterKey: string, + pageKey: string, query: QueryArgs ): { tag: Array; extraArgs: QueryArgs } => { - const pageConf = usePageConf(filterKey) + const pageConf = usePageConf(pageKey) const filters = pageConf.filters.filter((item) => item.type === 'select') const queryArray = [] for (const filter of filters) { const queryFilter = query[filter.id] if (queryFilter != null) { queryArray.push( - useTagSlug(filterKey, filter.id, queryFilter, filter.use_tag_prefix) + useTagSlug(pageKey, filter.id, queryFilter, filter.use_tag_prefix) ) } delete query[filter.id] @@ -147,11 +147,11 @@ export const useTagsQuery = ( } export const useTagFromId = ( - filterKey: string, + pageKey: string, filterId: string, tagId: string | null ): ResolvedTag | null => { - const filter = getFilterConf(filterKey, filterId) + const filter = getFilterConf(pageKey, filterId) if (!filter) return null const tag = filter.values.find((v) => v.id === tagId) if (!tag) return null diff --git a/src/views/datasets/DatasetDetailView.vue b/src/views/datasets/DatasetDetailView.vue index 5e7001ab9..d7ad7266a 100644 --- a/src/views/datasets/DatasetDetailView.vue +++ b/src/views/datasets/DatasetDetailView.vue @@ -31,7 +31,7 @@ import { useTopicsConf } from '@/utils/config' import { useLicense } from '@/utils/dataset' const route = useRouteParamsAsString() -const datasetId = route.params.did +const datasetId = route.params.item_id const datasetStore = useDatasetStore() const userStore = useUserStore() diff --git a/src/views/datasets/DatasetsListView.vue b/src/views/datasets/DatasetsListView.vue index 8b6d844b9..2e5dec668 100644 --- a/src/views/datasets/DatasetsListView.vue +++ b/src/views/datasets/DatasetsListView.vue @@ -25,8 +25,10 @@ const props = defineProps({ const router = useRouter() const route = useRoute() +// FIXME: useRouteMeta const meta = route.meta as RouteMeta -const pageConf = usePageConf(meta.filterKey || 'datasets') +// FIXME: pageKey should be mandatory +const pageConf = usePageConf(meta.pageKey || 'datasets') const datasetListComp = ref | null>(null) const searchResultsMessage = computed( diff --git a/src/views/organizations/OrganizationDetailView.vue b/src/views/organizations/OrganizationDetailView.vue index d40a8c7b5..aa6b25e27 100644 --- a/src/views/organizations/OrganizationDetailView.vue +++ b/src/views/organizations/OrganizationDetailView.vue @@ -126,7 +126,7 @@ watchEffect(() => {
  • { modalData.dataset.availability = Availability.LOCAL_AVAILABLE const resolved = router.resolve({ name: 'datasets_detail', - params: { did: dataset.id } + params: { item_id: dataset.id } }) modalData.dataset.uri = resolved.href modalData.dataset.id = dataset.id diff --git a/src/components/forms/dataset/DatasetPropertiesFields.vue b/src/components/forms/dataset/DatasetPropertiesFields.vue index 18668ecaf..d6529dffc 100644 --- a/src/components/forms/dataset/DatasetPropertiesFields.vue +++ b/src/components/forms/dataset/DatasetPropertiesFields.vue @@ -93,7 +93,7 @@ const onSelectDataset = (value: DatasetV2 | undefined) => { datasetProperties.value.id = value.id const resolved = router.resolve({ name: 'datasets_detail', - params: { did: value.id } + params: { item_id: value.id } }) datasetProperties.value.uri = resolved.href delete datasetProperties.value.remoteDeleted diff --git a/src/components/sections/SubSectionDatasets.vue b/src/components/sections/SubSectionDatasets.vue index 7edc8691d..7cb91fcff 100644 --- a/src/components/sections/SubSectionDatasets.vue +++ b/src/components/sections/SubSectionDatasets.vue @@ -29,7 +29,7 @@ const zIndex = (key: number) => { } const getDatasetPage = (id: string) => { - return { name: 'datasets_detail', params: { did: id } } + return { name: 'datasets_detail', params: { item_id: id } } } const getOrganizationPage = (id: string) => { diff --git a/src/router/index.ts b/src/router/index.ts index 700df7333..fbb17c375 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -69,7 +69,7 @@ const defaultRoutes: RouteRecordRaw[] = [ title: capitalize(topicsName) + 's' }, component: async () => - await import('@/views/bouquets/BouquetsListView.vue'), + await import('@/views/bouquets/TopicsListView.vue'), props: (route: RouteLocationNormalizedLoaded) => ({ query: route.query.q || null, subtheme: route.query.subtheme || null, @@ -87,7 +87,7 @@ const defaultRoutes: RouteRecordRaw[] = [ bouquetId: route.params.bid }), component: async () => - await import('@/views/bouquets/BouquetDetailView.vue') + await import('@/views/bouquets/TopicDetailView.vue') } ] }, diff --git a/src/views/bouquets/BouquetDetailView.vue b/src/views/bouquets/TopicDetailView.vue similarity index 100% rename from src/views/bouquets/BouquetDetailView.vue rename to src/views/bouquets/TopicDetailView.vue diff --git a/src/views/bouquets/BouquetsListView.vue b/src/views/bouquets/TopicsListView.vue similarity index 98% rename from src/views/bouquets/BouquetsListView.vue rename to src/views/bouquets/TopicsListView.vue index 885e26630..d3dba80da 100644 --- a/src/views/bouquets/BouquetsListView.vue +++ b/src/views/bouquets/TopicsListView.vue @@ -90,7 +90,7 @@ const search = useDebounceFn(() => { .push({ name: topicsSlug, query: { ...route.query, q: selectedQuery.value }, - hash: '#bouquets-list' + hash: '#topics-list' }) .then(() => { setLiveResults() @@ -148,7 +148,7 @@ watch(
    - +
    Date: Thu, 3 Apr 2025 17:22:14 +0200 Subject: [PATCH 04/71] refactor TopicsListView --- configs/ecospheres/config.yaml | 122 ++-------- src/components/bouquets/BouquetCard.vue | 2 +- src/components/datasets/DatasetList.vue | 6 +- src/components/datasets/DatasetSearch.vue | 13 +- .../BouquetList.vue => topics/TopicList.vue} | 12 +- .../datasets/EcospheresDatasetSearch.vue | 2 +- src/custom/ecospheres/routes.ts | 58 ++--- src/model/topic.ts | 10 - src/router/index.ts | 58 +---- src/router/utils.ts | 54 ++++- src/utils/a11y.ts | 1 - src/views/bouquets/TopicsListView.vue | 216 ------------------ src/views/datasets/DatasetsListView.vue | 8 +- .../{bouquets => topics}/TopicDetailView.vue | 23 +- .../TopicFormView.vue} | 4 +- src/views/topics/TopicsListView.vue | 162 +++++++++++++ 16 files changed, 281 insertions(+), 470 deletions(-) rename src/components/{bouquets/BouquetList.vue => topics/TopicList.vue} (96%) delete mode 100644 src/views/bouquets/TopicsListView.vue rename src/views/{bouquets => topics}/TopicDetailView.vue (96%) rename src/views/{bouquets/BouquetFormView.vue => topics/TopicFormView.vue} (99%) create mode 100644 src/views/topics/TopicsListView.vue diff --git a/configs/ecospheres/config.yaml b/configs/ecospheres/config.yaml index 5affa7f38..dcafba9dd 100644 --- a/configs/ecospheres/config.yaml +++ b/configs/ecospheres/config.yaml @@ -171,12 +171,6 @@ website: can_add_topics: everyone: true authorized_users: - banner: - title: Mettre en commun les usages des données et des indicateurs territoriaux - content: | - Le module de bouquet offre aux acteurs du développement durable un cadre collaboratif pour documenter dans un contexte précis territoire par territoire l'usage des données et des indicateurs qu'ils mobilisent. Ils sont pensés pour être enrichis au fil du temps à mesure que des informations complémentaires sont identifiées par leurs contributeurs afin de promouvoir une réponse toujours plus complète aux problématiques exprimées. - - Toute donnée ou indicateur présent sur data.gouv.fr peut être associé à un bouquet. sitemap: - name: Accueil path: / @@ -323,20 +317,25 @@ pages: bouquets: universe_query: tag_prefix: ecospheres - title: + title: Bouquets breadcrumb_title: search: - input: + input: Filtrer les bouquets results: - one: - several: + one: 1 bouquet disponible + several: '{{total}} bouquets disponibles' banner: + title: Mettre en commun les usages des données et des indicateurs territoriaux + content: | + Le module de bouquet offre aux acteurs du développement durable un cadre collaboratif pour documenter dans un contexte précis territoire par territoire l'usage des données et des indicateurs qu'ils mobilisent. Ils sont pensés pour être enrichis au fil du temps à mesure que des informations complémentaires sont identifiées par leurs contributeurs afin de promouvoir une réponse toujours plus complète aux problématiques exprimées. + + Toute donnée ou indicateur présent sur data.gouv.fr peut être associé à un bouquet. filters: - name: Thématique + default_option: Toutes les thématiques id: theme type: select - child: subtheme - color: noop + color: green-emeraude use_tag_prefix: true values: - id: se-loger @@ -353,101 +352,10 @@ pages: name: Se déplacer - id: chantiers-transverses name: Chantiers transverses - - name: Chantier - id: subtheme - type: select - color: green-archipel - use_tag_prefix: true - values: - # parent theme: se-loger - - id: construction-et-renovation-des-logements - name: Construction et rénovation des logements - parent: se-loger - - id: amenagements-des-villes - name: Aménagements des villes - parent: se-loger - # parent theme: produire - - id: nucleaire - name: Nucléaire - parent: produire - - id: tertiaire - name: - Tertiaire (incluant les bâtiments publics de l'État et des collectivités, - hors logement) - parent: produire - - id: electricite-decarbonee - name: Production d'électricité décarbonée (hors nucléaire) - parent: produire - # parent theme: se-nourrir - - id: alimentation - name: Alimentation - parent: se-nourrir - - id: agriculture-et-peche - name: Agriculture et pêche - parent: se-nourrir - # parent theme: consommer - - id: consommation-plus-durable-menages - name: Consommation plus durable (ménages) - parent: consommer - - id: numerique-responsable - name: Numérique responsable - parent: consommer - - id: achats-durables - name: Achats durables (de l'État, des collectivités et des entreprises) - parent: consommer - # parent theme: preserver - - id: eau - name: Eau - parent: preserver - - id: sols - name: Sols - parent: preserver - - id: oceans-et-mers - name: Océans et mers - parent: preserver - - id: foret - name: Forêt - parent: preserver - # parent theme: se-deplacer - - id: voitures-et-infrastructures-routieres - name: Voitures et infrastructures routières - parent: se-deplacer - - id: mobilite-courte-distance-hors-voiture - name: Mobilité courte distance (hors voiture) - parent: se-deplacer - - id: mobilite-longue-distance-avion-train - name: Mobilité longue distance (avion, train) - parent: se-deplacer - # parent theme: chantiers-transverses - - id: financement-investissement - name: - Le financement qui permet de définir des trajectoires d'investissement - crédibles et cohérentes - parent: chantiers-transverses - - id: planification-differenciation-territoriale - name: - La planification et la différenciation territoriale selon les caractéristiques - et les spécificités de chaque territoire, incluant les territoires ultra-marins - parent: chantiers-transverses - - id: transition-filieres-emplois-formations-competences - name: - La transition des filières avec la gestion des emplois, des formations - et des compétences - parent: chantiers-transverses - - id: donnees-environnementales - name: Les données environnementales - parent: chantiers-transverses - - id: services-publics-exemplaires - name: Les services publics exemplaires - parent: chantiers-transverses - - id: transition-juste - name: - La transition juste et les mesures d’accompagnement, pour ne laisser personne - au bord du chemin - parent: chantiers-transverses - - id: sobriete-usages-ressources - name: La sobriété des usages et des ressources - parent: chantiers-transverses + - name: Couverture territoriale + default_option: + id: geozone + type: spatial_zone # INDICATORS indicators: universe_query: diff --git a/src/components/bouquets/BouquetCard.vue b/src/components/bouquets/BouquetCard.vue index 5a6d8b7e4..718f84a51 100644 --- a/src/components/bouquets/BouquetCard.vue +++ b/src/components/bouquets/BouquetCard.vue @@ -41,7 +41,7 @@ const nbData: number = datasetsProperties.value.length const bouquetLink: RouteLocationRaw = { name: `${topicsSlug}_detail`, - params: { bid: props.bouquet.slug } + params: { item_id: props.bouquet.slug } } const theme = useTag('bouquets', bouquetRef, 'theme') diff --git a/src/components/datasets/DatasetList.vue b/src/components/datasets/DatasetList.vue index e83f8b12e..8acbe583a 100644 --- a/src/components/datasets/DatasetList.vue +++ b/src/components/datasets/DatasetList.vue @@ -52,7 +52,7 @@ const getOrganizationPage = (id: string | undefined) => { const clearFilters = () => { const query: LocationQueryRaw = {} - router.push({ name: route.name, query, hash: '#datasets-list' }).then(() => { + router.push({ name: route.name, query, hash: '#list' }).then(() => { emits('clearFilters') }) } @@ -61,7 +61,7 @@ const goToPage = (page: number) => { router.push({ name: route.name, query: { ...route.query, page: page + 1 }, - hash: '#datasets-list' + hash: '#list' }) } @@ -69,7 +69,7 @@ const doSort = (value: string | null) => { router.push({ name: route.name, query: { ...route.query, sort: value }, - hash: '#datasets-list' + hash: '#list' }) } diff --git a/src/components/datasets/DatasetSearch.vue b/src/components/datasets/DatasetSearch.vue index 941404dde..6ab42b5d9 100644 --- a/src/components/datasets/DatasetSearch.vue +++ b/src/components/datasets/DatasetSearch.vue @@ -4,6 +4,7 @@ import SelectSpatialGranularity from '@/components/forms/SelectSpatialGranularit import type { SpatialCoverage } from '@/model/spatial' import type { RouteMeta } from '@/router' import { useRouteQueryAsString } from '@/router/utils' +import { useSpatialStore } from '@/store/SpatialStore' import { useFiltersState } from '@/utils/filters' import { useRoute, useRouter } from 'vue-router' @@ -18,14 +19,14 @@ const selectedSpatialCoverage: Ref = ref(undefined) const { filtersState, pageConf } = useFiltersState( routeQuery, - meta.filterKey || 'datasets' + meta.pageKey || 'datasets' ) const navigate = (data?: Record) => { router.push({ name: route.name, query: { ...route.query, ...data }, - hash: '#datasets-list' + hash: '#list' }) } @@ -56,6 +57,14 @@ watch( }, { immediate: true } ) + +onMounted(async () => { + if (routeQuery.geozone) { + selectedSpatialCoverage.value = await useSpatialStore().loadZone( + routeQuery.geozone + ) + } +})