refactor: reorganizar importaciones y eliminar componentes obsoletos en las páginas de proformas y facturas

This commit is contained in:
David Arranz 2026-09-04 11:53:59 +02:00
parent 3eb7c37a7b
commit 85d2f11bde
17 changed files with 287 additions and 321 deletions

View File

@ -1,4 +1,5 @@
import { Card, CardContent, RdxBadge } from "@repo/shadcn-ui/components"; import { RdxBadge } from "@repo/rdx-ui/components";
import { Card, CardContent } from "@repo/shadcn-ui/components";
import { CalendarClockIcon } from "lucide-react"; import { CalendarClockIcon } from "lucide-react";
import { useTranslation } from "../../../../i18n"; import { useTranslation } from "../../../../i18n";

View File

@ -1,6 +1,6 @@
import { PageErrorState } from "@erp/core/components"; import { PageErrorState } from "@erp/core/components";
import { RdxPageContainer } from "@repo/rdx-ui/components"; import { RdxBadge, RdxPageContainer } from "@repo/rdx-ui/components";
import { Button, Card, CardContent, RdxBadge } from "@repo/shadcn-ui/components"; import { Button, Card, CardContent } from "@repo/shadcn-ui/components";
import { PlusIcon } from "lucide-react"; import { PlusIcon } from "lucide-react";
import { useTranslation } from "../../../../i18n"; import { useTranslation } from "../../../../i18n";

View File

