Compare commits
2 Commits
d018360967
...
957a92aad9
| Author | SHA1 | Date | |
|---|---|---|---|
| 957a92aad9 | |||
| b6cb56daff |
@ -1,26 +1,34 @@
|
|||||||
|
import { Suspense, lazy } from "react";
|
||||||
import { Navigate, Outlet, RouterProvider, createBrowserRouter } from "react-router-dom";
|
import { Navigate, Outlet, RouterProvider, createBrowserRouter } from "react-router-dom";
|
||||||
import {
|
import { LoadingOverlay, ProtectedRoute } from "./components";
|
||||||
DealerLayout,
|
|
||||||
DealersList,
|
// Lazy load components
|
||||||
ErrorPage,
|
const DealerLayout = lazy(() => import("./app").then((m) => ({ default: m.DealerLayout })));
|
||||||
LoginPageWithLanguageSelector,
|
const DealersList = lazy(() => import("./app").then((m) => ({ default: m.DealersList })));
|
||||||
LogoutPage,
|
const ErrorPage = lazy(() => import("./app").then((m) => ({ default: m.ErrorPage })));
|
||||||
QuoteCreate,
|
const LoginPageWithLanguageSelector = lazy(() =>
|
||||||
QuoteEdit,
|
import("./app").then((m) => ({ default: m.LoginPageWithLanguageSelector }))
|
||||||
SettingsEditor,
|
);
|
||||||
SettingsLayout,
|
const LogoutPage = lazy(() => import("./app").then((m) => ({ default: m.LogoutPage })));
|
||||||
} from "./app";
|
const QuoteCreate = lazy(() => import("./app").then((m) => ({ default: m.QuoteCreate })));
|
||||||
import { CatalogLayout, CatalogList } from "./app/catalog";
|
const QuoteEdit = lazy(() => import("./app").then((m) => ({ default: m.QuoteEdit })));
|
||||||
import { DashboardPage } from "./app/dashboard";
|
const SettingsEditor = lazy(() => import("./app").then((m) => ({ default: m.SettingsEditor })));
|
||||||
import { QuotesLayout } from "./app/quotes";
|
const SettingsLayout = lazy(() => import("./app").then((m) => ({ default: m.SettingsLayout })));
|
||||||
import { QuotesList } from "./app/quotes/list";
|
const CatalogLayout = lazy(() => import("./app").then((m) => ({ default: m.CatalogLayout })));
|
||||||
import { ProtectedRoute } from "./components";
|
const CatalogList = lazy(() => import("./app").then((m) => ({ default: m.CatalogList })));
|
||||||
|
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: "*",
|
||||||
Component: ErrorPage,
|
Element: (
|
||||||
|
<Suspense fallback={<LoadingOverlay />}>
|
||||||
|
<ErrorPage />
|
||||||
|
</Suspense>
|
||||||
|
),
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
@ -38,71 +46,105 @@ 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: <CatalogList />,
|
element: (
|
||||||
|
<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: <DealersList />,
|
element: (
|
||||||
|
<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: <QuotesList />,
|
element: (
|
||||||
|
<Suspense fallback={<LoadingOverlay />}>
|
||||||
|
<QuotesList />
|
||||||
|
</Suspense>
|
||||||
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "add",
|
path: "add",
|
||||||
element: <QuoteCreate />,
|
element: (
|
||||||
|
<Suspense fallback={<LoadingOverlay />}>
|
||||||
|
<QuoteCreate />
|
||||||
|
</Suspense>
|
||||||
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "edit/:id",
|
path: "edit/:id",
|
||||||
element: <QuoteEdit />,
|
element: (
|
||||||
|
<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: <SettingsEditor />,
|
element: (
|
||||||
|
<Suspense fallback={<LoadingOverlay />}>
|
||||||
|
<SettingsEditor />
|
||||||
|
</Suspense>
|
||||||
|
),
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
@ -116,7 +158,11 @@ export const Routes = () => {
|
|||||||
const routesForNotAuthenticatedOnly = [
|
const routesForNotAuthenticatedOnly = [
|
||||||
{
|
{
|
||||||
path: "/login",
|
path: "/login",
|
||||||
Component: LoginPageWithLanguageSelector,
|
element: (
|
||||||
|
<Suspense fallback={<LoadingOverlay />}>
|
||||||
|
<LoginPageWithLanguageSelector />
|
||||||
|
</Suspense>
|
||||||
|
),
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@ -117,10 +117,11 @@ export function CatalogDataTableFilter<TData>({
|
|||||||
<Tooltip>
|
<Tooltip>
|
||||||
<TooltipTrigger asChild>
|
<TooltipTrigger asChild>
|
||||||
<Button
|
<Button
|
||||||
variant='outline'
|
variant='default'
|
||||||
size='icon'
|
size='icon'
|
||||||
|
disabled={!inputValue}
|
||||||
onClick={addFilterTerm}
|
onClick={addFilterTerm}
|
||||||
className='w-8 h-8 p-0 hover:bg-muted'
|
className='w-8 h-8 p-0 transition-all'
|
||||||
>
|
>
|
||||||
<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>
|
||||||
|
|||||||
@ -72,17 +72,14 @@ 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
|
<AppendEmptyRowButton variant='link' onClick={() => table.options.meta?.appendItem()} />
|
||||||
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='ghost'
|
variant='link'
|
||||||
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();
|
||||||
@ -95,7 +92,7 @@ export const QuoteItemsSortableDataTableToolbar = ({ table }: { table: Table<any
|
|||||||
<Tooltip>
|
<Tooltip>
|
||||||
<TooltipTrigger asChild>
|
<TooltipTrigger asChild>
|
||||||
<AppendBlockRowButton
|
<AppendBlockRowButton
|
||||||
variant='ghost'
|
variant='link'
|
||||||
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();
|
||||||
|
|||||||
@ -100,32 +100,32 @@ export const QuoteEdit = () => {
|
|||||||
id_article: "",
|
id_article: "",
|
||||||
description: "",
|
description: "",
|
||||||
quantity: {
|
quantity: {
|
||||||
amount: undefined,
|
amount: null,
|
||||||
scale: 2,
|
scale: 2,
|
||||||
},
|
},
|
||||||
unit_price: {
|
unit_price: {
|
||||||
amount: undefined,
|
amount: null,
|
||||||
scale: 2,
|
scale: 2,
|
||||||
currency_code: "",
|
currency_code: quoteCurrency.code,
|
||||||
},
|
},
|
||||||
subtotal_price: {
|
subtotal_price: {
|
||||||
amount: undefined,
|
amount: null,
|
||||||
scale: 2,
|
scale: 2,
|
||||||
currency_code: "",
|
currency_code: quoteCurrency.code,
|
||||||
},
|
},
|
||||||
discount: {
|
discount: {
|
||||||
amount: undefined,
|
amount: null,
|
||||||
scale: 2,
|
scale: 2,
|
||||||
},
|
},
|
||||||
total_price: {
|
total_price: {
|
||||||
amount: undefined,
|
amount: null,
|
||||||
scale: 2,
|
scale: 2,
|
||||||
currency_code: "",
|
currency_code: quoteCurrency.code,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
}),
|
}),
|
||||||
[]
|
[quoteCurrency.code]
|
||||||
);
|
);
|
||||||
|
|
||||||
const { useOne, useUpdate } = useQuotes();
|
const { useOne, useUpdate } = useQuotes();
|
||||||
|
|||||||
@ -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 dando de alta un item",
|
subtitle = "Empieza solicitando la carga del catálogo",
|
||||||
buttonText = "Nuevo item",
|
buttonText = "Solicitar carga del catálogo",
|
||||||
onButtonClick = () => {},
|
onButtonClick = () => {},
|
||||||
actions = undefined,
|
actions = () => <></>,
|
||||||
}) => {
|
}) => {
|
||||||
return (
|
return (
|
||||||
<div className='text-center'>
|
<div className='text-center'>
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"translation": {
|
"translation": {
|
||||||
"common": {
|
"common": {
|
||||||
|
"loading": "Loading...",
|
||||||
"required": "required",
|
"required": "required",
|
||||||
"cancel": "Cancel",
|
"cancel": "Cancel",
|
||||||
"no": "No",
|
"no": "No",
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"translation": {
|
"translation": {
|
||||||
"common": {
|
"common": {
|
||||||
|
"loading": "Cargando...",
|
||||||
"required": "obligatorio",
|
"required": "obligatorio",
|
||||||
"cancel": "Cancelar",
|
"cancel": "Cancelar",
|
||||||
"no": "No",
|
"no": "No",
|
||||||
|
|||||||
315
dist/client/assets/index-BLcuj4sR.js
vendored
Normal file
315
dist/client/assets/index-BLcuj4sR.js
vendored
Normal file
File diff suppressed because one or more lines are too long
323
dist/client/assets/index-C4qjCyTZ.js
vendored
Normal file
323
dist/client/assets/index-C4qjCyTZ.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
dist/client/assets/index-CRnRspMf.css
vendored
1
dist/client/assets/index-CRnRspMf.css
vendored
File diff suppressed because one or more lines are too long
636
dist/client/assets/index-Dma5RbLy.js
vendored
636
dist/client/assets/index-Dma5RbLy.js
vendored
File diff suppressed because one or more lines are too long
1
dist/client/assets/index-DtTssDoC.css
vendored
Normal file
1
dist/client/assets/index-DtTssDoC.css
vendored
Normal file
File diff suppressed because one or more lines are too long
1
dist/client/assets/index-enIG-PHa.css
vendored
Normal file
1
dist/client/assets/index-enIG-PHa.css
vendored
Normal file
File diff suppressed because one or more lines are too long
2
dist/client/index.html
vendored
2
dist/client/index.html
vendored
@ -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-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>
|
<!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>
|
||||||
Loading…
Reference in New Issue
Block a user