Backport de mejoras genéricas de frontend (desde cliente/tagumedica)

- Nuevo Icon.tsx (reemplaza emojis en toda la app), FieldTooltip, ConfirmModal, PageLoader, SecondaryButton, hook useSapCatalog, utils/errors (getErrorMessage).
- App.tsx: code-splitting con lazy()+Suspense+PageLoader para todas las rutas.
- MainLayout.tsx: menú usa Icon.tsx en vez de emojis.
- FormattedField/SelectField: soporte de dbField+tooltip, multiline.
- DenseTable/FilterBar/ListViewTemplate: onClear, mejoras varias.
- PrimaryButton: variante de tamaño sm/md.
- Renombres *View.tsx para uniformar el naming de vistas de detalle/mantenimiento (Dashboard, Items, BatchNumberDetails, Customers, Suppliers, Invoices, Orders, PurchaseOrders, PurchaseInvoices) y SapLogin -> SapLoginForm.
- BatchNumberDetailsList: filtros y columna de descripción de artículo.
- Configs de reportes e iconos de módulos actualizados a Icon.tsx.
- Ajustes de paleta en los 4 temas CSS.
- Docs actualizadas.

Se excluyó explícitamente del backport (queda solo en cliente/tagumedica, no es reusable sin adaptar a los UDFs propios de cada cliente):
- Vistas InmovilizarLotesView, LiberarLotesView, ConfirmarLiberacionLoteView y sus rutas/ítems de menú.
- types/sapInventoryLock.ts (contrato con los UDFs U_SIS_MOVINV/U_EXX_TIPOOPER/U_SIS_TIPDESP/U_SIS_MOTALM de Tagumedica).
- En BatchForm.tsx: los 3 campos U_SIS_MOTEST/U_SIS_COMEST/U_SIS_ACCTOM (Motivo/Comentario/Acción), manteniendo el resto de mejoras genéricas del archivo y reactivando el campo estándar "Detalles/Observaciones" que en tagumedica había quedado comentado sin justificación genérica.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
GeorgeandClaude Sonnet 5 committed 2026-09-28 14:28:29 -05:00
1 parent fef21898f9
commit f58f4292c3
55 files changed
+1014 -356

No files matched your search

+10 -9
View File
@@ -1,6 +1,7 @@
import { useState, useEffect } from "react";
import { Link, Outlet, useLocation } from "react-router-dom";
import { API_URL, getToken, getUsername, getCompany } from "../utils/api";
import Icon from "../components/ui/Icon";
// Estructura del menú tipada para SAP Business One
interface SubMenuItem {
@@ -17,12 +18,12 @@ interface MenuItem {
const menuConfig: MenuItem[] = [
{
title: "0. Dashboard",
icon: "📊",
icon: "chart",
subItems: [{ name: "Inicio", path: "/dashboard" }],
},
{
title: "1. Inventario",
icon: "📦",
icon: "box",
subItems: [
{ name: "Articulos", path: "/inventario/articulos" },
{ name: "Lotes", path: "/inventario/lotes" },
@@ -30,7 +31,7 @@ const menuConfig: MenuItem[] = [
},
{
title: "2. Socio de negocios",
icon: "👥",
icon: "users",
subItems: [
{ name: "Clientes", path: "/socios/clientes" },
{ name: "Proveedores", path: "/socios/proveedores" },
@@ -38,7 +39,7 @@ const menuConfig: MenuItem[] = [
},
{
title: "3. Ventas",
icon: "🛒",
icon: "cart",
subItems: [
{ name: "Ordenes de venta", path: "/ventas/ordenes" },
{ name: "Entregas o Guías", path: "/ventas/entrega" },
@@ -47,7 +48,7 @@ const menuConfig: MenuItem[] = [
},
{
title: "4. Compras",
icon: "💼",
icon: "briefcase",
subItems: [
{ name: "Ordenes de compra", path: "/compras/ordenes" },
{ name: "Recepciones de compras", path: "/compras/recepcion" },
@@ -56,7 +57,7 @@ const menuConfig: MenuItem[] = [
},
{
title: "5. Informes",
icon: "📊",
icon: "chart",
subItems: [
{ name: "Socios de negocios", path: "/informes/socios" },
{ name: "Ventas", path: "/informes/ventas" },
@@ -66,7 +67,7 @@ const menuConfig: MenuItem[] = [
},
{
title: "6. Reportes Crystal",
icon: "📊",
icon: "chart",
subItems: [
{ name: "Socios de negocios", path: "/reportes-crystal/socios" },
{ name: "Ventas", path: "/reportes-crystal/ventas" },
@@ -76,7 +77,7 @@ const menuConfig: MenuItem[] = [
},
{
title: "7. Reportes HTML",
icon: "🏷️",
icon: "tag",
subItems: [
{ name: "Socios de negocios", path: "/reportes-html/socios" },
{ name: "Ventas", path: "/reportes-html/ventas" },
@@ -207,7 +208,7 @@ export default function MainLayout() {
}`}
disabled={!isSidebarOpen}
>
<span className="text-sm">{module.icon}</span>
<Icon name={module.icon} className="w-4 h-4 shrink-0" />
{isSidebarOpen && (
<>
<span className="ml-2 flex-1 truncate">