From 34bbaf7cea3b6c98f209eff38c5c4e9156ef2e0a Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Thu, 22 Oct 2026 14:47:44 +0200 Subject: [PATCH 01/29] feat(CrsSelector): v-model API, authority:code selection key, non-blocking load [skip ci] --- app/components/CrsSelector.vue | 45 ++++++-------- .../unit/components/CrsSelector.nuxt.test.ts | 60 +++++++++++++++++-- 2 files changed, 72 insertions(+), 33 deletions(-) diff --git a/app/components/CrsSelector.vue b/app/components/CrsSelector.vue index 023c5b11b..552907cc6 100644 --- a/app/components/CrsSelector.vue +++ b/app/components/CrsSelector.vue @@ -2,22 +2,14 @@ import schemas, { type CRSList } from "@geode/opengeodeweb-back/opengeodeweb_back_typed_schemas.js"; import { useBackStore } from "@ogw_front/stores/back"; -const schema = schemas.opengeodeweb_back.geographic_coordinate_systems; - -interface Emits { - update_values: [values: Record]; - increment_step: []; - decrement_step: []; -} - -const emit = defineEmits(); +const schema = schemas.opengeodeweb_back.crs.geographic_list; interface Props { geodeObjectType: string; - keyToUpdate: string; } -const { geodeObjectType, keyToUpdate } = defineProps(); +const { geodeObjectType } = defineProps(); +const selectedCrs = defineModel(); const search = ref(""); const data_table_loading = ref(false); @@ -26,24 +18,20 @@ const selected_crs = ref([]); const toggle_loading = useToggle(data_table_loading); const backStore = useBackStore(); -function get_selected_crs(crs_code: unknown): unknown { - for (const crs of crs_list.value) { - if (crs.code === crs_code) { - return crs; - } - } +// Codes are only unique within an authority (e.g. EPSG:4812 and ESRI:4812) +function crs_key(crs: CRSList): string { + return `${crs.authority}:${crs.code}`; +} + +function get_selected_crs(key: unknown): CRSList | undefined { + return crs_list.value.find((crs) => crs_key(crs) === key); } watch(selected_crs, (new_value) => { - const crs = get_selected_crs(new_value[0]); - const keys_values_object = { - [keyToUpdate]: crs, - }; - emit("update_values", keys_values_object); - emit("increment_step"); + selectedCrs.value = get_selected_crs(new_value[0]); }); -async function get_crs_table(): void { +async function get_crs_table(): Promise { const params = { geode_object_type: geodeObjectType }; toggle_loading(); await backStore.request( @@ -68,13 +56,16 @@ const headers = [ { title: "Name", align: "end", key: "name" }, ] as const; -// oxlint-disable-next-line no-top-level-await -await get_crs_table(); +// Not awaited in setup: the table renders right away with its loader +onMounted(async () => { + await get_crs_table(); +});