diff --git a/frontend/src/lib/api/dashboard/a76/general_catalogs/customs-broker-concepts.ts b/frontend/src/lib/api/dashboard/a76/general_catalogs/customs-broker-concepts.ts index 2d53c469..2ce162fd 100644 --- a/frontend/src/lib/api/dashboard/a76/general_catalogs/customs-broker-concepts.ts +++ b/frontend/src/lib/api/dashboard/a76/general_catalogs/customs-broker-concepts.ts @@ -59,5 +59,5 @@ export async function updateCustomsBrokerConcept(id: number, data: CustomsBroker } export async function deleteCustomsBrokerConcept(id: number, companyId: number): Promise> { - return await api.delete(`/v1/a76/customs-broker-concepts/${id}/?company_id=${companyId}`); + return await api.delete(`/v1/a76/customs-broker-concepts/${id}?company_id=${companyId}`); } diff --git a/frontend/src/lib/components/dashboard/general_catalogs/customs_broker_concepts/create-edit-dialog.svelte b/frontend/src/lib/components/dashboard/general_catalogs/customs_broker_concepts/create-edit-dialog.svelte index 30f7a7c0..61e3db50 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/customs_broker_concepts/create-edit-dialog.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/customs_broker_concepts/create-edit-dialog.svelte @@ -3,6 +3,12 @@ import * as Dialog from '$lib/components/ui/dialog'; import { Input } from '$lib/components/ui/input'; import { Label } from '$lib/components/ui/label'; + import { FolderSearch } from 'lucide-svelte'; + import BrokerSelectorDialog from '$lib/components/dashboard/export/manifest/modals/broker-selector-dialog.svelte'; + import { + customsBrokersApi, + type CustomsBroker + } from '$lib/api/dashboard/a76/customs-brokers'; import { createCustomsBrokerConcept, updateCustomsBrokerConcept, @@ -38,6 +44,8 @@ let loading = $state(false); let error = $state(null); + let showBrokerSelector = $state(false); + let selectedBrokerLabel = $state(''); // Cargar datos al editar $effect(() => { @@ -48,6 +56,7 @@ amount: item.amount, priority: item.priority }; + selectedBrokerLabel = item.broker_key || ''; } else { formData = { broker_key: '', @@ -55,9 +64,36 @@ amount: undefined, priority: undefined }; + selectedBrokerLabel = ''; } }); + $effect(() => { + if (!open || !formData.broker_key || !companyId || selectedBrokerLabel) return; + + (async () => { + try { + const response = await customsBrokersApi.get(formData.broker_key, companyId.toString()); + if (response.data) { + selectedBrokerLabel = response.data.name || response.data.broker_key; + } + } catch (e) { + selectedBrokerLabel = formData.broker_key; + } + })(); + }); + + function handleBrokerSelect(broker: CustomsBroker) { + formData.broker_key = broker.broker_key || ''; + selectedBrokerLabel = broker.name || broker.broker_key || ''; + } + + const brokerDisplayValue = $derived( + selectedBrokerLabel && selectedBrokerLabel !== formData.broker_key + ? `${selectedBrokerLabel} (${formData.broker_key})` + : formData.broker_key + ); + async function handleSubmit() { error = null; loading = true; @@ -118,13 +154,28 @@
- +
+ { + if (!isEdit) showBrokerSelector = true; + }} + /> + +
@@ -166,3 +217,5 @@ + + diff --git a/frontend/src/routes/dashboard/general_catalogs/customs_broker_concepts/+page.svelte b/frontend/src/routes/dashboard/general_catalogs/customs_broker_concepts/+page.svelte index a049231d..9e1d707a 100644 --- a/frontend/src/routes/dashboard/general_catalogs/customs_broker_concepts/+page.svelte +++ b/frontend/src/routes/dashboard/general_catalogs/customs_broker_concepts/+page.svelte @@ -6,26 +6,34 @@ import CreateEditDialog from '$lib/components/dashboard/general_catalogs/customs_broker_concepts/create-edit-dialog.svelte'; import { Button } from '$lib/components/ui/button'; import { Input } from '$lib/components/ui/input'; - import { Plus, RefreshCw } from 'lucide-svelte'; - import { goto } from '$app/navigation'; + import { Pencil, Plus, Trash2 } from 'lucide-svelte'; import { browser } from '$app/environment'; import { useShortcuts } from '$lib/hooks/use-shortcuts'; import { obtenerAtajosListaConceptosAA } from '$lib/config/shortcuts/dashboard/general_catalogs/customs_broker_concepts/list'; import { companyStore } from '$lib/stores/company.svelte'; - import { getCustomsBrokerConcepts } from '$lib/api/dashboard/a76/general_catalogs/customs-broker-concepts'; + import { + deleteCustomsBrokerConcept, + getCustomsBrokerConcepts, + type CustomsBrokerConcept + } from '$lib/api/dashboard/a76/general_catalogs/customs-broker-concepts'; let { data } = $props(); const activeCompanyId = $derived(companyStore.activeCompany?.id); let dialogOpen = $state(false); + let editingItem = $state(null); let error = $state(data.error || null); + let selectedIds = $state<(string | number)[]>([]); // Atajos useShortcuts( 'Lista Conceptos AA', obtenerAtajosListaConceptosAA({ - manejarNuevo: () => (dialogOpen = true), - manejarActualizar: () => goto($page.url, { invalidateAll: true }), + manejarNuevo: () => { + editingItem = null; + dialogOpen = true; + }, + manejarActualizar: reloadData, }) ); @@ -42,6 +50,9 @@ let totalItems = $state(data.concepts?.total || 0); let loading = $state(false); let hasMore = $derived(allItems.length < totalItems); + const selectedConcept = $derived( + selectedIds.length === 1 ? allItems.find((item) => item.id === selectedIds[0]) ?? null : null + ); $effect(() => { if (data.concepts) { @@ -150,8 +161,62 @@ } function handleSuccess() { + dialogOpen = false; + editingItem = null; + selectedIds = []; reloadData(); } + + function handleRowClick(row: CustomsBrokerConcept) { + const id = row.id; + selectedIds = selectedIds.includes(id) ? [] : [id]; + } + + function handleRowDoubleClick(row: CustomsBrokerConcept) { + editingItem = row; + dialogOpen = true; + } + + function handleEditSelected() { + if (!selectedConcept) return; + editingItem = selectedConcept; + dialogOpen = true; + } + + async function handleDeleteSelected() { + if (!selectedConcept || !companyStore.activeCompany) return; + + if ( + !confirm( + `¿Estás seguro de eliminar el concepto "${selectedConcept.concept}" del agente "${selectedConcept.broker_key}"?` + ) + ) { + return; + } + + loading = true; + error = null; + + try { + const response = await deleteCustomsBrokerConcept( + selectedConcept.id, + companyStore.activeCompany.id + ); + + if (response.error) { + error = response.error; + return; + } + + selectedIds = []; + await reloadData(); + } catch (err) { + error = 'Error al eliminar el concepto'; + console.error('Error deleting broker concept:', err); + } finally { + loading = false; + } + }
@@ -161,11 +226,13 @@

Gestión del catálogo de conceptos de agente aduanal

- - @@ -206,6 +273,10 @@ {loading} {hasMore} {loadMore} + {selectedIds} + onSelectedIdsChange={(ids) => (selectedIds = ids)} + onRowClick={handleRowClick} + onRowDoubleClick={handleRowDoubleClick} />
@@ -215,9 +286,41 @@ Mostrando {allItems.length} de {totalItems} registros
+
+ + + {#if activeCompanyId}