diff --git a/apps/infoalloggi/src/components/annunci_map.tsx b/apps/infoalloggi/src/components/annunci_map.tsx index 1767605..befb373 100644 --- a/apps/infoalloggi/src/components/annunci_map.tsx +++ b/apps/infoalloggi/src/components/annunci_map.tsx @@ -50,7 +50,7 @@ const MapDisplay = memo( }: { selectTipo: string; selectComune: string; - selectConsegna: number | null; + selectConsegna: number[] | null; setSelected: Dispatch>; }) => { const { data, isLoading } = api.annunci.getMapping.useQuery({ diff --git a/apps/infoalloggi/src/i18n/it.ts b/apps/infoalloggi/src/i18n/it.ts index 6e41b39..d17a8f8 100644 --- a/apps/infoalloggi/src/i18n/it.ts +++ b/apps/infoalloggi/src/i18n/it.ts @@ -289,7 +289,7 @@ export const it: LangDict = { Faqs.come_confermare, ], comune: "Comune", - consegna: "Consegna", + consegna: "Disponibile da", filtri_attivi: "Filtri attivi", filtri_reset: "Reset filtri", filtro_attivo: "Filtro attivo", diff --git a/apps/infoalloggi/src/pages/annunci.tsx b/apps/infoalloggi/src/pages/annunci.tsx index 8859552..fc6f30c 100644 --- a/apps/infoalloggi/src/pages/annunci.tsx +++ b/apps/infoalloggi/src/pages/annunci.tsx @@ -123,21 +123,14 @@ const Filters = () => { setTipo, comune, setComune, - consegna, - setConsegna, sort, setSort, comuniOptions, tipologieOptions, - consegnaOptions, ResetParams, nFiltri, } = useRicerca(); - const mappedConsegnaOptions = useMemo( - // biome-ignore lint/style/noNonNullAssertion: - () => consegnaOptions.map((m) => t.parametri.mesi[m]!).filter(Boolean), - [consegnaOptions, t.parametri.mesi], - ); + return ( <> { placeholder={t.seleziona_placeholder} value={comune} /> - + {/* { await setConsegna(null); @@ -187,7 +181,7 @@ const Filters = () => { options={mappedConsegnaOptions} placeholder={t.seleziona_placeholder} value={consegna ? t.parametri.mesi[consegna] || "" : ""} - /> + /> */} { @@ -274,7 +268,7 @@ const RicercaHeader = () => {
); }; + +const ConsegnaFilter = () => { + const { t } = useTranslation(); + const { + consegna: consegna2, + setConsegna: setConsegna2, + + consegnaOptions, + } = useRicerca(); + + const mappedConsegnaOptions = useMemo(() => { + if (consegnaOptions.length === 0) return []; + return consegnaOptions + .map((c) => + t.parametri.mesi[c] ? { value: c, label: t.parametri.mesi[c] } : null, + ) + .filter((v) => v !== null); + }, [consegnaOptions, t.parametri.mesi]); + + const onValueChange = async (value: number) => { + if (consegna2?.includes(value)) { + // Remove value + const newConsegna2 = consegna2.filter((c) => c !== value); + await setConsegna2(newConsegna2.length > 0 ? newConsegna2 : null); + return; + } + // Add value + const newConsegna2 = consegna2 ? [...consegna2, value] : [value]; + await setConsegna2(newConsegna2); + return; + }; + return ( +
+
+ + {consegna2 !== null && consegna2.length > 0 && ( + + )} +
+ +
+ {mappedConsegnaOptions.map(({ value, label }) => ( + + ))} +
+
+ ); +}; diff --git a/apps/infoalloggi/src/providers/RicercaProvider.tsx b/apps/infoalloggi/src/providers/RicercaProvider.tsx index 58bd038..38eca2e 100644 --- a/apps/infoalloggi/src/providers/RicercaProvider.tsx +++ b/apps/infoalloggi/src/providers/RicercaProvider.tsx @@ -1,5 +1,6 @@ "use client"; import { + parseAsArrayOf, parseAsBoolean, parseAsInteger, parseAsString, @@ -28,9 +29,10 @@ type RicercaContextType = { setComune: ( value: string | ((old: string) => string | null) | null, ) => Promise; - consegna: number | null; + + consegna: number[] | null; setConsegna: ( - value: number | ((old: number | null) => number | null) | null, + value: number[] | ((old: number[] | null) => number[] | null) | null, ) => Promise; sort: SortTypes; setSort: ( @@ -88,7 +90,7 @@ export const RicercaProvider: FC<{ ); const [consegna, setConsegna] = useQueryState( "consegna", - parseAsInteger.withOptions({ startTransition }), + parseAsArrayOf(parseAsInteger).withOptions({ startTransition }), ); const [sort, setSort] = useQueryState( "sort", @@ -101,7 +103,7 @@ export const RicercaProvider: FC<{ const set = new Set(); options.forEach((item) => { if (!comune || item.comune === comune) { - if (!consegna || item.consegna === consegna) { + if (!consegna || consegna.includes(item.consegna)) { set.add(item.tipo); } } @@ -113,7 +115,7 @@ export const RicercaProvider: FC<{ const set = new Set(); options.forEach((item) => { if (!tipo || item.tipo === tipo) { - if (!consegna || item.consegna === consegna) { + if (!consegna || consegna.includes(item.consegna)) { set.add(item.comune); } } @@ -159,24 +161,27 @@ export const RicercaProvider: FC<{ {children} diff --git a/apps/infoalloggi/src/server/api/routers/annunci.ts b/apps/infoalloggi/src/server/api/routers/annunci.ts index 979471b..8ab575e 100644 --- a/apps/infoalloggi/src/server/api/routers/annunci.ts +++ b/apps/infoalloggi/src/server/api/routers/annunci.ts @@ -71,7 +71,7 @@ export const annunciRouter = createTRPCRouter({ .input( z.object({ comune: z.string().optional(), - consegna: z.number().optional(), + consegna: z.number().array().optional(), tipologia: z.string().optional(), }), ) @@ -94,7 +94,7 @@ export const annunciRouter = createTRPCRouter({ .input( z.object({ comune: z.string().optional(), - consegna: z.number().optional(), + consegna: z.number().array().optional(), sort: z.enum(["Recenti", "Prezzo", "Consegna", "Mq"]).optional(), tipologia: z.string().optional(), }), diff --git a/apps/infoalloggi/src/server/controllers/annunci.controller.ts b/apps/infoalloggi/src/server/controllers/annunci.controller.ts index eef80db..720f697 100644 --- a/apps/infoalloggi/src/server/controllers/annunci.controller.ts +++ b/apps/infoalloggi/src/server/controllers/annunci.controller.ts @@ -180,7 +180,7 @@ export const get_AnnunciPositionsHandler = async ({ }: { tipologia?: string; comune?: string; - consegna?: number; + consegna?: number[]; }): Promise => { try { let query = db @@ -222,7 +222,7 @@ export const get_AnnunciPositionsHandler = async ({ query = query.where("comune", "like", comune); } if (consegna) { - query = query.where("consegna", "=", consegna); + query = query.where("consegna", "in", consegna); } const annunci = await query.execute(); @@ -273,7 +273,7 @@ export const getAnnunciRicerca = async ({ }: { tipologia?: string; comune?: string; - consegna?: number; + consegna?: number[]; sort?: "Recenti" | "Prezzo" | "Consegna" | "Mq"; }): Promise => { try { @@ -313,7 +313,7 @@ export const getAnnunciRicerca = async ({ query = query.where("comune", "like", comune); } if (consegna) { - query = query.where("consegna", "=", consegna); + query = query.where("consegna", "in", consegna); } switch (sort) {