Merge pull request 'se agrego la edicion y eliminacion de los registros de selectores' (#386) from fix/sectores into development

Reviewed-on: ADUANASOFT/anexo76#386
This commit is contained in:
2026-05-12 14:05:34 +00:00
5 changed files with 44 additions and 14 deletions

View File

@@ -45,7 +45,7 @@ export const sectorsApi = {
},
get: (id: number, companyId: number) =>
api.get<Sector>(`/v1/a76/sectors/${id}/?company_id=${companyId}`),
api.get<Sector>(`/v1/a76/sectors/${id}?company_id=${companyId}`),
getByKey: (key: string, companyId: number) => {
const params = new URLSearchParams({
@@ -64,5 +64,5 @@ export const sectorsApi = {
api.put<Sector>(`/v1/a76/sectors/${id}/?company_id=${companyId}`, data),
delete: (id: number, companyId: number) =>
api.delete(`/v1/a76/sectors/${id}/?company_id=${companyId}`)
api.delete(`/v1/a76/sectors/${id}?company_id=${companyId}`)
};

View File

@@ -14,7 +14,8 @@ export type Sector = {
export function createColumns(
onSuccess?: () => void,
permissions: { canEdit: boolean; canDelete: boolean } = { canEdit: true, canDelete: true }
permissions: { canEdit: boolean; canDelete: boolean } = { canEdit: true, canDelete: true },
callbacks: { onEdit?: (item: Sector) => void; onDelete?: (item: Sector) => void } = {}
): ColumnDef<Sector>[] {
return [
{
@@ -67,7 +68,9 @@ export function createColumns(
item: row.original,
onSuccess,
canEdit: permissions.canEdit,
canDelete: permissions.canDelete
canDelete: permissions.canDelete,
onEdit: callbacks.onEdit,
onDelete: callbacks.onDelete
});
}
}

View File

@@ -13,12 +13,16 @@
item,
onSuccess,
canEdit = true,
canDelete = true
canDelete = true,
onEdit,
onDelete
}: {
item: Sector;
onSuccess?: () => void;
canEdit?: boolean;
canDelete?: boolean;
onEdit?: (item: Sector) => void;
onDelete?: (item: Sector) => void;
} = $props();
let showDetailsDialog = $state(false);
@@ -54,13 +58,13 @@
<DropdownMenu.Separator />
<DropdownMenu.Group>
{#if canEdit}
<DropdownMenu.Item onclick={() => (alert('Módulo de edición no disponible para Catálogos Públicos'))}>
<DropdownMenu.Item onclick={() => onEdit?.(item)}>
<Pencil class="mr-2 size-4" />
Editar
</DropdownMenu.Item>
{/if}
{#if canDelete}
<DropdownMenu.Item onclick={() => (alert('Módulo de eliminación no disponible para Catálogos Públicos'))} class="text-destructive">
<DropdownMenu.Item onclick={() => onDelete?.(item)} class="text-destructive">
<Trash2 class="mr-2 size-4" />
Eliminar
</DropdownMenu.Item>

View File

@@ -1,13 +1,20 @@
/**
* Datos de referencia — permisos `ref_sectors.*` (seed_v2.py `permissions_reference`).
* Solo lectura en seed actual; `action` reservado por si se amplía el CRUD.
* Sectores (referencia)
* Nota: Para mutaciones (create/edit/delete) se usan los permisos de cat_sectors
* ya que es el único catálogo "fijo" que permite edición por el usuario.
*/
import type { User } from '$lib/auth';
import { userHasPermission } from '$lib/auth';
export type SectorsRefAction = 'view';
export type SectorsRefAction = 'view' | 'create' | 'edit' | 'delete';
export function userHasSectorsRefAction(user: User | null, action: SectorsRefAction): boolean {
return userHasPermission(user, `ref_sectors.${action}`);
if (action === 'view') {
return userHasPermission(user, `ref_sectors.${action}`);
}
// Mapeo a cat_sectors para acciones de escritura
const catalogAction = action === 'edit' ? 'edit' : action;
return userHasPermission(user, `cat_sectors.${catalogAction}`);
}

View File

@@ -15,6 +15,7 @@
import ErrorState from '$lib/components/dashboard/common/error-state.svelte';
import { createColumns } from '$lib/components/dashboard/reference_data/sectors/columns';
import CreateEditDialog from '$lib/components/dashboard/reference_data/sectors/create-edit-dialog.svelte';
import DeleteDialog from '$lib/components/dashboard/reference_data/sectors/delete-dialog.svelte';
import InfiniteDataTable from '$lib/components/dashboard/common/infinite-data-table.svelte';
// Los datos iniciales vienen del servidor
@@ -31,7 +32,9 @@
// Diálogos
let createDialogOpen = $state(false);
let deleteDialogOpen = $state(false);
let editingItem = $state<Sector | null>(null);
let itemToDelete = $state<Sector | null>(null);
// Filtros
let searchQuery = $state($page.url.searchParams.get('search') || '');
@@ -39,9 +42,9 @@
// Permisos
const canView = $derived(userHasSectorsRefAction($currentUser, 'view'));
const canCreate = $derived(false);
const canEdit = $derived(false);
const canDelete = $derived(false);
const canCreate = $derived(userHasSectorsRefAction($currentUser, 'create'));
const canEdit = $derived(userHasSectorsRefAction($currentUser, 'edit'));
const canDelete = $derived(userHasSectorsRefAction($currentUser, 'delete'));
const isError = $derived(!canView || status >= 400 || error);
@@ -111,10 +114,22 @@
function handleSuccess() {
createDialogOpen = false;
deleteDialogOpen = false;
editingItem = null;
itemToDelete = null;
reloadData();
}
function handleEdit(item: Sector) {
editingItem = item;
createDialogOpen = true;
}
function handleDelete(item: Sector) {
itemToDelete = item;
deleteDialogOpen = true;
}
useShortcuts('Sectores', [
{ key: 'Alt+Shift+R', description: 'Actualizar Lista', action: reloadData },
{
@@ -127,7 +142,7 @@
}
]);
const columns = $derived(createColumns(handleSuccess, { canEdit, canDelete }));
const columns = $derived(createColumns(handleSuccess, { canEdit, canDelete }, { onEdit: handleEdit, onDelete: handleDelete }));
</script>
<div class="flex flex-col gap-6 p-6 h-[calc(100svh-4rem)] group-has-data-[collapsible=icon]/sidebar-wrapper:h-[calc(100svh-3rem)] overflow-hidden">
@@ -176,3 +191,4 @@
</div>
<CreateEditDialog bind:open={createDialogOpen} item={editingItem} onSuccess={handleSuccess} />
<DeleteDialog bind:open={deleteDialogOpen} item={itemToDelete} onSuccess={handleSuccess} />