diff --git a/client/src/app/catalog/list.tsx b/client/src/app/catalog/list.tsx index 0bbce4a..e93ea7e 100644 --- a/client/src/app/catalog/list.tsx +++ b/client/src/app/catalog/list.tsx @@ -1,35 +1,4 @@ -import { - Badge, - Button, - Card, - CardContent, - CardDescription, - CardFooter, - CardHeader, - CardTitle, - DropdownMenu, - DropdownMenuCheckboxItem, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuLabel, - DropdownMenuSeparator, - DropdownMenuTrigger, - Table, - TableBody, - TableCell, - TableHead, - TableHeader, - TableRow, - Tabs, - TabsContent, - TabsList, - TabsTrigger, -} from "@/ui"; - -import { File, ListFilter, MoreHorizontal, PlusCircle } from "lucide-react"; - import { DataTableProvider } from "@/lib/hooks"; -import { Trans } from "react-i18next"; import { CatalogDataTable } from "./components"; export const CatalogList = () => { @@ -38,282 +7,4 @@ export const CatalogList = () => { ); - - return ( - <> - - - - All - Active - Draft - - Archived - - - - - - - - Filter - - - - Filter by - - Active - Draft - Archived - - - - - Export - - - - Add Product - - - - - - - - - - - Manage your products and view their sales performance. - - - - - - - - Image - - Name - Status - Price - Total Sales - Created at - - Actions - - - - - - - - - Laser Lemonade Machine - - Draft - - $499.99 - 25 - 2023-07-12 10:42 AM - - - - - - Toggle menu - - - - Actions - Edit - Delete - - - - - - - - - Hypernova Headphones - - Active - - $129.99 - 100 - 2023-10-18 03:21 PM - - - - - - Toggle menu - - - - Actions - Edit - Delete - - - - - - - - - AeroGlow Desk Lamp - - Active - - $39.99 - 50 - 2023-11-29 08:15 AM - - - - - - Toggle menu - - - - Actions - Edit - Delete - - - - - - - - - TechTonic Energy Drink - - Draft - - $2.99 - 0 - 2023-12-25 11:59 PM - - - - - - Toggle menu - - - - Actions - Edit - Delete - - - - - - - - - Gamer Gear Pro Controller - - Active - - $59.99 - 75 - 2024-01-01 12:00 AM - - - - - - Toggle menu - - - - Actions - Edit - Delete - - - - - - - - - Luminous VR Headset - - Active - - $199.99 - 30 - 2024-02-14 02:14 PM - - - - - - Toggle menu - - - - Actions - Edit - Delete - - - - - - - - - - Showing 1-10 of 32 products - - - - - - > - ); }; diff --git a/client/src/app/settings/edit.tsx b/client/src/app/settings/edit.tsx index 6b2ad75..e3da7af 100644 --- a/client/src/app/settings/edit.tsx +++ b/client/src/app/settings/edit.tsx @@ -33,21 +33,20 @@ type SettingsDataForm = { export const SettingsEditor = () => { const [loading, setLoading] = useState(false); - const { - query: { data }, - mutation: { mutate }, - } = useSettings(); + const { useQuery, useMutation } = useSettings(); - console.log(data); + const { data } = useQuery; + const { mutate } = useMutation; const form = useForm({ mode: "onBlur", + values: data, defaultValues: { - contact_information: data?.contact_information ?? "", - default_payment_method: data?.default_payment_method ?? "", - default_notes: data?.default_notes ?? "", - default_legal_terms: data?.default_legal_terms ?? "", - default_quote_validity: data?.default_quote_validity ?? "", + contact_information: "", + default_payment_method: "", + default_notes: "", + default_legal_terms: "", + default_quote_validity: "", }, /*resolver: joiResolver( Joi.object({ diff --git a/client/src/app/settings/hooks/useSettings.tsx b/client/src/app/settings/hooks/useSettings.tsx index 04edf42..e4e0977 100644 --- a/client/src/app/settings/hooks/useSettings.tsx +++ b/client/src/app/settings/hooks/useSettings.tsx @@ -13,7 +13,7 @@ export const useSettings = (params?: UseSettingsGetParamsType) => { const keys = useQueryKey(); return { - query: useOne({ + useQuery: useOne({ queryKey: keys().data().resource("settings").action("one").id("").params().get(), queryFn: () => dataSource.getOne({ @@ -22,7 +22,7 @@ export const useSettings = (params?: UseSettingsGetParamsType) => { }), ...params, }), - mutation: useSave({ + useMutation: useSave({ mutationKey: keys().data().resource("settings").action("one").id("").params().get(), mutationFn: (data) => dataSource.updateOne({ diff --git a/client/src/components/Layout/components/UserButton.tsx b/client/src/components/Layout/components/UserButton.tsx index 7ba95ca..52987c2 100644 --- a/client/src/components/Layout/components/UserButton.tsx +++ b/client/src/components/Layout/components/UserButton.tsx @@ -1,4 +1,4 @@ -import { useCustomDialog } from "@/lib/hooks"; +import { useCustomDialog, useGetIdentity } from "@/lib/hooks"; import { Button, DropdownMenu, @@ -32,7 +32,9 @@ export const UserButton = () => { navigate("/logout"); }, }); - //const { data, status } = useGetIdentity(); + const { data, status } = useGetIdentity(); + + console.log(data, status); const openUserMenu = (event: SyntheticEvent) => { event.preventDefault(); @@ -51,10 +53,18 @@ export const UserButton = () => { return ( - - - {t("main_menu.user.user_menu")} - + <> + {status === "success" && ( + + {data?.name} + {data?.email} + + )} + + + {t("main_menu.user.user_menu")} + + > {t("main_menu.user.my_account")} diff --git a/client/src/lib/hooks/useAuth/useGetIdentity.ts b/client/src/lib/hooks/useAuth/useGetIdentity.ts index b54123e..d2efdd7 100644 --- a/client/src/lib/hooks/useAuth/useGetIdentity.ts +++ b/client/src/lib/hooks/useAuth/useGetIdentity.ts @@ -1,4 +1,4 @@ -import { useAuth } from "@/lib/hooks"; +import { IdentityResponse, useAuth } from "@/lib/hooks"; import { UseQueryOptions, useQuery } from "@tanstack/react-query"; import { useQueryKey } from "../useQueryKey"; @@ -6,9 +6,11 @@ export const useGetIdentity = (queryOptions?: UseQueryOptions) => { const keys = useQueryKey(); const { getIdentity } = useAuth(); - return useQuery({ + return useQuery({ queryKey: keys().auth().action("identity").get(), queryFn: getIdentity, ...queryOptions, }); }; + +export const isAdmin = () => true; diff --git a/server/src/contexts/common/infrastructure/sequelize/queryBuilder/SequelizeQueryBuilder.ts b/server/src/contexts/common/infrastructure/sequelize/queryBuilder/SequelizeQueryBuilder.ts index b405e98..6b0c133 100644 --- a/server/src/contexts/common/infrastructure/sequelize/queryBuilder/SequelizeQueryBuilder.ts +++ b/server/src/contexts/common/infrastructure/sequelize/queryBuilder/SequelizeQueryBuilder.ts @@ -20,10 +20,7 @@ export interface ISequelizeQueryOptions extends IRepositoryQueryOptions { } export interface ISequelizeQueryBuilder extends IRepositoryQueryBuilder { - generateQuery: (props: { - model: any; - queryCriteria?: IQueryCriteria; - }) => ISequelizeQueryOptions; + generateQuery: (props: { model: any; queryCriteria?: IQueryCriteria }) => ISequelizeQueryOptions; } export class SequelizeQueryBuilder implements ISequelizeQueryBuilder { @@ -44,15 +41,11 @@ export class SequelizeQueryBuilder implements ISequelizeQueryBuilder { private applyQuickSearch( model: ModelDefined, - quickSearchCriteria: QuickSearchCriteria, + quickSearchCriteria: QuickSearchCriteria ): any { let _model = model; if (!quickSearchCriteria.isEmpty()) { - if ( - _model && - _model.options.scopes && - _model.options.scopes["quickSearch"] - ) { + if (_model && _model.options.scopes && _model.options.scopes["quickSearch"]) { _model = _model.scope({ method: ["quickSearch", quickSearchCriteria.value], }); diff --git a/server/src/contexts/profile/infrastructure/sequelize/profile.model.ts b/server/src/contexts/profile/infrastructure/sequelize/profile.model.ts index 3db74bc..92a8d7d 100644 --- a/server/src/contexts/profile/infrastructure/sequelize/profile.model.ts +++ b/server/src/contexts/profile/infrastructure/sequelize/profile.model.ts @@ -30,11 +30,11 @@ export default (sequelize: Sequelize) => { primaryKey: true, }, - contact_information: DataTypes.STRING, - default_payment_method: DataTypes.STRING, - default_notes: DataTypes.STRING, - default_legal_terms: DataTypes.STRING, - default_quote_validity: DataTypes.STRING, + contact_information: DataTypes.TEXT, + default_payment_method: DataTypes.TEXT, + default_notes: DataTypes.TEXT, + default_legal_terms: DataTypes.TEXT, + default_quote_validity: DataTypes.TEXT, }, { sequelize, diff --git a/server/src/contexts/sales/domain/entities/Dealer.ts b/server/src/contexts/sales/domain/entities/Dealer.ts index 2d8b12b..ebe2d89 100644 --- a/server/src/contexts/sales/domain/entities/Dealer.ts +++ b/server/src/contexts/sales/domain/entities/Dealer.ts @@ -7,7 +7,6 @@ import { Result, UniqueID, } from "@shared/contexts"; -import { DealerRole } from "./DealerRole"; import { DealerStatus } from "./DealerStatus"; export interface IDealerProps { @@ -15,7 +14,6 @@ export interface IDealerProps { name: Name; logo: string; language: Language; - roles: DealerRole[]; additionalInfo: KeyValueMap; status: DealerStatus; } @@ -28,7 +26,6 @@ export interface IDealer { additionalInfo: KeyValueMap; status: DealerStatus; - getRoles: () => DealerRole[]; } export class Dealer extends AggregateRoot implements IDealer { @@ -37,14 +34,6 @@ export class Dealer extends AggregateRoot implements IDealer { return Result.ok(user); } - private roles: DealerRole[]; - - constructor(props: IDealerProps, id?: UniqueID) { - const { roles } = props; - super(props, id); - this.roles = roles; - } - get user_id(): UniqueID { return this.props.user_id; } @@ -64,20 +53,4 @@ export class Dealer extends AggregateRoot implements IDealer { get additionalInfo(): KeyValueMap { return this.props.additionalInfo; } - - get isUser(): boolean { - return this._hasRole(DealerRole.ROLE_USER); - } - - get isAdmin(): boolean { - return this._hasRole(DealerRole.ROLE_ADMIN); - } - - public getRoles(): DealerRole[] { - return this.roles; - } - - private _hasRole(role: DealerRole): boolean { - return (this.roles || []).some((r) => r.equals(role)); - } } diff --git a/server/src/contexts/sales/infrastructure/Dealer.repository.ts b/server/src/contexts/sales/infrastructure/Dealer.repository.ts index 6ae559f..ad35868 100644 --- a/server/src/contexts/sales/infrastructure/Dealer.repository.ts +++ b/server/src/contexts/sales/infrastructure/Dealer.repository.ts @@ -63,13 +63,9 @@ export class DealerRepository extends SequelizeRepository implements IDe } public async findAll(queryCriteria?: IQueryCriteria): Promise> { - const { rows, count } = await this._findAll( - "Dealer_Model", - queryCriteria - /*{ - include: [], // esto es para quitar las asociaciones al hacer la consulta - }*/ - ); + const { rows, count } = await this._findAll("Dealer_Model", queryCriteria, { + include: [], // esto es para quitar las asociaciones al hacer la consulta + }); return this.mapper.mapArrayAndCountToDomain(rows, count); } diff --git a/server/src/contexts/sales/infrastructure/mappers/dealer.mapper.ts b/server/src/contexts/sales/infrastructure/mappers/dealer.mapper.ts index 3483f8e..a8d0ca4 100644 --- a/server/src/contexts/sales/infrastructure/mappers/dealer.mapper.ts +++ b/server/src/contexts/sales/infrastructure/mappers/dealer.mapper.ts @@ -5,7 +5,6 @@ import { } from "@/contexts/common/infrastructure"; import { KeyValueMap, Language, Name, UniqueID } from "@shared/contexts"; import { Dealer, DealerStatus, IDealerProps } from "../../domain/entities"; -import { DealerRole } from "../../domain/entities/DealerRole"; import { ISalesContext } from "../Sales.context"; import { DealerCreationAttributes, Dealer_Model } from "../sequelize"; @@ -26,7 +25,6 @@ class DealerMapper logo: "", name: this.mapsValue(source, "name", Name.create), status: this.mapsValue(source, "status", DealerStatus.create), - roles: this.mapsValue(source, "roles", DealerRole.create), language: this.mapsValue(source, "language", Language.createFromCode), additionalInfo: KeyValueMap.create([ ["contact_information", source.contact_information], diff --git a/server/src/contexts/sales/infrastructure/sequelize/dealer.model.ts b/server/src/contexts/sales/infrastructure/sequelize/dealer.model.ts index a9e72be..2b375b2 100644 --- a/server/src/contexts/sales/infrastructure/sequelize/dealer.model.ts +++ b/server/src/contexts/sales/infrastructure/sequelize/dealer.model.ts @@ -74,11 +74,11 @@ export default (sequelize: Sequelize) => { allowNull: false, }, - contact_information: DataTypes.STRING, - default_payment_method: DataTypes.STRING, - default_notes: DataTypes.STRING, - default_legal_terms: DataTypes.STRING, - default_quote_validity: DataTypes.STRING, + contact_information: DataTypes.TEXT, + default_payment_method: DataTypes.TEXT, + default_notes: DataTypes.TEXT, + default_legal_terms: DataTypes.TEXT, + default_quote_validity: DataTypes.TEXT, language: DataTypes.STRING, status: { @@ -104,6 +104,13 @@ export default (sequelize: Sequelize) => { ], whereMergeStrategy: "and", // <- cómo tratar el merge de un scope + + defaultScope: { + attributes: { + exclude: ["contact_id"], + }, + }, + scopes: { quickSearch(value) { return { diff --git a/server/src/contexts/sales/infrastructure/sequelize/quote.model.ts b/server/src/contexts/sales/infrastructure/sequelize/quote.model.ts index b75624b..be6f4b5 100644 --- a/server/src/contexts/sales/infrastructure/sequelize/quote.model.ts +++ b/server/src/contexts/sales/infrastructure/sequelize/quote.model.ts @@ -7,13 +7,17 @@ import { NonAttribute, Sequelize, } from "sequelize"; +import { Dealer_Model } from "./dealer.model"; import { QuoteItem_Model } from "./quoteItem.model"; -export type QuoteCreationAttributes = InferCreationAttributes; +export type QuoteCreationAttributes = InferCreationAttributes< + Quote_Model, + { omit: "items" | "dealer" } +>; export class Quote_Model extends Model< - InferAttributes, - InferCreationAttributes + InferAttributes, + InferCreationAttributes > { static associate(connection: Sequelize) { const { Quote_Model, QuoteItem_Model, Dealer_Model } = connection.models; @@ -39,7 +43,8 @@ export class Quote_Model extends Model< declare subtotal: number; declare total: number; - declare items: NonAttribute; + declare items?: NonAttribute; + declare dealer?: NonAttribute; } export default (sequelize: Sequelize) => {
{data?.name}
{data?.email}