feature/correccion-redireccion-doda

This commit is contained in:
2026-04-29 10:57:51 -06:00
parent 47411556ee
commit d4e5958742
6 changed files with 61 additions and 91 deletions

View File

@@ -42,7 +42,11 @@ const STATUS_CLASSES: Record<string, string> = {
export function createColumns(
loc: 'en' | 'es',
onSuccess?: () => void,
{ canEdit = true, canDelete = true }: { canEdit?: boolean; canDelete?: boolean } = {}
{
canEdit = true,
canDelete = true,
dodaListBasePath = '/dashboard/despacho/doda'
}: { canEdit?: boolean; canDelete?: boolean; dodaListBasePath?: string } = {}
): ColumnDef<Doda>[] {
const t = (k: DodaFormKey) => dodaFormT(loc, k);
return [
@@ -168,7 +172,8 @@ export function createColumns(
item: row.original,
onSuccess,
canEdit,
canDelete
canDelete,
dodaListBasePath
});
}
}

View File

@@ -12,12 +12,15 @@
item,
onSuccess,
canEdit = true,
canDelete = true
canDelete = true,
dodaListBasePath = '/dashboard/despacho/doda'
}: {
item: Doda;
onSuccess?: () => void;
canEdit?: boolean;
canDelete?: boolean;
/** Ruta base donde vive la lista+formulario de DODA (canónica en Despacho). */
dodaListBasePath?: string;
} = $props();
let loading = $state(false);
@@ -60,7 +63,7 @@
<DropdownMenu.Content align="end">
<DropdownMenu.Label>Acciones</DropdownMenu.Label>
{#if canEdit}
<DropdownMenu.Item onclick={() => goto(`/dashboard/general_catalogs/doda?doda_id=${item.id}`)}>
<DropdownMenu.Item onclick={() => goto(`${dodaListBasePath}?doda_id=${item.id}`)}>
<Pencil class="mr-2 h-4 w-4" />
Editar
</DropdownMenu.Item>

View File

@@ -28,6 +28,7 @@
import { createColumns } from '$lib/components/dashboard/general_catalogs/doda/columns';
import DodaProgressDialog from '$lib/components/dashboard/despacho/doda/doda-progress-dialog.svelte';
import DodaExportExcelDialog from '$lib/components/dashboard/despacho/doda/doda-export-excel-dialog.svelte';
import DodaFormModal from '$lib/components/dashboard/general_catalogs/doda/doda-form-modal.svelte';
import { applyOptimisticDelete } from '$lib/components/dashboard/general_catalogs/doda/delete-list-state';
import {
@@ -139,10 +140,17 @@
}
}
function handleNew() {
const url = new URL($page.url);
url.searchParams.set('doda_id', 'new');
goto(url.toString(), { replaceState: true });
}
function handleEdit() {
if (selectedDoda) {
void goto(`/dashboard/general_catalogs/doda?doda_id=${selectedDoda.id}`, { noScroll: true });
}
if (!selectedDoda) return;
const url = new URL($page.url);
url.searchParams.set('doda_id', String(selectedDoda.id));
goto(url.toString(), { replaceState: true });
}
async function handleDelete() {
@@ -335,7 +343,7 @@
<RefreshCw class="mr-2 h-4 w-4 {dodaLoading ? 'animate-spin' : ''}" />
{m['sidebar.doda_alta.refresh']()}
</Button>
<Button size="sm" onclick={() => goto('/dashboard/general_catalogs/doda?doda_id=new')}>
<Button size="sm" onclick={handleNew}>
<Plus class="mr-2 h-4 w-4" />
{m['sidebar.doda_alta.action_new']()}
</Button>
@@ -405,7 +413,7 @@
<div class="rounded-md border bg-background">
<DataTable
data={allDodas}
columns={createColumns()}
columns={createColumns('es', () => reloadDodas())}
loading={dodaLoading}
hasMore={dodaHasMore}
loadMore={loadMoreDodas}
@@ -413,8 +421,11 @@
onRowClick={(row) => {
selectedDodaIds = selectedDodaIds.includes(row.id) ? [] : [row.id];
}}
onRowDoubleClick={(item) =>
goto(`/dashboard/general_catalogs/doda?doda_id=${item.id}`, { noScroll: true })}
onRowDoubleClick={(item) => {
const url = new URL($page.url);
url.searchParams.set('doda_id', String(item.id));
goto(url.toString(), { replaceState: true });
}}
/>
</div>
</Card.Content>
@@ -536,3 +547,21 @@
onCancel={() => (progressDialogOpen = false)}
/>
{/if}
{#if $page.url.searchParams.get('doda_id')}
<DodaFormModal
dodaIdParam={$page.url.searchParams.get('doda_id')!}
defaultLastUser={data.defaultLastUser}
onClose={() => {
const url = new URL($page.url);
url.searchParams.delete('doda_id');
goto(url.toString(), { replaceState: true });
void reloadDodas();
}}
onCreatedNavigateTo={(newId) => {
const url = new URL($page.url);
url.searchParams.set('doda_id', String(newId));
goto(url.toString(), { replaceState: true });
}}
/>
{/if}

View File

@@ -8,8 +8,8 @@ export const load: PageLoad = async ({ params }) => {
if (params.id) {
throw redirect(
303,
`/dashboard/general_catalogs/doda?doda_id=${encodeURIComponent(String(params.id))}`
`/dashboard/despacho/doda?doda_id=${encodeURIComponent(String(params.id))}`
);
}
throw redirect(303, '/dashboard/general_catalogs/doda?doda_id=new');
throw redirect(303, '/dashboard/despacho/doda?doda_id=new');
};

View File

@@ -1,81 +1,14 @@
import { redirect } from '@sveltejs/kit';
import type { PageServerLoad } from './$types';
import { getAuthTokens, authenticatedFetch } from '$lib/server/api';
export const load: PageServerLoad = async ({ cookies, fetch, url, parent }) => {
const parentData = await parent();
const { accessToken } = getAuthTokens(cookies);
export const load: PageServerLoad = async ({ url }) => {
// Preservar parámetros relevantes al redirigir al nuevo flujo en Despacho
const dodaId = url.searchParams.get('doda_id');
const integrationNumber = url.searchParams.get('integration_number');
const pUser = parentData.user as
| { preferred_username?: string; name?: string; email?: string }
| undefined
| null;
const defaultLastUser =
(pUser?.preferred_username?.trim() || pUser?.name?.trim() || pUser?.email?.trim() || '') || '';
const target = new URL('/dashboard/despacho/doda', url.origin);
if (dodaId) target.searchParams.set('doda_id', dodaId);
if (integrationNumber) target.searchParams.set('integration_number', integrationNumber);
if (!accessToken) {
return {
error: 'No authenticated',
dodas: { items: [], total: 0, page: 1, page_size: 50, pages: 0 },
defaultLastUser
};
}
try {
const page = Number(url.searchParams.get('page')) || 1;
const pageSize = Number(url.searchParams.get('pageSize')) || 50;
// Obtener company_id de la cookie o usar el primero disponible
const cookieCompanyId = cookies.get('active_company_id');
const companyId = cookieCompanyId
? parseInt(cookieCompanyId)
: parentData.companies?.[0]?.id;
if (!companyId) {
return {
error: 'No company selected',
dodas: { items: [], total: 0, page: 1, page_size: 50, pages: 0 },
defaultLastUser
};
}
const filters: Record<string, string> = {};
const integrationNumber = url.searchParams.get('integration_number');
if (integrationNumber) filters.integration_number = integrationNumber;
const queryParams = new URLSearchParams({
page: page.toString(),
page_size: pageSize.toString(),
company_id: companyId.toString(),
...filters
});
const response = await authenticatedFetch(`v1/a76/doda?${queryParams.toString()}`, { method: 'GET' }, cookies, fetch);
if (!response.ok) {
let errorMsg = 'Failed to load';
try {
const errorData = await response.json();
errorMsg = errorData.detail || errorData.message || errorMsg;
} catch (e) {
// Ignore json parsing error
}
return {
error: errorMsg,
status: response.status,
dodas: { items: [], total: 0, page, page_size: pageSize, pages: 0 },
defaultLastUser
};
}
const dodasData = await response.json();
return { dodas: dodasData, status: 200, defaultLastUser };
} catch (error: any) {
console.error('Error loading DODAs:', error);
return {
error: error.message || 'Error loading',
status: error.status || 500,
dodas: { items: [], total: 0, page: 1, page_size: 50, pages: 0 },
defaultLastUser
};
}
throw redirect(303, `${target.pathname}${target.search}`);
};

View File

@@ -8,8 +8,8 @@ export const load: PageLoad = async ({ params }) => {
if (params.id) {
throw redirect(
303,
`/dashboard/general_catalogs/doda?doda_id=${encodeURIComponent(String(params.id))}`
`/dashboard/despacho/doda?doda_id=${encodeURIComponent(String(params.id))}`
);
}
throw redirect(303, '/dashboard/general_catalogs/doda?doda_id=new');
throw redirect(303, '/dashboard/despacho/doda?doda_id=new');
};