diff --git a/apps/infoalloggi/src/components/KabanExample.tsx b/apps/infoalloggi/src/components/KabanExample.tsx deleted file mode 100644 index b77bf86..0000000 --- a/apps/infoalloggi/src/components/KabanExample.tsx +++ /dev/null @@ -1,117 +0,0 @@ -"use client"; - -import { useState } from "react"; -import { Avatar, AvatarFallback, AvatarImage } from "~/components/ui/avatar"; -import { - KanbanBoard, - KanbanCard, - KanbanCards, - KanbanHeader, - KanbanProvider, -} from "~/components/ui/kanban"; - -const columns = [ - { id: "todo", name: "To Do", color: "red" }, - { id: "inprogress", name: "In Progress", color: "blue" }, - { id: "done", name: "Done", color: "green" }, -]; -const exampleFeatures = [ - { - id: "1", - name: "Design new homepage", - column: "todo", - startAt: new Date("2024-06-01"), - endAt: new Date("2024-06-10"), - owner: { - name: "Alice", - image: "https://i.pravatar.cc/150?img=1", - }, - }, - { - id: "2", - name: "Implement authentication", - column: "inprogress", - startAt: new Date("2024-06-05"), - endAt: new Date("2024-06-15"), - owner: { - name: "Bob", - image: "https://i.pravatar.cc/150?img=2", - }, - }, - { - id: "3", - name: "Set up database", - column: "done", - startAt: new Date("2024-05-20"), - endAt: new Date("2024-05-30"), - owner: { - name: "Charlie", - image: "https://i.pravatar.cc/150?img=3", - }, - }, -]; - -const dateFormatter = new Intl.DateTimeFormat("en-US", { - month: "short", - day: "numeric", - year: "numeric", -}); -const shortDateFormatter = new Intl.DateTimeFormat("en-US", { - month: "short", - day: "numeric", -}); -const Example = () => { - const [features, setFeatures] = useState(exampleFeatures); - return ( - - {(column) => ( - - -
-
- {column.name} -
- - - {(feature: (typeof features)[number]) => ( - -
-
-

- {feature.name} -

-
- {feature.owner && ( - - - - {feature.owner.name?.slice(0, 2)} - - - )} -
-

- {shortDateFormatter.format(feature.startAt)} -{" "} - {dateFormatter.format(feature.endAt)} -

-
- )} -
- - )} - - ); -}; -export default Example; diff --git a/apps/infoalloggi/src/components/area-riservata/potenziali.tsx b/apps/infoalloggi/src/components/area-riservata/potenziali.tsx new file mode 100644 index 0000000..8a6257c --- /dev/null +++ b/apps/infoalloggi/src/components/area-riservata/potenziali.tsx @@ -0,0 +1,179 @@ +"use client"; + +import { format } from "date-fns"; +import { + KanbanBoard, + KanbanCard, + KanbanCards, + KanbanHeader, + KanbanProvider, +} from "~/components/ui/kanban"; +import { + type ElementoPotenziali, + PotenzialiProvider, + usePotenziali, +} from "~/providers/PotenzialiProvider"; +import type { UsersId } from "~/schemas/public/Users"; +import { + ContextMenu, + ContextMenuContent, + ContextMenuItem, + ContextMenuTrigger, +} from "../ui/context-menu"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, +} from "../ui/dialog"; +import { UserAvatar } from "../user_avatar"; + +const columns = [ + { id: "todo", name: "To Do", color: "red" }, + { id: "inprogress", name: "In Progress", color: "blue" }, + { id: "done", name: "Done", color: "green" }, +]; + +const SampleData: ElementoPotenziali[] = [ + { + id: "1", + name: "Mario Rossi", + column: "todo", + descrizione: + "Single, cerca appartamento in centro da subito, budget 800 euro", + createdAt: new Date(), + owner: { + userId: "019b9a25-eff1-420a-9017-b0add205d7b6" as UsersId, + username: "Marco Pedone", + }, + }, + { + id: "2", + name: "Luigi Bianchi", + column: "inprogress", + descrizione: "Coppia, cerca bilocale in periferia, budget 600 euro", + createdAt: new Date(), + owner: null, + }, + { + id: "3", + name: "Giovanni Verdi", + column: "done", + descrizione: + "Famiglia con 2 figli, cerca trilocale vicino a scuole, budget 1000 euro", + createdAt: new Date(), + owner: { + userId: "019b9a25-eff1-420a-9017-b0add205d7b6" as UsersId, + username: "Marco Pedone", + }, + }, +]; + +const Potenziali = () => { + return ( + + + + ); +}; + +const Kaban = () => { + const { data, updateData, setEditingId, editingId, removeItem } = + usePotenziali(); + + return ( + <> + + {(column) => ( + + +
+
+ {column.name} +
+ + + {(data: ElementoPotenziali) => ( + + + +
+
+

+ {data.name} +

+
+ {data.owner && ( + + )} +
+

+ {format(data.createdAt, "dd/MM/yyyy HH:mm")} +

+
+
+ + { + setEditingId(data.id); + }} + > + Modifica + + + removeItem(data.id)}> + Elimina + + +
+ )} +
+ + )} + + { + if (!v) { + setEditingId(null); + } + }} + open={!!editingId} + > + + + + ); +}; + +const EditingContent = () => { + const { getEditingItem } = usePotenziali(); + const item = getEditingItem(); + if (!item) return null; + return ( + + + Modifica {item.name} + desc + +
+

Descrizione: {item.descrizione}

+

Creato il: {format(item.createdAt, "dd/MM/yyyy HH:mm")}

+

Utente Assegnato: {item.owner ? item.owner.username : "Nessuno"}

+
+
+ ); +}; + +export default Potenziali; diff --git a/apps/infoalloggi/src/i18n/en.ts b/apps/infoalloggi/src/i18n/en.ts index 15a6226..5be715c 100644 --- a/apps/infoalloggi/src/i18n/en.ts +++ b/apps/infoalloggi/src/i18n/en.ts @@ -605,6 +605,7 @@ export const en: LangDict = { { icon: "cog", items: [ + { href: "/area-riservata/admin/potenziali", title: "Potenziali" }, { href: "/area-riservata/admin/utenti", title: "Users" }, { href: "/area-riservata/admin/chats", title: "Chat List" }, { href: "/area-riservata/admin/ordini", title: "Orders" }, diff --git a/apps/infoalloggi/src/i18n/it.ts b/apps/infoalloggi/src/i18n/it.ts index 726d7e3..8dd18f6 100644 --- a/apps/infoalloggi/src/i18n/it.ts +++ b/apps/infoalloggi/src/i18n/it.ts @@ -610,6 +610,7 @@ export const it: LangDict = { { icon: "cog", items: [ + { href: "/area-riservata/admin/potenziali", title: "Potenziali" }, { href: "/area-riservata/admin/utenti", title: "Utenti" }, { href: "/area-riservata/admin/chats", title: "Lista Chat" }, { href: "/area-riservata/admin/ordini", title: "Ordini" }, diff --git a/apps/infoalloggi/src/pages/area-riservata/admin/potenziali.tsx b/apps/infoalloggi/src/pages/area-riservata/admin/potenziali.tsx new file mode 100644 index 0000000..e7d2726 --- /dev/null +++ b/apps/infoalloggi/src/pages/area-riservata/admin/potenziali.tsx @@ -0,0 +1,53 @@ +import dynamic from "next/dynamic"; +import { AreaRiservataLayout } from "~/components/Layout"; +import { LoadingPage } from "~/components/loading"; +import type { NextPageWithLayout } from "~/pages/_app"; + +const Potenziali = dynamic( + () => import("~/components/area-riservata/potenziali"), + { + loading: () => , + ssr: false, + }, +); + +const AdminPotenziali: NextPageWithLayout = () => { + return ( +
+
+
+
+

+ Potenziali +

+
+
+
+ +
+
+
+ ); +}; +export default AdminPotenziali; + +// export const getServerSideProps = (async (context) => { +// const access_token = context.req.cookies.access_token; + +// const helpers = await TrpcAuthedFetchingIstance({ access_token }); +// if (helpers) { +// await helpers.trpc.etichette.getAllEtichette.prefetch(); +// return { +// props: { +// trpcState: helpers.trpc.dehydrate(), +// }, +// }; +// } +// return { +// props: {}, +// }; +// }) satisfies GetServerSideProps; + +AdminPotenziali.getLayout = function getLayout(page) { + return {page}; +}; diff --git a/apps/infoalloggi/src/pages/test.tsx b/apps/infoalloggi/src/pages/test.tsx index e64a66e..7e009b8 100644 --- a/apps/infoalloggi/src/pages/test.tsx +++ b/apps/infoalloggi/src/pages/test.tsx @@ -1,18 +1,7 @@ -import dynamic from "next/dynamic"; -import { LoadingPage } from "~/components/loading"; import type { NextPageWithLayout } from "./_app"; -const Kaban = dynamic(() => import("~/components/KabanExample"), { - loading: () => , - ssr: false, -}); - const Test: NextPageWithLayout = () => { - return ( -
- -
- ); + return
asdsad
; }; export default Test; diff --git a/apps/infoalloggi/src/providers/PotenzialiProvider.tsx b/apps/infoalloggi/src/providers/PotenzialiProvider.tsx new file mode 100644 index 0000000..100fcd4 --- /dev/null +++ b/apps/infoalloggi/src/providers/PotenzialiProvider.tsx @@ -0,0 +1,66 @@ +import { createContext, useContext, useState } from "react"; +import type { UsersId } from "~/schemas/public/Users"; + +export type ElementoPotenziali = { + id: string; + name: string; + column: string; + descrizione: string; + createdAt: Date; + owner: { userId: UsersId; username: string } | null; +}; +type PotenzialiContextType = { + data: ElementoPotenziali[]; + editingId: string | null; + updateData: (data: ElementoPotenziali[]) => void; + setEditingId: (id: string | null) => void; + getEditingItem: () => ElementoPotenziali | null; + addItem: (item: ElementoPotenziali) => void; + removeItem: (id: string) => void; +}; + +const PotenzialiContext = createContext(null); + +type PotenzialiProviderProps = { + children: React.ReactNode; + data: ElementoPotenziali[]; +}; +export const PotenzialiProvider = ({ + children, + data: initial, +}: PotenzialiProviderProps) => { + const [data, setData] = useState(initial); + const [editingId, setEditingId] = useState(null); + + const getEditingItem = () => { + return data.find((item) => item.id === editingId) || null; + }; + const addItem = (item: ElementoPotenziali) => { + setData((prev) => [...prev, item]); + }; + const removeItem = (id: string) => { + setData((prev) => prev.filter((item) => item.id !== id)); + }; + return ( + + {children} + + ); +}; +export const usePotenziali = () => { + const context = useContext(PotenzialiContext); + if (!context) { + throw new Error("usePotenziali must be used within a PotenzialiProvider"); + } + return context; +};