From 3dd24e33c941dc4b7f3b1dc67bc4e1383d0c5176 Mon Sep 17 00:00:00 2001 From: josedario87 Date: Mon, 13 Oct 2025 18:46:52 -0600 Subject: [PATCH] refactor: improve SelectMenu implementation with object binding - Change from ID-based selection to full object binding - Add custom label templates to display proper text - Simplify computed properties and watchers - Improve user experience with proper label display --- nuxt4-app/app/pages/explorer.vue | 68 +++++++++++++++----------------- 1 file changed, 31 insertions(+), 37 deletions(-) diff --git a/nuxt4-app/app/pages/explorer.vue b/nuxt4-app/app/pages/explorer.vue index c11924c..64b91e8 100644 --- a/nuxt4-app/app/pages/explorer.vue +++ b/nuxt4-app/app/pages/explorer.vue @@ -15,34 +15,40 @@ + option-attribute="name" + > + + - + + :disabled="loadingTables || !selectedDatabase" + option-attribute="name" + > + + - +

No hay datos disponibles

@@ -175,8 +181,8 @@ definePageMeta({ }) // State -const selectedDatabaseId = ref(null) -const selectedTableId = ref(null) +const selectedDatabase = ref(null) +const selectedTable = ref(null) const loadingDatabases = ref(false) const loadingTables = ref(false) const loadingData = ref(false) @@ -190,23 +196,11 @@ const tableData = ref([]) const visibleColumns = ref([]) // Computed -const databaseOptions = computed(() => { - return databases.value.map(db => ({ - label: db.name, - value: db.id - })) -}) - -const tableOptions = computed(() => { - return tables.value.map(table => ({ - label: `${table.display_name || table.name} (${table.row_count || 0} registros)`, - value: table.id - })) -}) +const selectedDatabaseId = computed(() => selectedDatabase.value?.id) +const selectedTableId = computed(() => selectedTable.value?.id) const selectedTableName = computed(() => { - const table = tables.value.find(t => t.id === selectedTableId.value) - return table ? (table.display_name || table.name) : '' + return selectedTable.value ? (selectedTable.value.display_name || selectedTable.value.name) : '' }) const tableColumns = computed(() => { @@ -252,7 +246,7 @@ async function loadDatabases() { // Auto-select first database if (databases.value.length > 0) { - selectedDatabaseId.value = databases.value[0].id + selectedDatabase.value = databases.value[0] } } catch (err: any) { error.value = `Error al cargar bases de datos: ${err.message || 'Error desconocido'}` @@ -263,15 +257,15 @@ async function loadDatabases() { } async function loadTables() { - if (!selectedDatabaseId.value) return + if (!selectedDatabase.value) return loadingTables.value = true error.value = null - selectedTableId.value = null + selectedTable.value = null tableData.value = [] try { - const response = await $fetch(`/api/metabase/tables/${selectedDatabaseId.value}`) + const response = await $fetch(`/api/metabase/tables/${selectedDatabase.value.id}`) const metadata = response as any // Metabase returns tables in the 'tables' property @@ -339,7 +333,7 @@ function toggleColumn(columnKey: string) { } // Watchers -watch(selectedDatabaseId, () => { +watch(selectedDatabase, () => { loadTables() })