feature/correccion-redireccion-doda
This commit is contained in:
@@ -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
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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');
|
||||
};
|
||||
|
||||
@@ -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}`);
|
||||
};
|
||||
|
||||
@@ -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');
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user