Refactor Prezziario schema and related components
- Updated the Prezziario schema to replace boolean flags (isAcconto, isSaldo, isConsulenza, isStabile, isTransitorio) with new fields (order_type, service_type, service_variant) to better represent service attributes. - Modified NewPrezzoModal to align with the updated schema. - Renamed FormNewServizioAcquisto to FormServizioAcquisto in user onboarding pages for consistency. - Adjusted imports and component usage in the user view and service onboarding pages to reflect the new form name.
This commit is contained in:
parent
6c53ef130c
commit
985a302a05
11 changed files with 174 additions and 201 deletions
|
|
@ -45,7 +45,6 @@ type DataTableProps<TData, TValue> = {
|
||||||
highlightedRow?: string;
|
highlightedRow?: string;
|
||||||
defaultColumnVisibility?: VisibilityState;
|
defaultColumnVisibility?: VisibilityState;
|
||||||
tabClassName?: string;
|
tabClassName?: string;
|
||||||
pagination?: boolean;
|
|
||||||
onStateChange?: () => void;
|
onStateChange?: () => void;
|
||||||
defaultFilterState?: ColumnFiltersState;
|
defaultFilterState?: ColumnFiltersState;
|
||||||
onTableInit?: (table: TableType<TData>) => void;
|
onTableInit?: (table: TableType<TData>) => void;
|
||||||
|
|
@ -79,7 +78,6 @@ export function DataTable<TData, TValue>({
|
||||||
highlightedRow,
|
highlightedRow,
|
||||||
defaultColumnVisibility,
|
defaultColumnVisibility,
|
||||||
tabClassName,
|
tabClassName,
|
||||||
pagination = true,
|
|
||||||
onStateChange,
|
onStateChange,
|
||||||
defaultFilterState,
|
defaultFilterState,
|
||||||
onTableInit,
|
onTableInit,
|
||||||
|
|
@ -88,6 +86,10 @@ export function DataTable<TData, TValue>({
|
||||||
}: DataTableProps<TData, TValue>) {
|
}: DataTableProps<TData, TValue>) {
|
||||||
const [sorting, setSorting] = useState<SortingState>(defaultSort || []);
|
const [sorting, setSorting] = useState<SortingState>(defaultSort || []);
|
||||||
const [rowSelection, setRowSelection] = useState<RowSelectionState>({});
|
const [rowSelection, setRowSelection] = useState<RowSelectionState>({});
|
||||||
|
const [pagination, setPagination] = useState({
|
||||||
|
pageIndex: 0, //initial page index
|
||||||
|
pageSize: 20, //default page size
|
||||||
|
});
|
||||||
|
|
||||||
const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>(
|
const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>(
|
||||||
defaultFilterState || [],
|
defaultFilterState || [],
|
||||||
|
|
@ -114,12 +116,14 @@ export function DataTable<TData, TValue>({
|
||||||
onGlobalFilterChange: setGlobalFilter,
|
onGlobalFilterChange: setGlobalFilter,
|
||||||
onRowSelectionChange: setRowSelection,
|
onRowSelectionChange: setRowSelection,
|
||||||
onSortingChange: setSorting,
|
onSortingChange: setSorting,
|
||||||
|
onPaginationChange: setPagination,
|
||||||
state: {
|
state: {
|
||||||
columnFilters,
|
columnFilters,
|
||||||
columnVisibility,
|
columnVisibility,
|
||||||
globalFilter,
|
globalFilter,
|
||||||
rowSelection,
|
rowSelection,
|
||||||
sorting,
|
sorting,
|
||||||
|
pagination,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -235,9 +239,8 @@ export function DataTable<TData, TValue>({
|
||||||
</TableBody>
|
</TableBody>
|
||||||
</Table>
|
</Table>
|
||||||
</div>
|
</div>
|
||||||
{pagination ? (
|
|
||||||
<DataTablePagination hasSelectRow={hasSelectRow} table={table} />
|
<DataTablePagination hasSelectRow={hasSelectRow} table={table} />
|
||||||
) : null}
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -587,7 +587,8 @@ const TransitorioSection = () => {
|
||||||
};
|
};
|
||||||
const preferenzeDescrizione = data.desc_it?.match(/Permanenza:.*$/m);
|
const preferenzeDescrizione = data.desc_it?.match(/Permanenza:.*$/m);
|
||||||
|
|
||||||
const permanenzaAnnuncio = data.permanenza
|
const permanenzaAnnuncio =
|
||||||
|
data.permanenza !== null
|
||||||
? `${data.permanenza.join(" - ")} mesi`
|
? `${data.permanenza.join(" - ")} mesi`
|
||||||
: (preferenzeDescrizione?.[0] ??
|
: (preferenzeDescrizione?.[0] ??
|
||||||
"errore: testo non trovato in descrizione");
|
"errore: testo non trovato in descrizione");
|
||||||
|
|
@ -601,7 +602,7 @@ const TransitorioSection = () => {
|
||||||
|
|
||||||
<MultiSelect
|
<MultiSelect
|
||||||
defaultValue={
|
defaultValue={
|
||||||
servizio.permanenza
|
servizio.permanenza !== null
|
||||||
? {
|
? {
|
||||||
label: t.parametri.permanenza[servizio.permanenza] || "",
|
label: t.parametri.permanenza[servizio.permanenza] || "",
|
||||||
value: servizio.permanenza.toString(),
|
value: servizio.permanenza.toString(),
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import toast from "react-hot-toast";
|
import toast from "react-hot-toast";
|
||||||
import { FormNewServizio, type FormValues } from "~/forms/FormNewServizio";
|
import { FormServizio, type FormValues } from "~/forms/FormServizio";
|
||||||
import type { Servizio } from "~/schemas/public/Servizio";
|
import type { Servizio } from "~/schemas/public/Servizio";
|
||||||
import type { UsersId } from "~/schemas/public/Users";
|
import type { UsersId } from "~/schemas/public/Users";
|
||||||
import { api } from "~/utils/api";
|
import { api } from "~/utils/api";
|
||||||
|
|
@ -103,7 +103,7 @@ const NewServizioModal = ({
|
||||||
<DialogDescription className="sr-only">desc</DialogDescription>
|
<DialogDescription className="sr-only">desc</DialogDescription>
|
||||||
</DialogHeader>
|
</DialogHeader>
|
||||||
<div className="overflow-y-auto">
|
<div className="overflow-y-auto">
|
||||||
<FormNewServizio
|
<FormServizio
|
||||||
initialData={editData}
|
initialData={editData}
|
||||||
isLimited={false}
|
isLimited={false}
|
||||||
onSubmit={onSubmit}
|
onSubmit={onSubmit}
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,9 @@ import type {
|
||||||
import { Badge } from "~/components/ui/badge";
|
import { Badge } from "~/components/ui/badge";
|
||||||
import { Button } from "~/components/ui/button";
|
import { Button } from "~/components/ui/button";
|
||||||
import { cn, formatCurrency } from "~/lib/utils";
|
import { cn, formatCurrency } from "~/lib/utils";
|
||||||
|
import OrderTypeEnum from "~/schemas/public/OrderTypeEnum";
|
||||||
import type { Prezziario } from "~/schemas/public/Prezziario";
|
import type { Prezziario } from "~/schemas/public/Prezziario";
|
||||||
|
import TipologiaPosizioneEnum from "~/schemas/public/TipologiaPosizioneEnum";
|
||||||
|
|
||||||
export const PrezzarioTable = ({
|
export const PrezzarioTable = ({
|
||||||
data,
|
data,
|
||||||
|
|
@ -20,36 +22,17 @@ export const PrezzarioTable = ({
|
||||||
setOpenEdit: (status: boolean) => void;
|
setOpenEdit: (status: boolean) => void;
|
||||||
setEditData: (data: Prezziario | null) => void;
|
setEditData: (data: Prezziario | null) => void;
|
||||||
}) => {
|
}) => {
|
||||||
const tabledata = data.map((row) => {
|
const tabledata = data;
|
||||||
return {
|
|
||||||
actions: "Azioni",
|
|
||||||
categoria: [
|
|
||||||
row.isAcconto && "acconto",
|
|
||||||
row.isSaldo && "saldo",
|
|
||||||
row.isConsulenza && "consulenza",
|
|
||||||
].filter(Boolean),
|
|
||||||
desc_en: row.desc_en,
|
|
||||||
desc_it: row.desc_it,
|
|
||||||
id: row.idprezziario,
|
|
||||||
isAcconto: row.isAcconto,
|
|
||||||
isActive: row.isActive,
|
|
||||||
isConsulenza: row.isConsulenza,
|
|
||||||
isSaldo: row.isSaldo,
|
|
||||||
isStabile: row.isStabile,
|
|
||||||
isTransitorio: row.isTransitorio,
|
|
||||||
nome_en: row.nome_en,
|
|
||||||
nome_it: row.nome_it,
|
|
||||||
prezzo_cent: row.prezzo_cent,
|
|
||||||
sconto: row.sconto,
|
|
||||||
testo_condizioni: row.testo_condizioni,
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
const cat_options = [
|
const tipologia_options = Object.values(OrderTypeEnum).map((value) => ({
|
||||||
{ label: "acconto", value: "acconto" },
|
label: value,
|
||||||
{ label: "saldo", value: "saldo" },
|
value: value,
|
||||||
{ label: "consulenza", value: "consulenza" },
|
}));
|
||||||
];
|
|
||||||
|
const cat_options = Object.values(TipologiaPosizioneEnum).map((value) => ({
|
||||||
|
label: value,
|
||||||
|
value: value,
|
||||||
|
}));
|
||||||
|
|
||||||
const columns_titles = {
|
const columns_titles = {
|
||||||
actions: "Azioni",
|
actions: "Azioni",
|
||||||
|
|
@ -61,11 +44,10 @@ export const PrezzarioTable = ({
|
||||||
tipologia: "Tipo",
|
tipologia: "Tipo",
|
||||||
};
|
};
|
||||||
type Column = (typeof tabledata)[number];
|
type Column = (typeof tabledata)[number];
|
||||||
const includesAll = (arr: string[], values: string[]) =>
|
|
||||||
values.every((v) => arr.includes(v));
|
|
||||||
const columns: ColumnDef<Column>[] = [
|
const columns: ColumnDef<Column>[] = [
|
||||||
{
|
{
|
||||||
accessorKey: "id",
|
accessorKey: "idprezziario",
|
||||||
enableHiding: false,
|
enableHiding: false,
|
||||||
header: ({ column }) => (
|
header: ({ column }) => (
|
||||||
<DataTableColumnHeader column={column} title={columns_titles.id} />
|
<DataTableColumnHeader column={column} title={columns_titles.id} />
|
||||||
|
|
@ -85,10 +67,8 @@ export const PrezzarioTable = ({
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
accessorKey: "categoria",
|
accessorKey: "service_type",
|
||||||
filterFn: (row, id, value) => {
|
|
||||||
return includesAll(row.getValue(id), value as string[]);
|
|
||||||
},
|
|
||||||
header: ({ column }) => (
|
header: ({ column }) => (
|
||||||
<DataTableColumnHeader
|
<DataTableColumnHeader
|
||||||
column={column}
|
column={column}
|
||||||
|
|
@ -98,23 +78,8 @@ export const PrezzarioTable = ({
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
accessorKey: "tipologia",
|
accessorKey: "order_type",
|
||||||
cell: ({ row }) => {
|
|
||||||
return (
|
|
||||||
<div>
|
|
||||||
{(() => {
|
|
||||||
if (row.original.isTransitorio && row.original.isStabile)
|
|
||||||
return "Transitorio/Stabile";
|
|
||||||
if (row.original.isTransitorio) return "Transitorio";
|
|
||||||
if (row.original.isStabile) return "Stabile";
|
|
||||||
return "";
|
|
||||||
})()}
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
},
|
|
||||||
filterFn: (row, id, value) => {
|
|
||||||
return includesAll(row.getValue(id), value as string[]);
|
|
||||||
},
|
|
||||||
header: ({ column }) => (
|
header: ({ column }) => (
|
||||||
<DataTableColumnHeader
|
<DataTableColumnHeader
|
||||||
column={column}
|
column={column}
|
||||||
|
|
@ -146,31 +111,16 @@ export const PrezzarioTable = ({
|
||||||
header: ({ column }) => (
|
header: ({ column }) => (
|
||||||
<DataTableColumnHeader column={column} title={columns_titles.sconto} />
|
<DataTableColumnHeader column={column} title={columns_titles.sconto} />
|
||||||
),
|
),
|
||||||
|
enableSorting: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
accessorKey: "actions",
|
accessorKey: "actions",
|
||||||
cell: ({ row }) => {
|
cell: ({ row }) => {
|
||||||
const rowData = row.original;
|
|
||||||
return (
|
return (
|
||||||
<Button
|
<Button
|
||||||
aria-label="Modifica Prezziario"
|
aria-label="Modifica Prezziario"
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
setEditData({
|
setEditData(row.original);
|
||||||
desc_en: rowData.desc_en,
|
|
||||||
desc_it: rowData.desc_it,
|
|
||||||
idprezziario: rowData.id,
|
|
||||||
isAcconto: rowData.isAcconto,
|
|
||||||
isActive: rowData.isActive,
|
|
||||||
isConsulenza: rowData.isConsulenza,
|
|
||||||
isSaldo: rowData.isSaldo,
|
|
||||||
isStabile: rowData.isStabile,
|
|
||||||
isTransitorio: rowData.isTransitorio,
|
|
||||||
nome_en: rowData.nome_en,
|
|
||||||
nome_it: rowData.nome_it,
|
|
||||||
prezzo_cent: rowData.prezzo_cent,
|
|
||||||
sconto: rowData.sconto,
|
|
||||||
testo_condizioni: rowData.testo_condizioni,
|
|
||||||
});
|
|
||||||
setOpenEdit(true);
|
setOpenEdit(true);
|
||||||
}}
|
}}
|
||||||
variant="ghost"
|
variant="ghost"
|
||||||
|
|
@ -188,13 +138,18 @@ export const PrezzarioTable = ({
|
||||||
];
|
];
|
||||||
const pinnedFiltri: PinnedFiltro[] = [
|
const pinnedFiltri: PinnedFiltro[] = [
|
||||||
{
|
{
|
||||||
columnName: "categoria",
|
columnName: "service_type",
|
||||||
options: cat_options,
|
options: cat_options,
|
||||||
title: "Categoria",
|
title: "Categoria",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
columnName: "order_type",
|
||||||
|
options: tipologia_options,
|
||||||
|
title: "Tipologia",
|
||||||
|
},
|
||||||
];
|
];
|
||||||
const searchFiltro: SearchFiltro = {
|
const searchFiltro: SearchFiltro = {
|
||||||
columnName: "id",
|
columnName: "idprezziario",
|
||||||
placeholder: "Filtra codice...",
|
placeholder: "Filtra codice...",
|
||||||
};
|
};
|
||||||
return (
|
return (
|
||||||
|
|
@ -203,7 +158,7 @@ export const PrezzarioTable = ({
|
||||||
columns={columns}
|
columns={columns}
|
||||||
columns_titles={columns_titles}
|
columns_titles={columns_titles}
|
||||||
data={tabledata}
|
data={tabledata}
|
||||||
defaultSort={[{ desc: false, id: "id" }]}
|
defaultSort={[{ desc: false, id: "idprezziario" }]}
|
||||||
pinnedFiltri={pinnedFiltri}
|
pinnedFiltri={pinnedFiltri}
|
||||||
searchColumn={searchFiltro}
|
searchColumn={searchFiltro}
|
||||||
/>
|
/>
|
||||||
|
|
|
||||||
|
|
@ -20,11 +20,14 @@ import {
|
||||||
SelectValue,
|
SelectValue,
|
||||||
} from "~/components/ui/select";
|
} from "~/components/ui/select";
|
||||||
import { Switch } from "~/components/ui/switch";
|
import { Switch } from "~/components/ui/switch";
|
||||||
|
import { FieldResetButton } from "~/forms/comps";
|
||||||
import { useZodForm } from "~/lib/zodForm";
|
import { useZodForm } from "~/lib/zodForm";
|
||||||
|
import OrderTypeEnum from "~/schemas/public/OrderTypeEnum";
|
||||||
import type {
|
import type {
|
||||||
Prezziario,
|
Prezziario,
|
||||||
PrezziarioIdprezziario,
|
PrezziarioIdprezziario,
|
||||||
} from "~/schemas/public/Prezziario";
|
} from "~/schemas/public/Prezziario";
|
||||||
|
import TipologiaPosizioneEnum from "~/schemas/public/TipologiaPosizioneEnum";
|
||||||
import { api } from "~/utils/api";
|
import { api } from "~/utils/api";
|
||||||
|
|
||||||
type FormPrezzoProps = {
|
type FormPrezzoProps = {
|
||||||
|
|
@ -38,28 +41,24 @@ export const FormPrezzo = ({
|
||||||
const { data: stringhe_condizioni } =
|
const { data: stringhe_condizioni } =
|
||||||
api.strings.getStringheCondizioni.useQuery();
|
api.strings.getStringheCondizioni.useQuery();
|
||||||
|
|
||||||
const stringhe_condizioni_options = [
|
const stringhe_condizioni_options = stringhe_condizioni
|
||||||
"",
|
|
||||||
...(stringhe_condizioni
|
|
||||||
? stringhe_condizioni.map((v) => String(v.stinga_id))
|
? stringhe_condizioni.map((v) => String(v.stinga_id))
|
||||||
: []),
|
: [];
|
||||||
];
|
|
||||||
const PrezzoSchema = z
|
const PrezzoSchema = z
|
||||||
.object({
|
.object({
|
||||||
desc_en: z.string(),
|
desc_en: z.string(),
|
||||||
desc_it: z.string(),
|
desc_it: z.string(),
|
||||||
idprezziario: z.custom<PrezziarioIdprezziario>(),
|
idprezziario: z.custom<PrezziarioIdprezziario>(),
|
||||||
isAcconto: z.boolean(),
|
|
||||||
isActive: z.boolean(),
|
isActive: z.boolean(),
|
||||||
isConsulenza: z.boolean(),
|
|
||||||
isSaldo: z.boolean(),
|
|
||||||
isStabile: z.boolean(),
|
|
||||||
isTransitorio: z.boolean(),
|
|
||||||
nome_en: z.string(),
|
nome_en: z.string(),
|
||||||
nome_it: z.string(),
|
nome_it: z.string(),
|
||||||
prezzo_cent: z.number().min(0),
|
prezzo_cent: z.number().min(0),
|
||||||
sconto: z.number().min(0).max(100),
|
sconto: z.number().min(0).max(100),
|
||||||
testo_condizioni: z.string().nullable(),
|
testo_condizioni: z.string().nullable(),
|
||||||
|
order_type: z.enum(OrderTypeEnum).nullable(),
|
||||||
|
service_type: z.enum(TipologiaPosizioneEnum).nullable(),
|
||||||
|
service_variant: z.number().nullable(),
|
||||||
})
|
})
|
||||||
.superRefine(({ testo_condizioni }, ctx) => {
|
.superRefine(({ testo_condizioni }, ctx) => {
|
||||||
if (testo_condizioni) {
|
if (testo_condizioni) {
|
||||||
|
|
@ -84,17 +83,15 @@ export const FormPrezzo = ({
|
||||||
desc_en: "",
|
desc_en: "",
|
||||||
desc_it: "",
|
desc_it: "",
|
||||||
idprezziario: "" as PrezziarioIdprezziario,
|
idprezziario: "" as PrezziarioIdprezziario,
|
||||||
isAcconto: false,
|
|
||||||
isActive: false,
|
isActive: false,
|
||||||
isConsulenza: false,
|
|
||||||
isSaldo: false,
|
|
||||||
isStabile: false,
|
|
||||||
isTransitorio: false,
|
|
||||||
nome_en: "",
|
nome_en: "",
|
||||||
nome_it: "",
|
nome_it: "",
|
||||||
prezzo_cent: 0,
|
prezzo_cent: 0,
|
||||||
sconto: 0,
|
sconto: 0,
|
||||||
testo_condizioni: "",
|
testo_condizioni: "",
|
||||||
|
order_type: null,
|
||||||
|
service_type: null,
|
||||||
|
service_variant: null,
|
||||||
};
|
};
|
||||||
|
|
||||||
z.config(z.locales.it());
|
z.config(z.locales.it());
|
||||||
|
|
@ -228,6 +225,13 @@ export const FormPrezzo = ({
|
||||||
>
|
>
|
||||||
ID Testo Condizioni
|
ID Testo Condizioni
|
||||||
</FormLabel>
|
</FormLabel>
|
||||||
|
{field.value !== null && (
|
||||||
|
<FieldResetButton
|
||||||
|
onClick={() =>
|
||||||
|
form.setValue("testo_condizioni", null)
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
<FormMessage />
|
<FormMessage />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -243,10 +247,9 @@ export const FormPrezzo = ({
|
||||||
elementId="select-testo-condizioni"
|
elementId="select-testo-condizioni"
|
||||||
elementName="testo_condizioni"
|
elementName="testo_condizioni"
|
||||||
isMulti={false}
|
isMulti={false}
|
||||||
|
key={`${field.value}-select-testo`}
|
||||||
onValueChange={async (value) => {
|
onValueChange={async (value) => {
|
||||||
if (value.value === "") {
|
if (value.value !== "") {
|
||||||
field.onChange(undefined);
|
|
||||||
} else {
|
|
||||||
field.onChange(
|
field.onChange(
|
||||||
stringhe_condizioni_options[
|
stringhe_condizioni_options[
|
||||||
Number.parseInt(value.value)
|
Number.parseInt(value.value)
|
||||||
|
|
@ -268,101 +271,116 @@ export const FormPrezzo = ({
|
||||||
<div className="flex w-full flex-col gap-4 md:w-1/3">
|
<div className="flex w-full flex-col gap-4 md:w-1/3">
|
||||||
<FormField
|
<FormField
|
||||||
control={form.control}
|
control={form.control}
|
||||||
name="isAcconto"
|
name="order_type"
|
||||||
render={({ field }) => (
|
render={({ field }) => (
|
||||||
<FormItem>
|
<FormItem>
|
||||||
<div className="flex flex-wrap items-center gap-x-2">
|
<div className="flex flex-wrap items-center gap-x-2">
|
||||||
<FormLabel htmlFor="isAcconto">Acconto</FormLabel>
|
<FormLabel htmlFor="select-order_type">
|
||||||
<FormControl>
|
Tipologia
|
||||||
<Switch
|
</FormLabel>
|
||||||
className="data-[state=checked]:bg-neutral-700"
|
{field.value !== null && (
|
||||||
defaultChecked={field.value}
|
<FieldResetButton
|
||||||
id="isAcconto"
|
onClick={() => form.setValue("order_type", null)}
|
||||||
onCheckedChange={field.onChange}
|
|
||||||
/>
|
/>
|
||||||
</FormControl>
|
)}
|
||||||
<FormMessage />
|
<FormMessage />
|
||||||
</div>
|
</div>
|
||||||
|
<FormControl>
|
||||||
|
<Select
|
||||||
|
defaultValue={field.value || ""}
|
||||||
|
key={`${field.value}-select-order_type`}
|
||||||
|
onValueChange={field.onChange}
|
||||||
|
>
|
||||||
|
<FormControl>
|
||||||
|
<SelectTrigger className="w-full">
|
||||||
|
<SelectValue placeholder="Seleziona tipologia" />
|
||||||
|
</SelectTrigger>
|
||||||
|
</FormControl>
|
||||||
|
<SelectContent id="select-order_type">
|
||||||
|
{Object.values(OrderTypeEnum).map((option) => (
|
||||||
|
<SelectItem key={option} value={option}>
|
||||||
|
{option}
|
||||||
|
</SelectItem>
|
||||||
|
))}
|
||||||
|
</SelectContent>
|
||||||
|
</Select>
|
||||||
|
</FormControl>
|
||||||
</FormItem>
|
</FormItem>
|
||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
<FormField
|
<FormField
|
||||||
control={form.control}
|
control={form.control}
|
||||||
name="isSaldo"
|
name="service_type"
|
||||||
render={({ field }) => (
|
render={({ field }) => (
|
||||||
<FormItem>
|
<FormItem>
|
||||||
<div className="flex flex-wrap items-center gap-x-2">
|
<div className="flex flex-wrap items-center gap-x-2">
|
||||||
<FormLabel htmlFor="isSaldo">Saldo</FormLabel>
|
<FormLabel htmlFor="select-service_type">
|
||||||
<FormControl>
|
Categoria
|
||||||
<Switch
|
</FormLabel>
|
||||||
className="data-[state=checked]:bg-neutral-700"
|
{field.value !== null && (
|
||||||
defaultChecked={field.value}
|
<FieldResetButton
|
||||||
id="isSaldo"
|
onClick={() => form.setValue("service_type", null)}
|
||||||
onCheckedChange={field.onChange}
|
|
||||||
/>
|
/>
|
||||||
</FormControl>
|
)}
|
||||||
<FormMessage />
|
<FormMessage />
|
||||||
</div>
|
</div>
|
||||||
|
<FormControl>
|
||||||
|
<Select
|
||||||
|
defaultValue={field.value || ""}
|
||||||
|
key={`${field.value}-select-service_type`}
|
||||||
|
onValueChange={field.onChange}
|
||||||
|
>
|
||||||
|
<FormControl>
|
||||||
|
<SelectTrigger className="w-full">
|
||||||
|
<SelectValue placeholder="Seleziona categoria" />
|
||||||
|
</SelectTrigger>
|
||||||
|
</FormControl>
|
||||||
|
<SelectContent id="select-service_type">
|
||||||
|
{Object.values(TipologiaPosizioneEnum).map(
|
||||||
|
(option) => (
|
||||||
|
<SelectItem key={option} value={option}>
|
||||||
|
{option}
|
||||||
|
</SelectItem>
|
||||||
|
),
|
||||||
|
)}
|
||||||
|
</SelectContent>
|
||||||
|
</Select>
|
||||||
|
</FormControl>
|
||||||
</FormItem>
|
</FormItem>
|
||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
<FormField
|
<FormField
|
||||||
control={form.control}
|
control={form.control}
|
||||||
name="isConsulenza"
|
name="service_variant"
|
||||||
render={({ field }) => (
|
render={({ field }) => (
|
||||||
<FormItem>
|
<FormItem>
|
||||||
<div className="flex flex-wrap items-center gap-x-2">
|
<div className="flex flex-wrap items-center gap-x-2">
|
||||||
<FormLabel htmlFor="isConsulenza">Consulenza</FormLabel>
|
<FormLabel htmlFor="service_variant">
|
||||||
<FormControl>
|
Variante Categoria
|
||||||
<Switch
|
</FormLabel>
|
||||||
className="data-[state=checked]:bg-neutral-700"
|
{field.value !== null && (
|
||||||
defaultChecked={field.value}
|
<FieldResetButton
|
||||||
id="isConsulenza"
|
onClick={() => form.setValue("service_variant", null)}
|
||||||
onCheckedChange={field.onChange}
|
|
||||||
/>
|
/>
|
||||||
</FormControl>
|
|
||||||
<FormMessage />
|
|
||||||
</div>
|
|
||||||
</FormItem>
|
|
||||||
)}
|
)}
|
||||||
/>
|
|
||||||
<FormField
|
|
||||||
control={form.control}
|
|
||||||
name="isTransitorio"
|
|
||||||
render={({ field }) => (
|
|
||||||
<FormItem>
|
|
||||||
<div className="flex flex-wrap items-center gap-x-2">
|
|
||||||
<FormLabel htmlFor="isTransitorio">Transitorio</FormLabel>
|
|
||||||
<FormControl>
|
|
||||||
<Switch
|
|
||||||
className="data-[state=checked]:bg-neutral-700"
|
|
||||||
defaultChecked={field.value}
|
|
||||||
id="isTransitorio"
|
|
||||||
onCheckedChange={field.onChange}
|
|
||||||
/>
|
|
||||||
</FormControl>
|
|
||||||
<FormMessage />
|
<FormMessage />
|
||||||
</div>
|
</div>
|
||||||
</FormItem>
|
|
||||||
)}
|
|
||||||
/>
|
|
||||||
<FormField
|
|
||||||
control={form.control}
|
|
||||||
name="isStabile"
|
|
||||||
render={({ field }) => (
|
|
||||||
<FormItem>
|
|
||||||
<div className="flex flex-wrap items-center gap-x-2">
|
|
||||||
<FormLabel htmlFor="isStabile">Stabile</FormLabel>
|
|
||||||
<FormControl>
|
<FormControl>
|
||||||
<Switch
|
<Input
|
||||||
className="data-[state=checked]:bg-neutral-700"
|
placeholder=""
|
||||||
defaultChecked={field.value}
|
{...field}
|
||||||
id="isStabile"
|
id="service_variant"
|
||||||
onCheckedChange={field.onChange}
|
onChange={(e) => {
|
||||||
|
const v = e.target.value.trim();
|
||||||
|
if (v !== null && v !== "") {
|
||||||
|
field.onChange(parseInt(v, 10));
|
||||||
|
} else {
|
||||||
|
field.onChange(null);
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
value={field.value !== null ? String(field.value) : ""}
|
||||||
/>
|
/>
|
||||||
</FormControl>
|
</FormControl>
|
||||||
<FormMessage />
|
|
||||||
</div>
|
|
||||||
</FormItem>
|
</FormItem>
|
||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
|
|
|
||||||
|
|
@ -68,7 +68,7 @@ const Schema = z
|
||||||
|
|
||||||
export type FormValues = z.infer<typeof Schema>;
|
export type FormValues = z.infer<typeof Schema>;
|
||||||
|
|
||||||
export const FormNewServizio = ({
|
export const FormServizio = ({
|
||||||
initialData,
|
initialData,
|
||||||
onSubmit,
|
onSubmit,
|
||||||
isLimited,
|
isLimited,
|
||||||
|
|
@ -290,7 +290,7 @@ export const FormNewServizio = ({
|
||||||
<FormControl>
|
<FormControl>
|
||||||
<MultiSelect
|
<MultiSelect
|
||||||
defaultValue={
|
defaultValue={
|
||||||
field.value
|
field.value !== null
|
||||||
? {
|
? {
|
||||||
label: t.parametri.permanenza[field.value] || "",
|
label: t.parametri.permanenza[field.value] || "",
|
||||||
value: field.value.toString(),
|
value: field.value.toString(),
|
||||||
|
|
@ -74,7 +74,7 @@ type InitialData = {
|
||||||
anagrafica: UsersAnagrafica | undefined;
|
anagrafica: UsersAnagrafica | undefined;
|
||||||
};
|
};
|
||||||
|
|
||||||
const FormNewServizioSchema = z.object({
|
const schema = z.object({
|
||||||
animali: z.boolean(),
|
animali: z.boolean(),
|
||||||
arredato: z.boolean(),
|
arredato: z.boolean(),
|
||||||
ascensore: z.boolean(),
|
ascensore: z.boolean(),
|
||||||
|
|
@ -109,9 +109,9 @@ const FormNewServizioSchema = z.object({
|
||||||
scadenza_motivazione_transitoria: z.date().nullable(),
|
scadenza_motivazione_transitoria: z.date().nullable(),
|
||||||
skipPayment: z.boolean(),
|
skipPayment: z.boolean(),
|
||||||
});
|
});
|
||||||
type FormNewServizioValues = z.infer<typeof FormNewServizioSchema>;
|
type FormServizioAcquistoValues = z.infer<typeof schema>;
|
||||||
|
|
||||||
export const FormNewServizioAcquisto = ({
|
export const FormServizioAcquisto = ({
|
||||||
initialData,
|
initialData,
|
||||||
userId,
|
userId,
|
||||||
isAdmin,
|
isAdmin,
|
||||||
|
|
@ -122,8 +122,8 @@ export const FormNewServizioAcquisto = ({
|
||||||
}) => {
|
}) => {
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const { comuni, nazioni } = useCatasto();
|
const { comuni, nazioni } = useCatasto();
|
||||||
console.log(isAdmin);
|
|
||||||
const schema = FormNewServizioSchema.superRefine(
|
const form_schema = schema.superRefine(
|
||||||
(
|
(
|
||||||
{
|
{
|
||||||
telefono,
|
telefono,
|
||||||
|
|
@ -270,7 +270,7 @@ export const FormNewServizioAcquisto = ({
|
||||||
);
|
);
|
||||||
|
|
||||||
// This can come from your database or API.
|
// This can come from your database or API.
|
||||||
const defaultValues: FormNewServizioValues = {
|
const defaultValues: FormServizioAcquistoValues = {
|
||||||
...initialData.userData,
|
...initialData.userData,
|
||||||
cap_recapiti: initialData.anagrafica?.cap_residenza || "",
|
cap_recapiti: initialData.anagrafica?.cap_residenza || "",
|
||||||
citta_recapiti: initialData.anagrafica?.comune_residenza || null,
|
citta_recapiti: initialData.anagrafica?.comune_residenza || null,
|
||||||
|
|
@ -291,7 +291,7 @@ export const FormNewServizioAcquisto = ({
|
||||||
const { locale, t } = useTranslation();
|
const { locale, t } = useTranslation();
|
||||||
z.config(z.locales[locale]());
|
z.config(z.locales[locale]());
|
||||||
|
|
||||||
const form = useZodForm(schema, {
|
const form = useZodForm(form_schema, {
|
||||||
defaultValues: defaultValues,
|
defaultValues: defaultValues,
|
||||||
});
|
});
|
||||||
const DatePickerLocale = locale === "it" ? it : enUS;
|
const DatePickerLocale = locale === "it" ? it : enUS;
|
||||||
|
|
@ -323,7 +323,7 @@ export const FormNewServizioAcquisto = ({
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
function onSubmit(fields: FormNewServizioValues) {
|
function onSubmit(fields: FormServizioAcquistoValues) {
|
||||||
const a: UsersAnagraficaUpdate = {
|
const a: UsersAnagraficaUpdate = {
|
||||||
cap_residenza: fields.cap_recapiti,
|
cap_residenza: fields.cap_recapiti,
|
||||||
civico_residenza: fields.civico_recapiti,
|
civico_residenza: fields.civico_recapiti,
|
||||||
|
|
@ -572,7 +572,7 @@ export const FormNewServizioAcquisto = ({
|
||||||
<FormControl>
|
<FormControl>
|
||||||
<MultiSelect
|
<MultiSelect
|
||||||
defaultValue={
|
defaultValue={
|
||||||
field.value
|
field.value != null
|
||||||
? {
|
? {
|
||||||
label:
|
label:
|
||||||
t.parametri.permanenza[field.value] || "",
|
t.parametri.permanenza[field.value] || "",
|
||||||
|
|
@ -1255,10 +1255,10 @@ const ResidenzaSection = ({
|
||||||
trigger,
|
trigger,
|
||||||
setValue,
|
setValue,
|
||||||
}: {
|
}: {
|
||||||
control: Control<FormNewServizioValues>;
|
control: Control<FormServizioAcquistoValues>;
|
||||||
trigger: (name?: keyof FormNewServizioValues) => Promise<boolean>;
|
trigger: (name?: keyof FormServizioAcquistoValues) => Promise<boolean>;
|
||||||
// biome-ignore lint/suspicious/noExplicitAny: <fine here>
|
// biome-ignore lint/suspicious/noExplicitAny: <fine here>
|
||||||
setValue: (field: keyof FormNewServizioValues, value: any) => void;
|
setValue: (field: keyof FormServizioAcquistoValues, value: any) => void;
|
||||||
}) => {
|
}) => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const { comuni, nazioni, provincie } = useCatasto();
|
const { comuni, nazioni, provincie } = useCatasto();
|
||||||
|
|
@ -130,12 +130,10 @@ const NewPrezzoModal = () => {
|
||||||
desc_en: "translations to be inserted",
|
desc_en: "translations to be inserted",
|
||||||
desc_it: "traduzioni da inserire",
|
desc_it: "traduzioni da inserire",
|
||||||
idprezziario: "" as PrezziarioIdprezziario,
|
idprezziario: "" as PrezziarioIdprezziario,
|
||||||
isAcconto: false,
|
order_type: null,
|
||||||
|
service_type: null,
|
||||||
|
service_variant: null,
|
||||||
isActive: true,
|
isActive: true,
|
||||||
isConsulenza: false,
|
|
||||||
isSaldo: false,
|
|
||||||
isStabile: false,
|
|
||||||
isTransitorio: false,
|
|
||||||
nome_en: "New service",
|
nome_en: "New service",
|
||||||
nome_it: "Nuovo servizio",
|
nome_it: "Nuovo servizio",
|
||||||
prezzo_cent: 0,
|
prezzo_cent: 0,
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ import type { GetServerSideProps } from "next";
|
||||||
import { AreaRiservataLayoutUserView } from "~/components/Layout";
|
import { AreaRiservataLayoutUserView } from "~/components/Layout";
|
||||||
import { LoadingPage } from "~/components/loading";
|
import { LoadingPage } from "~/components/loading";
|
||||||
import { Status500 } from "~/components/status-page";
|
import { Status500 } from "~/components/status-page";
|
||||||
import { FormNewServizioAcquisto } from "~/forms/FormNewServizioAcquisto";
|
import { FormServizioAcquisto } from "~/forms/FormServizioAcquisto";
|
||||||
import type { NextPageWithLayout } from "~/pages/_app";
|
import type { NextPageWithLayout } from "~/pages/_app";
|
||||||
import { CatastoProvider } from "~/providers/CatastoProvider";
|
import { CatastoProvider } from "~/providers/CatastoProvider";
|
||||||
import type { ServizioServizioId } from "~/schemas/public/Servizio";
|
import type { ServizioServizioId } from "~/schemas/public/Servizio";
|
||||||
|
|
@ -40,7 +40,7 @@ const OnboardUser: NextPageWithLayout<OnboardUserProps> = ({
|
||||||
</h3>
|
</h3>
|
||||||
</div>
|
</div>
|
||||||
<CatastoProvider>
|
<CatastoProvider>
|
||||||
<FormNewServizioAcquisto
|
<FormServizioAcquisto
|
||||||
initialData={data}
|
initialData={data}
|
||||||
isAdmin={true}
|
isAdmin={true}
|
||||||
userId={data.userData.id}
|
userId={data.userData.id}
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ import { AreaRiservataLayout } from "~/components/Layout";
|
||||||
import { LoadingPage } from "~/components/loading";
|
import { LoadingPage } from "~/components/loading";
|
||||||
import { OnboardTutorial } from "~/components/onboard_tutorial";
|
import { OnboardTutorial } from "~/components/onboard_tutorial";
|
||||||
import { Status500 } from "~/components/status-page";
|
import { Status500 } from "~/components/status-page";
|
||||||
import { FormNewServizioAcquisto } from "~/forms/FormNewServizioAcquisto";
|
import { FormServizioAcquisto } from "~/forms/FormServizioAcquisto";
|
||||||
import type { NextPageWithLayout } from "~/pages/_app";
|
import type { NextPageWithLayout } from "~/pages/_app";
|
||||||
import { CatastoProvider } from "~/providers/CatastoProvider";
|
import { CatastoProvider } from "~/providers/CatastoProvider";
|
||||||
import { useTranslation } from "~/providers/I18nProvider";
|
import { useTranslation } from "~/providers/I18nProvider";
|
||||||
|
|
@ -44,7 +44,7 @@ const OnboardServizio: NextPageWithLayout<OnboardServizioProps> = ({
|
||||||
</div>
|
</div>
|
||||||
<OnboardTutorial />
|
<OnboardTutorial />
|
||||||
<CatastoProvider>
|
<CatastoProvider>
|
||||||
<FormNewServizioAcquisto
|
<FormServizioAcquisto
|
||||||
initialData={data}
|
initialData={data}
|
||||||
isAdmin={false}
|
isAdmin={false}
|
||||||
userId={data.userData.id}
|
userId={data.userData.id}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
// @generated
|
// @generated
|
||||||
// This file is automatically generated by Kanel. Do not modify manually.
|
// This file is automatically generated by Kanel. Do not modify manually.
|
||||||
|
|
||||||
|
import type { default as OrderTypeEnum } from './OrderTypeEnum';
|
||||||
|
import type { default as TipologiaPosizioneEnum } from './TipologiaPosizioneEnum';
|
||||||
import type { ColumnType, Selectable, Insertable, Updateable } from 'kysely';
|
import type { ColumnType, Selectable, Insertable, Updateable } from 'kysely';
|
||||||
|
|
||||||
/** Identifier type for public.prezziario */
|
/** Identifier type for public.prezziario */
|
||||||
|
|
@ -26,15 +28,11 @@ export default interface PrezziarioTable {
|
||||||
|
|
||||||
sconto: ColumnType<number, number | undefined, number>;
|
sconto: ColumnType<number, number | undefined, number>;
|
||||||
|
|
||||||
isAcconto: ColumnType<boolean, boolean | undefined, boolean>;
|
order_type: ColumnType<OrderTypeEnum | null, OrderTypeEnum | null, OrderTypeEnum | null>;
|
||||||
|
|
||||||
isSaldo: ColumnType<boolean, boolean | undefined, boolean>;
|
service_type: ColumnType<TipologiaPosizioneEnum | null, TipologiaPosizioneEnum | null, TipologiaPosizioneEnum | null>;
|
||||||
|
|
||||||
isConsulenza: ColumnType<boolean, boolean | undefined, boolean>;
|
service_variant: ColumnType<number | null, number | null, number | null>;
|
||||||
|
|
||||||
isStabile: ColumnType<boolean, boolean | undefined, boolean>;
|
|
||||||
|
|
||||||
isTransitorio: ColumnType<boolean, boolean | undefined, boolean>;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export type Prezziario = Selectable<PrezziarioTable>;
|
export type Prezziario = Selectable<PrezziarioTable>;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue