- Updated the "Nueva Sección" button in customs_sections, customs_warehouses, incoterms, invoice_types, material_types, payment_methods, pedimento_codes, pedimento_regimens, sectors, states, transport_modes, and transport_types pages to use the Plus icon from Lucide. - Updated the "Actualizar" button in the same pages to use the RefreshCw icon from Lucide. - Added a new edit dialog component for customs brokers with a comprehensive form for editing broker details, including validation and loading states.
88 lines
2.2 KiB
Svelte
88 lines
2.2 KiB
Svelte
<script lang="ts">
|
|
import { Button } from "$lib/components/ui/button";
|
|
import * as DropdownMenu from "$lib/components/ui/dropdown-menu";
|
|
import { pedimentosApi, type Pedimento } from "$lib/api/dashboard/a76/pedimentos";
|
|
import { EllipsisVertical, Pencil, LoaderCircle, Trash2 } from 'lucide-svelte';
|
|
|
|
let {
|
|
item,
|
|
onSuccess
|
|
}: {
|
|
item: Pedimento;
|
|
onSuccess?: () => void;
|
|
} = $props();
|
|
|
|
let loading = $state(false);
|
|
let error = $state<string | null>(null);
|
|
|
|
async function handleDelete() {
|
|
if (!confirm(`¿Estás seguro de eliminar el pedimento #${item.id}?`)) {
|
|
return;
|
|
}
|
|
|
|
loading = true;
|
|
error = null;
|
|
|
|
try {
|
|
const response = await pedimentosApi.delete(item.id);
|
|
|
|
if (response.error) {
|
|
if (response.status === 401) {
|
|
error = 'Sesión expirada. Recargando página...';
|
|
setTimeout(() => {
|
|
window.location.reload();
|
|
}, 1500);
|
|
} else {
|
|
error = response.error;
|
|
alert(`Error al eliminar: ${response.error}`);
|
|
}
|
|
return;
|
|
}
|
|
|
|
// Éxito
|
|
if (onSuccess) {
|
|
onSuccess();
|
|
}
|
|
} catch (e) {
|
|
error = e instanceof Error ? e.message : "Error al eliminar";
|
|
alert(`Error: ${error}`);
|
|
console.error("Error deleting:", e);
|
|
} finally {
|
|
loading = false;
|
|
}
|
|
}
|
|
|
|
function handleEdit() {
|
|
// Navegar a la página de edición
|
|
window.location.href = `/dashboard/pedimentos/edit/${item.id}`;
|
|
}
|
|
</script>
|
|
|
|
<DropdownMenu.Root>
|
|
<DropdownMenu.Trigger>
|
|
{#snippet child({ props })}
|
|
<Button {...props} variant="ghost" size="icon" class="relative size-8 p-0">
|
|
<span class="sr-only">Abrir menú</span>
|
|
<EllipsisVertical class="h-4 w-4" />
|
|
</Button>
|
|
{/snippet}
|
|
</DropdownMenu.Trigger>
|
|
<DropdownMenu.Content align="end" class="w-[160px]">
|
|
<DropdownMenu.Label>Acciones</DropdownMenu.Label>
|
|
<DropdownMenu.Separator />
|
|
<DropdownMenu.Item onclick={handleEdit}>
|
|
<Pencil class="mr-2 h-4 w-4" />
|
|
Editar
|
|
</DropdownMenu.Item>
|
|
<DropdownMenu.Separator />
|
|
<DropdownMenu.Item onclick={handleDelete} class="text-destructive" disabled={loading}>
|
|
{#if loading}
|
|
<LoaderCircle class="mr-2 h-4 w-4 animate-spin" />
|
|
{:else}
|
|
<Trash2 class="mr-2 h-4 w-4" />
|
|
{/if}
|
|
Eliminar
|
|
</DropdownMenu.Item>
|
|
</DropdownMenu.Content>
|
|
</DropdownMenu.Root>
|