diff --git a/frontend/src/lib/api/dashboard/a76/general_catalogs/classification-concepts.ts b/frontend/src/lib/api/dashboard/a76/general_catalogs/classification-concepts.ts index 77f0f8b8..cb3384ef 100644 --- a/frontend/src/lib/api/dashboard/a76/general_catalogs/classification-concepts.ts +++ b/frontend/src/lib/api/dashboard/a76/general_catalogs/classification-concepts.ts @@ -43,7 +43,7 @@ export async function getClassificationConcepts( } export async function getClassificationConcept(id: number, companyId: number): Promise> { - return await api.get(`/v1/a76/classification-concepts/${id}/?company_id=${companyId}`); + return await api.get(`/v1/a76/classification-concepts/${id}?company_id=${companyId}`); } export async function createClassificationConcept( @@ -62,5 +62,5 @@ export async function updateClassificationConcept( } export async function deleteClassificationConcept(id: number, companyId: number): Promise> { - return await api.delete(`/v1/a76/classification-concepts/${id}/?company_id=${companyId}`); + return await api.delete(`/v1/a76/classification-concepts/${id}?company_id=${companyId}`); } \ No newline at end of file diff --git a/frontend/src/lib/api/dashboard/a76/general_catalogs/company.ts b/frontend/src/lib/api/dashboard/a76/general_catalogs/company.ts index f5814474..ab21081d 100644 --- a/frontend/src/lib/api/dashboard/a76/general_catalogs/company.ts +++ b/frontend/src/lib/api/dashboard/a76/general_catalogs/company.ts @@ -426,7 +426,7 @@ export async function getCompanies( page_size: pageSize.toString(), ...filters }); - return await api.get(`/v1/a76/company/?${queryParams.toString()}`); + return await api.get(`/v1/a76/company?${queryParams.toString()}`); } export async function getCompany(id: number): Promise> { @@ -434,7 +434,7 @@ export async function getCompany(id: number): Promise> { } export async function createCompany(data: CompanyCreate): Promise> { - return await api.post(`/v1/a76/company/`, data); + return await api.post(`/v1/a76/company`, data); } export async function updateCompany(id: number, data: CompanyUpdate): Promise> { @@ -442,7 +442,7 @@ export async function updateCompany(id: number, data: CompanyUpdate): Promise> { - return await api.delete(`/v1/a76/company/${id}/`); + return await api.delete(`/v1/a76/company/${id}`); } export async function uploadCompanyLogo(id: number, file: File): Promise> { diff --git a/frontend/src/lib/api/dashboard/a76/general_catalogs/concepts.ts b/frontend/src/lib/api/dashboard/a76/general_catalogs/concepts.ts index 6232e3ce..b943aaee 100644 --- a/frontend/src/lib/api/dashboard/a76/general_catalogs/concepts.ts +++ b/frontend/src/lib/api/dashboard/a76/general_catalogs/concepts.ts @@ -62,7 +62,7 @@ export async function getConcepts( export async function getConcept(id: number, companyId: number): Promise> { - return await api.get(`/v1/a76/concepts/${id}/?company_id=${companyId}`); + return await api.get(`/v1/a76/concepts/${id}?company_id=${companyId}`); } @@ -77,5 +77,5 @@ export async function updateConcept(id: number, data: ConceptUpdate, companyId: export async function deleteConcept(id: number, companyId: number): Promise> { - return await api.delete(`/v1/a76/concepts/${id}/?company_id=${companyId}`); + return await api.delete(`/v1/a76/concepts/${id}?company_id=${companyId}`); } \ No newline at end of file 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 2ce162fd..dce225f7 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 @@ -47,7 +47,7 @@ export async function getCustomsBrokerConcepts( } export async function getCustomsBrokerConcept(id: number, companyId: number): Promise> { - return await api.get(`/v1/a76/customs-broker-concepts/${id}/?company_id=${companyId}`); + return await api.get(`/v1/a76/customs-broker-concepts/${id}?company_id=${companyId}`); } export async function createCustomsBrokerConcept(data: CustomsBrokerConceptCreate, companyId: number): Promise> { diff --git a/frontend/src/lib/api/dashboard/a76/general_catalogs/electronic-notices.ts b/frontend/src/lib/api/dashboard/a76/general_catalogs/electronic-notices.ts index 591ab614..7a8fdc0f 100644 --- a/frontend/src/lib/api/dashboard/a76/general_catalogs/electronic-notices.ts +++ b/frontend/src/lib/api/dashboard/a76/general_catalogs/electronic-notices.ts @@ -1,5 +1,4 @@ import { api } from '$lib/api'; -import type { ApiResponse } from '$lib/api'; export interface ElectronicNotice { id: number; @@ -52,7 +51,7 @@ export async function getElectronicNotices( pageSize: number = 50, filters: Record = {}, companyId?: number -): Promise> { +): Promise { const params = new URLSearchParams({ page: page.toString(), page_size: pageSize.toString(), @@ -62,7 +61,13 @@ export async function getElectronicNotices( params.append('company_id', companyId.toString()); } - const response = await api.get(`/v1/a76/electronic-notices/?${params.toString()}`); + const response = await api.get(`/v1/a76/electronic-notices/?${params.toString()}`); + if (response.error) { + throw new Error(response.error); + } + if (!response.data) { + throw new Error('No se pudieron obtener los avisos electrónicos'); + } return response.data; } @@ -71,20 +76,41 @@ export async function getElectronicNotice(id: number, companyId?: number): Promi if (companyId) { params.append('company_id', companyId.toString()); } - const response = await api.get(`/v1/a76/electronic-notices/${id}?${params.toString()}`); + const response = await api.get(`/v1/a76/electronic-notices/${id}?${params.toString()}`); + if (response.error) { + throw new Error(response.error); + } + if (!response.data) { + throw new Error('No se pudo obtener el aviso electrónico'); + } return response.data; } export async function createElectronicNotice(data: ElectronicNoticeCreate, companyId: number): Promise { - const response = await api.post(`/v1/a76/electronic-notices/?company_id=${companyId}`, data); + const response = await api.post(`/v1/a76/electronic-notices/?company_id=${companyId}`, data); + if (response.error) { + throw new Error(response.error); + } + if (!response.data) { + throw new Error('No se pudo crear el aviso electrónico'); + } return response.data; } export async function updateElectronicNotice(id: number, data: ElectronicNoticeUpdate, companyId: number): Promise { - const response = await api.put(`/v1/a76/electronic-notices/${id}?company_id=${companyId}`, data); + const response = await api.put(`/v1/a76/electronic-notices/${id}/?company_id=${companyId}`, data); + if (response.error) { + throw new Error(response.error); + } + if (!response.data) { + throw new Error('No se pudo actualizar el aviso electrónico'); + } return response.data; } export async function deleteElectronicNotice(id: number, companyId: number): Promise { - await api.delete(`/v1/a76/electronic-notices/${id}?company_id=${companyId}`); + const response = await api.delete(`/v1/a76/electronic-notices/${id}?company_id=${companyId}`); + if (response.error) { + throw new Error(response.error); + } } \ No newline at end of file diff --git a/frontend/src/lib/api/dashboard/a76/general_catalogs/error-catalogs.ts b/frontend/src/lib/api/dashboard/a76/general_catalogs/error-catalogs.ts index f48c9139..21d02991 100644 --- a/frontend/src/lib/api/dashboard/a76/general_catalogs/error-catalogs.ts +++ b/frontend/src/lib/api/dashboard/a76/general_catalogs/error-catalogs.ts @@ -93,7 +93,7 @@ export async function createErrorClassification(data: ErrorClassificationCreate, export async function updateErrorClassification(id: number, data: ErrorClassificationUpdate, companyId: number): Promise { const params = new URLSearchParams({ company_id: companyId.toString() }); - const response = await api.put(`/v1/a76/error-catalogs/classifications/${id}?${params.toString()}`, data); + const response = await api.put(`/v1/a76/error-catalogs/classifications/${id}/?${params.toString()}`, data); return response.data; } @@ -135,7 +135,7 @@ export async function createErrorCatalog(data: ErrorCatalogCreate, companyId: nu export async function updateErrorCatalog(id: number, data: ErrorCatalogUpdate, companyId: number): Promise { const params = new URLSearchParams({ company_id: companyId.toString() }); - const response = await api.put(`/v1/a76/error-catalogs/${id}?${params.toString()}`, data); + const response = await api.put(`/v1/a76/error-catalogs/${id}/?${params.toString()}`, data); return response.data; } diff --git a/frontend/src/lib/api/dashboard/a76/general_catalogs/identifiers.ts b/frontend/src/lib/api/dashboard/a76/general_catalogs/identifiers.ts index 15be7cc2..d2346b06 100644 --- a/frontend/src/lib/api/dashboard/a76/general_catalogs/identifiers.ts +++ b/frontend/src/lib/api/dashboard/a76/general_catalogs/identifiers.ts @@ -97,7 +97,7 @@ export async function deleteIdentifier( id: number, companyId: number ): Promise> { - return await api.delete(`/v1/a76/identifiers/${id}/?company_id=${companyId}`); + return await api.delete(`/v1/a76/identifiers/${id}?company_id=${companyId}`); } /** @@ -122,5 +122,5 @@ export async function deleteIdentifierDetail( id: number, companyId: number ): Promise> { - return await api.delete(`/v1/a76/identifiers/details/${id}/?company_id=${companyId}`); + return await api.delete(`/v1/a76/identifiers/details/${id}?company_id=${companyId}`); } \ No newline at end of file diff --git a/frontend/src/lib/api/dashboard/a76/general_catalogs/inpc.ts b/frontend/src/lib/api/dashboard/a76/general_catalogs/inpc.ts index 4720519b..c74a6778 100644 --- a/frontend/src/lib/api/dashboard/a76/general_catalogs/inpc.ts +++ b/frontend/src/lib/api/dashboard/a76/general_catalogs/inpc.ts @@ -45,7 +45,7 @@ export async function getINPCs( } export async function getINPC(id: number, companyId: number): Promise> { - return await api.get(`/v1/a76/inpc/${id}/?company_id=${companyId}`); + return await api.get(`/v1/a76/inpc/${id}?company_id=${companyId}`); } export async function createINPC( @@ -64,5 +64,5 @@ export async function updateINPC( } export async function deleteINPC(id: number, companyId: number): Promise> { - return await api.delete(`/v1/a76/inpc/${id}/?company_id=${companyId}`); + return await api.delete(`/v1/a76/inpc/${id}?company_id=${companyId}`); } diff --git a/frontend/src/lib/api/dashboard/a76/general_catalogs/legends.ts b/frontend/src/lib/api/dashboard/a76/general_catalogs/legends.ts index 1e81cb63..1794908f 100644 --- a/frontend/src/lib/api/dashboard/a76/general_catalogs/legends.ts +++ b/frontend/src/lib/api/dashboard/a76/general_catalogs/legends.ts @@ -42,7 +42,7 @@ export async function getLegends( } export async function getLegend(id: number, companyId: number): Promise> { - return await api.get(`/v1/a76/legends/${id}/?company_id=${companyId}`); + return await api.get(`/v1/a76/legends/${id}?company_id=${companyId}`); } export async function createLegend( @@ -61,5 +61,5 @@ export async function updateLegend( } export async function deleteLegend(id: number, companyId: number): Promise> { - return await api.delete(`/v1/a76/legends/${id}/?company_id=${companyId}`); + return await api.delete(`/v1/a76/legends/${id}?company_id=${companyId}`); } \ No newline at end of file diff --git a/frontend/src/lib/api/dashboard/a76/general_catalogs/multi-currency-types.ts b/frontend/src/lib/api/dashboard/a76/general_catalogs/multi-currency-types.ts index a565026a..4c80acc1 100644 --- a/frontend/src/lib/api/dashboard/a76/general_catalogs/multi-currency-types.ts +++ b/frontend/src/lib/api/dashboard/a76/general_catalogs/multi-currency-types.ts @@ -75,7 +75,7 @@ export async function updateMultiCurrencyType( ): Promise> { const params = new URLSearchParams({ company_id: companyId.toString() }); return api.put( - `/v1/a76/multi-currency-types/${multiCurrencyTypeId}?${params.toString()}`, + `/v1/a76/multi-currency-types/${multiCurrencyTypeId}/?${params.toString()}`, data ); } diff --git a/frontend/src/lib/api/dashboard/a76/general_catalogs/packages.ts b/frontend/src/lib/api/dashboard/a76/general_catalogs/packages.ts index 80ca6ba8..952056d4 100644 --- a/frontend/src/lib/api/dashboard/a76/general_catalogs/packages.ts +++ b/frontend/src/lib/api/dashboard/a76/general_catalogs/packages.ts @@ -57,7 +57,7 @@ export async function getPackages( export async function getPackage(id: number, companyId: number): Promise> { - return await api.get(`/v1/a76/packages/${id}/?company_id=${companyId}`); + return await api.get(`/v1/a76/packages/${id}?company_id=${companyId}`); } export async function createPackage( diff --git a/frontend/src/lib/api/dashboard/a76/general_catalogs/ports.ts b/frontend/src/lib/api/dashboard/a76/general_catalogs/ports.ts index fe2caaba..95e08865 100644 --- a/frontend/src/lib/api/dashboard/a76/general_catalogs/ports.ts +++ b/frontend/src/lib/api/dashboard/a76/general_catalogs/ports.ts @@ -37,6 +37,10 @@ export interface PortUpdate { export interface PortListResponse { items: Port[]; total: number; + page?: number; + page_size?: number; + pageSize?: number; + pages?: number; } class PortsApi { diff --git a/frontend/src/lib/api/dashboard/a76/general_catalogs/prevalidators.ts b/frontend/src/lib/api/dashboard/a76/general_catalogs/prevalidators.ts index 1041bd8b..7233839f 100644 --- a/frontend/src/lib/api/dashboard/a76/general_catalogs/prevalidators.ts +++ b/frontend/src/lib/api/dashboard/a76/general_catalogs/prevalidators.ts @@ -65,7 +65,7 @@ export async function createPrevalidator(data: PrevalidatorCreate, companyId: nu } export async function updatePrevalidator(id: number, data: PrevalidatorUpdate, companyId: number): Promise { - const response = await api.put(`/v1/a76/prevalidators/${id}?company_id=${companyId}`, data); + const response = await api.put(`/v1/a76/prevalidators/${id}/?company_id=${companyId}`, data); return response.data; } diff --git a/frontend/src/lib/api/dashboard/a76/general_catalogs/signatures.ts b/frontend/src/lib/api/dashboard/a76/general_catalogs/signatures.ts index 3f2bfc7d..9afee945 100644 --- a/frontend/src/lib/api/dashboard/a76/general_catalogs/signatures.ts +++ b/frontend/src/lib/api/dashboard/a76/general_catalogs/signatures.ts @@ -53,7 +53,7 @@ export async function getSignatures( export async function getSignature(id: number, companyId: number): Promise { - const response = await api.get(`/v1/a76/signatures/${id}/?company_id=${companyId}`); + const response = await api.get(`/v1/a76/signatures/${id}?company_id=${companyId}`); if (response.error) throw new Error(response.error); return response.data; } @@ -79,6 +79,6 @@ export async function updateSignature( } export async function deleteSignature(id: number, companyId: number): Promise { - const response = await api.delete(`/v1/a76/signatures/${id}/?company_id=${companyId}`); + const response = await api.delete(`/v1/a76/signatures/${id}?company_id=${companyId}`); if (response.error) throw new Error(response.error); } \ No newline at end of file diff --git a/frontend/src/lib/api/dashboard/a76/general_catalogs/unit-conversions.ts b/frontend/src/lib/api/dashboard/a76/general_catalogs/unit-conversions.ts index 1a977195..0bfcd591 100644 --- a/frontend/src/lib/api/dashboard/a76/general_catalogs/unit-conversions.ts +++ b/frontend/src/lib/api/dashboard/a76/general_catalogs/unit-conversions.ts @@ -1,5 +1,4 @@ import { api } from '$lib/api'; -import type { ApiResponse } from '$lib/api'; export interface UnitConversion { id: number; @@ -35,7 +34,7 @@ export async function getUnitConversions( pageSize: number = 50, companyId: number, // 👈 Obligatorio filters: Record = {} -): Promise> { +): Promise { const params = new URLSearchParams({ page: page.toString(), page_size: pageSize.toString(), @@ -45,13 +44,16 @@ export async function getUnitConversions( // Agregamos /v1 y prefijo. // NOTA: Revisa si en tu router definiste "unit_conversions" o "unit-conversions" - const response = await api.get(`/v1/a76/unit-conversions/?${params.toString()}`); + const response = await api.get(`/v1/a76/unit-conversions/?${params.toString()}`); + if (response.error) throw new Error(response.error); + if (!response.data) throw new Error('No se pudieron obtener las conversiones de unidades'); return response.data; } export async function getUnitConversion(id: number, companyId: number): Promise { - const response = await api.get(`/v1/a76/unit-conversions/${id}/?company_id=${companyId}`); + const response = await api.get(`/v1/a76/unit-conversions/${id}?company_id=${companyId}`); if (response.error) throw new Error(response.error); + if (!response.data) throw new Error('No se pudo obtener la conversión de unidades'); return response.data; } @@ -59,8 +61,9 @@ export async function createUnitConversion( data: UnitConversionCreate, companyId: number ): Promise { - const response = await api.post(`/v1/a76/unit-conversions/?company_id=${companyId}`, data); + const response = await api.post(`/v1/a76/unit-conversions/?company_id=${companyId}`, data); if (response.error) throw new Error(response.error); + if (!response.data) throw new Error('No se pudo crear la conversión de unidades'); return response.data; } @@ -70,8 +73,9 @@ export async function updateUnitConversion( data: UnitConversionUpdate, companyId: number ): Promise { - const response = await api.put(`/v1/a76/unit-conversions/${id}/?company_id=${companyId}`, data); + const response = await api.put(`/v1/a76/unit-conversions/${id}/?company_id=${companyId}`, data); if (response.error) throw new Error(response.error); + if (!response.data) throw new Error('No se pudo actualizar la conversión de unidades'); return response.data; } diff --git a/frontend/src/lib/api/dashboard/a76/general_catalogs/units-of-measure.ts b/frontend/src/lib/api/dashboard/a76/general_catalogs/units-of-measure.ts index 44721369..5c3d23ba 100644 --- a/frontend/src/lib/api/dashboard/a76/general_catalogs/units-of-measure.ts +++ b/frontend/src/lib/api/dashboard/a76/general_catalogs/units-of-measure.ts @@ -52,7 +52,7 @@ export async function updateUnitOfMeasureACE(id: number, data: UnitOfMeasureACEU } export async function deleteUnitOfMeasureACE(id: number, companyId: number): Promise> { - return await api.delete(`/v1/a76/units-of-measure/ace/${id}/?company_id=${companyId}`); + return await api.delete(`/v1/a76/units-of-measure/ace/${id}?company_id=${companyId}`); } // --- OMA --- @@ -106,7 +106,7 @@ export async function updateUnitOfMeasureOMA(id: number, data: UnitOfMeasureOMAU } export async function deleteUnitOfMeasureOMA(id: number, companyId: number): Promise> { - return await api.delete(`/v1/a76/units-of-measure/oma/${id}/?company_id=${companyId}`); + return await api.delete(`/v1/a76/units-of-measure/oma/${id}?company_id=${companyId}`); } // --- American --- @@ -160,7 +160,7 @@ export async function updateUnitOfMeasureAmerican(id: number, data: UnitOfMeasur } export async function deleteUnitOfMeasureAmerican(id: number, companyId: number): Promise> { - return await api.delete(`/v1/a76/units-of-measure/american/${id}/?company_id=${companyId}`); + return await api.delete(`/v1/a76/units-of-measure/american/${id}?company_id=${companyId}`); } // --- General --- @@ -271,7 +271,7 @@ export async function updateUnitOfMeasureCustoms(id: number, data: UnitOfMeasure } export async function deleteUnitOfMeasureCustoms(id: number, companyId: number): Promise> { - return await api.delete(`/v1/a76/units-of-measure/customs/${id}/?company_id=${companyId}`); + return await api.delete(`/v1/a76/units-of-measure/customs/${id}?company_id=${companyId}`); } export interface UnitOfMeasure { diff --git a/frontend/src/lib/components/dashboard/exchange_rate/columns.ts b/frontend/src/lib/components/dashboard/exchange_rate/columns.ts index 2d6a6097..b26d00e9 100644 --- a/frontend/src/lib/components/dashboard/exchange_rate/columns.ts +++ b/frontend/src/lib/components/dashboard/exchange_rate/columns.ts @@ -1,9 +1,7 @@ import type { ColumnDef } from '@tanstack/table-core'; import type { ExchangeRate } from '$lib/api/dashboard/a76/general_catalogs/exchange-rate'; -import { renderComponent } from '$lib/components/ui/data-table'; -import DataTableActions from './data-table-actions.svelte'; -export function createColumns(onSuccess?: () => void): ColumnDef[] { +export function createColumns(): ColumnDef[] { return [ { accessorKey: 'date', @@ -33,16 +31,6 @@ export function createColumns(onSuccess?: () => void): ColumnDef[] accessorKey: 'foreign_currency', header: 'Moneda Extranjera', cell: ({ row }) => row.original.foreign_currency ?? 'N/A' - }, - { - id: 'actions', - header: 'Acciones', - cell: ({ row }) => { - return renderComponent(DataTableActions, { - item: row.original, - onSuccess - }); - } } ]; } \ No newline at end of file diff --git a/frontend/src/lib/components/dashboard/general_catalogs/classification_concepts/columns.ts b/frontend/src/lib/components/dashboard/general_catalogs/classification_concepts/columns.ts index 6bc0b68f..7aa0eeaf 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/classification_concepts/columns.ts +++ b/frontend/src/lib/components/dashboard/general_catalogs/classification_concepts/columns.ts @@ -1,9 +1,7 @@ import type { ClassificationConcept } from '$lib/api/dashboard/a76/general_catalogs/classification-concepts'; import type { ColumnDef } from '@tanstack/table-core'; -import { renderComponent } from '$lib/components/ui/data-table'; -import DataTableActions from './data-table-actions.svelte'; -export function createColumns(onSuccess?: () => void): ColumnDef[] { +export function createColumns(): ColumnDef[] { return [ { accessorKey: 'classification', @@ -14,16 +12,6 @@ export function createColumns(onSuccess?: () => void): ColumnDef row.original.description || '-' - }, - { - id: 'actions', - header: 'Acciones', - cell: ({ row }) => { - return renderComponent(DataTableActions, { - item: row.original, - onSuccess - }); - } } ]; } diff --git a/frontend/src/lib/components/dashboard/general_catalogs/classification_concepts/data-table-actions.svelte b/frontend/src/lib/components/dashboard/general_catalogs/classification_concepts/data-table-actions.svelte deleted file mode 100644 index c46d18e6..00000000 --- a/frontend/src/lib/components/dashboard/general_catalogs/classification_concepts/data-table-actions.svelte +++ /dev/null @@ -1,85 +0,0 @@ - - - - - {#snippet child({ props })} - - {/snippet} - - - Acciones - dialogOpen = true}> - - Editar - - - - {#if loading} - - {:else} - - {/if} - Eliminar - - - - - diff --git a/frontend/src/lib/components/dashboard/general_catalogs/company/columns.ts b/frontend/src/lib/components/dashboard/general_catalogs/company/columns.ts index aa9692c4..c2e6e81b 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/company/columns.ts +++ b/frontend/src/lib/components/dashboard/general_catalogs/company/columns.ts @@ -1,9 +1,7 @@ import type { Company } from '$lib/api/dashboard/a76/general_catalogs/company'; import type { ColumnDef } from '@tanstack/table-core'; -import { renderComponent } from '$lib/components/ui/data-table'; -import DataTableActions from './data-table-actions.svelte'; -export function createColumns(onSuccess?: () => void): ColumnDef[] { +export function createColumns(): ColumnDef[] { return [ { accessorKey: 'name', @@ -24,15 +22,6 @@ export function createColumns(onSuccess?: () => void): ColumnDef[] { accessorKey: 'program_number', header: 'No. Programa', cell: ({ row }) => row.original.program_number || '-' - }, - { - id: 'actions', - cell: ({ row }) => { - return renderComponent(DataTableActions, { - item: row.original, - onSuccess - }); - } } ]; } diff --git a/frontend/src/lib/components/dashboard/general_catalogs/concepts/columns.ts b/frontend/src/lib/components/dashboard/general_catalogs/concepts/columns.ts index a466a539..759f5b29 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/concepts/columns.ts +++ b/frontend/src/lib/components/dashboard/general_catalogs/concepts/columns.ts @@ -1,9 +1,7 @@ import type { Concept } from '$lib/api/dashboard/a76/general_catalogs/concepts'; import type { ColumnDef } from '@tanstack/table-core'; -import { renderComponent } from '$lib/components/ui/data-table'; -import DataTableActions from './data-table-actions.svelte'; -export function createColumns(onSuccess?: () => void): ColumnDef[] { +export function createColumns(): ColumnDef[] { return [ { accessorKey: 'code', @@ -24,16 +22,6 @@ export function createColumns(onSuccess?: () => void): ColumnDef[] { accessorKey: 'section', header: 'Sección', cell: ({ row }) => row.original.section?.toString() || '-' - }, - { - id: 'actions', - header: 'Acciones', - cell: ({ row }) => { - return renderComponent(DataTableActions, { - item: row.original, - onSuccess - }); - } } ]; } diff --git a/frontend/src/lib/components/dashboard/general_catalogs/concepts/data-table-actions.svelte b/frontend/src/lib/components/dashboard/general_catalogs/concepts/data-table-actions.svelte deleted file mode 100644 index 3a62c824..00000000 --- a/frontend/src/lib/components/dashboard/general_catalogs/concepts/data-table-actions.svelte +++ /dev/null @@ -1,85 +0,0 @@ - - - - - {#snippet child({ props })} - - {/snippet} - - - Acciones - dialogOpen = true}> - - Editar - - - - {#if loading} - - {:else} - - {/if} - Eliminar - - - - - diff --git a/frontend/src/lib/components/dashboard/general_catalogs/customs_broker_concepts/columns.ts b/frontend/src/lib/components/dashboard/general_catalogs/customs_broker_concepts/columns.ts index 0f004d62..6b54bf5d 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/customs_broker_concepts/columns.ts +++ b/frontend/src/lib/components/dashboard/general_catalogs/customs_broker_concepts/columns.ts @@ -1,9 +1,7 @@ import type { CustomsBrokerConcept } from '$lib/api/dashboard/a76/general_catalogs/customs-broker-concepts'; import type { ColumnDef } from '@tanstack/table-core'; -import { renderComponent } from '$lib/components/ui/data-table'; -import DataTableActions from './data-table-actions.svelte'; -export function createColumns(onSuccess?: () => void): ColumnDef[] { +export function createColumns(): ColumnDef[] { return [ { accessorKey: 'broker_key', @@ -24,16 +22,6 @@ export function createColumns(onSuccess?: () => void): ColumnDef row.original.priority?.toString() || '-' - }, - { - id: 'actions', - header: 'Acciones', - cell: ({ row }) => { - return renderComponent(DataTableActions, { - item: row.original, - onSuccess - }); - } } ]; } diff --git a/frontend/src/lib/components/dashboard/general_catalogs/doda/columns.ts b/frontend/src/lib/components/dashboard/general_catalogs/doda/columns.ts index add997d8..b4983c0b 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/doda/columns.ts +++ b/frontend/src/lib/components/dashboard/general_catalogs/doda/columns.ts @@ -1,8 +1,7 @@ import type { ColumnDef } from '@tanstack/table-core'; import type { Doda } from '$lib/api/dashboard/a76/general_catalogs/doda'; -import { renderComponent, renderSnippet } from '$lib/components/ui/data-table'; +import { renderSnippet } from '$lib/components/ui/data-table'; import { createRawSnippet } from 'svelte'; -import DataTableActions from './data-table-actions.svelte'; function formatDate(date?: string | null): string { if (!date) return '-'; @@ -18,7 +17,7 @@ function formatDate(date?: string | null): string { } } -export function createColumns(onSuccess?: () => void): ColumnDef[] { +export function createColumns(): ColumnDef[] { return [ { accessorKey: 'id', @@ -119,16 +118,6 @@ export function createColumns(onSuccess?: () => void): ColumnDef[] { }); return renderSnippet(statusSnippet, { status }); } - }, - { - id: 'actions', - header: 'Acciones', - cell: ({ row }) => { - return renderComponent(DataTableActions, { - item: row.original, - onSuccess - }); - } } ]; } diff --git a/frontend/src/lib/components/dashboard/general_catalogs/electronic_notices/columns.ts b/frontend/src/lib/components/dashboard/general_catalogs/electronic_notices/columns.ts index 3ebec0cb..6457b2f4 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/electronic_notices/columns.ts +++ b/frontend/src/lib/components/dashboard/general_catalogs/electronic_notices/columns.ts @@ -1,10 +1,8 @@ import type { ColumnDef } from '@tanstack/table-core'; import type { ElectronicNotice } from '$lib/api/dashboard/a76/general_catalogs/electronic-notices'; -import { renderComponent } from '$lib/components/ui/data-table'; -import DataTableActions from './data-table-actions.svelte'; import { Head } from '$lib/components/ui/table'; -export function createColumns(onSuccess?: () => void): ColumnDef[] { +export function createColumns(): ColumnDef[] { return [ { accessorKey: 'notice_number', @@ -30,16 +28,6 @@ export function createColumns(onSuccess?: () => void): ColumnDef row.original.status || 'N/A' - }, - { - id: 'actions', - Headers: 'Acciones', - cell: ({ row }) => { - return renderComponent(DataTableActions, { - item: row.original, - onSuccess - }); - } } ]; } diff --git a/frontend/src/lib/components/dashboard/general_catalogs/electronic_notices/create-edit-dialog.svelte b/frontend/src/lib/components/dashboard/general_catalogs/electronic_notices/create-edit-dialog.svelte index 45fcb502..e14af62a 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/electronic_notices/create-edit-dialog.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/electronic_notices/create-edit-dialog.svelte @@ -3,6 +3,11 @@ import * as Dialog from '$lib/components/ui/dialog'; import { Input } from '$lib/components/ui/input'; import { Label } from '$lib/components/ui/label'; + import { + createElectronicNotice, + updateElectronicNotice, + type ElectronicNotice + } from '$lib/api/dashboard/a76/general_catalogs/electronic-notices'; import { companyStore } from '$lib/stores/company.svelte'; import { obtenerAtajosFormularioAvisosElectrónicos } from '$lib/config/shortcuts/dashboard/general_catalogs/electronic_notices/edit'; @@ -89,10 +94,15 @@ error = null; try { + let savedNotice: ElectronicNotice | undefined; if (isEdit && item) { - await updateElectronicNotice(item.id, formData, companyId); + savedNotice = await updateElectronicNotice(item.id, formData, companyId); } else { - await createElectronicNotice(formData, companyId); + savedNotice = await createElectronicNotice(formData, companyId); + } + + if (!savedNotice) { + throw new Error('No se pudo guardar el aviso electrónico'); } open = false; diff --git a/frontend/src/lib/components/dashboard/general_catalogs/electronic_notices/data-table-actions.svelte b/frontend/src/lib/components/dashboard/general_catalogs/electronic_notices/data-table-actions.svelte deleted file mode 100644 index a401612e..00000000 --- a/frontend/src/lib/components/dashboard/general_catalogs/electronic_notices/data-table-actions.svelte +++ /dev/null @@ -1,82 +0,0 @@ - - - - - {#snippet child({ props })} - - {/snippet} - - - Acciones - - - Editar - - - {#if loading} - - {:else} - - {/if} - Eliminar - - - - - diff --git a/frontend/src/lib/components/dashboard/general_catalogs/equivalencies/catalog-columns.ts b/frontend/src/lib/components/dashboard/general_catalogs/equivalencies/catalog-columns.ts index 32ee7c5f..30ee4126 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/equivalencies/catalog-columns.ts +++ b/frontend/src/lib/components/dashboard/general_catalogs/equivalencies/catalog-columns.ts @@ -1,17 +1,7 @@ import type { ColumnDef } from '@tanstack/table-core'; import type { Equivalency } from '$lib/api/dashboard/a76/general_catalogs/equivalencies'; -import { renderComponent } from '$lib/components/ui/data-table'; -import CatalogDataTableActions from './catalog-data-table-actions.svelte'; -export function createCatalogColumns({ - onInsertItems, - onEdit, - onSuccess -}: { - onInsertItems: (equivalency: Equivalency) => void; - onEdit: (equivalency: Equivalency) => void; - onSuccess?: () => void; -}): ColumnDef[] { +export function createCatalogColumns(): ColumnDef[] { return [ { accessorKey: 'identifier', @@ -22,18 +12,6 @@ export function createCatalogColumns({ accessorKey: 'description', header: 'Descripción', cell: ({ row }) => row.original.description || '' - }, - { - id: 'actions', - Header: 'Acciones', - cell: ({ row }) => { - return renderComponent(CatalogDataTableActions, { - item: row.original, - onInsertItems, - onEdit, - onSuccess - }); - } } ]; } diff --git a/frontend/src/lib/components/dashboard/general_catalogs/equivalencies/catalog-data-table-actions.svelte b/frontend/src/lib/components/dashboard/general_catalogs/equivalencies/catalog-data-table-actions.svelte deleted file mode 100644 index cea10bf0..00000000 --- a/frontend/src/lib/components/dashboard/general_catalogs/equivalencies/catalog-data-table-actions.svelte +++ /dev/null @@ -1,71 +0,0 @@ - - - - - {#snippet child({ props })} - - {/snippet} - - - Acciones - onInsertItems(item)}> - Insertar items - - onEdit(item)}> - - Editar - - - {#if loading} - - {:else} - - {/if} - Borrar - - - - diff --git a/frontend/src/lib/components/dashboard/general_catalogs/equivalencies/data-table-actions.svelte b/frontend/src/lib/components/dashboard/general_catalogs/equivalencies/data-table-actions.svelte deleted file mode 100644 index d2d7e9d9..00000000 --- a/frontend/src/lib/components/dashboard/general_catalogs/equivalencies/data-table-actions.svelte +++ /dev/null @@ -1,87 +0,0 @@ - - - - - {#snippet child({ props })} - - {/snippet} - - - Acciones - - - Editar - - - {#if loading} - - {:else} - - {/if} - Eliminar - - - - - diff --git a/frontend/src/lib/components/dashboard/general_catalogs/error_catalogs/columns.ts b/frontend/src/lib/components/dashboard/general_catalogs/error_catalogs/columns.ts index 6b2ad6ea..e7c6bbd4 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/error_catalogs/columns.ts +++ b/frontend/src/lib/components/dashboard/general_catalogs/error_catalogs/columns.ts @@ -1,9 +1,7 @@ import type { ColumnDef } from '@tanstack/table-core'; import type { ErrorCatalog } from '$lib/api/dashboard/a76/general_catalogs/error-catalogs'; -import { renderComponent } from '$lib/components/ui/data-table'; -import DataTableActions from './data-table-actions.svelte'; -export function createColumns(onSuccess?: () => void): ColumnDef[] { +export function createColumns(): ColumnDef[] { return [ { accessorKey: 'code', @@ -18,14 +16,6 @@ export function createColumns(onSuccess?: () => void): ColumnDef[] accessorKey: 'classification_id', header: 'Clasificación', cell: ({ row }) => row.original.classification_id ?? '—' - }, - { - id: 'actions', - header: 'Acciones', - cell: ({ row }) => renderComponent(DataTableActions, { - item: row.original, - onSuccess - }) } ]; } diff --git a/frontend/src/lib/components/dashboard/general_catalogs/error_catalogs/data-table-actions.svelte b/frontend/src/lib/components/dashboard/general_catalogs/error_catalogs/data-table-actions.svelte deleted file mode 100644 index cf5b202c..00000000 --- a/frontend/src/lib/components/dashboard/general_catalogs/error_catalogs/data-table-actions.svelte +++ /dev/null @@ -1,94 +0,0 @@ - - - - - {#snippet child({ props })} - - {/snippet} - - - Acciones - - - - Editar - - - - {#if loading} - - {:else} - - {/if} - Eliminar - - - - - diff --git a/frontend/src/lib/components/dashboard/general_catalogs/identifiers/columns.ts b/frontend/src/lib/components/dashboard/general_catalogs/identifiers/columns.ts index 6aa1997c..1bc16e62 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/identifiers/columns.ts +++ b/frontend/src/lib/components/dashboard/general_catalogs/identifiers/columns.ts @@ -1,10 +1,7 @@ import type { ColumnDef } from '@tanstack/table-core'; import type { Identifier } from '$lib/api/dashboard/a76/general_catalogs/identifiers'; -import { renderComponent } from '$lib/components/ui/data-table'; -import DataTableActions from './data-table-actions.svelte'; -import { Header } from '$lib/components/ui/alert-dialog'; -export function createColumns(onSuccess?: () => void): ColumnDef[] { +export function createColumns(): ColumnDef[] { return [ { accessorKey: 'code', @@ -25,16 +22,6 @@ export function createColumns(onSuccess?: () => void): ColumnDef[] { accessorKey: 'complement', header: 'Complemento', cell: ({ row }) => row.original.complement || 'N/A' - }, - { - id: 'actions', - Header: 'Acciones', - cell: ({ row }) => { - return renderComponent(DataTableActions, { - item: row.original, - onSuccess - }); - } } ]; } diff --git a/frontend/src/lib/components/dashboard/general_catalogs/identifiers/data-table-actions.svelte b/frontend/src/lib/components/dashboard/general_catalogs/identifiers/data-table-actions.svelte deleted file mode 100644 index 32b56ba3..00000000 --- a/frontend/src/lib/components/dashboard/general_catalogs/identifiers/data-table-actions.svelte +++ /dev/null @@ -1,82 +0,0 @@ - - - - - {#snippet child({ props })} - - {/snippet} - - - Acciones - - - Editar - - - {#if loading} - - {:else} - - {/if} - Eliminar - - - - - diff --git a/frontend/src/lib/components/dashboard/general_catalogs/inpc/columns.ts b/frontend/src/lib/components/dashboard/general_catalogs/inpc/columns.ts index c6828b12..c5dbe5c7 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/inpc/columns.ts +++ b/frontend/src/lib/components/dashboard/general_catalogs/inpc/columns.ts @@ -1,9 +1,7 @@ import type { ColumnDef } from '@tanstack/table-core'; import type { INPC } from '$lib/api/dashboard/a76/general_catalogs/inpc'; -import { renderComponent } from '$lib/components/ui/data-table'; -import DataTableActions from './data-table-actions.svelte'; -export function createColumns(onSuccess?: () => void): ColumnDef[] { +export function createColumns(): ColumnDef[] { return [ { accessorKey: 'year', @@ -19,16 +17,6 @@ export function createColumns(onSuccess?: () => void): ColumnDef[] { accessorKey: 'value', header: 'Valor', cell: ({ row }) => row.original.value?.toString() || 'N/A' - }, - { - id: 'actions', - header: 'Acciones', - cell: ({ row }) => { - return renderComponent(DataTableActions, { - item: row.original, - onSuccess - }); - } } ]; } diff --git a/frontend/src/lib/components/dashboard/general_catalogs/inpc/data-table-actions.svelte b/frontend/src/lib/components/dashboard/general_catalogs/inpc/data-table-actions.svelte deleted file mode 100644 index f35c1870..00000000 --- a/frontend/src/lib/components/dashboard/general_catalogs/inpc/data-table-actions.svelte +++ /dev/null @@ -1,82 +0,0 @@ - - - - - {#snippet child({ props })} - - {/snippet} - - - Acciones - - - Editar - - - {#if loading} - - {:else} - - {/if} - Eliminar - - - - - diff --git a/frontend/src/lib/components/dashboard/general_catalogs/legends/columns.ts b/frontend/src/lib/components/dashboard/general_catalogs/legends/columns.ts index 4a711c45..ec846287 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/legends/columns.ts +++ b/frontend/src/lib/components/dashboard/general_catalogs/legends/columns.ts @@ -1,9 +1,7 @@ import type { Legend } from '$lib/api/dashboard/a76/general_catalogs/legends'; import type { ColumnDef } from '@tanstack/table-core'; -import { renderComponent } from '$lib/components/ui/data-table'; -import DataTableActions from './data-table-actions.svelte'; -export function createColumns(onSuccess?: () => void): ColumnDef[] { +export function createColumns(): ColumnDef[] { return [ { accessorKey: 'code', @@ -14,16 +12,6 @@ export function createColumns(onSuccess?: () => void): ColumnDef[] { accessorKey: 'description', header: 'Descripción', cell: ({ row }) => row.original.description || '-' - }, - { - id: 'actions', - header: 'Acciones', - cell: ({ row }) => { - return renderComponent(DataTableActions, { - item: row.original, - onSuccess - }); - } } ]; } diff --git a/frontend/src/lib/components/dashboard/general_catalogs/legends/data-table-actions.svelte b/frontend/src/lib/components/dashboard/general_catalogs/legends/data-table-actions.svelte deleted file mode 100644 index cdbe4445..00000000 --- a/frontend/src/lib/components/dashboard/general_catalogs/legends/data-table-actions.svelte +++ /dev/null @@ -1,86 +0,0 @@ - - - - - {#snippet child({ props })} - - {/snippet} - - - Acciones - dialogOpen = true}> - - Editar - - - - {#if loading} - - {:else} - - {/if} - Eliminar - - - - - diff --git a/frontend/src/lib/components/dashboard/general_catalogs/multi_currency_types/create-edit-dialog.svelte b/frontend/src/lib/components/dashboard/general_catalogs/multi_currency_types/create-edit-dialog.svelte index 5775f1df..79f9560a 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/multi_currency_types/create-edit-dialog.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/multi_currency_types/create-edit-dialog.svelte @@ -96,10 +96,15 @@ publication_date: dateInt // Mandamos el INT que espera Python }; + let response; if (isEdit && item) { - await updateMultiCurrencyType(item.id, dataToSend, companyId); + response = await updateMultiCurrencyType(item.id, dataToSend, companyId); } else { - await createMultiCurrencyType(dataToSend, companyId); + response = await createMultiCurrencyType(dataToSend, companyId); + } + + if (response?.error) { + throw new Error(response.error); } open = false; diff --git a/frontend/src/lib/components/dashboard/general_catalogs/prevalidators/columns.ts b/frontend/src/lib/components/dashboard/general_catalogs/prevalidators/columns.ts index 404a0752..0fe4b6b8 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/prevalidators/columns.ts +++ b/frontend/src/lib/components/dashboard/general_catalogs/prevalidators/columns.ts @@ -1,10 +1,7 @@ import type { ColumnDef } from '@tanstack/table-core'; import type { Prevalidator } from '$lib/api/dashboard/a76/general_catalogs/prevalidators'; -import { renderComponent } from '$lib/components/ui/data-table'; -import DataTableActions from './data-table-actions.svelte'; -import { Header } from '$lib/components/ui/alert-dialog'; -export function createColumns(onSuccess?: () => void): ColumnDef[] { +export function createColumns(): ColumnDef[] { return [ { accessorKey: 'code', @@ -25,16 +22,6 @@ export function createColumns(onSuccess?: () => void): ColumnDef[] accessorKey: 'patent_prevalidator', header: 'Patente', cell: ({ row }) => row.original.patent_prevalidator || 'N/A' - }, - { - id: 'actions', - Header: 'Acciones', - cell: ({ row }) => { - return renderComponent(DataTableActions, { - item: row.original, - onSuccess - }); - } } ]; } diff --git a/frontend/src/lib/components/dashboard/general_catalogs/prevalidators/data-table-actions.svelte b/frontend/src/lib/components/dashboard/general_catalogs/prevalidators/data-table-actions.svelte deleted file mode 100644 index bd364ee4..00000000 --- a/frontend/src/lib/components/dashboard/general_catalogs/prevalidators/data-table-actions.svelte +++ /dev/null @@ -1,82 +0,0 @@ - - - - - {#snippet child({ props })} - - {/snippet} - - - Acciones - - - Editar - - - {#if loading} - - {:else} - - {/if} - Eliminar - - - - - diff --git a/frontend/src/lib/components/dashboard/general_catalogs/signatures/columns.ts b/frontend/src/lib/components/dashboard/general_catalogs/signatures/columns.ts index cfff6db4..384c9349 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/signatures/columns.ts +++ b/frontend/src/lib/components/dashboard/general_catalogs/signatures/columns.ts @@ -1,9 +1,7 @@ import type { ColumnDef } from '@tanstack/table-core'; import type { Signature } from '$lib/api/dashboard/a76/general_catalogs/signatures'; -import { renderComponent } from '$lib/components/ui/data-table'; -import DataTableActions from './data-table-actions.svelte'; -export function createColumns(onSuccess?: () => void): ColumnDef[] { +export function createColumns(): ColumnDef[] { return [ { accessorKey: 'code', @@ -19,14 +17,6 @@ export function createColumns(onSuccess?: () => void): ColumnDef[] { accessorKey: 'photo_path', header: 'Ruta Foto', cell: ({ row }) => row.original.photo_path ?? 'N/A' - }, - { - id: 'actions', - header: 'Acciones', - cell: ({ row }) => renderComponent(DataTableActions, { - item: row.original, - onSuccess - }) } ]; } diff --git a/frontend/src/lib/components/dashboard/general_catalogs/signatures/data-table-actions.svelte b/frontend/src/lib/components/dashboard/general_catalogs/signatures/data-table-actions.svelte deleted file mode 100644 index d86157af..00000000 --- a/frontend/src/lib/components/dashboard/general_catalogs/signatures/data-table-actions.svelte +++ /dev/null @@ -1,90 +0,0 @@ - - - - - {#snippet child({ props })} - - {/snippet} - - - Acciones - - - - Editar - - - - {#if loading} - - {:else} - - {/if} - Eliminar - - - - - diff --git a/frontend/src/lib/components/dashboard/general_catalogs/unit_conversions/columns.ts b/frontend/src/lib/components/dashboard/general_catalogs/unit_conversions/columns.ts index 34d970a0..238f31a4 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/unit_conversions/columns.ts +++ b/frontend/src/lib/components/dashboard/general_catalogs/unit_conversions/columns.ts @@ -1,10 +1,7 @@ import type { ColumnDef } from '@tanstack/table-core'; import type { UnitConversion } from '$lib/api/dashboard/a76/general_catalogs/unit-conversions'; -import { renderComponent } from '$lib/components/ui/data-table'; -import DataTableActions from './data-table-actions.svelte'; -import { Header } from '$lib/components/ui/alert-dialog'; -export function createColumns(onSuccess?: () => void): ColumnDef[] { +export function createColumns(): ColumnDef[] { return [ { accessorKey: 'from_unit_code', @@ -17,15 +14,6 @@ export function createColumns(onSuccess?: () => void): ColumnDef { accessorKey: 'conversion_factor', header: 'Factor de conversión' - }, - { - id: 'actions', - header: 'Acciones', - cell: ({ row }) => - renderComponent(DataTableActions, { - conversion: row.original, - onSuccess - }) } ]; } diff --git a/frontend/src/lib/components/dashboard/general_catalogs/unit_conversions/create-edit-dialog.svelte b/frontend/src/lib/components/dashboard/general_catalogs/unit_conversions/create-edit-dialog.svelte index 0d6c303a..57cd6a39 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/unit_conversions/create-edit-dialog.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/unit_conversions/create-edit-dialog.svelte @@ -15,11 +15,13 @@ let { open = $bindable(false), + item = null, conversion = null, mode = 'create', onSuccess }: { open: boolean; + item?: UnitConversion | null; conversion?: UnitConversion | null; mode?: 'create' | 'edit'; onSuccess?: () => void; @@ -27,7 +29,8 @@ // Atajos - const isEdit = $derived(mode === 'edit'); + const currentConversion = $derived(item ?? conversion); + const isEdit = $derived(mode === 'edit' || !!currentConversion); const title = $derived(isEdit ? 'Editar Conversión' : 'Nueva Conversión'); let formData = $state({ @@ -40,26 +43,15 @@ let error = $state(null); let showFromUomModal = $state(false); let showToUomModal = $state(false); - let wasOpen = $state(false); - - function resetForm() { - formData = { - from_unit_code: '', - to_unit_code: '', - conversion_factor: '' - }; - error = null; - loading = false; - showFromUomModal = false; - showToUomModal = false; - } $effect(() => { - if (conversion) { + if (!open) return; + + if (currentConversion) { formData = { - from_unit_code: conversion.from_unit_code || '', - to_unit_code: conversion.to_unit_code || '', - conversion_factor: conversion.conversion_factor.toString() || '' + from_unit_code: currentConversion.from_unit_code || '', + to_unit_code: currentConversion.to_unit_code || '', + conversion_factor: currentConversion.conversion_factor.toString() || '' }; } else { formData = { @@ -68,14 +60,11 @@ conversion_factor: '' }; } - }); - $effect(() => { - // Reset each time the dialog is opened in create mode - if (open && !wasOpen && !isEdit) { - resetForm(); - } - wasOpen = open; + error = null; + loading = false; + showFromUomModal = false; + showToUomModal = false; }); async function handleSubmit() { @@ -101,8 +90,8 @@ throw new Error('El factor de conversión debe ser un número válido'); } - if (isEdit && conversion) { - await updateUnitConversion(conversion.id, dataToSend, companyId); + if (isEdit && currentConversion) { + await updateUnitConversion(currentConversion.id, dataToSend, companyId); } else { await createUnitConversion(dataToSend, companyId); } diff --git a/frontend/src/lib/components/dashboard/general_catalogs/unit_conversions/data-table-actions.svelte b/frontend/src/lib/components/dashboard/general_catalogs/unit_conversions/data-table-actions.svelte deleted file mode 100644 index b020111a..00000000 --- a/frontend/src/lib/components/dashboard/general_catalogs/unit_conversions/data-table-actions.svelte +++ /dev/null @@ -1,82 +0,0 @@ - - - - - {#snippet child({ props })} - - {/snippet} - - - Acciones - dialogOpen = true}> - - Editar - - - - {#if loading} - - {:else} - - {/if} - Eliminar - - - - - diff --git a/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/ace/columns.ts b/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/ace/columns.ts index 64c72924..ea0dc54a 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/ace/columns.ts +++ b/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/ace/columns.ts @@ -1,9 +1,7 @@ import type { UnitOfMeasureACE } from '$lib/api/dashboard/a76/general_catalogs/units-of-measure'; import type { ColumnDef } from '@tanstack/table-core'; -import { renderComponent } from '$lib/components/ui/data-table'; -import DataTableActions from './data-table-actions.svelte'; -export function createColumns(onSuccess?: () => void): ColumnDef[] { +export function createColumns(): ColumnDef[] { return [ { accessorKey: 'code', @@ -14,16 +12,6 @@ export function createColumns(onSuccess?: () => void): ColumnDef row.original.description || '-' - }, - { - id: 'actions', - header: 'Acciones', - cell: ({ row }) => { - return renderComponent(DataTableActions, { - item: row.original, - onSuccess - }); - } } ]; } diff --git a/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/american/columns.ts b/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/american/columns.ts index f9d51db1..7e61e5dc 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/american/columns.ts +++ b/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/american/columns.ts @@ -1,9 +1,7 @@ import type { ColumnDef } from "@tanstack/table-core"; import type { UnitOfMeasureAmerican } from "$lib/api/dashboard/a76/general_catalogs/units-of-measure"; -import { renderComponent } from "$lib/components/ui/data-table/index.js"; -import DataTableActions from "./data-table-actions.svelte"; -export function createColumns(onSuccess?: () => void): ColumnDef[] { +export function createColumns(): ColumnDef[] { return [ { accessorKey: "code", @@ -13,14 +11,5 @@ export function createColumns(onSuccess?: () => void): ColumnDef - renderComponent(DataTableActions, { - unit: row.original, - onSuccess - }), - }, ]; } diff --git a/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/american/create-edit-dialog.svelte b/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/american/create-edit-dialog.svelte index 1e7af055..79a6bed8 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/american/create-edit-dialog.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/american/create-edit-dialog.svelte @@ -17,11 +17,11 @@ interface Props { open: boolean; - unit?: UnitOfMeasureAmerican; + item?: UnitOfMeasureAmerican | null; onSuccess?: () => void; } - let { open = $bindable(), unit, onSuccess }: Props = $props(); + let { open = $bindable(), item, onSuccess }: Props = $props(); // Atajos @@ -29,41 +29,64 @@ code: '', description: '' }); + let loading = $state(false); + let error = $state(null); $effect(() => { if (open) { - if (unit) { + if (item) { formData = { - code: unit.code, - description: unit.description || '' + code: item.code, + description: item.description || '' }; } else { formData = { code: '', description: '' }; } + error = null; } }); async function handleSubmit(e: Event) { e.preventDefault(); + loading = true; + error = null; - const activeCompanyId = companyStore.activeCompany?.id; - if (!activeCompanyId) { - return; - } + try { + const activeCompanyId = companyStore.activeCompany?.id; + if (!activeCompanyId) { + throw new Error('No hay una compañía seleccionada'); + } - const data: UnitOfMeasureAmericanCreate | UnitOfMeasureAmericanUpdate = { - code: formData.code, - description: formData.description || null - }; + let response; + if (item) { + response = await updateUnitOfMeasureAmerican( + item.id, + { + code: formData.code, + description: formData.description || null + } satisfies UnitOfMeasureAmericanUpdate, + activeCompanyId + ); + } else { + response = await createUnitOfMeasureAmerican( + { + code: formData.code, + description: formData.description || null + } satisfies UnitOfMeasureAmericanCreate, + activeCompanyId + ); + } - const response = unit - ? await updateUnitOfMeasureAmerican(unit.id, data, activeCompanyId) - : await createUnitOfMeasureAmerican(data, activeCompanyId); + if (response.error) { + throw new Error(response.error); + } - if (response.error) { - } else { open = false; onSuccess?.(); + } catch (e) { + error = e instanceof Error ? e.message : 'Error al guardar la unidad'; + } finally { + loading = false; } } @@ -71,20 +94,25 @@ - {unit ? 'Editar' : 'Crear'} Unidad Americana + {item ? 'Editar' : 'Crear'} Unidad Americana
+ {#if error} +
{error}
+ {/if}
- +
- +
- - + +
diff --git a/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/customs/columns.ts b/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/customs/columns.ts index f8106bcc..f253115d 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/customs/columns.ts +++ b/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/customs/columns.ts @@ -1,9 +1,7 @@ import type { ColumnDef } from "@tanstack/table-core"; import type { UnitOfMeasureCustoms } from "$lib/api/dashboard/a76/general_catalogs/units-of-measure"; -import { renderComponent } from "$lib/components/ui/data-table/index.js"; -import DataTableActions from "./data-table-actions.svelte"; -export function createColumns(onSuccess?: () => void): ColumnDef[] { +export function createColumns(): ColumnDef[] { return [ { accessorKey: "code", @@ -17,14 +15,5 @@ export function createColumns(onSuccess?: () => void): ColumnDef - renderComponent(DataTableActions, { - unit: row.original, - onSuccess - }), - }, ]; } diff --git a/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/customs/create-edit-dialog.svelte b/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/customs/create-edit-dialog.svelte index dbf8b476..1d63fea3 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/customs/create-edit-dialog.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/customs/create-edit-dialog.svelte @@ -17,11 +17,11 @@ interface Props { open: boolean; - unit?: UnitOfMeasureCustoms; + item?: UnitOfMeasureCustoms | null; onSuccess?: () => void; } - let { open = $bindable(), unit, onSuccess }: Props = $props(); + let { open = $bindable(), item, onSuccess }: Props = $props(); // Atajos @@ -30,50 +30,64 @@ description: '', a76_unit_code: '' }); + let loading = $state(false); + let error = $state(null); $effect(() => { if (open) { - if (unit) { + if (item) { formData = { - code: unit.code, - description: unit.description || '', - a76_unit_code: unit.a76_unit_code || '' + code: item.code, + description: item.description || '', + a76_unit_code: item.a76_unit_code || '' }; } else { formData = { code: '', description: '', a76_unit_code: '' }; } + error = null; } }); async function handleSubmit(e: Event) { e.preventDefault(); + loading = true; + error = null; - const activeCompanyId = companyStore.activeCompany?.id; - if (!activeCompanyId) { - return; - } + try { + const activeCompanyId = companyStore.activeCompany?.id; + if (!activeCompanyId) { + throw new Error('No hay una compañía seleccionada'); + } - const response = unit - ? await updateUnitOfMeasureCustoms(unit.id, { - code: formData.code, - description: formData.description || null, - a76_unit_code: formData.a76_unit_code || null - } satisfies UnitOfMeasureCustomsUpdate, - activeCompanyId - ) - : await createUnitOfMeasureCustoms( - { - code: formData.code, - description: formData.description || null, - a76_unit_code: formData.a76_unit_code || null - } satisfies UnitOfMeasureCustomsCreate, - activeCompanyId - ); + const response = item + ? await updateUnitOfMeasureCustoms( + item.id, + { + code: formData.code, + description: formData.description || null, + a76_unit_code: formData.a76_unit_code || null + } satisfies UnitOfMeasureCustomsUpdate, + activeCompanyId + ) + : await createUnitOfMeasureCustoms( + { + code: formData.code, + description: formData.description || null, + a76_unit_code: formData.a76_unit_code || null + } satisfies UnitOfMeasureCustomsCreate, + activeCompanyId + ); + + if (response.error) { + throw new Error(response.error); + } - if (response.error) { - } else { open = false; onSuccess?.(); + } catch (e) { + error = e instanceof Error ? e.message : 'Error al guardar la unidad'; + } finally { + loading = false; } } @@ -81,24 +95,29 @@ - {unit ? 'Editar' : 'Crear'} Unidad Aduanas MEX + {item ? 'Editar' : 'Crear'} Unidad Aduanas MEX
+ {#if error} +
{error}
+ {/if}
- +
- +
- +
- - + +
diff --git a/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/general/columns.ts b/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/general/columns.ts index a9edaf1c..5fc24027 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/general/columns.ts +++ b/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/general/columns.ts @@ -1,9 +1,7 @@ import type { ColumnDef } from '@tanstack/table-core'; import type { UnitOfMeasureGeneral } from '$lib/api/dashboard/a76/general_catalogs/units-of-measure'; -import { renderComponent } from '$lib/components/ui/data-table'; -import DataTableActions from './data-table-actions.svelte'; -export function createColumns(onSuccess?: () => void): ColumnDef[] { +export function createColumns(): ColumnDef[] { return [ { accessorKey: 'code', @@ -14,16 +12,6 @@ export function createColumns(onSuccess?: () => void): ColumnDef info.getValue() || '-' - }, - { - id: 'actions', - header: 'Acciones', - cell: ({ row }) => { - return renderComponent(DataTableActions, { - unit: row.original, - onSuccess - }); - } } ]; } diff --git a/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/general/create-edit-dialog.svelte b/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/general/create-edit-dialog.svelte index eee99210..2a947472 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/general/create-edit-dialog.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/general/create-edit-dialog.svelte @@ -17,11 +17,11 @@ interface Props { open: boolean; - unit?: UnitOfMeasureGeneral; + item?: UnitOfMeasureGeneral | null; onSuccess?: () => void; } - let { open = $bindable(), unit, onSuccess }: Props = $props(); + let { open = $bindable(), item, onSuccess }: Props = $props(); // Atajos @@ -29,41 +29,64 @@ code: '', description: '' }); + let loading = $state(false); + let error = $state(null); $effect(() => { if (open) { - if (unit) { + if (item) { formData = { - code: unit.code, - description: unit.description || '' + code: item.code, + description: item.description || '' }; } else { formData = { code: '', description: '' }; } + error = null; } }); async function handleSubmit(e: Event) { e.preventDefault(); + loading = true; + error = null; - const activeCompanyId = companyStore.activeCompany?.id; - if (!activeCompanyId) { - return; - } + try { + const activeCompanyId = companyStore.activeCompany?.id; + if (!activeCompanyId) { + throw new Error('No hay una compañía seleccionada'); + } - const data: UnitOfMeasureGeneralCreate | UnitOfMeasureGeneralUpdate = { - code: formData.code, - description: formData.description || null - }; + let response; + if (item) { + response = await updateUnitOfMeasureGeneral( + item.id, + { + code: formData.code, + description: formData.description || null + } satisfies UnitOfMeasureGeneralUpdate, + activeCompanyId + ); + } else { + response = await createUnitOfMeasureGeneral( + { + code: formData.code, + description: formData.description || null + } satisfies UnitOfMeasureGeneralCreate, + activeCompanyId + ); + } - const response = unit - ? await updateUnitOfMeasureGeneral(unit.id, data, activeCompanyId) - : await createUnitOfMeasureGeneral(data, activeCompanyId); + if (response.error) { + throw new Error(response.error); + } - if (response.error) { - } else { open = false; onSuccess?.(); + } catch (e) { + error = e instanceof Error ? e.message : 'Error al guardar la unidad'; + } finally { + loading = false; } } @@ -71,20 +94,25 @@ - {unit ? 'Editar' : 'Crear'} Unidad General + {item ? 'Editar' : 'Crear'} Unidad General
+ {#if error} +
{error}
+ {/if}
- +
- +
- - + +
diff --git a/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/oma/columns.ts b/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/oma/columns.ts index a24ccbea..880817d4 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/oma/columns.ts +++ b/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/oma/columns.ts @@ -1,9 +1,7 @@ import type { ColumnDef } from "@tanstack/table-core"; import type { UnitOfMeasureOMA } from "$lib/api/dashboard/a76/general_catalogs/units-of-measure"; -import { renderComponent } from "$lib/components/ui/data-table/index.js"; -import DataTableActions from "./data-table-actions.svelte"; -export function createColumns(onSuccess?: () => void): ColumnDef[] { +export function createColumns(): ColumnDef[] { return [ { accessorKey: "code", @@ -13,14 +11,5 @@ export function createColumns(onSuccess?: () => void): ColumnDef - renderComponent(DataTableActions, { - unit: row.original, - onSuccess - }), - }, ]; } diff --git a/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/oma/create-edit-dialog.svelte b/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/oma/create-edit-dialog.svelte index 8ac818be..05906325 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/oma/create-edit-dialog.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/units_of_measure/oma/create-edit-dialog.svelte @@ -17,11 +17,11 @@ interface Props { open: boolean; - unit?: UnitOfMeasureOMA; + item?: UnitOfMeasureOMA | null; onSuccess?: () => void; } - let { open = $bindable(), unit, onSuccess }: Props = $props(); + let { open = $bindable(), item, onSuccess }: Props = $props(); // Atajos @@ -29,41 +29,64 @@ code: '', description: '' }); + let loading = $state(false); + let error = $state(null); $effect(() => { if (open) { - if (unit) { + if (item) { formData = { - code: unit.code, - description: unit.description || '' + code: item.code, + description: item.description || '' }; } else { formData = { code: '', description: '' }; } + error = null; } }); async function handleSubmit(e: Event) { e.preventDefault(); + loading = true; + error = null; - const activeCompanyId = companyStore.activeCompany?.id; - if (!activeCompanyId) { - return; - } + try { + const activeCompanyId = companyStore.activeCompany?.id; + if (!activeCompanyId) { + throw new Error('No hay una compañía seleccionada'); + } - const data: UnitOfMeasureOMACreate | UnitOfMeasureOMAUpdate = { - code: formData.code, - description: formData.description || null - }; + let response; + if (item) { + response = await updateUnitOfMeasureOMA( + item.id, + { + code: formData.code, + description: formData.description || null + } satisfies UnitOfMeasureOMAUpdate, + activeCompanyId + ); + } else { + response = await createUnitOfMeasureOMA( + { + code: formData.code, + description: formData.description || null + } satisfies UnitOfMeasureOMACreate, + activeCompanyId + ); + } - const response = unit - ? await updateUnitOfMeasureOMA(unit.id, data, activeCompanyId) - : await createUnitOfMeasureOMA(data, activeCompanyId); + if (response.error) { + throw new Error(response.error); + } - if (response.error) { - } else { open = false; onSuccess?.(); + } catch (e) { + error = e instanceof Error ? e.message : 'Error al guardar la unidad'; + } finally { + loading = false; } } @@ -71,20 +94,25 @@ - {unit ? 'Editar' : 'Crear'} Unidad OMA + {item ? 'Editar' : 'Crear'} Unidad OMA
+ {#if error} +
{error}
+ {/if}
- +
- +
- - + +
diff --git a/frontend/src/lib/components/dashboard/ports/columns.ts b/frontend/src/lib/components/dashboard/ports/columns.ts index 5c7b7a6e..62a341f8 100644 --- a/frontend/src/lib/components/dashboard/ports/columns.ts +++ b/frontend/src/lib/components/dashboard/ports/columns.ts @@ -1,9 +1,7 @@ import type { Port } from '$lib/api/dashboard/a76/general_catalogs/ports'; import type { ColumnDef } from '@tanstack/table-core'; -import { renderComponent } from '$lib/components/ui/data-table'; -import DataTableActions from './data-table-actions.svelte'; -export function createColumns(onSuccess?: () => void): ColumnDef[] { +export function createColumns(): ColumnDef[] { return [ { accessorKey: 'port_code', @@ -33,16 +31,6 @@ export function createColumns(onSuccess?: () => void): ColumnDef[] { if (type === 'BOTH') return 'Ambos'; return type; } - }, - { - id: 'actions', - header: 'Acciones', - cell: ({ row }) => { - return renderComponent(DataTableActions, { - item: row.original, - onSuccess - }); - } } ]; } diff --git a/frontend/src/lib/components/dashboard/ports/create-edit-dialog.svelte b/frontend/src/lib/components/dashboard/ports/create-edit-dialog.svelte index 9e6396b8..f57ae60d 100644 --- a/frontend/src/lib/components/dashboard/ports/create-edit-dialog.svelte +++ b/frontend/src/lib/components/dashboard/ports/create-edit-dialog.svelte @@ -25,7 +25,7 @@ onSuccess?: () => void; } = $props(); - const isEdit = $derived(mode === 'edit'); + const isEdit = $derived(mode === 'edit' || !!item); const title = $derived(isEdit ? 'Editar Puerto' : 'Nuevo Puerto'); // Atajos diff --git a/frontend/src/lib/components/dashboard/ports/data-table-actions.svelte b/frontend/src/lib/components/dashboard/ports/data-table-actions.svelte deleted file mode 100644 index ef199203..00000000 --- a/frontend/src/lib/components/dashboard/ports/data-table-actions.svelte +++ /dev/null @@ -1,54 +0,0 @@ - - - - - {#snippet child({ props })} - - {/snippet} - - - Acciones - editDialogOpen = true}> - - Editar - - deleteDialogOpen = true} class="text-destructive"> - - Eliminar - - - - - - - diff --git a/frontend/src/lib/components/dashboard/seal/columns.ts b/frontend/src/lib/components/dashboard/seal/columns.ts index bf68d94e..20b9a4dc 100644 --- a/frontend/src/lib/components/dashboard/seal/columns.ts +++ b/frontend/src/lib/components/dashboard/seal/columns.ts @@ -1,26 +1,12 @@ import type { ColumnDef } from '@tanstack/table-core'; import type { Seal } from '$lib/api/dashboard/a76/general_catalogs/seal'; -import { renderComponent } from '$lib/components/ui/data-table'; -import DataTableActions from './data-table-actions.svelte'; -export function createColumns(onSuccess?: () => void): ColumnDef[] { +export function createColumns(): ColumnDef[] { return [ - { accessorKey: 'seal', header: 'Sello', cell: ({ row }) => row.original.seal, - }, - { - id: 'actions', - header: 'Acciones', - meta: { - class: 'w-[100px] text-right' - }, - cell: ({ row }) => renderComponent(DataTableActions, { - item: row.original, - onSuccess - }) } ]; } \ No newline at end of file diff --git a/frontend/src/lib/components/dashboard/seal/data-table-actions.svelte b/frontend/src/lib/components/dashboard/seal/data-table-actions.svelte deleted file mode 100644 index 480ad0e9..00000000 --- a/frontend/src/lib/components/dashboard/seal/data-table-actions.svelte +++ /dev/null @@ -1,98 +0,0 @@ - - - - - {#snippet child({ props })} - - {/snippet} - - - Acciones - - - - Editar - - - - {#if loading} - - {:else} - - {/if} - Eliminar - - - - - diff --git a/frontend/src/lib/components/dashboard/seal/data-table.svelte b/frontend/src/lib/components/dashboard/seal/data-table.svelte deleted file mode 100644 index 954785f8..00000000 --- a/frontend/src/lib/components/dashboard/seal/data-table.svelte +++ /dev/null @@ -1,122 +0,0 @@ - - -
-
- - - {#each table.getHeaderGroups() as headerGroup (headerGroup.id)} - - {#each headerGroup.headers as header (header.id)} - - {#if !header.isPlaceholder} - - {/if} - - {/each} - - {/each} - - - {#each table.getRowModel().rows as row (row.id)} - - {#each row.getVisibleCells() as cell (cell.id)} - - - - {/each} - - {:else} - - - No hay resultados. - - - {/each} - - {#if hasMore} - - -
- {#if loading} -
-
- Cargando más registros... -
- {:else} -
- - Desplázate para cargar más - -
- {/if} -
-
-
- {/if} -
-
-
-
diff --git a/frontend/src/routes/dashboard/general_catalogs/classification_concepts/+page.svelte b/frontend/src/routes/dashboard/general_catalogs/classification_concepts/+page.svelte index 17c41434..a695527b 100644 --- a/frontend/src/routes/dashboard/general_catalogs/classification_concepts/+page.svelte +++ b/frontend/src/routes/dashboard/general_catalogs/classification_concepts/+page.svelte @@ -6,23 +6,31 @@ import CreateDialog from '$lib/components/dashboard/general_catalogs/classification/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 { Pencil, Plus, Trash2 } from 'lucide-svelte'; import { goto } from '$app/navigation'; import { browser } from '$app/environment'; import { useShortcuts } from '$lib/hooks/use-shortcuts'; import { obtenerAtajosListaClasificacion } from '$lib/config/shortcuts/dashboard/general_catalogs/classification/list'; - import { getClassificationConcepts } from '$lib/api/dashboard/a76/general_catalogs/classification-concepts'; + import { getClassificationConcepts, deleteClassificationConcept, type ClassificationConcept } from '$lib/api/dashboard/a76/general_catalogs/classification-concepts'; import { companyStore } from '$lib/stores/company.svelte'; let { data } = $props(); let dialogOpen = $state(false); + let editingItem = $state(null); let error = $state(data.error || null); + let selectedIds = $state<(string | number)[]>([]); + const selectedItem = $derived( + selectedIds.length === 1 ? allItems.find((item) => item.id === selectedIds[0]) ?? null : null + ); // Atajos useShortcuts( 'Lista Clasificaciones', obtenerAtajosListaClasificacion({ - manejarNuevo: () => (dialogOpen = true), + manejarNuevo: () => { + editingItem = null; + dialogOpen = true; + }, manejarActualizar: handleSuccess }) ); @@ -32,7 +40,7 @@ let searchDesc = $state($page.url.searchParams.get('description') || ''); let timeout: ReturnType; - const columns = $derived(createColumns(handleSuccess)); + const columns = createColumns(); let allItems = $state(data.classifications?.items || []); let currentPage = $state(data.classifications?.page || 1); @@ -148,8 +156,55 @@ } function handleSuccess() { + dialogOpen = false; + editingItem = null; + selectedIds = []; reloadData(); } + + function handleRowClick(row: ClassificationConcept) { + const id = row.id; + selectedIds = selectedIds.includes(id) ? [] : [id]; + } + + function handleRowDoubleClick(row: ClassificationConcept) { + editingItem = row; + dialogOpen = true; + } + + function handleEditSelected() { + if (!selectedItem) return; + editingItem = selectedItem; + dialogOpen = true; + } + + async function handleDeleteSelected() { + if (!selectedItem || !companyStore.activeCompany) return; + + if (!confirm(`¿Estás seguro de eliminar la clasificación "${selectedItem.classification}"?`)) { + return; + } + + loading = true; + error = null; + + try { + const response = await deleteClassificationConcept(selectedItem.id, companyStore.activeCompany.id); + + if (response.error) { + error = response.error; + return; + } + + selectedIds = []; + await reloadData(); + } catch (err) { + error = 'Error al eliminar la clasificación'; + console.error('Error deleting classification:', err); + } finally { + loading = false; + } + }
@@ -159,11 +214,13 @@

Gestión del catálogo de clasificaciones de conceptos

- - @@ -204,6 +261,10 @@ {loading} {hasMore} {loadMore} + {selectedIds} + onSelectedIdsChange={(ids) => (selectedIds = ids)} + onRowClick={handleRowClick} + onRowDoubleClick={handleRowDoubleClick} />
@@ -212,8 +273,41 @@
Mostrando {allItems.length} de {totalItems} registros
+ +
+ + + diff --git a/frontend/src/routes/dashboard/general_catalogs/company_information/+page.svelte b/frontend/src/routes/dashboard/general_catalogs/company_information/+page.svelte index 6ce44afb..934cf35e 100644 --- a/frontend/src/routes/dashboard/general_catalogs/company_information/+page.svelte +++ b/frontend/src/routes/dashboard/general_catalogs/company_information/+page.svelte @@ -6,26 +6,29 @@ import { Button } from '$lib/components/ui/button'; import { Input } from '$lib/components/ui/input'; - import { Plus, RefreshCw } from 'lucide-svelte'; + import { Pencil, Plus, Trash2 } from 'lucide-svelte'; import { goto } from '$app/navigation'; import { browser } from '$app/environment'; import * as m from '$lib/paraglide/messages.js'; import { useShortcuts } from '$lib/hooks/use-shortcuts'; import { obtenerAtajosListaEmpresa } from '$lib/config/shortcuts/dashboard/general_catalogs/company_information/list'; - import { getCompanies } from '$lib/api/dashboard/a76/general_catalogs/company'; + import { getCompanies, deleteCompany, type Company } from '$lib/api/dashboard/a76/general_catalogs/company'; let { data } = $props(); + let selectedIds = $state<(string | number)[]>([]); + const selectedItem = $derived( + selectedIds.length === 1 ? allItems.find((item) => item.id === selectedIds[0]) ?? null : null + ); // Atajos useShortcuts( 'Lista Empresas', obtenerAtajosListaEmpresa({ manejarNuevo: () => goto('/dashboard/general_catalogs/company_information/edit'), - manejarActualizar: () => goto($page.url, { invalidateAll: true }) + manejarActualizar: handleSuccess }) ); - let dialogOpen = $state(false); let error = $state(data.error || null); // Filtros @@ -130,8 +133,42 @@ } function handleSuccess() { + selectedIds = []; reloadData(); } + + function handleRowClick(row: Company) { + const id = row.id; + selectedIds = selectedIds.includes(id) ? [] : [id]; + } + + function handleEditSelected() { + if (!selectedItem) return; + goto(`/dashboard/general_catalogs/company_information/edit/${selectedItem.id}`); + } + + async function handleDeleteSelected() { + if (!selectedItem) return; + + if (!confirm(`¿Estás seguro de eliminar la empresa "${selectedItem.name}"?`)) { + return; + } + + loading = true; + error = null; + + try { + await deleteCompany(selectedItem.id); + + selectedIds = []; + await reloadData(); + } catch (err) { + error = 'Error al eliminar la empresa'; + console.error('Error deleting company:', err); + } finally { + loading = false; + } + }
@@ -141,11 +178,7 @@

Gestión de información de empresas

- - @@ -182,17 +215,50 @@
goto(`/dashboard/general_catalogs/company_information/edit/${item.id}`)} + {selectedIds} + onSelectedIdsChange={(ids) => (selectedIds = ids)} + onRowClick={handleRowClick} + onRowDoubleClick={(item) => + goto(`/dashboard/general_catalogs/company_information/edit/${item.id}`)} />
-
- Mostrando {allItems.length} de {totalItems} registros +
Mostrando {allItems.length} de {totalItems} registros
+ +
+ +
diff --git a/frontend/src/routes/dashboard/general_catalogs/concepts/+page.svelte b/frontend/src/routes/dashboard/general_catalogs/concepts/+page.svelte index 5484e615..f09f936f 100644 --- a/frontend/src/routes/dashboard/general_catalogs/concepts/+page.svelte +++ b/frontend/src/routes/dashboard/general_catalogs/concepts/+page.svelte @@ -6,26 +6,33 @@ import CreateEditDialog from '$lib/components/dashboard/general_catalogs/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 { Pencil, Plus, Trash2 } from 'lucide-svelte'; import { goto } from '$app/navigation'; import { browser } from '$app/environment'; import type { PageData } from './$types'; import { useShortcuts } from '$lib/hooks/use-shortcuts'; import { obtenerAtajosListaConceptos } from '$lib/config/shortcuts/dashboard/general_catalogs/concepts/list'; - import { getConcepts } from '$lib/api/dashboard/a76/general_catalogs/concepts'; + import { getConcepts, deleteConcept, type Concept } from '$lib/api/dashboard/a76/general_catalogs/concepts'; import { companyStore } from '$lib/stores/company.svelte'; let { data }: { data: PageData } = $props(); - let createDialogOpen = $state(false); let dialogOpen = $state(false); + let editingItem = $state(null); let error = $state(data.error || null); + let selectedIds = $state<(string | number)[]>([]); + const selectedItem = $derived( + selectedIds.length === 1 ? allItems.find((item) => item.id === selectedIds[0]) ?? null : null + ); // Atajos useShortcuts( 'Lista Conceptos', obtenerAtajosListaConceptos({ - manejarNuevo: () => (createDialogOpen = true), + manejarNuevo: () => { + editingItem = null; + dialogOpen = true; + }, manejarActualizar: () => goto($page.url, { invalidateAll: true }) }) ); @@ -139,8 +146,55 @@ } function handleSuccess() { + dialogOpen = false; + editingItem = null; + selectedIds = []; reloadData(); } + + function handleRowClick(row: Concept) { + const id = row.id; + selectedIds = selectedIds.includes(id) ? [] : [id]; + } + + function handleRowDoubleClick(row: Concept) { + editingItem = row; + dialogOpen = true; + } + + function handleEditSelected() { + if (!selectedItem) return; + editingItem = selectedItem; + dialogOpen = true; + } + + async function handleDeleteSelected() { + if (!selectedItem || !companyStore.activeCompany) return; + + if (!confirm(`¿Estás seguro de eliminar el concepto "${selectedItem.code}"?`)) { + return; + } + + loading = true; + error = null; + + try { + const response = await deleteConcept(selectedItem.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 concept:', err); + } finally { + loading = false; + } + }
@@ -150,11 +204,13 @@

Define los conceptos que se usan para capturar y clasificar cargos en la pestaña Cuenta de Gastos y A.A. del pedimento.

- - @@ -191,10 +247,14 @@
(selectedIds = ids)} + onRowClick={handleRowClick} + onRowDoubleClick={handleRowDoubleClick} />
@@ -204,7 +264,38 @@ Mostrando {allItems.length} de {totalItems} registros
+
+ + + {#if dialogOpen} - + {/if}
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 9e1d707a..d85074fa 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 @@ -42,7 +42,7 @@ let searchConcept = $state($page.url.searchParams.get('concept') || ''); let timeout: ReturnType; - const columns = $derived(createColumns(handleSuccess)); + const columns = $derived(createColumns()); let allItems = $state(data.concepts?.items || []); let currentPage = $state(data.concepts?.page || 1); diff --git a/frontend/src/routes/dashboard/general_catalogs/doda/+page.svelte b/frontend/src/routes/dashboard/general_catalogs/doda/+page.svelte index ab57e42d..7ccdd708 100644 --- a/frontend/src/routes/dashboard/general_catalogs/doda/+page.svelte +++ b/frontend/src/routes/dashboard/general_catalogs/doda/+page.svelte @@ -50,8 +50,10 @@ let error = $state(data.error || null); // Selection - let selectedId = $state(null); - const selectedDoda = $derived(selectedId ? allItems.find((i) => i.id === selectedId) : null); + let selectedIds = $state<(string | number)[]>([]); + const selectedDoda = $derived( + selectedIds.length === 1 ? allItems.find((item) => item.id === selectedIds[0]) ?? null : null + ); // Sincronizar con datos del servidor al cargar (primera carga) $effect(() => { @@ -144,7 +146,7 @@ allItems = res.data.items; currentPage = 1; totalItems = res.data.total; - selectedId = null; + selectedIds = []; } } catch (e) { console.error('Error reloading DODAs:', e); @@ -169,18 +171,19 @@ } function handleEdit() { - if (selectedId) { - goto(`/dashboard/general_catalogs/doda/edit/${selectedId}`); + if (selectedDoda) { + goto(`/dashboard/general_catalogs/doda/edit/${selectedDoda.id}`); } } async function handleDelete() { - if (!selectedId || !companyStore.activeCompany) return; + if (!selectedDoda || !companyStore.activeCompany) return; if (confirm('¿Estás seguro de eliminar este DODA?')) { try { - await deleteDoda(selectedId, companyStore.activeCompany.id); + await deleteDoda(selectedDoda.id, companyStore.activeCompany.id); toast.success('DODA eliminado correctamente'); + selectedIds = []; reloadData(); } catch (e) { toast.error('Error al eliminar DODA'); @@ -188,8 +191,9 @@ } } - function handleRowClick(doda: Doda) { - selectedId = selectedId === doda.id ? null : doda.id; + function handleRowClick(row: Doda) { + const id = row.id; + selectedIds = selectedIds.includes(id) ? [] : [id]; } @@ -200,10 +204,6 @@

Gestiona tus Documentos de Operación Aduanera (DODA)

- - - - - - - - - -
+
+ + + +
diff --git a/frontend/src/routes/dashboard/general_catalogs/electronic_notices/+page.svelte b/frontend/src/routes/dashboard/general_catalogs/electronic_notices/+page.svelte index 7aa48435..dffea48b 100644 --- a/frontend/src/routes/dashboard/general_catalogs/electronic_notices/+page.svelte +++ b/frontend/src/routes/dashboard/general_catalogs/electronic_notices/+page.svelte @@ -8,21 +8,25 @@ import * as Card from '$lib/components/ui/card'; import { Button } from '$lib/components/ui/button'; import { Input } from '$lib/components/ui/input'; - import { Plus, RefreshCw } from 'lucide-svelte'; + import { Pencil, Plus, Trash2 } from 'lucide-svelte'; import { useShortcuts } from '$lib/hooks/use-shortcuts'; import { obtenerAtajosListaAvisosElectrónicos } from '$lib/config/shortcuts/dashboard/general_catalogs/electronic_notices/list'; - import { getElectronicNotices } from '$lib/api/dashboard/a76/general_catalogs/electronic-notices'; + import { getElectronicNotices, deleteElectronicNotice, type ElectronicNotice } from '$lib/api/dashboard/a76/general_catalogs/electronic-notices'; import { companyStore } from '$lib/stores/company.svelte'; let { data } = $props(); let dialogOpen = $state(false); + let editingItem = $state(null); let error = $state(data.error || null); // Atajos useShortcuts( 'Lista Avisos Electrónicos', obtenerAtajosListaAvisosElectrónicos({ - manejarNuevo: () => (dialogOpen = true), + manejarNuevo: () => { + editingItem = null; + dialogOpen = true; + }, manejarRefrescar: handleSuccess }) ); @@ -32,12 +36,18 @@ let searchPedimento = $state($page.url.searchParams.get('pedimento') || ''); let timeout: ReturnType; - let allItems = $state(data.notices?.items || []); + let allItems = $state(data.notices?.items || []); let currentPage = $state(data.notices?.page || 1); let pageSize = $state(data.notices?.page_size || 50); let totalItems = $state(data.notices?.total || 0); let loading = $state(false); let hasMore = $derived(allItems.length < totalItems); + let selectedIds = $state<(string | number)[]>([]); + const selectedItem = $derived( + selectedIds.length === 1 + ? allItems.find((item) => String(item.id) === String(selectedIds[0])) ?? null + : null + ); $effect(() => { if (data.notices) { @@ -146,8 +156,50 @@ } function handleSuccess() { + dialogOpen = false; + editingItem = null; + selectedIds = []; reloadData(); } + + function handleRowClick(row: ElectronicNotice) { + const id = row.id; + selectedIds = selectedIds.includes(id) ? [] : [id]; + } + + function handleRowDoubleClick(row: ElectronicNotice) { + editingItem = row; + dialogOpen = true; + } + + function handleEditSelected() { + if (!selectedItem) return; + editingItem = selectedItem; + dialogOpen = true; + } + + async function handleDeleteSelected() { + if (!selectedItem || !companyStore.activeCompany) return; + + if (!confirm(`¿Estás seguro de eliminar el aviso "${selectedItem.notice_number}"?`)) { + return; + } + + loading = true; + error = null; + + try { + await deleteElectronicNotice(selectedItem.id, companyStore.activeCompany.id); + + selectedIds = []; + await reloadData(); + } catch (err) { + error = 'Error al eliminar el aviso'; + console.error('Error deleting notice:', err); + } finally { + loading = false; + } + }
@@ -156,7 +208,7 @@

Avisos Electrónicos

Gestión del catálogo de avisos electrónicos

-
+
{#if error} @@ -167,10 +219,41 @@
Listado de Avisos
-
+
(selectedIds = ids)} onRowClick={handleRowClick} onRowDoubleClick={handleRowDoubleClick} />
Mostrando {allItems.length} de {totalItems} registros
- +
+ + + + diff --git a/frontend/src/routes/dashboard/general_catalogs/equivalencies/+page.svelte b/frontend/src/routes/dashboard/general_catalogs/equivalencies/+page.svelte index 51a76f07..55a6f137 100644 --- a/frontend/src/routes/dashboard/general_catalogs/equivalencies/+page.svelte +++ b/frontend/src/routes/dashboard/general_catalogs/equivalencies/+page.svelte @@ -8,12 +8,12 @@ import * as Card from '$lib/components/ui/card'; import { Button } from '$lib/components/ui/button'; import { Input } from '$lib/components/ui/input'; - import { Plus, RefreshCw } from 'lucide-svelte'; + import { Pencil, Plus, Trash2 } from 'lucide-svelte'; import { useShortcuts } from '$lib/hooks/use-shortcuts'; import { obtenerAtajosListaEquivalencias } from '$lib/config/shortcuts/dashboard/general_catalogs/equivalencies/list'; import DataEquivalenciesDialog from '$lib/components/dashboard/general_catalogs/equivalencies/data-equivalencies-dialog.svelte'; import type { PageData } from './$types'; - import { getEquivalencies } from '$lib/api/dashboard/a76/general_catalogs/equivalencies'; + import { getEquivalencies, deleteEquivalency } from '$lib/api/dashboard/a76/general_catalogs/equivalencies'; import { companyStore } from '$lib/stores/company.svelte'; let { data }: { data: PageData } = $props(); @@ -22,6 +22,11 @@ let dataDialogOpen = $state(false); let selectedEquivalency = $state(null); let dataMode = $state<'create' | 'edit'>('edit'); + + let selectedIds = $state<(string | number)[]>([]); + const singleSelected = $derived( + selectedIds.length === 1 ? allItems.find((item) => item.id === selectedIds[0]) ?? null : null + ); // Atajos useShortcuts( @@ -148,20 +153,51 @@ } function handleSuccess() { + dataDialogOpen = false; + selectedEquivalency = null; + selectedIds = []; reloadData(); } - function handleOpenInsertItems(equivalency: Equivalency) { - selectedEquivalency = equivalency; + function handleRowClick(row: Equivalency) { + const id = row.id; + selectedIds = selectedIds.includes(id) ? [] : [id]; + } + + function handleRowDoubleClick(row: Equivalency) { + selectedEquivalency = row; dataMode = 'edit'; dataDialogOpen = true; } - function handleOpenEditCatalog(equivalency: Equivalency) { - selectedEquivalency = equivalency; + function handleEditSelected() { + if (!singleSelected) return; + selectedEquivalency = singleSelected; dataMode = 'edit'; dataDialogOpen = true; } + + async function handleDeleteSelected() { + if (!singleSelected || !companyStore.activeCompany) return; + + if (!confirm('¿Estás seguro de eliminar la equivalencia seleccionada?')) { + return; + } + + loading = true; + error = null; + + try { + await deleteEquivalency(singleSelected.id, companyStore.activeCompany.id); + selectedIds = []; + await reloadData(); + } catch (err) { + error = 'Error al eliminar la equivalencia'; + console.error('Error deleting equivalency:', err); + } finally { + loading = false; + } + }
@@ -170,7 +206,7 @@

Equivalencias

Catálogo de equivalencias

-
+ +
+ + + (null); let error = $state(data.error || null); + let selectedIds = $state<(string | number)[]>([]); + const selectedItem = $derived( + selectedIds.length === 1 ? allItems.find((item) => item.id === selectedIds[0]) ?? null : null + ); // Atajos useShortcuts( 'Lista Errores', obtenerAtajosListaErrores({ - manejarNuevo: () => (dialogOpen = true), + manejarNuevo: () => { + editingItem = null; + dialogOpen = true; + }, manejarActualizar: handleSuccess }) ); @@ -147,8 +155,50 @@ } function handleSuccess() { + dialogOpen = false; + editingItem = null; + selectedIds = []; reloadData(); } + + function handleRowClick(row: ErrorCatalog) { + const id = row.id; + selectedIds = selectedIds.includes(id) ? [] : [id]; + } + + function handleRowDoubleClick(row: ErrorCatalog) { + editingItem = row; + dialogOpen = true; + } + + function handleEditSelected() { + if (!selectedItem) return; + editingItem = selectedItem; + dialogOpen = true; + } + + async function handleDeleteSelected() { + if (!selectedItem || !companyStore.activeCompany) return; + + if (!confirm(`¿Estás seguro de eliminar el error "${selectedItem.code}"?`)) { + return; + } + + loading = true; + error = null; + + try { + await deleteErrorCatalog(selectedItem.id, companyStore.activeCompany.id); + + selectedIds = []; + await reloadData(); + } catch (err) { + error = 'Error al eliminar el error'; + console.error('Error deleting error catalog:', err); + } finally { + loading = false; + } + }
@@ -157,7 +207,18 @@

Errores de Facturación

Gestión del catálogo de errores de facturación

-
+
+ +
{#if error} @@ -168,10 +229,59 @@
Listado de Errores
-
+ +
+ (selectedIds = ids)} + onRowClick={handleRowClick} + onRowDoubleClick={handleRowDoubleClick} + /> +
+
Mostrando {allItems.length} de {totalItems} registros
- +
+ + + + diff --git a/frontend/src/routes/dashboard/general_catalogs/exchange-rate/+page.svelte b/frontend/src/routes/dashboard/general_catalogs/exchange-rate/+page.svelte index a68435cb..424c4af0 100644 --- a/frontend/src/routes/dashboard/general_catalogs/exchange-rate/+page.svelte +++ b/frontend/src/routes/dashboard/general_catalogs/exchange-rate/+page.svelte @@ -8,23 +8,31 @@ import * as Card from '$lib/components/ui/card'; import { Button } from '$lib/components/ui/button'; import { Input } from '$lib/components/ui/input'; - import { Plus, RefreshCw } from 'lucide-svelte'; + import { Pencil, Plus, Trash2 } from 'lucide-svelte'; import { useShortcuts } from '$lib/hooks/use-shortcuts'; import { obtenerAtajosListaTiposCambio } from '$lib/config/shortcuts/dashboard/general_catalogs/exchange_rate/list'; import type { PageData } from './$types'; - import { getExchangeRates } from '$lib/api/dashboard/a76/general_catalogs/exchange-rate'; + import { getExchangeRates, deleteExchangeRate, type ExchangeRate } from '$lib/api/dashboard/a76/general_catalogs/exchange-rate'; import { companyStore } from '$lib/stores/company.svelte'; let { data }: { data: PageData } = $props(); let createDialogOpen = $state(false); + let editingItem = $state(null); let error = $state(data.error || null); + let selectedIds = $state<(string | number)[]>([]); + const selectedItem = $derived( + selectedIds.length === 1 ? allItems.find((item) => item.id === selectedIds[0]) ?? null : null + ); // Atajos useShortcuts( 'Lista Tipos de Cambio', obtenerAtajosListaTiposCambio({ - manejarNuevo: () => (createDialogOpen = true), + manejarNuevo: () => { + editingItem = null; + createDialogOpen = true; + }, manejarActualizar: handleSuccess }) ); @@ -136,8 +144,50 @@ } function handleSuccess() { + createDialogOpen = false; + editingItem = null; + selectedIds = []; reloadData(); } + + function handleRowClick(row: ExchangeRate) { + const id = row.id; + selectedIds = selectedIds.includes(id) ? [] : [id]; + } + + function handleRowDoubleClick(row: ExchangeRate) { + editingItem = row; + createDialogOpen = true; + } + + function handleEditSelected() { + if (!selectedItem) return; + editingItem = selectedItem; + createDialogOpen = true; + } + + async function handleDeleteSelected() { + if (!selectedItem || !companyStore.activeCompany) return; + + if (!confirm(`¿Estás seguro de eliminar este tipo de cambio?`)) { + return; + } + + loading = true; + error = null; + + try { + await deleteExchangeRate(selectedItem.id, companyStore.activeCompany.id); + + selectedIds = []; + await reloadData(); + } catch (err) { + error = 'Error al eliminar el tipo de cambio'; + console.error('Error deleting exchange rate:', err); + } finally { + loading = false; + } + }
@@ -146,7 +196,18 @@

Tipos de Cambio

Catálogo de tipos de cambio

-
+
+ +
{#if error} @@ -157,10 +218,59 @@
Listado de Tipos de Cambio
-
+ +
+ (selectedIds = ids)} + onRowClick={handleRowClick} + onRowDoubleClick={handleRowDoubleClick} + /> +
+
Mostrando {allItems.length} de {totalItems} registros
- +
+ + + + diff --git a/frontend/src/routes/dashboard/general_catalogs/identifiers/+page.svelte b/frontend/src/routes/dashboard/general_catalogs/identifiers/+page.svelte index d986d669..9d943501 100644 --- a/frontend/src/routes/dashboard/general_catalogs/identifiers/+page.svelte +++ b/frontend/src/routes/dashboard/general_catalogs/identifiers/+page.svelte @@ -8,23 +8,31 @@ import * as Card from '$lib/components/ui/card'; import { Button } from '$lib/components/ui/button'; import { Input } from '$lib/components/ui/input'; - import { Plus, RefreshCw } from 'lucide-svelte'; + import { Pencil, Plus, Trash2 } from 'lucide-svelte'; import type { PageData } from './$types'; import { useShortcuts } from '$lib/hooks/use-shortcuts'; import { obtenerAtajosListaIdentificadores } from '$lib/config/shortcuts/dashboard/general_catalogs/identifiers/list'; - import { getIdentifiers } from '$lib/api/dashboard/a76/general_catalogs/identifiers'; + import { getIdentifiers, deleteIdentifier, type Identifier } from '$lib/api/dashboard/a76/general_catalogs/identifiers'; import { companyStore } from '$lib/stores/company.svelte'; let { data }: { data: PageData } = $props(); let createDialogOpen = $state(false); + let editingItem = $state(null); let error = $state(data.error || null); + let selectedIds = $state<(string | number)[]>([]); + const selectedItem = $derived( + selectedIds.length === 1 ? allItems.find((item) => item.id === selectedIds[0]) ?? null : null + ); // Atajos useShortcuts( 'Lista Identificadores', obtenerAtajosListaIdentificadores({ - manejarNuevo: () => (createDialogOpen = true), + manejarNuevo: () => { + editingItem = null; + createDialogOpen = true; + }, manejarRefrescar: handleSuccess }) ); @@ -138,8 +146,50 @@ } function handleSuccess() { + createDialogOpen = false; + editingItem = null; + selectedIds = []; reloadData(); } + + function handleRowClick(row: Identifier) { + const id = row.id; + selectedIds = selectedIds.includes(id) ? [] : [id]; + } + + function handleRowDoubleClick(row: Identifier) { + editingItem = row; + createDialogOpen = true; + } + + function handleEditSelected() { + if (!selectedItem) return; + editingItem = selectedItem; + createDialogOpen = true; + } + + async function handleDeleteSelected() { + if (!selectedItem || !companyStore.activeCompany) return; + + if (!confirm(`¿Estás seguro de eliminar el identificador "${selectedItem.code}"?`)) { + return; + } + + loading = true; + error = null; + + try { + await deleteIdentifier(selectedItem.id, companyStore.activeCompany.id); + + selectedIds = []; + await reloadData(); + } catch (err) { + error = 'Error al eliminar el identificador'; + console.error('Error deleting identifier:', err); + } finally { + loading = false; + } + }
@@ -149,11 +199,13 @@

Catálogo de identificadores

- - @@ -190,10 +242,14 @@
(selectedIds = ids)} + onRowClick={handleRowClick} + onRowDoubleClick={handleRowDoubleClick} />
@@ -203,5 +259,40 @@ Mostrando {allItems.length} de {totalItems} registros
- +
+ + + + diff --git a/frontend/src/routes/dashboard/general_catalogs/inpc/+page.svelte b/frontend/src/routes/dashboard/general_catalogs/inpc/+page.svelte index 92990890..2d773951 100644 --- a/frontend/src/routes/dashboard/general_catalogs/inpc/+page.svelte +++ b/frontend/src/routes/dashboard/general_catalogs/inpc/+page.svelte @@ -8,24 +8,32 @@ import * as Card from '$lib/components/ui/card'; import { Button } from '$lib/components/ui/button'; import { Input } from '$lib/components/ui/input'; - import { Plus, RefreshCw } from 'lucide-svelte'; + import { Pencil, Plus, Trash2 } from 'lucide-svelte'; import type { PageData } from './$types'; import { useShortcuts } from '$lib/hooks/use-shortcuts'; import { obtenerAtajosListaInpc } from '$lib/config/shortcuts/dashboard/general_catalogs/inpc/list'; - import { getINPCs } from '$lib/api/dashboard/a76/general_catalogs/inpc'; + import { getINPCs, deleteINPC, type INPC } from '$lib/api/dashboard/a76/general_catalogs/inpc'; import { companyStore } from '$lib/stores/company.svelte'; let { data }: { data: PageData } = $props(); let createDialogOpen = $state(false); + let editingItem = $state(null); let error = $state(data.error || null); + let selectedIds = $state<(string | number)[]>([]); + const selectedItem = $derived( + selectedIds.length === 1 ? allItems.find((item) => item.id === selectedIds[0]) ?? null : null + ); // Atajos useShortcuts( 'Lista INPC', obtenerAtajosListaInpc({ - manejarNuevo: () => (createDialogOpen = true), - manejarActualizar: () => goto($page.url, { invalidateAll: true }), + manejarNuevo: () => { + editingItem = null; + createDialogOpen = true; + }, + manejarActualizar: handleSuccess }) ); @@ -139,8 +147,55 @@ } function handleSuccess() { + createDialogOpen = false; + editingItem = null; + selectedIds = []; reloadData(); } + + function handleRowClick(row: INPC) { + const id = row.id; + selectedIds = selectedIds.includes(id) ? [] : [id]; + } + + function handleRowDoubleClick(row: INPC) { + editingItem = row; + createDialogOpen = true; + } + + function handleEditSelected() { + if (!selectedItem) return; + editingItem = selectedItem; + createDialogOpen = true; + } + + async function handleDeleteSelected() { + if (!selectedItem || !companyStore.activeCompany) return; + + if (!confirm(`¿Estás seguro de eliminar el INPC del periodo ${selectedItem.year}-${selectedItem.month}?`)) { + return; + } + + loading = true; + error = null; + + try { + const response = await deleteINPC(selectedItem.id, companyStore.activeCompany.id); + + if (response.error) { + error = response.error; + return; + } + + selectedIds = []; + await reloadData(); + } catch (err) { + error = 'Error al eliminar el INPC'; + console.error('Error deleting INPC:', err); + } finally { + loading = false; + } + }
@@ -150,11 +205,12 @@

Índice Nacional de Precios al Consumidor

- - @@ -191,10 +247,14 @@
(selectedIds = ids)} + onRowClick={handleRowClick} + onRowDoubleClick={handleRowDoubleClick} />
@@ -204,5 +264,40 @@ Mostrando {allItems.length} de {totalItems} registros
- +
+ + + + diff --git a/frontend/src/routes/dashboard/general_catalogs/legends/+page.svelte b/frontend/src/routes/dashboard/general_catalogs/legends/+page.svelte index 9632ba7c..570c9a48 100644 --- a/frontend/src/routes/dashboard/general_catalogs/legends/+page.svelte +++ b/frontend/src/routes/dashboard/general_catalogs/legends/+page.svelte @@ -6,24 +6,28 @@ import CreateDialog from '$lib/components/dashboard/general_catalogs/legends/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 { Pencil, Plus, Trash2 } from 'lucide-svelte'; import { goto } from '$app/navigation'; import { browser } from '$app/environment'; import { useShortcuts } from '$lib/hooks/use-shortcuts'; import { obtenerAtajosListaLeyendas } from '$lib/config/shortcuts/dashboard/general_catalogs/legends/list'; - import { getLegends } from '$lib/api/dashboard/a76/general_catalogs/legends'; + import { getLegends, deleteLegend, type Legend } from '$lib/api/dashboard/a76/general_catalogs/legends'; import { companyStore } from '$lib/stores/company.svelte'; let { data } = $props(); let dialogOpen = $state(false); + let editingItem = $state(null); let error = $state(data.error || null); // Atajos useShortcuts( 'Lista Leyendas', obtenerAtajosListaLeyendas({ - manejarNuevo: () => (dialogOpen = true), - manejarActualizar: () => goto($page.url, { invalidateAll: true }), + manejarNuevo: () => { + editingItem = null; + dialogOpen = true; + }, + manejarActualizar: handleSuccess }) ); @@ -32,14 +36,20 @@ let searchDesc = $state($page.url.searchParams.get('description') || ''); let timeout: ReturnType; - const columns = $derived(createColumns(handleSuccess)); - let allItems = $state(data.legends?.items || []); + + let allItems = $state(data.legends?.items || []); let currentPage = $state(data.legends?.page || 1); let pageSize = $state(data.legends?.page_size || 50); let totalItems = $state(data.legends?.total || 0); let loading = $state(false); let hasMore = $derived(allItems.length < totalItems); + let selectedIds = $state<(string | number)[]>([]); + const selectedItem = $derived( + selectedIds.length === 1 + ? allItems.find((item) => String(item.id) === String(selectedIds[0])) ?? null + : null + ); $effect(() => { if (data.legends) { @@ -63,6 +73,9 @@ if (searchDesc) filters.description = searchDesc; const response = await getLegends(1, pageSize, companyStore.activeCompany.id, filters); + if (response.error) { + throw new Error(response.error); + } if (response.data) { allItems = response.data.items; currentPage = 1; @@ -101,6 +114,9 @@ companyStore.activeCompany.id, filters ); + if (response.error) { + throw new Error(response.error); + } if (response.data?.items) { allItems = [...allItems, ...response.data.items]; currentPage += 1; @@ -124,6 +140,9 @@ if (searchDesc) filters.description = searchDesc; const response = await getLegends(1, pageSize, companyStore.activeCompany.id, filters); + if (response.error) { + throw new Error(response.error); + } if (response.data) { allItems = response.data.items; currentPage = 1; @@ -138,8 +157,53 @@ } function handleSuccess() { + dialogOpen = false; + editingItem = null; + selectedIds = []; reloadData(); } + + function handleRowClick(row: Legend) { + const id = row.id; + selectedIds = selectedIds.includes(id) ? [] : [id]; + } + + function handleRowDoubleClick(row: Legend) { + editingItem = row; + dialogOpen = true; + } + + function handleEditSelected() { + if (!selectedItem) return; + editingItem = selectedItem; + dialogOpen = true; + } + + async function handleDeleteSelected() { + if (!selectedItem || !companyStore.activeCompany) return; + + if (!confirm(`¿Estás seguro de eliminar la leyenda "${selectedItem.code}"?`)) { + return; + } + + loading = true; + error = null; + + try { + const response = await deleteLegend(selectedItem.id, companyStore.activeCompany.id); + if (response.error) { + throw new Error(response.error); + } + + selectedIds = []; + await reloadData(); + } catch (err) { + error = 'Error al eliminar la leyenda'; + console.error('Error deleting legend:', err); + } finally { + loading = false; + } + }
@@ -149,11 +213,13 @@

Gestión del catálogo de leyendas fijas

- - @@ -190,10 +256,14 @@
(selectedIds = ids)} + onRowClick={handleRowClick} + onRowDoubleClick={handleRowDoubleClick} />
@@ -203,5 +273,40 @@ Mostrando {allItems.length} de {totalItems} registros
- +
+ + + + diff --git a/frontend/src/routes/dashboard/general_catalogs/multi_currency_types/+page.svelte b/frontend/src/routes/dashboard/general_catalogs/multi_currency_types/+page.svelte index 004b399a..b7a7cc57 100644 --- a/frontend/src/routes/dashboard/general_catalogs/multi_currency_types/+page.svelte +++ b/frontend/src/routes/dashboard/general_catalogs/multi_currency_types/+page.svelte @@ -6,27 +6,32 @@ import * as Card from '$lib/components/ui/card'; import { Button } from '$lib/components/ui/button'; import { Input } from '$lib/components/ui/input'; - import { Plus, RefreshCw } from 'lucide-svelte'; + import { Pencil, Plus, Trash2 } from 'lucide-svelte'; import { goto } from '$app/navigation'; import { browser } from '$app/environment'; import { useShortcuts } from '$lib/hooks/use-shortcuts'; import { obtenerAtajosListaMonedas } from '$lib/config/shortcuts/dashboard/general_catalogs/multi_currency_types/list'; import { getMultiCurrencyTypes, + deleteMultiCurrencyType, type MultiCurrencyType } from '$lib/api/dashboard/a76/general_catalogs/multi-currency-types'; import { companyStore } from '$lib/stores/company.svelte'; let { data } = $props(); let dialogOpen = $state(false); + let editingItem = $state(null); let error = $state(data.error || null); // Atajos useShortcuts( 'Lista Monedas', obtenerAtajosListaMonedas({ - manejarNuevo: () => (dialogOpen = true), - manejarActualizar: () => goto($page.url, { invalidateAll: true }), + manejarNuevo: () => { + editingItem = null; + dialogOpen = true; + }, + manejarActualizar: handleSuccess }) ); @@ -58,12 +63,18 @@ } ]; - let allItems = $state(data.types?.items || []); + let allItems = $state(data.types?.items || []); let currentPage = $state(data.types?.page || 1); let pageSize = $state(data.types?.page_size || 50); let totalItems = $state(data.types?.total || 0); let loading = $state(false); let hasMore = $derived(allItems.length < totalItems); + let selectedIds = $state<(string | number)[]>([]); + const selectedItem = $derived( + selectedIds.length === 1 + ? allItems.find((item) => String(item.id) === String(selectedIds[0])) ?? null + : null + ); $effect(() => { if (data.types) { @@ -91,6 +102,9 @@ country_key: searchCountry || undefined } ); + if (response.error) { + throw new Error(response.error); + } if (response.data?.items) { allItems = response.data.items; currentPage = response.data.page || 1; @@ -128,6 +142,9 @@ country_key: searchCountry || undefined } ); + if (response.error) { + throw new Error(response.error); + } if (response.data?.items) { allItems = [...allItems, ...response.data.items]; currentPage += 1; @@ -155,6 +172,9 @@ country_key: searchCountry || undefined } ); + if (response.error) { + throw new Error(response.error); + } if (response.data?.items) { allItems = response.data.items; currentPage = response.data.page || 1; @@ -169,8 +189,53 @@ } function handleSuccess() { + dialogOpen = false; + editingItem = null; + selectedIds = []; reloadData(); } + + function handleRowClick(row: MultiCurrencyType) { + const id = row.id; + selectedIds = selectedIds.includes(id) ? [] : [id]; + } + + function handleRowDoubleClick(row: MultiCurrencyType) { + editingItem = row; + dialogOpen = true; + } + + function handleEditSelected() { + if (!selectedItem) return; + editingItem = selectedItem; + dialogOpen = true; + } + + async function handleDeleteSelected() { + if (!selectedItem || !companyStore.activeCompany) return; + + if (!confirm(`¿Estás seguro de eliminar el tipo de moneda "${selectedItem.currency_type_code}"?`)) { + return; + } + + loading = true; + error = null; + + try { + const response = await deleteMultiCurrencyType(selectedItem.id, companyStore.activeCompany.id); + if (response.error) { + throw new Error(response.error); + } + + selectedIds = []; + await reloadData(); + } catch (err) { + error = 'Error al eliminar el tipo de moneda'; + console.error('Error deleting multi-currency type:', err); + } finally { + loading = false; + } + }
@@ -179,7 +244,18 @@

Tipos de Moneda Múltiple

Gestión del catálogo de tipos de moneda múltiple

-
+
+ +
{#if error} @@ -190,10 +266,59 @@
Listado de Monedas
-
+ +
+ (selectedIds = ids)} + onRowClick={handleRowClick} + onRowDoubleClick={handleRowDoubleClick} + /> +
+
Mostrando {allItems.length} de {totalItems} registros
- +
+ + + + diff --git a/frontend/src/routes/dashboard/general_catalogs/ports/+page.svelte b/frontend/src/routes/dashboard/general_catalogs/ports/+page.svelte index 2ad73e0c..da348f5c 100644 --- a/frontend/src/routes/dashboard/general_catalogs/ports/+page.svelte +++ b/frontend/src/routes/dashboard/general_catalogs/ports/+page.svelte @@ -8,24 +8,28 @@ import * as Card from '$lib/components/ui/card'; import { Button } from '$lib/components/ui/button'; import { Input } from '$lib/components/ui/input'; - import { Plus, RefreshCw } from 'lucide-svelte'; + import { Pencil, Plus, Trash2 } from 'lucide-svelte'; import type { PageData } from './$types'; import { useShortcuts } from '$lib/hooks/use-shortcuts'; import { obtenerAtajosListaPuertos } from '$lib/config/shortcuts/dashboard/general_catalogs/ports/list'; - import { portsApi } from '$lib/api/dashboard/a76/general_catalogs/ports'; + import { portsApi, type Port } from '$lib/api/dashboard/a76/general_catalogs/ports'; import { companyStore } from '$lib/stores/company.svelte'; let { data }: { data: PageData } = $props(); let createDialogOpen = $state(false); + let editingItem = $state(null); let error = $state(data.items?.error || null); // Atajos useShortcuts( 'Lista Puertos', obtenerAtajosListaPuertos({ - manejarNuevo: () => (createDialogOpen = true), - manejarActualizar: () => goto($page.url, { invalidateAll: true }), + manejarNuevo: () => { + editingItem = null; + createDialogOpen = true; + }, + manejarActualizar: handleSuccess }) ); @@ -34,12 +38,18 @@ let searchDesc = $state($page.url.searchParams.get('description') || ''); let timeout: ReturnType; - let allItems = $state(data.items?.items || data.items || []); + let allItems = $state(data.items?.items || data.items || []); let currentPage = $state(data.items?.page || 1); let pageSize = $state(data.items?.pageSize || data.items?.page_size || 50); let totalItems = $state(data.items?.total || 0); let loading = $state(false); let hasMore = $derived(allItems.length < totalItems); + let selectedIds = $state<(string | number)[]>([]); + const selectedItem = $derived( + selectedIds.length === 1 + ? allItems.find((item) => String(item.id) === String(selectedIds[0])) ?? null + : null + ); $effect(() => { if (data.items?.items) { @@ -142,8 +152,50 @@ } function handleSuccess() { + createDialogOpen = false; + editingItem = null; + selectedIds = []; reloadData(); } + + function handleRowClick(row: Port) { + const id = row.id; + selectedIds = selectedIds.includes(id) ? [] : [id]; + } + + function handleRowDoubleClick(row: Port) { + editingItem = row; + createDialogOpen = true; + } + + function handleEditSelected() { + if (!selectedItem) return; + editingItem = selectedItem; + createDialogOpen = true; + } + + async function handleDeleteSelected() { + if (!selectedItem || !companyStore.activeCompany) return; + + if (!confirm(`¿Estás seguro de eliminar el puerto "${selectedItem.port_code}"?`)) { + return; + } + + loading = true; + error = null; + + try { + await portsApi.delete(selectedItem.id, companyStore.activeCompany.id); + + selectedIds = []; + await reloadData(); + } catch (err) { + error = 'Error al eliminar el puerto'; + console.error('Error deleting port:', err); + } finally { + loading = false; + } + }
@@ -153,11 +205,13 @@

Catálogo de puertos

- - @@ -186,10 +240,14 @@
(selectedIds = ids)} + onRowClick={handleRowClick} + onRowDoubleClick={handleRowDoubleClick} />
@@ -197,5 +255,41 @@
Mostrando {allItems.length} de {totalItems} registros
- +
+ + + +
diff --git a/frontend/src/routes/dashboard/general_catalogs/prevalidators/+page.svelte b/frontend/src/routes/dashboard/general_catalogs/prevalidators/+page.svelte index fd4ed81e..0285cee6 100644 --- a/frontend/src/routes/dashboard/general_catalogs/prevalidators/+page.svelte +++ b/frontend/src/routes/dashboard/general_catalogs/prevalidators/+page.svelte @@ -5,25 +5,33 @@ import * as Card from '$lib/components/ui/card'; import { Button } from '$lib/components/ui/button'; import { Input } from '$lib/components/ui/input'; - import { Plus, RefreshCw } from 'lucide-svelte'; + import { Pencil, Plus, Trash2 } from 'lucide-svelte'; import InfiniteDataTable from '$lib/components/dashboard/common/infinite-data-table.svelte'; import { createColumns } from '$lib/components/dashboard/general_catalogs/prevalidators/columns'; import CreateEditDialog from '$lib/components/dashboard/general_catalogs/prevalidators/create-edit-dialog.svelte'; import { useShortcuts } from '$lib/hooks/use-shortcuts'; import { obtenerAtajosListaPrevalidadores } from '$lib/config/shortcuts/dashboard/general_catalogs/prevalidators/list'; - import { getPrevalidators } from '$lib/api/dashboard/a76/general_catalogs/prevalidators'; + import { getPrevalidators, deletePrevalidator, type Prevalidator } from '$lib/api/dashboard/a76/general_catalogs/prevalidators'; import { companyStore } from '$lib/stores/company.svelte'; let { data } = $props(); let dialogOpen = $state(false); + let editingItem = $state(null); let error = $state(data.error || null); + let selectedIds = $state<(string | number)[]>([]); + const selectedItem = $derived( + selectedIds.length === 1 ? allItems.find((item) => item.id === selectedIds[0]) ?? null : null + ); // Atajos useShortcuts( 'Lista Prevalidadores', obtenerAtajosListaPrevalidadores({ - manejarNuevo: () => (dialogOpen = true), - manejarActualizar: () => goto($page.url, { invalidateAll: true }), + manejarNuevo: () => { + editingItem = null; + dialogOpen = true; + }, + manejarActualizar: handleSuccess }) ); @@ -135,8 +143,50 @@ } function handleSuccess() { + dialogOpen = false; + editingItem = null; + selectedIds = []; reloadData(); } + + function handleRowClick(row: Prevalidator) { + const id = row.id; + selectedIds = selectedIds.includes(id) ? [] : [id]; + } + + function handleRowDoubleClick(row: Prevalidator) { + editingItem = row; + dialogOpen = true; + } + + function handleEditSelected() { + if (!selectedItem) return; + editingItem = selectedItem; + dialogOpen = true; + } + + async function handleDeleteSelected() { + if (!selectedItem || !companyStore.activeCompany) return; + + if (!confirm(`¿Estás seguro de eliminar el prevalidador "${selectedItem.code}"?`)) { + return; + } + + loading = true; + error = null; + + try { + await deletePrevalidator(selectedItem.id, companyStore.activeCompany.id); + + selectedIds = []; + await reloadData(); + } catch (err) { + error = 'Error al eliminar el prevalidador'; + console.error('Error deleting prevalidator:', err); + } finally { + loading = false; + } + }
@@ -146,8 +196,16 @@

Catálogo de prevalidadores

- - +
@@ -167,10 +225,59 @@ -
+ +
+ (selectedIds = ids)} + onRowClick={handleRowClick} + onRowDoubleClick={handleRowDoubleClick} + /> +
+
Mostrando {allItems.length} de {totalItems} registros
- +
+ + + + diff --git a/frontend/src/routes/dashboard/general_catalogs/seal/+page.svelte b/frontend/src/routes/dashboard/general_catalogs/seal/+page.svelte index fac039f8..511f5efd 100644 --- a/frontend/src/routes/dashboard/general_catalogs/seal/+page.svelte +++ b/frontend/src/routes/dashboard/general_catalogs/seal/+page.svelte @@ -3,12 +3,11 @@ import * as Card from '$lib/components/ui/card'; import { Button } from '$lib/components/ui/button'; import { Input } from '$lib/components/ui/input'; - import { Plus, RefreshCw } from 'lucide-svelte'; - import DataTable from '$lib/components/dashboard/seal/data-table.svelte'; + import { Pencil, Plus, Trash2 } from 'lucide-svelte'; + import InfiniteDataTable from '$lib/components/dashboard/common/infinite-data-table.svelte'; import CreateEditDialog from '$lib/components/dashboard/seal/create-edit-dialog.svelte'; import { createColumns } from '$lib/components/dashboard/seal/columns'; - import type { Seal } from '$lib/api/dashboard/a76/general_catalogs/seal'; - import { getSeals } from '$lib/api/dashboard/a76/general_catalogs/seal'; + import { getSeals, deleteSeal, type Seal } from '$lib/api/dashboard/a76/general_catalogs/seal'; import { companyStore } from '$lib/stores/company.svelte'; import { useShortcuts } from '$lib/hooks/use-shortcuts'; import { obtenerAtajosListaSellos } from '$lib/config/shortcuts/dashboard/general_catalogs/seal/list'; @@ -21,13 +20,21 @@ let totalItems = $state(0); let dialogOpen = $state(false); + let editingItem = $state(null); + let selectedIds = $state<(string | number)[]>([]); + const selectedItem = $derived( + selectedIds.length === 1 ? allItems.find((item) => item.id === selectedIds[0]) ?? null : null + ); // Atajos useShortcuts( 'Lista Sellos', obtenerAtajosListaSellos({ - manejarNuevo: handleCreate, - manejarActualizar: loadInitialData + manejarNuevo: () => { + editingItem = null; + dialogOpen = true; + }, + manejarActualizar: handleSuccess }) ); @@ -125,19 +132,55 @@ loadInitialData(); } - function handleCreate() { + function handleSuccess() { + dialogOpen = false; + editingItem = null; + selectedIds = []; + loadInitialData(); + } + + function handleRowClick(row: Seal) { + const id = row.id; + selectedIds = selectedIds.includes(id) ? [] : [id]; + } + + function handleRowDoubleClick(row: Seal) { + editingItem = row; dialogOpen = true; } - function handleSuccess() { - loadInitialData(); + function handleEditSelected() { + if (!selectedItem) return; + editingItem = selectedItem; + dialogOpen = true; + } + + async function handleDeleteSelected() { + if (!selectedItem || !companyStore.activeCompany) return; + + if (!confirm(`¿Estás seguro de eliminar el sello "${selectedItem.seal}"?`)) { + return; + } + + loading = true; + error = null; + + try { + await deleteSeal(selectedItem.id, companyStore.activeCompany.id); + + selectedIds = []; + await loadInitialData(); + } catch (err) { + error = 'Error al eliminar el sello'; + console.error('Error deleting seal:', err); + } finally { + loading = false; + } } function reloadData() { loadInitialData(); } - - const columns = createColumns(handleSuccess);
@@ -147,11 +190,13 @@

Gestiona los sellos de tu empresa

- - @@ -181,7 +226,17 @@
- + (selectedIds = ids)} + onRowClick={handleRowClick} + onRowDoubleClick={handleRowDoubleClick} + />
@@ -190,5 +245,40 @@ Mostrando {allItems.length} de {totalItems || allItems.length} registros
- +
+ + + + diff --git a/frontend/src/routes/dashboard/general_catalogs/signatures/+page.svelte b/frontend/src/routes/dashboard/general_catalogs/signatures/+page.svelte index a0e46d78..360b15f2 100644 --- a/frontend/src/routes/dashboard/general_catalogs/signatures/+page.svelte +++ b/frontend/src/routes/dashboard/general_catalogs/signatures/+page.svelte @@ -5,25 +5,33 @@ import { Button } from '$lib/components/ui/button'; import { Input } from '$lib/components/ui/input'; import * as Card from '$lib/components/ui/card'; - import { Plus, RefreshCw } from 'lucide-svelte'; + import { Pencil, Plus, Trash2 } from 'lucide-svelte'; import InfiniteDataTable from '$lib/components/dashboard/common/infinite-data-table.svelte'; import { createColumns } from '$lib/components/dashboard/general_catalogs/signatures/columns'; import CreateEditDialog from '$lib/components/dashboard/general_catalogs/signatures/create-edit-dialog.svelte'; import { useShortcuts } from '$lib/hooks/use-shortcuts'; import { obtenerAtajosListaFirmas } from '$lib/config/shortcuts/dashboard/general_catalogs/signatures/list'; - import { getSignatures } from '$lib/api/dashboard/a76/general_catalogs/signatures'; + import { getSignatures, deleteSignature, type Signature } from '$lib/api/dashboard/a76/general_catalogs/signatures'; import { companyStore } from '$lib/stores/company.svelte'; let { data } = $props(); let dialogOpen = $state(false); + let editingItem = $state(null); let error = $state(data.error || null); + let selectedIds = $state<(string | number)[]>([]); + const selectedItem = $derived( + selectedIds.length === 1 ? allItems.find((item) => item.id === selectedIds[0]) ?? null : null + ); // Atajos useShortcuts( 'Lista Firmas', obtenerAtajosListaFirmas({ - manejarNuevo: () => (dialogOpen = true), - manejarActualizar: () => goto($page.url, { invalidateAll: true }), + manejarNuevo: () => { + editingItem = null; + dialogOpen = true; + }, + manejarActualizar: handleSuccess }) ); @@ -137,8 +145,50 @@ } function handleSuccess() { + dialogOpen = false; + editingItem = null; + selectedIds = []; reloadData(); } + + function handleRowClick(row: Signature) { + const id = row.id; + selectedIds = selectedIds.includes(id) ? [] : [id]; + } + + function handleRowDoubleClick(row: Signature) { + editingItem = row; + dialogOpen = true; + } + + function handleEditSelected() { + if (!selectedItem) return; + editingItem = selectedItem; + dialogOpen = true; + } + + async function handleDeleteSelected() { + if (!selectedItem || !companyStore.activeCompany) return; + + if (!confirm(`¿Estás seguro de eliminar la firma "${selectedItem.code}"?`)) { + return; + } + + loading = true; + error = null; + + try { + await deleteSignature(selectedItem.id, companyStore.activeCompany.id); + + selectedIds = []; + await reloadData(); + } catch (err) { + error = 'Error al eliminar la firma'; + console.error('Error deleting signature:', err); + } finally { + loading = false; + } + }
@@ -147,7 +197,18 @@

Firmas Electrónicas

Gestión del catálogo de firmas electrónicas

-
+
+ +
{#if error} @@ -158,10 +219,59 @@
Listado de Firmas
-
+ +
+ (selectedIds = ids)} + onRowClick={handleRowClick} + onRowDoubleClick={handleRowDoubleClick} + /> +
+
Mostrando {allItems.length} de {totalItems} registros
- +
+ + + + diff --git a/frontend/src/routes/dashboard/general_catalogs/unit_conversions/+page.svelte b/frontend/src/routes/dashboard/general_catalogs/unit_conversions/+page.svelte index ea00c786..759bac5a 100644 --- a/frontend/src/routes/dashboard/general_catalogs/unit_conversions/+page.svelte +++ b/frontend/src/routes/dashboard/general_catalogs/unit_conversions/+page.svelte @@ -8,23 +8,27 @@ import * as Card from '$lib/components/ui/card'; import { Button } from '$lib/components/ui/button'; import { Input } from '$lib/components/ui/input'; - import { Plus, RefreshCw } from 'lucide-svelte'; + import { Pencil, Plus, Trash2 } from 'lucide-svelte'; import type { PageData } from './$types'; import { useShortcuts } from '$lib/hooks/use-shortcuts'; import { obtenerAtajosListaConversiones } from '$lib/config/shortcuts/dashboard/general_catalogs/unit_conversions/list'; - import { getUnitConversions } from '$lib/api/dashboard/a76/general_catalogs/unit-conversions'; + import { getUnitConversions, deleteUnitConversion, type UnitConversion } from '$lib/api/dashboard/a76/general_catalogs/unit-conversions'; import { companyStore } from '$lib/stores/company.svelte'; let { data }: { data: PageData } = $props(); let createDialogOpen = $state(false); + let editingItem = $state(null); let error = $state(data.error || null); // Atajos useShortcuts( 'Lista Conversiones', obtenerAtajosListaConversiones({ - manejarNuevo: () => (createDialogOpen = true), + manejarNuevo: () => { + editingItem = null; + createDialogOpen = true; + }, manejarRefrescar: handleSuccess }) ); @@ -34,12 +38,18 @@ let searchTo = $state($page.url.searchParams.get('to_unit_code') || ''); let timeout: ReturnType; - let allItems = $state(data.conversions?.items || []); + let allItems = $state(data.conversions?.items || []); let currentPage = $state(data.conversions?.page || 1); let pageSize = $state(data.conversions?.page_size || 50); let totalItems = $state(data.conversions?.total || 0); let loading = $state(false); let hasMore = $derived(allItems.length < totalItems); + let selectedIds = $state<(string | number)[]>([]); + const selectedItem = $derived( + selectedIds.length === 1 + ? allItems.find((item) => String(item.id) === String(selectedIds[0])) ?? null + : null + ); $effect(() => { if (data.conversions) { @@ -148,8 +158,50 @@ } function handleSuccess() { + createDialogOpen = false; + editingItem = null; + selectedIds = []; reloadData(); } + + function handleRowClick(row: UnitConversion) { + const id = row.id; + selectedIds = selectedIds.includes(id) ? [] : [id]; + } + + function handleRowDoubleClick(row: UnitConversion) { + editingItem = row; + createDialogOpen = true; + } + + function handleEditSelected() { + if (!selectedItem) return; + editingItem = selectedItem; + createDialogOpen = true; + } + + async function handleDeleteSelected() { + if (!selectedItem || !companyStore.activeCompany) return; + + if (!confirm(`¿Estás seguro de eliminar esta conversión?`)) { + return; + } + + loading = true; + error = null; + + try { + await deleteUnitConversion(selectedItem.id, companyStore.activeCompany.id); + + selectedIds = []; + await reloadData(); + } catch (err) { + error = 'Error al eliminar la conversión'; + console.error('Error deleting unit conversion:', err); + } finally { + loading = false; + } + }
@@ -158,7 +210,18 @@

Conversiones de Unidades

Catálogo de conversiones de unidades de medida

-
+
+ +
{#if error} @@ -169,10 +232,60 @@
Listado de Conversiones
-
+ +
+ (selectedIds = ids)} + onRowClick={handleRowClick} + onRowDoubleClick={handleRowDoubleClick} + /> +
+
Mostrando {allItems.length} de {totalItems} registros
- +
+ + + + diff --git a/frontend/src/routes/dashboard/general_catalogs/units_of_measure/ace/+page.svelte b/frontend/src/routes/dashboard/general_catalogs/units_of_measure/ace/+page.svelte index a4bc68fb..9d4f6b94 100644 --- a/frontend/src/routes/dashboard/general_catalogs/units_of_measure/ace/+page.svelte +++ b/frontend/src/routes/dashboard/general_catalogs/units_of_measure/ace/+page.svelte @@ -8,24 +8,28 @@ import * as Card from '$lib/components/ui/card'; import { Button } from '$lib/components/ui/button'; import { Input } from '$lib/components/ui/input'; - import { Plus, RefreshCw } from 'lucide-svelte'; - import type { PageData } from './$types'; + import { Pencil, Plus, Trash2 } from 'lucide-svelte'; import { useShortcuts } from '$lib/hooks/use-shortcuts'; import { obtenerAtajosListaUnidadesACE } from '$lib/config/shortcuts/dashboard/general_catalogs/units_of_measure/ace/list'; - import { getUnitsOfMeasureACE } from '$lib/api/dashboard/a76/general_catalogs/units-of-measure'; + import { getUnitsOfMeasureACE, deleteUnitOfMeasureACE, type UnitOfMeasureACE } from '$lib/api/dashboard/a76/general_catalogs/units-of-measure'; import { companyStore } from '$lib/stores/company.svelte'; + import type { PageData } from './$types'; let { data }: { data: PageData } = $props(); let createDialogOpen = $state(false); + let editingItem = $state(null); let error = $state(data.error || null); // Atajos useShortcuts( 'Lista Unidades ACE', obtenerAtajosListaUnidadesACE({ - manejarNuevo: () => (createDialogOpen = true), - manejarActualizar: () => goto($page.url, { invalidateAll: true }), + manejarNuevo: () => { + editingItem = null; + createDialogOpen = true; + }, + manejarActualizar: handleSuccess }) ); @@ -34,12 +38,18 @@ let searchDesc = $state($page.url.searchParams.get('description') || ''); let timeout: ReturnType; - let allItems = $state(data.ace_units?.items || []); + let allItems = $state(data.ace_units?.items || []); let currentPage = $state(data.ace_units?.page || 1); let pageSize = $state(data.ace_units?.page_size || 50); let totalItems = $state(data.ace_units?.total || 0); let loading = $state(false); let hasMore = $derived(allItems.length < totalItems); + let selectedIds = $state<(string | number)[]>([]); + const selectedItem = $derived( + selectedIds.length === 1 + ? allItems.find((item) => String(item.id) === String(selectedIds[0])) ?? null + : null + ); $effect(() => { if (data.ace_units) { @@ -68,6 +78,9 @@ companyStore.activeCompany.id, filters ); + if (response.error) { + throw new Error(response.error); + } if (response.data) { allItems = response.data.items; currentPage = 1; @@ -106,6 +119,9 @@ companyStore.activeCompany.id, filters ); + if (response.error) { + throw new Error(response.error); + } if (response.data?.items) { allItems = [...allItems, ...response.data.items]; currentPage += 1; @@ -134,6 +150,9 @@ companyStore.activeCompany.id, filters ); + if (response.error) { + throw new Error(response.error); + } if (response.data) { allItems = response.data.items; currentPage = 1; @@ -148,8 +167,53 @@ } function handleSuccess() { + createDialogOpen = false; + editingItem = null; + selectedIds = []; reloadData(); } + + function handleRowClick(row: UnitOfMeasureACE) { + const id = row.id; + selectedIds = selectedIds.includes(id) ? [] : [id]; + } + + function handleRowDoubleClick(row: UnitOfMeasureACE) { + editingItem = row; + createDialogOpen = true; + } + + function handleEditSelected() { + if (!selectedItem) return; + editingItem = selectedItem; + createDialogOpen = true; + } + + async function handleDeleteSelected() { + if (!selectedItem || !companyStore.activeCompany) return; + + if (!confirm(`¿Estás seguro de eliminar la unidad "${selectedItem.code}"?`)) { + return; + } + + loading = true; + error = null; + + try { + const response = await deleteUnitOfMeasureACE(selectedItem.id, companyStore.activeCompany.id); + if (response.error) { + throw new Error(response.error); + } + + selectedIds = []; + await reloadData(); + } catch (err) { + error = 'Error al eliminar la unidad'; + console.error('Error deleting ACE unit:', err); + } finally { + loading = false; + } + }
@@ -158,7 +222,18 @@

Unidades de Medida ACE

Catálogo de unidades de medida ACE

-
+
+ +
{#if error} @@ -169,10 +244,59 @@
Listado de Unidades ACE
-
+ +
+ (selectedIds = ids)} + onRowClick={handleRowClick} + onRowDoubleClick={handleRowDoubleClick} + /> +
+
Mostrando {allItems.length} de {totalItems} registros
- +
+ + + + diff --git a/frontend/src/routes/dashboard/general_catalogs/units_of_measure/american/+page.svelte b/frontend/src/routes/dashboard/general_catalogs/units_of_measure/american/+page.svelte index 38bfedf3..178051c4 100644 --- a/frontend/src/routes/dashboard/general_catalogs/units_of_measure/american/+page.svelte +++ b/frontend/src/routes/dashboard/general_catalogs/units_of_measure/american/+page.svelte @@ -8,24 +8,28 @@ import * as Card from '$lib/components/ui/card'; import { Button } from '$lib/components/ui/button'; import { Input } from '$lib/components/ui/input'; - import { Plus, RefreshCw } from 'lucide-svelte'; - import type { PageData } from './$types'; + import { Pencil, Plus, Trash2 } from 'lucide-svelte'; import { useShortcuts } from '$lib/hooks/use-shortcuts'; import { obtenerAtajosListaUnidadesAmericanas } from '$lib/config/shortcuts/dashboard/general_catalogs/units_of_measure/american/list'; - import { getUnitsOfMeasureAmerican } from '$lib/api/dashboard/a76/general_catalogs/units-of-measure'; + import { getUnitsOfMeasureAmerican, deleteUnitOfMeasureAmerican, type UnitOfMeasureAmerican } from '$lib/api/dashboard/a76/general_catalogs/units-of-measure'; import { companyStore } from '$lib/stores/company.svelte'; + import type { PageData } from './$types'; let { data }: { data: PageData } = $props(); let createDialogOpen = $state(false); + let editingItem = $state(null); let error = $state(data.error || null); // Atajos useShortcuts( 'Lista Unidades Americanas', obtenerAtajosListaUnidadesAmericanas({ - manejarNuevo: () => (createDialogOpen = true), - manejarActualizar: () => goto($page.url, { invalidateAll: true }), + manejarNuevo: () => { + editingItem = null; + createDialogOpen = true; + }, + manejarActualizar: handleSuccess }) ); @@ -34,12 +38,18 @@ let searchDesc = $state($page.url.searchParams.get('description') || ''); let timeout: ReturnType; - let allItems = $state(data.american_units?.items || []); + let allItems = $state(data.american_units?.items || []); let currentPage = $state(data.american_units?.page || 1); let pageSize = $state(data.american_units?.page_size || 50); let totalItems = $state(data.american_units?.total || 0); let loading = $state(false); let hasMore = $derived(allItems.length < totalItems); + let selectedIds = $state<(string | number)[]>([]); + const selectedItem = $derived( + selectedIds.length === 1 + ? allItems.find((item) => String(item.id) === String(selectedIds[0])) ?? null + : null + ); $effect(() => { if (data.american_units) { @@ -68,6 +78,9 @@ companyStore.activeCompany.id, filters ); + if (response.error) { + throw new Error(response.error); + } if (response.data) { allItems = response.data.items; currentPage = 1; @@ -106,6 +119,9 @@ companyStore.activeCompany.id, filters ); + if (response.error) { + throw new Error(response.error); + } if (response.data?.items) { allItems = [...allItems, ...response.data.items]; currentPage += 1; @@ -134,6 +150,9 @@ companyStore.activeCompany.id, filters ); + if (response.error) { + throw new Error(response.error); + } if (response.data) { allItems = response.data.items; currentPage = 1; @@ -148,8 +167,53 @@ } function handleSuccess() { + createDialogOpen = false; + editingItem = null; + selectedIds = []; reloadData(); } + + function handleRowClick(row: UnitOfMeasureAmerican) { + const id = row.id; + selectedIds = selectedIds.includes(id) ? [] : [id]; + } + + function handleRowDoubleClick(row: UnitOfMeasureAmerican) { + editingItem = row; + createDialogOpen = true; + } + + function handleEditSelected() { + if (!selectedItem) return; + editingItem = selectedItem; + createDialogOpen = true; + } + + async function handleDeleteSelected() { + if (!selectedItem || !companyStore.activeCompany) return; + + if (!confirm(`¿Estás seguro de eliminar la unidad "${selectedItem.code}"?`)) { + return; + } + + loading = true; + error = null; + + try { + const response = await deleteUnitOfMeasureAmerican(selectedItem.id, companyStore.activeCompany.id); + if (response.error) { + throw new Error(response.error); + } + + selectedIds = []; + await reloadData(); + } catch (err) { + error = 'Error al eliminar la unidad'; + console.error('Error deleting American unit:', err); + } finally { + loading = false; + } + }
@@ -158,7 +222,18 @@

Unidades de Medida Americanas

Catálogo de unidades de medida Americanas

-
+
+ +
{#if error} @@ -169,10 +244,59 @@
Listado de Unidades Americanas
-
+ +
+ (selectedIds = ids)} + onRowClick={handleRowClick} + onRowDoubleClick={handleRowDoubleClick} + /> +
+
Mostrando {allItems.length} de {totalItems} registros
- +
+ + + + diff --git a/frontend/src/routes/dashboard/general_catalogs/units_of_measure/customs/+page.svelte b/frontend/src/routes/dashboard/general_catalogs/units_of_measure/customs/+page.svelte index e8e8fe79..db0a656b 100644 --- a/frontend/src/routes/dashboard/general_catalogs/units_of_measure/customs/+page.svelte +++ b/frontend/src/routes/dashboard/general_catalogs/units_of_measure/customs/+page.svelte @@ -8,24 +8,28 @@ import * as Card from '$lib/components/ui/card'; import { Button } from '$lib/components/ui/button'; import { Input } from '$lib/components/ui/input'; - import { Plus, RefreshCw } from 'lucide-svelte'; - import type { PageData } from './$types'; + import { Pencil, Plus, Trash2 } from 'lucide-svelte'; import { useShortcuts } from '$lib/hooks/use-shortcuts'; import { obtenerAtajosListaUnidadesAduanas } from '$lib/config/shortcuts/dashboard/general_catalogs/units_of_measure/customs/list'; - import { getUnitsOfMeasureCustoms } from '$lib/api/dashboard/a76/general_catalogs/units-of-measure'; + import { getUnitsOfMeasureCustoms, deleteUnitOfMeasureCustoms, type UnitOfMeasureCustoms } from '$lib/api/dashboard/a76/general_catalogs/units-of-measure'; import { companyStore } from '$lib/stores/company.svelte'; + import type { PageData } from './$types'; let { data }: { data: PageData } = $props(); let createDialogOpen = $state(false); + let editingItem = $state(null); let error = $state(data.error || null); // Atajos useShortcuts( 'Lista Unidades Aduanas', obtenerAtajosListaUnidadesAduanas({ - manejarNuevo: () => (createDialogOpen = true), - manejarActualizar: () => goto($page.url, { invalidateAll: true }), + manejarNuevo: () => { + editingItem = null; + createDialogOpen = true; + }, + manejarActualizar: handleSuccess }) ); @@ -34,12 +38,18 @@ let searchDesc = $state($page.url.searchParams.get('description') || ''); let timeout: ReturnType; - let allItems = $state(data.customs_units?.items || []); + let allItems = $state(data.customs_units?.items || []); let currentPage = $state(data.customs_units?.page || 1); let pageSize = $state(data.customs_units?.page_size || 50); let totalItems = $state(data.customs_units?.total || 0); let loading = $state(false); let hasMore = $derived(allItems.length < totalItems); + let selectedIds = $state<(string | number)[]>([]); + const selectedItem = $derived( + selectedIds.length === 1 + ? allItems.find((item) => String(item.id) === String(selectedIds[0])) ?? null + : null + ); $effect(() => { if (data.customs_units) { @@ -68,6 +78,9 @@ companyStore.activeCompany.id, filters ); + if (response.error) { + throw new Error(response.error); + } if (response.data) { allItems = response.data.items; currentPage = 1; @@ -106,6 +119,9 @@ companyStore.activeCompany.id, filters ); + if (response.error) { + throw new Error(response.error); + } if (response.data?.items) { allItems = [...allItems, ...response.data.items]; currentPage += 1; @@ -134,6 +150,9 @@ companyStore.activeCompany.id, filters ); + if (response.error) { + throw new Error(response.error); + } if (response.data) { allItems = response.data.items; currentPage = 1; @@ -148,8 +167,53 @@ } function handleSuccess() { + createDialogOpen = false; + editingItem = null; + selectedIds = []; reloadData(); } + + function handleRowClick(row: UnitOfMeasureCustoms) { + const id = row.id; + selectedIds = selectedIds.includes(id) ? [] : [id]; + } + + function handleRowDoubleClick(row: UnitOfMeasureCustoms) { + editingItem = row; + createDialogOpen = true; + } + + function handleEditSelected() { + if (!selectedItem) return; + editingItem = selectedItem; + createDialogOpen = true; + } + + async function handleDeleteSelected() { + if (!selectedItem || !companyStore.activeCompany) return; + + if (!confirm(`¿Estás seguro de eliminar la unidad "${selectedItem.code}"?`)) { + return; + } + + loading = true; + error = null; + + try { + const response = await deleteUnitOfMeasureCustoms(selectedItem.id, companyStore.activeCompany.id); + if (response.error) { + throw new Error(response.error); + } + + selectedIds = []; + await reloadData(); + } catch (err) { + error = 'Error al eliminar la unidad'; + console.error('Error deleting customs unit:', err); + } finally { + loading = false; + } + }
@@ -158,7 +222,18 @@

Unidades de Medida Aduanas MEX

Catálogo de unidades de medida para aduanas mexicanas

-
+
+ +
{#if error} @@ -169,10 +244,59 @@
Listado de Unidades Aduanas MX
-
+ +
+ (selectedIds = ids)} + onRowClick={handleRowClick} + onRowDoubleClick={handleRowDoubleClick} + /> +
+
Mostrando {allItems.length} de {totalItems} registros
- +
+ + + + diff --git a/frontend/src/routes/dashboard/general_catalogs/units_of_measure/general/+page.svelte b/frontend/src/routes/dashboard/general_catalogs/units_of_measure/general/+page.svelte index 00f06498..664507d3 100644 --- a/frontend/src/routes/dashboard/general_catalogs/units_of_measure/general/+page.svelte +++ b/frontend/src/routes/dashboard/general_catalogs/units_of_measure/general/+page.svelte @@ -8,24 +8,28 @@ import * as Card from '$lib/components/ui/card'; import { Button } from '$lib/components/ui/button'; import { Input } from '$lib/components/ui/input'; - import { Plus, RefreshCw } from 'lucide-svelte'; - import type { PageData } from './$types'; + import { Pencil, Plus, Trash2 } from 'lucide-svelte'; import { useShortcuts } from '$lib/hooks/use-shortcuts'; import { obtenerAtajosListaUnidadesGeneral } from '$lib/config/shortcuts/dashboard/general_catalogs/units_of_measure/general/list'; - import { getUnitsOfMeasureGeneral } from '$lib/api/dashboard/a76/general_catalogs/units-of-measure'; + import { getUnitsOfMeasureGeneral, deleteUnitOfMeasureGeneral, type UnitOfMeasureGeneral } from '$lib/api/dashboard/a76/general_catalogs/units-of-measure'; import { companyStore } from '$lib/stores/company.svelte'; + import type { PageData } from './$types'; let { data }: { data: PageData } = $props(); let createDialogOpen = $state(false); + let editingItem = $state(null); let error = $state(data.error || null); // Atajos useShortcuts( 'Lista Unidades de Medida', obtenerAtajosListaUnidadesGeneral({ - manejarNuevo: () => (createDialogOpen = true), - manejarActualizar: () => goto($page.url, { invalidateAll: true }), + manejarNuevo: () => { + editingItem = null; + createDialogOpen = true; + }, + manejarActualizar: handleSuccess }) ); @@ -34,12 +38,18 @@ let searchDesc = $state($page.url.searchParams.get('description') || ''); let timeout: ReturnType; - let allItems = $state(data.general_units?.items || []); + let allItems = $state(data.general_units?.items || []); let currentPage = $state(data.general_units?.page || 1); let pageSize = $state(data.general_units?.page_size || 50); let totalItems = $state(data.general_units?.total || 0); let loading = $state(false); let hasMore = $derived(allItems.length < totalItems); + let selectedIds = $state<(string | number)[]>([]); + const selectedItem = $derived( + selectedIds.length === 1 + ? allItems.find((item) => String(item.id) === String(selectedIds[0])) ?? null + : null + ); $effect(() => { if (data.general_units) { @@ -68,6 +78,9 @@ companyStore.activeCompany.id, filters ); + if (response.error) { + throw new Error(response.error); + } if (response.data) { allItems = response.data.items; currentPage = 1; @@ -106,6 +119,9 @@ companyStore.activeCompany.id, filters ); + if (response.error) { + throw new Error(response.error); + } if (response.data?.items) { allItems = [...allItems, ...response.data.items]; currentPage += 1; @@ -134,6 +150,9 @@ companyStore.activeCompany.id, filters ); + if (response.error) { + throw new Error(response.error); + } if (response.data) { allItems = response.data.items; currentPage = 1; @@ -148,8 +167,53 @@ } function handleSuccess() { + createDialogOpen = false; + editingItem = null; + selectedIds = []; reloadData(); } + + function handleRowClick(row: UnitOfMeasureGeneral) { + const id = row.id; + selectedIds = selectedIds.includes(id) ? [] : [id]; + } + + function handleRowDoubleClick(row: UnitOfMeasureGeneral) { + editingItem = row; + createDialogOpen = true; + } + + function handleEditSelected() { + if (!selectedItem) return; + editingItem = selectedItem; + createDialogOpen = true; + } + + async function handleDeleteSelected() { + if (!selectedItem || !companyStore.activeCompany) return; + + if (!confirm(`¿Estás seguro de eliminar la unidad "${selectedItem.code}"?`)) { + return; + } + + loading = true; + error = null; + + try { + const response = await deleteUnitOfMeasureGeneral(selectedItem.id, companyStore.activeCompany.id); + if (response.error) { + throw new Error(response.error); + } + + selectedIds = []; + await reloadData(); + } catch (err) { + error = 'Error al eliminar la unidad'; + console.error('Error deleting general unit:', err); + } finally { + loading = false; + } + }
@@ -158,7 +222,18 @@

Unidades de Medida

Catálogo general de unidades de medida

-
+
+ +
{#if error} @@ -169,10 +244,59 @@
Listado de Unidades
-
+ +
+ (selectedIds = ids)} + onRowClick={handleRowClick} + onRowDoubleClick={handleRowDoubleClick} + /> +
+
Mostrando {allItems.length} de {totalItems} registros
- +
+ + + + diff --git a/frontend/src/routes/dashboard/general_catalogs/units_of_measure/oma/+page.svelte b/frontend/src/routes/dashboard/general_catalogs/units_of_measure/oma/+page.svelte index da28b5ba..99137e00 100644 --- a/frontend/src/routes/dashboard/general_catalogs/units_of_measure/oma/+page.svelte +++ b/frontend/src/routes/dashboard/general_catalogs/units_of_measure/oma/+page.svelte @@ -8,24 +8,28 @@ import * as Card from '$lib/components/ui/card'; import { Button } from '$lib/components/ui/button'; import { Input } from '$lib/components/ui/input'; - import { Plus, RefreshCw } from 'lucide-svelte'; - import type { PageData } from './$types'; + import { Pencil, Plus, Trash2 } from 'lucide-svelte'; import { useShortcuts } from '$lib/hooks/use-shortcuts'; import { obtenerAtajosListaUnidadesOMA } from '$lib/config/shortcuts/dashboard/general_catalogs/units_of_measure/oma/list'; - import { getUnitsOfMeasureOMA } from '$lib/api/dashboard/a76/general_catalogs/units-of-measure'; + import { getUnitsOfMeasureOMA, deleteUnitOfMeasureOMA, type UnitOfMeasureOMA } from '$lib/api/dashboard/a76/general_catalogs/units-of-measure'; import { companyStore } from '$lib/stores/company.svelte'; + import type { PageData } from './$types'; let { data }: { data: PageData } = $props(); let createDialogOpen = $state(false); + let editingItem = $state(null); let error = $state(data.error || null); // Atajos useShortcuts( 'Lista Unidades OMA', obtenerAtajosListaUnidadesOMA({ - manejarNuevo: () => (createDialogOpen = true), - manejarActualizar: () => goto($page.url, { invalidateAll: true }), + manejarNuevo: () => { + editingItem = null; + createDialogOpen = true; + }, + manejarActualizar: handleSuccess }) ); @@ -34,12 +38,18 @@ let searchDesc = $state($page.url.searchParams.get('description') || ''); let timeout: ReturnType; - let allItems = $state(data.oma_units?.items || []); + let allItems = $state(data.oma_units?.items || []); let currentPage = $state(data.oma_units?.page || 1); let pageSize = $state(data.oma_units?.page_size || 50); let totalItems = $state(data.oma_units?.total || 0); let loading = $state(false); let hasMore = $derived(allItems.length < totalItems); + let selectedIds = $state<(string | number)[]>([]); + const selectedItem = $derived( + selectedIds.length === 1 + ? allItems.find((item) => String(item.id) === String(selectedIds[0])) ?? null + : null + ); $effect(() => { if (data.oma_units) { @@ -68,6 +78,9 @@ companyStore.activeCompany.id, filters ); + if (response.error) { + throw new Error(response.error); + } if (response.data) { allItems = response.data.items; currentPage = 1; @@ -106,6 +119,9 @@ companyStore.activeCompany.id, filters ); + if (response.error) { + throw new Error(response.error); + } if (response.data?.items) { allItems = [...allItems, ...response.data.items]; currentPage += 1; @@ -134,6 +150,9 @@ companyStore.activeCompany.id, filters ); + if (response.error) { + throw new Error(response.error); + } if (response.data) { allItems = response.data.items; currentPage = 1; @@ -148,8 +167,53 @@ } function handleSuccess() { + createDialogOpen = false; + editingItem = null; + selectedIds = []; reloadData(); } + + function handleRowClick(row: UnitOfMeasureOMA) { + const id = row.id; + selectedIds = selectedIds.includes(id) ? [] : [id]; + } + + function handleRowDoubleClick(row: UnitOfMeasureOMA) { + editingItem = row; + createDialogOpen = true; + } + + function handleEditSelected() { + if (!selectedItem) return; + editingItem = selectedItem; + createDialogOpen = true; + } + + async function handleDeleteSelected() { + if (!selectedItem || !companyStore.activeCompany) return; + + if (!confirm(`¿Estás seguro de eliminar la unidad "${selectedItem.code}"?`)) { + return; + } + + loading = true; + error = null; + + try { + const response = await deleteUnitOfMeasureOMA(selectedItem.id, companyStore.activeCompany.id); + if (response.error) { + throw new Error(response.error); + } + + selectedIds = []; + await reloadData(); + } catch (err) { + error = 'Error al eliminar la unidad'; + console.error('Error deleting OMA unit:', err); + } finally { + loading = false; + } + }
@@ -158,7 +222,18 @@

Unidades de Medida OMA

Catálogo de unidades de medida OMA

-
+
+ +
{#if error} @@ -169,10 +244,59 @@
Listado de Unidades OMA
-
+ +
+ (selectedIds = ids)} + onRowClick={handleRowClick} + onRowDoubleClick={handleRowDoubleClick} + /> +
+
Mostrando {allItems.length} de {totalItems} registros
- +
+ + + +