Compare commits

..

No commits in common. "957a92aad920bf83c765e00cf6ac71d732883e15" and "d0183609677b16635963419897cd011404a06bfb" have entirely different histories.

14 changed files with 695 additions and 744 deletions

View File

@ -1,34 +1,26 @@
import { Suspense, lazy } from "react";
import { Navigate, Outlet, RouterProvider, createBrowserRouter } from "react-router-dom"; import { Navigate, Outlet, RouterProvider, createBrowserRouter } from "react-router-dom";
import { LoadingOverlay, ProtectedRoute } from "./components"; import {
DealerLayout,
// Lazy load components DealersList,
const DealerLayout = lazy(() => import("./app").then((m) => ({ default: m.DealerLayout }))); ErrorPage,
const DealersList = lazy(() => import("./app").then((m) => ({ default: m.DealersList }))); LoginPageWithLanguageSelector,
const ErrorPage = lazy(() => import("./app").then((m) => ({ default: m.ErrorPage }))); LogoutPage,
const LoginPageWithLanguageSelector = lazy(() => QuoteCreate,
import("./app").then((m) => ({ default: m.LoginPageWithLanguageSelector })) QuoteEdit,
); SettingsEditor,
const LogoutPage = lazy(() => import("./app").then((m) => ({ default: m.LogoutPage }))); SettingsLayout,
const QuoteCreate = lazy(() => import("./app").then((m) => ({ default: m.QuoteCreate }))); } from "./app";
const QuoteEdit = lazy(() => import("./app").then((m) => ({ default: m.QuoteEdit }))); import { CatalogLayout, CatalogList } from "./app/catalog";
const SettingsEditor = lazy(() => import("./app").then((m) => ({ default: m.SettingsEditor }))); import { DashboardPage } from "./app/dashboard";
const SettingsLayout = lazy(() => import("./app").then((m) => ({ default: m.SettingsLayout }))); import { QuotesLayout } from "./app/quotes";
const CatalogLayout = lazy(() => import("./app").then((m) => ({ default: m.CatalogLayout }))); import { QuotesList } from "./app/quotes/list";
const CatalogList = lazy(() => import("./app").then((m) => ({ default: m.CatalogList }))); import { ProtectedRoute } from "./components";
const DashboardPage = lazy(() => import("./app").then((m) => ({ default: m.DashboardPage })));
const QuotesLayout = lazy(() => import("./app").then((m) => ({ default: m.QuotesLayout })));
const QuotesList = lazy(() => import("./app").then((m) => ({ default: m.QuotesList })));
export const Routes = () => { export const Routes = () => {
const routesForErrors = [ const routesForErrors = [
{ {
path: "*", path: "*",
Element: ( Component: ErrorPage,
<Suspense fallback={<LoadingOverlay />}>
<ErrorPage />
</Suspense>
),
}, },
]; ];
@ -46,105 +38,71 @@ export const Routes = () => {
path: "/home", path: "/home",
element: ( element: (
<ProtectedRoute> <ProtectedRoute>
<Suspense fallback={<LoadingOverlay />}> <DashboardPage />
<DashboardPage />
</Suspense>
</ProtectedRoute> </ProtectedRoute>
), ),
}, },
{ {
path: "/catalog", path: "/catalog",
element: ( element: (
<Suspense fallback={<LoadingOverlay />}> <CatalogLayout>
<CatalogLayout> <Outlet />
<Outlet /> </CatalogLayout>
</CatalogLayout>
</Suspense>
), ),
children: [ children: [
{ {
index: true, index: true,
element: ( element: <CatalogList />,
<Suspense fallback={<LoadingOverlay />}>
<CatalogList />
</Suspense>
),
}, },
], ],
}, },
{ {
path: "/dealers", path: "/dealers",
element: ( element: (
<Suspense fallback={<LoadingOverlay />}> <DealerLayout>
<DealerLayout> <Outlet />
<Outlet /> </DealerLayout>
</DealerLayout>
</Suspense>
), ),
children: [ children: [
{ {
index: true, index: true,
element: ( element: <DealersList />,
<Suspense fallback={<LoadingOverlay />}>
<DealersList />
</Suspense>
),
}, },
], ],
}, },
{ {
path: "/quotes", path: "/quotes",
element: ( element: (
<Suspense fallback={<LoadingOverlay />}> <QuotesLayout>
<QuotesLayout> <Outlet />
<Outlet /> </QuotesLayout>
</QuotesLayout>
</Suspense>
), ),
children: [ children: [
{ {
index: true, index: true,
element: ( element: <QuotesList />,
<Suspense fallback={<LoadingOverlay />}>
<QuotesList />
</Suspense>
),
}, },
{ {
path: "add", path: "add",
element: ( element: <QuoteCreate />,
<Suspense fallback={<LoadingOverlay />}>
<QuoteCreate />
</Suspense>
),
}, },
{ {
path: "edit/:id", path: "edit/:id",
element: ( element: <QuoteEdit />,
<Suspense fallback={<LoadingOverlay />}>
<QuoteEdit />
</Suspense>
),
}, },
], ],
}, },
{ {
path: "/settings", path: "/settings",
element: ( element: (
<Suspense fallback={<LoadingOverlay />}> <SettingsLayout>
<SettingsLayout> <Outlet />
<Outlet /> </SettingsLayout>
</SettingsLayout>
</Suspense>
), ),
children: [ children: [
{ {
index: true, index: true,
element: ( element: <SettingsEditor />,
<Suspense fallback={<LoadingOverlay />}>
<SettingsEditor />
</Suspense>
),
}, },
], ],
}, },
@ -158,11 +116,7 @@ export const Routes = () => {
const routesForNotAuthenticatedOnly = [ const routesForNotAuthenticatedOnly = [
{ {
path: "/login", path: "/login",
element: ( Component: LoginPageWithLanguageSelector,
<Suspense fallback={<LoadingOverlay />}>
<LoginPageWithLanguageSelector />
</Suspense>
),
}, },
]; ];

View File

@ -117,11 +117,10 @@ export function CatalogDataTableFilter<TData>({
<Tooltip> <Tooltip>
<TooltipTrigger asChild> <TooltipTrigger asChild>
<Button <Button
variant='default' variant='outline'
size='icon' size='icon'
disabled={!inputValue}
onClick={addFilterTerm} onClick={addFilterTerm}
className='w-8 h-8 p-0 transition-all' className='w-8 h-8 p-0 hover:bg-muted'
> >
<PlusIcon className='w-4 h-4' /> <PlusIcon className='w-4 h-4' />
<span className='sr-only'>{t("common.filter.button_add_term")}</span> <span className='sr-only'>{t("common.filter.button_add_term")}</span>

View File

@ -72,14 +72,17 @@ export const QuoteItemsSortableDataTableToolbar = ({ table }: { table: Table<any
<div className='flex space-x-2'> <div className='flex space-x-2'>
<Tooltip> <Tooltip>
<TooltipTrigger asChild> <TooltipTrigger asChild>
<AppendEmptyRowButton variant='link' onClick={() => table.options.meta?.appendItem()} /> <AppendEmptyRowButton
variant='ghost'
onClick={() => table.options.meta?.appendItem()}
/>
</TooltipTrigger> </TooltipTrigger>
<TooltipContent>{t("common.append_empty_row_tooltip")}</TooltipContent> <TooltipContent>{t("common.append_empty_row_tooltip")}</TooltipContent>
</Tooltip> </Tooltip>
<Tooltip> <Tooltip>
<TooltipTrigger asChild> <TooltipTrigger asChild>
<AppendCatalogArticleRowButton <AppendCatalogArticleRowButton
variant='link' variant='ghost'
onClick={() => { onClick={() => {
if (table.options.meta && table.options.meta.pickCatalogArticle) { if (table.options.meta && table.options.meta.pickCatalogArticle) {
table.options.meta?.pickCatalogArticle(); table.options.meta?.pickCatalogArticle();
@ -92,7 +95,7 @@ export const QuoteItemsSortableDataTableToolbar = ({ table }: { table: Table<any
<Tooltip> <Tooltip>
<TooltipTrigger asChild> <TooltipTrigger asChild>
<AppendBlockRowButton <AppendBlockRowButton
variant='link' variant='ghost'
onClick={() => { onClick={() => {
if (table.options.meta && table.options.meta.pickBlock) { if (table.options.meta && table.options.meta.pickBlock) {
table.options.meta?.pickBlock(); table.options.meta?.pickBlock();

View File

@ -100,32 +100,32 @@ export const QuoteEdit = () => {
id_article: "", id_article: "",
description: "", description: "",
quantity: { quantity: {
amount: null, amount: undefined,
scale: 2, scale: 2,
}, },
unit_price: { unit_price: {
amount: null, amount: undefined,
scale: 2, scale: 2,
currency_code: quoteCurrency.code, currency_code: "",
}, },
subtotal_price: { subtotal_price: {
amount: null, amount: undefined,
scale: 2, scale: 2,
currency_code: quoteCurrency.code, currency_code: "",
}, },
discount: { discount: {
amount: null, amount: undefined,
scale: 2, scale: 2,
}, },
total_price: { total_price: {
amount: null, amount: undefined,
scale: 2, scale: 2,
currency_code: quoteCurrency.code, currency_code: "",
}, },
}, },
], ],
}), }),
[quoteCurrency.code] []
); );
const { useOne, useUpdate } = useQuotes(); const { useOne, useUpdate } = useQuotes();

View File

@ -3,10 +3,10 @@ import { PlusIcon } from "lucide-react";
export const SimpleEmptyState = ({ export const SimpleEmptyState = ({
title = "Esto está muy vacío", title = "Esto está muy vacío",
subtitle = "Empieza solicitando la carga del catálogo", subtitle = "Empieza dando de alta un item",
buttonText = "Solicitar carga del catálogo", buttonText = "Nuevo item",
onButtonClick = () => {}, onButtonClick = () => {},
actions = () => <></>, actions = undefined,
}) => { }) => {
return ( return (
<div className='text-center'> <div className='text-center'>

View File

@ -1,7 +1,6 @@
{ {
"translation": { "translation": {
"common": { "common": {
"loading": "Loading...",
"required": "required", "required": "required",
"cancel": "Cancel", "cancel": "Cancel",
"no": "No", "no": "No",

View File

@ -1,7 +1,6 @@
{ {
"translation": { "translation": {
"common": { "common": {
"loading": "Cargando...",
"required": "obligatorio", "required": "obligatorio",
"cancel": "Cancelar", "cancel": "Cancelar",
"no": "No", "no": "No",

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
dist/client/assets/index-CRnRspMf.css vendored Normal file

File diff suppressed because one or more lines are too long

636
dist/client/assets/index-Dma5RbLy.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
<!doctype html><html><head><meta charset="UTF-8"/><meta name="robots" content="noindex, nofollow"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width,initial-scale=1"/><link href="https://fonts.upset.dev/css2?family=Poppins&display=swap" rel="stylesheet"/><title>Presupuestador Uecko</title><script type="module" crossorigin src="/assets/index-C4qjCyTZ.js"></script><link rel="stylesheet" crossorigin href="/assets/index-enIG-PHa.css"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="uecko"></div></body></html> <!doctype html><html><head><meta charset="UTF-8"/><meta name="robots" content="noindex, nofollow"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width,initial-scale=1"/><link href="https://fonts.upset.dev/css2?family=Poppins&display=swap" rel="stylesheet"/><title>Presupuestador Uecko</title><script type="module" crossorigin src="/assets/index-Dma5RbLy.js"></script><link rel="stylesheet" crossorigin href="/assets/index-CRnRspMf.css"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="uecko"></div></body></html>