Se arreglo el catalogo de UM
This commit is contained in:
@@ -17,6 +17,7 @@ ace_router = TenantCRUDRoutes(
|
|||||||
id_name="id",
|
id_name="id",
|
||||||
enable_list=True,
|
enable_list=True,
|
||||||
enable_filters=True,
|
enable_filters=True,
|
||||||
|
max_page_size=10000,
|
||||||
).router
|
).router
|
||||||
router.include_router(ace_router)
|
router.include_router(ace_router)
|
||||||
|
|
||||||
@@ -32,6 +33,7 @@ oma_router = TenantCRUDRoutes(
|
|||||||
id_name="id",
|
id_name="id",
|
||||||
enable_list=True,
|
enable_list=True,
|
||||||
enable_filters=True,
|
enable_filters=True,
|
||||||
|
max_page_size=10000,
|
||||||
).router
|
).router
|
||||||
router.include_router(oma_router)
|
router.include_router(oma_router)
|
||||||
|
|
||||||
@@ -47,6 +49,7 @@ american_router = TenantCRUDRoutes(
|
|||||||
id_name="id",
|
id_name="id",
|
||||||
enable_list=True,
|
enable_list=True,
|
||||||
enable_filters=True,
|
enable_filters=True,
|
||||||
|
max_page_size=10000,
|
||||||
).router
|
).router
|
||||||
router.include_router(american_router)
|
router.include_router(american_router)
|
||||||
|
|
||||||
@@ -62,6 +65,7 @@ customs_router = TenantCRUDRoutes(
|
|||||||
id_name="id",
|
id_name="id",
|
||||||
enable_list=True,
|
enable_list=True,
|
||||||
enable_filters=True,
|
enable_filters=True,
|
||||||
|
max_page_size=10000,
|
||||||
).router
|
).router
|
||||||
router.include_router(customs_router)
|
router.include_router(customs_router)
|
||||||
|
|
||||||
@@ -77,6 +81,7 @@ general_router = TenantCRUDRoutes(
|
|||||||
id_name="id",
|
id_name="id",
|
||||||
enable_list=True,
|
enable_list=True,
|
||||||
enable_filters=True,
|
enable_filters=True,
|
||||||
|
max_page_size=10000,
|
||||||
).router
|
).router
|
||||||
router.include_router(general_router)
|
router.include_router(general_router)
|
||||||
|
|
||||||
@@ -93,5 +98,6 @@ main_router = TenantCRUDRoutes(
|
|||||||
id_name="id",
|
id_name="id",
|
||||||
enable_list=True,
|
enable_list=True,
|
||||||
enable_filters=True,
|
enable_filters=True,
|
||||||
|
max_page_size=10000,
|
||||||
).router
|
).router
|
||||||
router.include_router(main_router)
|
router.include_router(main_router)
|
||||||
|
|||||||
@@ -295,7 +295,7 @@ export interface UnitOfMeasureListResponse {
|
|||||||
|
|
||||||
export async function getUnitsOfMeasure(
|
export async function getUnitsOfMeasure(
|
||||||
page: number = 1,
|
page: number = 1,
|
||||||
pageSize: number = 50,
|
pageSize: number = 1000,
|
||||||
companyId: number,
|
companyId: number,
|
||||||
filters: Record<string, any> = {}
|
filters: Record<string, any> = {}
|
||||||
): Promise<ApiResponse<UnitOfMeasureListResponse>> {
|
): Promise<ApiResponse<UnitOfMeasureListResponse>> {
|
||||||
|
|||||||
@@ -16,15 +16,27 @@
|
|||||||
} = $props();
|
} = $props();
|
||||||
|
|
||||||
let items = $state<UnitOfMeasure[]>([]);
|
let items = $state<UnitOfMeasure[]>([]);
|
||||||
|
let allItems = $state<UnitOfMeasure[]>([]); // Store full dataset
|
||||||
let loading = $state(false);
|
let loading = $state(false);
|
||||||
let searchTerm = $state("");
|
let searchTerm = $state("");
|
||||||
let page = $state(1);
|
|
||||||
let totalPages = $state(1);
|
// Derived state for filtering
|
||||||
let searchTimeout: NodeJS.Timeout;
|
$effect(() => {
|
||||||
|
if (!searchTerm) {
|
||||||
|
items = allItems;
|
||||||
|
} else {
|
||||||
|
const lowerTerm = searchTerm.toLowerCase();
|
||||||
|
items = allItems.filter(item =>
|
||||||
|
item.code.toLowerCase().includes(lowerTerm) ||
|
||||||
|
(item.description && item.description.toLowerCase().includes(lowerTerm)) ||
|
||||||
|
(item.description_en && item.description_en.toLowerCase().includes(lowerTerm))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// Cargar datos al abrir
|
// Cargar datos al abrir
|
||||||
$effect(() => {
|
$effect(() => {
|
||||||
if (open && companyStore.activeCompany) {
|
if (open && companyStore.activeCompany && allItems.length === 0) {
|
||||||
loadData();
|
loadData();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -34,17 +46,12 @@
|
|||||||
|
|
||||||
loading = true;
|
loading = true;
|
||||||
try {
|
try {
|
||||||
const filters = searchTerm ? { code: searchTerm } : {};
|
// Fetch everything once using the high limit
|
||||||
// Nota: Si tu backend soporta búsqueda por descripción, úsalo aquí.
|
const response = await getUnitsOfMeasure(1, 1000, companyStore.activeCompany.id, {});
|
||||||
// Por ahora asumo búsqueda por 'code' o 'description' según tu filtro backend.
|
|
||||||
|
|
||||||
const response = await getUnitsOfMeasure(page, 10, companyStore.activeCompany.id, {
|
|
||||||
q: searchTerm // Asumiendo que tu backend tiene un filtro genérico 'q' o usa 'code'/'description'
|
|
||||||
});
|
|
||||||
|
|
||||||
if (response.data) {
|
if (response.data) {
|
||||||
items = response.data.items;
|
allItems = response.data.items;
|
||||||
totalPages = response.data.pages;
|
items = allItems; // Initialize view
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Error cargando unidades:", error);
|
console.error("Error cargando unidades:", error);
|
||||||
@@ -56,32 +63,13 @@
|
|||||||
function handleSearch(e: Event) {
|
function handleSearch(e: Event) {
|
||||||
const value = (e.target as HTMLInputElement).value;
|
const value = (e.target as HTMLInputElement).value;
|
||||||
searchTerm = value;
|
searchTerm = value;
|
||||||
page = 1;
|
// No network call needed, $effect handles filtering
|
||||||
|
|
||||||
clearTimeout(searchTimeout);
|
|
||||||
searchTimeout = setTimeout(() => {
|
|
||||||
loadData();
|
|
||||||
}, 500);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleSelect(item: UnitOfMeasure) {
|
function handleSelect(item: UnitOfMeasure) {
|
||||||
onSelect(item);
|
onSelect(item);
|
||||||
open = false;
|
open = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
function nextPage() {
|
|
||||||
if (page < totalPages) {
|
|
||||||
page++;
|
|
||||||
loadData();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function prevPage() {
|
|
||||||
if (page > 1) {
|
|
||||||
page--;
|
|
||||||
loadData();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<Dialog.Root bind:open>
|
<Dialog.Root bind:open>
|
||||||
@@ -104,7 +92,7 @@
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="rounded-md border h-[300px] overflow-auto relative">
|
<div class="rounded-md border h-[400px] overflow-auto relative">
|
||||||
{#if loading}
|
{#if loading}
|
||||||
<div class="absolute inset-0 bg-background/50 flex items-center justify-center z-10">
|
<div class="absolute inset-0 bg-background/50 flex items-center justify-center z-10">
|
||||||
<Loader2 class="h-6 w-6 animate-spin text-primary" />
|
<Loader2 class="h-6 w-6 animate-spin text-primary" />
|
||||||
@@ -146,27 +134,9 @@
|
|||||||
</Table.Body>
|
</Table.Body>
|
||||||
</Table.Root>
|
</Table.Root>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flex items-center justify-between">
|
<div class="text-xs text-muted-foreground text-center">
|
||||||
<span class="text-xs text-muted-foreground">Página {page} de {totalPages}</span>
|
Mostrando {items.length} registros
|
||||||
<div class="flex gap-2">
|
|
||||||
<Button
|
|
||||||
variant="outline"
|
|
||||||
size="sm"
|
|
||||||
disabled={page === 1 || loading}
|
|
||||||
onclick={prevPage}
|
|
||||||
>
|
|
||||||
Anterior
|
|
||||||
</Button>
|
|
||||||
<Button
|
|
||||||
variant="outline"
|
|
||||||
size="sm"
|
|
||||||
disabled={page >= totalPages || loading}
|
|
||||||
onclick={nextPage}
|
|
||||||
>
|
|
||||||
Siguiente
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</Dialog.Content>
|
</Dialog.Content>
|
||||||
|
|||||||
Reference in New Issue
Block a user