feature/permisos-reference-data
This commit is contained in:
@@ -41,8 +41,8 @@
|
||||
|
||||
// Permisos
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_pedimento_regimens.view'));
|
||||
const canEdit = $derived(userHasPermission($currentUser, 'ref_pedimento_regimens.edit'));
|
||||
const canDelete = $derived(userHasPermission($currentUser, 'ref_pedimento_regimens.delete'));
|
||||
const canEdit = $derived(false);
|
||||
const canDelete = $derived(false);
|
||||
|
||||
const isError = $derived(!canView || status >= 400 || error);
|
||||
|
||||
@@ -123,7 +123,7 @@
|
||||
{#if isError}
|
||||
<ErrorState
|
||||
status={!canView ? 403 : status}
|
||||
error={!canView ? 'Permission denied: ref_code_pedimento_regimens.view' : error || ''}
|
||||
error={!canView ? 'Permission denied: ref_pedimento_regimens.view' : error || ''}
|
||||
onRetry={reloadData}
|
||||
/>
|
||||
{:else}
|
||||
|
||||
@@ -29,9 +29,9 @@
|
||||
|
||||
// Permisos
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_containers.view'));
|
||||
const canCreate = $derived(userHasPermission($currentUser, 'ref_containers.create'));
|
||||
const canEdit = $derived(userHasPermission($currentUser, 'ref_containers.edit'));
|
||||
const canDelete = $derived(userHasPermission($currentUser, 'ref_containers.delete'));
|
||||
const canCreate = $derived(false);
|
||||
const canEdit = $derived(false);
|
||||
const canDelete = $derived(false);
|
||||
|
||||
const isError = $derived(!canView || status >= 400 || error);
|
||||
|
||||
|
||||
@@ -64,10 +64,10 @@
|
||||
let status = $state<number>(data.status || 200);
|
||||
|
||||
// Permisos
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_countries.view') || userHasPermission($currentUser, 'cat_countries.view'));
|
||||
const canCreate = $derived(userHasPermission($currentUser, 'ref_countries.create'));
|
||||
const canEdit = $derived(userHasPermission($currentUser, 'ref_countries.edit'));
|
||||
const canDelete = $derived(userHasPermission($currentUser, 'ref_countries.delete'));
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_countries.view'));
|
||||
const canCreate = $derived(false);
|
||||
const canEdit = $derived(false);
|
||||
const canDelete = $derived(false);
|
||||
|
||||
const isError = $derived(!canView || status >= 400 || error);
|
||||
|
||||
|
||||
@@ -62,10 +62,10 @@
|
||||
let status = $state<number>(data.status || 200);
|
||||
|
||||
// Permisos
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_currency_types.view') || userHasPermission($currentUser, 'cat_currency.view'));
|
||||
const canCreate = $derived(userHasPermission($currentUser, 'ref_currency_types.create'));
|
||||
const canEdit = $derived(userHasPermission($currentUser, 'ref_currency_types.edit'));
|
||||
const canDelete = $derived(userHasPermission($currentUser, 'ref_currency_types.delete'));
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_currency_types.view'));
|
||||
const canCreate = $derived(false);
|
||||
const canEdit = $derived(false);
|
||||
const canDelete = $derived(false);
|
||||
|
||||
const isError = $derived(!canView || status >= 400 || error);
|
||||
|
||||
|
||||
@@ -33,9 +33,9 @@
|
||||
|
||||
// Permisos
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_customs_sections.view'));
|
||||
const canCreate = $derived(userHasPermission($currentUser, 'ref_customs_sections.create'));
|
||||
const canEdit = $derived(userHasPermission($currentUser, 'ref_customs_sections.edit'));
|
||||
const canDelete = $derived(userHasPermission($currentUser, 'ref_customs_sections.delete'));
|
||||
const canCreate = $derived(false);
|
||||
const canEdit = $derived(false);
|
||||
const canDelete = $derived(false);
|
||||
|
||||
const isError = $derived(status >= 400 || error);
|
||||
|
||||
|
||||
@@ -37,10 +37,10 @@
|
||||
let status = $state<number>(data.status || 200);
|
||||
|
||||
// Permisos
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_customs_warehouses.view') || userHasPermission($currentUser, 'cat_warehouses.view'));
|
||||
const canCreate = $derived(userHasPermission($currentUser, 'ref_customs_warehouses.create'));
|
||||
const canEdit = $derived(userHasPermission($currentUser, 'ref_customs_warehouses.edit'));
|
||||
const canDelete = $derived(userHasPermission($currentUser, 'ref_customs_warehouses.delete'));
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_customs_warehouses.view'));
|
||||
const canCreate = $derived(false);
|
||||
const canEdit = $derived(false);
|
||||
const canDelete = $derived(false);
|
||||
|
||||
const isError = $derived(!canView || status >= 400 || error);
|
||||
|
||||
|
||||
@@ -11,7 +11,8 @@ export const load: PageServerLoad = async ({ cookies, fetch, url, parent }) => {
|
||||
items: [],
|
||||
total: 0,
|
||||
page: 1,
|
||||
page_size: 50
|
||||
page_size: 50,
|
||||
status: 401
|
||||
};
|
||||
}
|
||||
|
||||
@@ -28,7 +29,8 @@ export const load: PageServerLoad = async ({ cookies, fetch, url, parent }) => {
|
||||
items: [],
|
||||
total: 0,
|
||||
page,
|
||||
page_size: pageSize
|
||||
page_size: pageSize,
|
||||
status: 400
|
||||
};
|
||||
}
|
||||
|
||||
@@ -50,19 +52,25 @@ export const load: PageServerLoad = async ({ cookies, fetch, url, parent }) => {
|
||||
);
|
||||
|
||||
if (!response.ok) {
|
||||
const errorText = await response.text();
|
||||
console.error('📊 [Document Types Digitization] API Error:', {
|
||||
status: response.status,
|
||||
statusText: response.statusText,
|
||||
error: errorText
|
||||
});
|
||||
|
||||
const message =
|
||||
response.status === 403
|
||||
? 'No tiene permiso para ver tipos de documento para digitalización'
|
||||
: `Error ${response.status}: ${response.statusText}`;
|
||||
if (response.status !== 403) {
|
||||
const errorText = await response.text();
|
||||
console.error('📊 [Document Types Digitization] API Error:', {
|
||||
status: response.status,
|
||||
statusText: response.statusText,
|
||||
error: errorText
|
||||
});
|
||||
}
|
||||
return {
|
||||
error: `Error ${response.status}: ${response.statusText}`,
|
||||
error: message,
|
||||
items: [],
|
||||
total: 0,
|
||||
page,
|
||||
page_size: pageSize
|
||||
page_size: pageSize,
|
||||
status: response.status
|
||||
};
|
||||
}
|
||||
|
||||
@@ -73,7 +81,8 @@ export const load: PageServerLoad = async ({ cookies, fetch, url, parent }) => {
|
||||
total: data.total || 0,
|
||||
page: data.page || page,
|
||||
page_size: data.page_size || pageSize,
|
||||
error: null
|
||||
error: null,
|
||||
status: 200
|
||||
};
|
||||
} catch (error) {
|
||||
console.error('📊 [Document Types Digitization] Load error:', error);
|
||||
@@ -82,7 +91,8 @@ export const load: PageServerLoad = async ({ cookies, fetch, url, parent }) => {
|
||||
items: [],
|
||||
total: 0,
|
||||
page: 1,
|
||||
page_size: 50
|
||||
page_size: 50,
|
||||
status: 500
|
||||
};
|
||||
}
|
||||
};
|
||||
@@ -16,6 +16,8 @@
|
||||
import { createColumns } from '$lib/components/dashboard/reference_data/document_types_digitization/columns';
|
||||
import { useShortcuts } from '$lib/hooks/use-shortcuts';
|
||||
import type { PageData } from './$types';
|
||||
import { currentUser, userHasPermission } from '$lib/auth';
|
||||
import ErrorState from '$lib/components/dashboard/common/error-state.svelte';
|
||||
|
||||
let { data }: { data: PageData } = $props();
|
||||
|
||||
@@ -39,9 +41,12 @@
|
||||
let totalItems = $state(data.total || 0);
|
||||
let loading = $state(false);
|
||||
let error = $state<string | null>(data.error || null);
|
||||
let status = $state<number>(data.status || 200);
|
||||
let searchQuery = $state($page.url.searchParams.get('search') || '');
|
||||
let timeout: ReturnType<typeof setTimeout>;
|
||||
let hasMore = $derived(allItems.length < totalItems);
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_invoice_types.view'));
|
||||
const isError = $derived(!canView || status >= 400 || error);
|
||||
|
||||
function getActiveCompanyId(): number | null {
|
||||
const fromStore = companyStore.activeCompany?.id;
|
||||
@@ -137,42 +142,54 @@
|
||||
const columns = createColumns();
|
||||
</script>
|
||||
|
||||
<div class="flex h-[calc(100svh-4rem)] flex-col gap-6 overflow-hidden p-6 group-has-data-[collapsible=icon]/sidebar-wrapper:h-[calc(100svh-3rem)]">
|
||||
<div class="flex-none flex items-center justify-between">
|
||||
<div class="space-y-1">
|
||||
<h1 class="text-2xl font-bold tracking-tight">Tipos de documento para digitalización</h1>
|
||||
<p class="text-muted-foreground">
|
||||
Consulta el catálogo fijo de solo lectura utilizado por digitalización y pedimentos.
|
||||
</p>
|
||||
</div>
|
||||
{#if isError}
|
||||
<div
|
||||
class="flex h-[calc(100svh-4rem)] flex-col p-6 group-has-data-[collapsible=icon]/sidebar-wrapper:h-[calc(100svh-3rem)]"
|
||||
>
|
||||
<ErrorState
|
||||
status={!canView ? 403 : status}
|
||||
error={!canView ? 'Permission denied: ref_invoice_types.view' : error || ''}
|
||||
onRetry={reloadData}
|
||||
/>
|
||||
</div>
|
||||
|
||||
{#if error}
|
||||
<div class="flex-none rounded-md border border-destructive px-4 py-3 text-sm text-destructive">
|
||||
{error}
|
||||
{:else}
|
||||
<div class="flex h-[calc(100svh-4rem)] flex-col gap-6 overflow-hidden p-6 group-has-data-[collapsible=icon]/sidebar-wrapper:h-[calc(100svh-3rem)]">
|
||||
<div class="flex-none flex items-center justify-between">
|
||||
<div class="space-y-1">
|
||||
<h1 class="text-2xl font-bold tracking-tight">Tipos de documento para digitalización</h1>
|
||||
<p class="text-muted-foreground">
|
||||
Consulta el catálogo fijo de solo lectura utilizado por digitalización y pedimentos.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<Card.Root class="border bg-background flex min-h-0 flex-1 flex-col">
|
||||
<Card.Header>
|
||||
<div class="flex flex-wrap items-center justify-between gap-3">
|
||||
<Card.Title>Listado de tipos de documento</Card.Title>
|
||||
<div class="flex flex-wrap items-center gap-2">
|
||||
<Input
|
||||
placeholder="Buscar por código o descripción"
|
||||
bind:value={searchQuery}
|
||||
oninput={handleSearch}
|
||||
class="h-9 w-56 bg-card lg:w-72"
|
||||
/>
|
||||
{#if error}
|
||||
<div class="flex-none rounded-md border border-destructive px-4 py-3 text-sm text-destructive">
|
||||
{error}
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<Card.Root class="border bg-background flex min-h-0 flex-1 flex-col">
|
||||
<Card.Header>
|
||||
<div class="flex flex-wrap items-center justify-between gap-3">
|
||||
<Card.Title>Listado de tipos de documento</Card.Title>
|
||||
<div class="flex flex-wrap items-center gap-2">
|
||||
<Input
|
||||
placeholder="Buscar por código o descripción"
|
||||
bind:value={searchQuery}
|
||||
oninput={handleSearch}
|
||||
class="h-9 w-56 bg-card lg:w-72"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</Card.Header>
|
||||
<Card.Content class="min-h-0 p-0">
|
||||
<div class="rounded-md border bg-background overflow-hidden flex min-h-0 flex-1 flex-col">
|
||||
<DataTable data={allItems} {columns} {loading} {hasMore} {loadMore} />
|
||||
</div>
|
||||
</Card.Content>
|
||||
</Card.Root>
|
||||
</Card.Header>
|
||||
<Card.Content class="min-h-0 p-0">
|
||||
<div class="rounded-md border bg-background overflow-hidden flex min-h-0 flex-1 flex-col">
|
||||
<DataTable data={allItems} {columns} {loading} {hasMore} {loadMore} />
|
||||
</div>
|
||||
</Card.Content>
|
||||
</Card.Root>
|
||||
|
||||
<div class="flex-none text-sm text-muted-foreground">Mostrando {allItems.length} de {totalItems} registros</div>
|
||||
</div>
|
||||
<div class="flex-none text-sm text-muted-foreground">Mostrando {allItems.length} de {totalItems} registros</div>
|
||||
</div>
|
||||
{/if}
|
||||
@@ -37,10 +37,10 @@
|
||||
let status = $state<number>(data.status || 200);
|
||||
|
||||
// Permisos
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_incoterms.view') || userHasPermission($currentUser, 'cat_incoterms.view'));
|
||||
const canCreate = $derived(userHasPermission($currentUser, 'ref_incoterms.create'));
|
||||
const canEdit = $derived(userHasPermission($currentUser, 'ref_incoterms.edit'));
|
||||
const canDelete = $derived(userHasPermission($currentUser, 'ref_incoterms.delete'));
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_incoterms.view'));
|
||||
const canCreate = $derived(false);
|
||||
const canEdit = $derived(false);
|
||||
const canDelete = $derived(false);
|
||||
|
||||
const isError = $derived(!canView || status >= 400 || error);
|
||||
|
||||
@@ -119,8 +119,18 @@
|
||||
const columns = $derived(createColumns(handleSuccess, { canEdit, canDelete }));
|
||||
</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">
|
||||
|
||||
{#if isError}
|
||||
<div
|
||||
class="flex h-[calc(100svh-4rem)] flex-col p-6 group-has-data-[collapsible=icon]/sidebar-wrapper:h-[calc(100svh-3rem)]"
|
||||
>
|
||||
<ErrorState
|
||||
status={!canView ? 403 : status}
|
||||
error={!canView ? 'Permission denied: ref_incoterms.view' : error || ''}
|
||||
onRetry={reloadData}
|
||||
/>
|
||||
</div>
|
||||
{:else}
|
||||
<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">
|
||||
{#if error}
|
||||
<div class="flex-none rounded-md border border-destructive px-4 py-3 text-sm text-destructive">
|
||||
{error}
|
||||
@@ -145,4 +155,5 @@
|
||||
</Card.Root>
|
||||
|
||||
<div class="flex-none text-sm text-muted-foreground">Mostrando {allItems.length} de {totalItems} registros</div>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
@@ -37,10 +37,10 @@
|
||||
let status = $state<number>(data.status || 200);
|
||||
|
||||
// Permisos
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_invoice_types.view') || userHasPermission($currentUser, 'cat_inv_types.view'));
|
||||
const canCreate = $derived(userHasPermission($currentUser, 'ref_invoice_types.create'));
|
||||
const canEdit = $derived(userHasPermission($currentUser, 'ref_invoice_types.edit'));
|
||||
const canDelete = $derived(userHasPermission($currentUser, 'ref_invoice_types.delete'));
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_invoice_types.view'));
|
||||
const canCreate = $derived(false);
|
||||
const canEdit = $derived(false);
|
||||
const canDelete = $derived(false);
|
||||
|
||||
const isError = $derived(!canView || status >= 400 || error);
|
||||
|
||||
|
||||
@@ -30,8 +30,8 @@
|
||||
|
||||
// Permisos
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_material_types.view'));
|
||||
const canEdit = $derived(userHasPermission($currentUser, 'ref_material_types.edit'));
|
||||
const canDelete = $derived(userHasPermission($currentUser, 'ref_material_types.delete'));
|
||||
const canEdit = $derived(false);
|
||||
const canDelete = $derived(false);
|
||||
|
||||
const isError = $derived(!canView || status >= 400 || error);
|
||||
|
||||
|
||||
@@ -29,9 +29,9 @@
|
||||
let status = $state<number>(data.status || 200);
|
||||
|
||||
// Permisos
|
||||
const canView = $derived(userHasPermission($currentUser, 'pedimentos_payments.view'));
|
||||
const canEdit = $derived(userHasPermission($currentUser, 'pedimentos_payments.edit'));
|
||||
const canDelete = $derived(userHasPermission($currentUser, 'pedimentos_payments.delete'));
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_payment_methods.view'));
|
||||
const canEdit = $derived(false);
|
||||
const canDelete = $derived(false);
|
||||
|
||||
const isError = $derived(status >= 400 || error);
|
||||
|
||||
|
||||
@@ -32,8 +32,8 @@
|
||||
|
||||
// Permisos
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_pedimento_codes.view'));
|
||||
const canEdit = $derived(userHasPermission($currentUser, 'ref_pedimento_codes.edit'));
|
||||
const canDelete = $derived(userHasPermission($currentUser, 'ref_pedimento_codes.delete'));
|
||||
const canEdit = $derived(false);
|
||||
const canDelete = $derived(false);
|
||||
|
||||
const isError = $derived(status >= 400 || error);
|
||||
|
||||
|
||||
@@ -42,9 +42,9 @@
|
||||
|
||||
// Permisos
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_pedimento_regimens.view'));
|
||||
const canCreate = $derived(userHasPermission($currentUser, 'ref_pedimento_regimens.create'));
|
||||
const canEdit = $derived(userHasPermission($currentUser, 'ref_pedimento_regimens.edit'));
|
||||
const canDelete = $derived(userHasPermission($currentUser, 'ref_pedimento_regimens.delete'));
|
||||
const canCreate = $derived(false);
|
||||
const canEdit = $derived(false);
|
||||
const canDelete = $derived(false);
|
||||
|
||||
const isError = $derived(status >= 400 || error);
|
||||
|
||||
|
||||
@@ -38,9 +38,9 @@
|
||||
|
||||
// Permisos
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_sectors.view'));
|
||||
const canCreate = $derived(userHasPermission($currentUser, 'ref_sectors.create'));
|
||||
const canEdit = $derived(userHasPermission($currentUser, 'ref_sectors.edit'));
|
||||
const canDelete = $derived(userHasPermission($currentUser, 'ref_sectors.delete'));
|
||||
const canCreate = $derived(false);
|
||||
const canEdit = $derived(false);
|
||||
const canDelete = $derived(false);
|
||||
|
||||
const isError = $derived(!canView || status >= 400 || error);
|
||||
|
||||
|
||||
@@ -32,8 +32,8 @@
|
||||
|
||||
// 🛡️ Permisos (Runas derivadas)
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_states.view'));
|
||||
const canEdit = $derived(userHasPermission($currentUser, 'ref_states.edit'));
|
||||
const canDelete = $derived(userHasPermission($currentUser, 'ref_states.delete'));
|
||||
const canEdit = $derived(false);
|
||||
const canDelete = $derived(false);
|
||||
|
||||
const isError = $derived(!canView || status >= 400 || error);
|
||||
|
||||
|
||||
@@ -33,9 +33,9 @@
|
||||
|
||||
// Permisos
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_transport_modes.view'));
|
||||
const canCreate = $derived(userHasPermission($currentUser, 'ref_transport_modes.create'));
|
||||
const canEdit = $derived(userHasPermission($currentUser, 'ref_transport_modes.edit'));
|
||||
const canDelete = $derived(userHasPermission($currentUser, 'ref_transport_modes.delete'));
|
||||
const canCreate = $derived(false);
|
||||
const canEdit = $derived(false);
|
||||
const canDelete = $derived(false);
|
||||
|
||||
const isError = $derived(!canView || status >= 400 || error);
|
||||
|
||||
|
||||
@@ -30,8 +30,8 @@
|
||||
|
||||
// Permisos
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_transport_types.view'));
|
||||
const canEdit = $derived(userHasPermission($currentUser, 'ref_transport_types.edit'));
|
||||
const canDelete = $derived(userHasPermission($currentUser, 'ref_transport_types.delete'));
|
||||
const canEdit = $derived(false);
|
||||
const canDelete = $derived(false);
|
||||
|
||||
const isError = $derived(!canView || status >= 400 || error);
|
||||
|
||||
|
||||
@@ -38,10 +38,10 @@
|
||||
let status = $state<number>(data.status || 200);
|
||||
|
||||
// Permisos
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_valuation_methods.view') || userHasPermission($currentUser, 'cat_valuation.view'));
|
||||
const canCreate = $derived(userHasPermission($currentUser, 'ref_valuation_methods.create'));
|
||||
const canEdit = $derived(userHasPermission($currentUser, 'ref_valuation_methods.edit'));
|
||||
const canDelete = $derived(userHasPermission($currentUser, 'ref_valuation_methods.delete'));
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_valuation_methods.view'));
|
||||
const canCreate = $derived(false);
|
||||
const canEdit = $derived(false);
|
||||
const canDelete = $derived(false);
|
||||
|
||||
const isError = $derived(!canView || status >= 400 || error);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user