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:
@@ -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}`)
|
||||
};
|
||||
|
||||
@@ -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
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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}`);
|
||||
}
|
||||
|
||||
@@ -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} />
|
||||
|
||||
Reference in New Issue
Block a user