@ -2,10 +2,6 @@ import type { ModuleClientParams } from "@erp/core/client";
import { lazy } from "react"; import { lazy } from "react";
import { Outlet, type RouteObject } from "react-router-dom"; import { Outlet, type RouteObject } from "react-router-dom";
const RecurringProformaLayout = lazy(() =>
import("./recurring-proformas/shared/ui").then((m) => ({ default: m.RecurringProformaLayout }))
);
const ProformasListPage = lazy(() => const ProformasListPage = lazy(() =>
import("./proformas/list").then((m) => ({ default: m.ListProformasPage })) import("./proformas/list").then((m) => ({ default: m.ListProformasPage }))
); );
@ -42,10 +38,6 @@ const RecurringProformaDetailPage = lazy(() =>
import("./recurring-proformas").then((m) => ({ default: m.RecurringProformaDetailPage })) import("./recurring-proformas").then((m) => ({ default: m.RecurringProformaDetailPage }))
); );
const IssuedInvoicesLayout = lazy(() =>
import("./issued-invoices/shared/ui").then((m) => ({ default: m.IssuedInvoicesLayout }))
);
const IssuedInvoiceListPage = lazy(() => const IssuedInvoiceListPage = lazy(() =>
import("./issued-invoices/list").then((m) => ({ default: m.ListIssuedInvoicesPage })) import("./issued-invoices/list").then((m) => ({ default: m.ListIssuedInvoicesPage }))
); );
@ -119,11 +111,7 @@ export const CustomerInvoiceRoutes = (params: ModuleClientParams): RouteObject[]
layout: "app-sidebar", layout: "app-sidebar",
protected: true, protected: true,
}, },
element: ( element: <RecurringProformasListPage />,
<RecurringProformaLayout>
<RecurringProformasListPage />
</RecurringProformaLayout>
),
}, },
{ {
path: "recurring-proformas/archived", path: "recurring-proformas/archived",
@ -131,11 +119,7 @@ export const CustomerInvoiceRoutes = (params: ModuleClientParams): RouteObject[]
layout: "app-sidebar", layout: "app-sidebar",
protected: true, protected: true,
}, },
element: ( element: <RecurringProformasListPage />,
<RecurringProformaLayout>
<RecurringProformasListPage />
</RecurringProformaLayout>
),
}, },
{ {
path: "recurring-proformas/create", path: "recurring-proformas/create",
@ -143,11 +127,7 @@ export const CustomerInvoiceRoutes = (params: ModuleClientParams): RouteObject[]
layout: "app-fullscreen", layout: "app-fullscreen",
protected: true, protected: true,
}, },
element: ( element: <RecurringProformaCreatePage />,
<RecurringProformaLayout>
<RecurringProformaCreatePage />
</RecurringProformaLayout>
),
}, },
{ {
path: "recurring-proformas/:recurring_proforma_id", path: "recurring-proformas/:recurring_proforma_id",
@ -155,11 +135,7 @@ export const CustomerInvoiceRoutes = (params: ModuleClientParams): RouteObject[]
layout: "app-fullscreen", layout: "app-fullscreen",
protected: true, protected: true,
}, },
element: ( element: <RecurringProformaDetailPage />,
<RecurringProformaLayout>
<RecurringProformaDetailPage />
</RecurringProformaLayout>
),
}, },
{ {
@ -168,11 +144,7 @@ export const CustomerInvoiceRoutes = (params: ModuleClientParams): RouteObject[]
layout: "app-sidebar", layout: "app-sidebar",
protected: true, protected: true,
}, },
element: ( element: <Outlet context={params} />,
<IssuedInvoicesLayout>
<Outlet context={params} />
</IssuedInvoicesLayout>
),
children: [ children: [
{ path: "", index: true, element: <IssuedInvoiceListPage /> }, // index { path: "", index: true, element: <IssuedInvoiceListPage /> }, // index
{ path: "list", element: <IssuedInvoiceListPage /> }, { path: "list", element: <IssuedInvoiceListPage /> },
@ -196,11 +168,7 @@ export const CustomerInvoiceRoutes = (params: ModuleClientParams): RouteObject[]
layout: "app-fullscreen", layout: "app-fullscreen",
protected: true, protected: true,
}, },
element: ( element: <IssuedInvoiceDetailPage />,
<IssuedInvoicesLayout>
<IssuedInvoiceDetailPage />
</IssuedInvoicesLayout>
),
}, },
{ {
path: "settings/billing/verifactu", path: "settings/billing/verifactu",

View File

@ -10,7 +10,7 @@ export const IssuedInvoiceDetailContent = ({
inspector, inspector,
}: IssuedInvoiceDetailContentProps) => { }: IssuedInvoiceDetailContentProps) => {
return ( return (
<div className="min-h-0 flex-1 overflow-auto lg:overflow-hidden"> <div className="min-h-full lg:h-full lg:min-h-0 lg:overflow-hidden">
<div className="grid min-h-full grid-cols-1 lg:h-full lg:min-h-0 lg:grid-cols-[minmax(0,1fr)_340px] lg:overflow-hidden xl:grid-cols-[minmax(0,1fr)_380px]"> <div className="grid min-h-full grid-cols-1 lg:h-full lg:min-h-0 lg:grid-cols-[minmax(0,1fr)_340px] lg:overflow-hidden xl:grid-cols-[minmax(0,1fr)_380px]">
{documentPane} {documentPane}
{inspector} {inspector}

View File

@ -1,4 +1,5 @@
import { PageErrorState } from "@erp/core/components"; import { PageErrorState } from "@erp/core/components";
import { RdxPageContainer, RdxPageFrame } from "@repo/rdx-ui/components";
import { useTranslation } from "../../../../i18n"; import { useTranslation } from "../../../../i18n";
import { useIssuedInvoiceDetailPageController } from "../../controllers"; import { useIssuedInvoiceDetailPageController } from "../../controllers";
@ -20,8 +21,8 @@ export const IssuedInvoiceDetailPage = () => {
if (ctrl.state.pageError) { if (ctrl.state.pageError) {
return ( return (
<div className="p-4 sm:p-6"> <RdxPageFrame>
<div className="mx-auto w-full max-w-3xl"> <RdxPageContainer width="content">
<PageErrorState <PageErrorState
description={ctrl.state.pageError.description} description={ctrl.state.pageError.description}
primaryAction={ctrl.state.pageError.primaryAction} primaryAction={ctrl.state.pageError.primaryAction}
@ -30,15 +31,15 @@ export const IssuedInvoiceDetailPage = () => {
title={ctrl.state.pageError.title} title={ctrl.state.pageError.title}
variant={ctrl.state.pageError.variant} variant={ctrl.state.pageError.variant}
/> />
</div> </RdxPageContainer>
</div> </RdxPageFrame>
); );
} }
if (!(ctrl.header && ctrl.document && ctrl.general)) { if (!(ctrl.header && ctrl.document && ctrl.general)) {
return ( return (
<div className="p-4 sm:p-6"> <RdxPageFrame>
<div className="mx-auto w-full max-w-3xl"> <RdxPageContainer width="content">
<PageErrorState <PageErrorState
description={t("pages.issued_invoices.detail.page_error.inconsistent.description")} description={t("pages.issued_invoices.detail.page_error.inconsistent.description")}
secondaryAction={{ secondaryAction={{
@ -48,20 +49,23 @@ export const IssuedInvoiceDetailPage = () => {
title={t("pages.issued_invoices.detail.page_error.unknown.title")} title={t("pages.issued_invoices.detail.page_error.unknown.title")}
variant="unknown" variant="unknown"
/> />
</div> </RdxPageContainer>
</div> </RdxPageFrame>
); );
} }
return ( return (
<div className="flex h-full min-h-0 flex-col overflow-hidden"> <RdxPageFrame
contentClassName="lg:overflow-hidden"
header={
<IssuedInvoiceDetailHeader <IssuedInvoiceDetailHeader
actions={ctrl.actions} actions={ctrl.actions}
header={ctrl.header} header={ctrl.header}
onBack={ctrl.navigation.navigateBack} onBack={ctrl.navigation.navigateBack}
onExecuteAction={ctrl.handlers.executeAction} onExecuteAction={ctrl.handlers.executeAction}
/> />
}
>
<IssuedInvoiceDetailContent <IssuedInvoiceDetailContent
documentPane={ documentPane={
<IssuedInvoiceDocumentPane <IssuedInvoiceDocumentPane
@ -80,6 +84,6 @@ export const IssuedInvoiceDetailPage = () => {
/> />
} }
/> />
</div> </RdxPageFrame>
); );
}; };

View File

@ -1,3 +1,4 @@
import { RdxBadge } from "@repo/rdx-ui/components";
import { ToggleGroup, ToggleGroupItem } from "@repo/shadcn-ui/components"; import { ToggleGroup, ToggleGroupItem } from "@repo/shadcn-ui/components";
import { cn } from "@repo/shadcn-ui/lib/utils"; import { cn } from "@repo/shadcn-ui/lib/utils";
import { import {

View File

@ -1,3 +1,4 @@
import { RdxBadge } from "@repo/rdx-ui/components";
import { Tooltip, TooltipContent, TooltipTrigger } from "@repo/shadcn-ui/components"; import { Tooltip, TooltipContent, TooltipTrigger } from "@repo/shadcn-ui/components";
import { cn } from "@repo/shadcn-ui/lib/utils"; import { cn } from "@repo/shadcn-ui/lib/utils";

View File

@ -1,6 +1,6 @@
import { ErrorAlert, PageErrorState, PageHeader, SimpleSearchInput } from "@erp/core/components"; import { ErrorAlert, PageErrorState, PageHeader, SimpleSearchInput } from "@erp/core/components";
import { useReturnToNavigation } from "@erp/core/hooks"; import { useReturnToNavigation } from "@erp/core/hooks";
import { LogoVerifactu } from "@repo/rdx-ui/components"; import { LogoVerifactu, RdxPageContainer, RdxPageFrame } from "@repo/rdx-ui/components";
import { Alert, AlertDescription, AlertTitle, Button } from "@repo/shadcn-ui/components"; import { Alert, AlertDescription, AlertTitle, Button } from "@repo/shadcn-ui/components";
import { PlusIcon } from "lucide-react"; import { PlusIcon } from "lucide-react";
import { useState } from "react"; import { useState } from "react";
@ -58,8 +58,8 @@ export const ListIssuedInvoicesPage = () => {
if (hasBlockingError && pageError) { if (hasBlockingError && pageError) {
return ( return (
<div className="p-4 sm:p-6"> <RdxPageFrame>
<div className="mx-auto w-full max-w-3xl"> <RdxPageContainer width="content">
<PageErrorState <PageErrorState
description={pageError.description} description={pageError.description}
primaryAction={ primaryAction={
@ -88,13 +88,14 @@ export const ListIssuedInvoicesPage = () => {
title={pageError.title} title={pageError.title}
variant={pageError.variant} variant={pageError.variant}
/> />
</div> </RdxPageContainer>
</div> </RdxPageFrame>
); );
} }
return ( return (
<div className="p-6 space-y-6"> <RdxPageFrame>
<RdxPageContainer className="space-y-6" width="full">
<PageHeader <PageHeader
description={t("pages.issued_invoices.list.description")} description={t("pages.issued_invoices.list.description")}
rightSlot={ rightSlot={
@ -127,7 +128,6 @@ export const ListIssuedInvoicesPage = () => {
<LogoVerifactu className="text-green-800 w-50" color="" /> <LogoVerifactu className="text-green-800 w-50" color="" />
</Alert> </Alert>
<div className="min-h-0 flex-1 overflow-auto">
<IssuedInvoicesGrid <IssuedInvoicesGrid
columns={columns} columns={columns}
data={listCtrl.data} data={listCtrl.data}
@ -164,10 +164,10 @@ export const ListIssuedInvoicesPage = () => {
</div> </div>
} }
/> />
</div>
{listCtrl.data.totalItems === 0 ? <IssuedInvoicesEmptyGrid /> : null} {listCtrl.data.totalItems === 0 ? <IssuedInvoicesEmptyGrid /> : null}
</div> </div>
</div> </RdxPageContainer>
</RdxPageFrame>
); );
}; };

View File

@ -1 +0,0 @@
export * from "./issued-invoices-layout";

View File

@ -1,5 +0,0 @@
import type { PropsWithChildren } from "react";
export const IssuedInvoicesLayout = ({ children }: PropsWithChildren) => {
return <div className="space-y-4">{children}</div>;
};

View File

@ -1,6 +1,6 @@
import { PageFormHeader } from "@erp/core/components"; import { PageFormHeader } from "@erp/core/components";
import { useHookForm } from "@erp/core/hooks"; import { useHookForm } from "@erp/core/hooks";
import { RdxEditorPageLayout } from "@repo/rdx-ui/components"; import { RdxEditorLayout, RdxPageContainer, RdxPageFrame } from "@repo/rdx-ui/components";
import { import {
Button, Button,
Card, Card,
@ -50,7 +50,9 @@ export const RecurringProformaCreatePage = () => {
}); });
return ( return (
<div className="fixed inset-0 flex flex-col overflow-hidden"> <RdxPageFrame
contentClassName="bg-muted/20"
header={
<PageFormHeader <PageFormHeader
actions={ actions={
<div className="flex items-center gap-3"> <div className="flex items-center gap-3">
@ -77,8 +79,10 @@ export const RecurringProformaCreatePage = () => {
onBack={() => navigate("/recurring-proformas")} onBack={() => navigate("/recurring-proformas")}
title={t("recurring_proformas.create.title")} title={t("recurring_proformas.create.title")}
/> />
<div className="flex-1 overflow-y-auto bg-muted/20"> }
<RdxEditorPageLayout width="simple"> >
<RdxPageContainer width="content">
<RdxEditorLayout>
<form <form
className="space-y-6" className="space-y-6"
id={RECURRING_PROFORMA_CREATE_FORM_ID} id={RECURRING_PROFORMA_CREATE_FORM_ID}
@ -129,8 +133,8 @@ export const RecurringProformaCreatePage = () => {
</CardContent> </CardContent>
</Card> </Card>
</form> </form>
</RdxEditorPageLayout> </RdxEditorLayout>
</div> </RdxPageContainer>
</div> </RdxPageFrame>
); );
}; };

View File

@ -1,10 +1,5 @@
import { PageErrorState } from "@erp/core/components"; import { PageErrorState } from "@erp/core/components";
import { import { RdxBadge, RdxPageContainer, RdxPageFrame, RdxPageStack } from "@repo/rdx-ui/components";
RdxBadge,
RdxEditorPageLayout,
RdxPageContainer,
RdxPageStack,
} from "@repo/rdx-ui/components";
import { Button, Card, CardContent, CardHeader, CardTitle } from "@repo/shadcn-ui/components"; import { Button, Card, CardContent, CardHeader, CardTitle } from "@repo/shadcn-ui/components";
import { ArrowLeftIcon } from "lucide-react"; import { ArrowLeftIcon } from "lucide-react";
import { useNavigate, useParams } from "react-router-dom"; import { useNavigate, useParams } from "react-router-dom";
@ -96,7 +91,8 @@ export const RecurringProformaDetailPage = () => {
}); });
return ( return (
<RdxPageStack className="fixed inset-0 min-h-0 overflow-hidden" spacing="none"> <RdxPageFrame
header={
<ProformaPageHeader <ProformaPageHeader
actions={ actions={
<RecurringProformaDetailHeaderActions <RecurringProformaDetailHeaderActions
@ -131,14 +127,14 @@ export const RecurringProformaDetailPage = () => {
</div> </div>
} }
/> />
}
<RdxPageContainer className="min-h-0 flex-1 overflow-y-auto" padding="none" width="wide"> >
<RdxEditorPageLayout width="wide"> <RdxPageContainer width="wide">
<RdxPageStack spacing="default">
<RecurringProformaOperationalSummary <RecurringProformaOperationalSummary
locale={dateLocale} locale={dateLocale}
recurringProforma={recurringProforma} recurringProforma={recurringProforma}
/> />
</RdxEditorPageLayout>
<div className="grid gap-6 xl:grid-cols-2"> <div className="grid gap-6 xl:grid-cols-2">
<Card> <Card>
@ -268,7 +264,8 @@ export const RecurringProformaDetailPage = () => {
<ArrowLeftIcon aria-hidden className="size-4" /> <ArrowLeftIcon aria-hidden className="size-4" />
{t("recurring_proformas.detail.back")} {t("recurring_proformas.detail.back")}
</Button> </Button>
</RdxPageContainer>
</RdxPageStack> </RdxPageStack>
</RdxPageContainer>
</RdxPageFrame>
); );
}; };

View File

@ -124,6 +124,7 @@ mock.module("./controllers/use-list-recurring-proformas-page-controller", {
mock.module("@repo/rdx-ui/components", { mock.module("@repo/rdx-ui/components", {
namedExports: { namedExports: {
RdxPageContainer: ({ children }: { children: ReactNode }) => <div>{children}</div>, RdxPageContainer: ({ children }: { children: ReactNode }) => <div>{children}</div>,
RdxPageFrame: ({ children }: { children: ReactNode }) => <div>{children}</div>,
RdxPageStack: ({ children }: { children: ReactNode }) => <div>{children}</div>, RdxPageStack: ({ children }: { children: ReactNode }) => <div>{children}</div>,
RdxPageHeader: ({ RdxPageHeader: ({
title, title,

View File

@ -2,6 +2,7 @@ import { ErrorAlert } from "@erp/core/components";
import { import {
RdxPageActions, RdxPageActions,
RdxPageContainer, RdxPageContainer,
RdxPageFrame,
RdxPageHeader, RdxPageHeader,
RdxPageStack, RdxPageStack,
} from "@repo/rdx-ui/components"; } from "@repo/rdx-ui/components";
@ -28,6 +29,7 @@ export const ScopedListRecurringProformasPageView = ({
content, content,
}: ScopedListRecurringProformasPageViewProps) => { }: ScopedListRecurringProformasPageViewProps) => {
return ( return (
<RdxPageFrame>
<RdxPageContainer width="full"> <RdxPageContainer width="full">
<RdxPageStack spacing="default"> <RdxPageStack spacing="default">
<RdxPageHeader <RdxPageHeader
@ -43,5 +45,6 @@ export const ScopedListRecurringProformasPageView = ({
{content} {content}
</RdxPageStack> </RdxPageStack>
</RdxPageContainer> </RdxPageContainer>
</RdxPageFrame>
); );
}; };

View File

@ -1 +0,0 @@
export * from "./recurring-proforma-layout";

View File

@ -1,9 +0,0 @@
import type { PropsWithChildren } from "react";
export function RecurringProformaLayout({ children }: PropsWithChildren) {
return (
<div className="flex flex-col h-full w-full" id="recurring_proformas ">
{children}
</div>
);
}

View File

@ -21,12 +21,14 @@ const ASIDE_GRID_CLASSNAME: Record<RdxEditorWidth, string> = {
}; };
/** /**
* @deprecated
* Distribuye el contenido interno de un contenedor en: * Distribuye el contenido interno de un contenedor en:
* *
* - una región principal * - una región principal
* - un aside opcional. * - un aside opcional.
* *
* No controla padding, scroll ni estructura general de página. * No controla padding, scroll ni estructura general de página.
* Para nuevos consumidores usar RdxPageContainer + RdxEditorLayout.
*/ */
export const RdxEditorPageLayout = ({ export const RdxEditorPageLayout = ({