fix: fixed map and client list

This commit is contained in:
Mouad Lahlal 2025-11-20 10:55:03 +01:00
parent fc729c6b77
commit ee3bb84269
11 changed files with 44 additions and 32 deletions

View file

@ -0,0 +1,2 @@
-- AlterTable
ALTER TABLE "Cliente" ALTER COLUMN "sede_url" SET DATA TYPE TEXT;

View file

@ -42,7 +42,7 @@ model Cliente {
partita_iva String @db.VarChar(255) partita_iva String @db.VarChar(255)
telefono String @db.VarChar(255) telefono String @db.VarChar(255)
sede String @db.VarChar(255) sede String @db.VarChar(255)
sede_url String @db.VarChar(255) sede_url String
contratto String @db.VarChar(255) contratto String @db.VarChar(255)
lat Float lat Float
lon Float lon Float

View file

@ -1,4 +1,4 @@
import { PrismaClient } from "@/generated/prisma"; import { Modello, PrismaClient } from "@/generated/prisma";
export async function GET(request: Request) { export async function GET(request: Request) {
const prisma = new PrismaClient(); const prisma = new PrismaClient();
@ -16,9 +16,24 @@ export async function GET(request: Request) {
return Response.json({ clients }); return Response.json({ clients });
} }
function extractLatLonFromGmapsUrl(url: string) {
// Usa una regex per cercare la latitudine e la longitudine nell'URL
const regex = /@(-?\d+\.\d+),(-?\d+\.\d+)/;
const match = url.match(regex);
if (match) {
const lat = parseFloat(match[1]);
const lon = parseFloat(match[2]);
return [lat, lon]; // Restituisce un array con latitudine e longitudine
} else {
return [0, 0]; // Se non trova latitudine e longitudine
}
}
export async function POST(request: Request) { export async function POST(request: Request) {
const prisma = new PrismaClient(); const prisma = new PrismaClient();
const data = await request.json(); const data = await request.json();
const [lat, lon] = extractLatLonFromGmapsUrl(data.sede_url);
await prisma.cliente.create({ await prisma.cliente.create({
data: { data: {
@ -29,8 +44,12 @@ export async function POST(request: Request) {
sede: data.sede, sede: data.sede,
sede_url: data.sede_url, sede_url: data.sede_url,
telefono: data.telefono, telefono: data.telefono,
registratori: { lat: lat,
lon: lon,
/*registratori: {
create: { create: {
id: "80E1758414",
modello: Modello.FORM100,
interventi: { interventi: {
create: { create: {
data: new Date("2025-10-30"), data: new Date("2025-10-30"),
@ -39,7 +58,7 @@ export async function POST(request: Request) {
}, },
}, },
}, },
}, },*/
}, },
}); });

View file

@ -17,7 +17,6 @@ export default function Page() {
async function getClienti() { async function getClienti() {
const req = await fetch(`/api/clienti`); const req = await fetch(`/api/clienti`);
const data = await req.json(); const data = await req.json();
console.log(data.clients);
setClienti(data.clients); setClienti(data.clients);
} }
@ -26,7 +25,10 @@ export default function Page() {
return ( return (
<div id="map" className="w-full h-full border rounded-md m-0 p-0"> <div id="map" className="w-full h-full border rounded-md m-0 p-0">
<MapWithNoSSR highlight={client} clienti={clienti} /> <MapWithNoSSR
highlight={clienti?.find((cliente) => cliente.id == +(client || -1))}
clienti={clienti}
/>
</div> </div>
); );
} }

View file

@ -155,10 +155,6 @@ export function AppSidebar({ ...props }: React.ComponentProps<typeof Sidebar>) {
setClientPathname(pathname); setClientPathname(pathname);
}, [pathname]); }, [pathname]);
useEffect(() => {
console.log();
}, [clientPathname]);
return ( return (
<Sidebar <Sidebar
collapsible="icon" collapsible="icon"

View file

@ -14,7 +14,7 @@ const Map = ({
highlight, highlight,
clienti, clienti,
}: { }: {
highlight?: string; highlight?: Cliente;
clienti: Array<Cliente>; clienti: Array<Cliente>;
}) => { }) => {
const positions = [ const positions = [
@ -55,7 +55,7 @@ const Map = ({
<MapContainer <MapContainer
center={ center={
highlight highlight
? positions.find((client) => client.name == highlight)?.position ? [highlight.lat, highlight.lon]
: [45.54157745559809, 10.211896906975962] : [45.54157745559809, 10.211896906975962]
} }
zoom={13} zoom={13}
@ -74,6 +74,7 @@ const Map = ({
draggable={false} draggable={false}
animate={false} animate={false}
icon={customMarker} icon={customMarker}
key={client.id}
> >
<Popup className=""> <Popup className="">
<div className="flex flex-row gap-5"> <div className="flex flex-row gap-5">
@ -108,9 +109,7 @@ const Map = ({
) )
) : ( ) : (
<Marker <Marker
position={ position={[highlight.lat, highlight.lon]}
positions.find((client) => client.name == highlight)?.position
}
draggable={false} draggable={false}
animate={false} animate={false}
icon={customMarker} icon={customMarker}
@ -119,7 +118,7 @@ const Map = ({
<div className="flex flex-row gap-5"> <div className="flex flex-row gap-5">
<div> <div>
<span className="block text-sm font-bold"> <span className="block text-sm font-bold">
{positions.find((client) => client.name == highlight)?.name} {highlight.ragione_sociale}
</span> </span>
<div className="flex gap-2"> <div className="flex gap-2">
<span className="text-xs font-semibold">P.IVA</span> <span className="text-xs font-semibold">P.IVA</span>
@ -129,13 +128,7 @@ const Map = ({
<Tooltip> <Tooltip>
<TooltipTrigger asChild> <TooltipTrigger asChild>
<a <a href={highlight.sede_url} target="blank">
href={
positions.find((client) => client.name == highlight)
?.sede_url
}
target="blank"
>
<Button variant="outline"> <Button variant="outline">
<MapIcon className="size-4" /> <MapIcon className="size-4" />
</Button> </Button>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,5 +1,5 @@
{ {
"name": "prisma-client-58455549b989c60e3bedecbaad5fb747da20ec4980d09c51c40211ff854da52b", "name": "prisma-client-5f7d234f39789de56f24e3f97fcb730daf5c78fb0ef54bab42a661559a87fb78",
"main": "index.js", "main": "index.js",
"types": "index.d.ts", "types": "index.d.ts",
"browser": "default.js", "browser": "default.js",

View file

@ -195,8 +195,8 @@ const config = {
} }
} }
}, },
"inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n output = \"../src/generated/prisma\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n url = env(\"DATABASE_URL\")\n}\n\nenum Modello {\n FORM100\n FORM200\n FORM200PLUS\n FORM500\n}\n\nmodel Intervento {\n id Int @id @default(autoincrement())\n id_registratore String\n data DateTime @db.Date\n lavoro String @db.Text\n fattura Boolean @db.Boolean\n registratore Registratore @relation(fields: [id_registratore], references: [id])\n}\n\nmodel Registratore {\n id String @id\n id_cliente Int\n modello Modello?\n data_acquisto DateTime? @db.Date\n ultima_verifica DateTime? @db.Date\n prossima_verifica DateTime? @db.Date\n cliente Cliente @relation(fields: [id_cliente], references: [id])\n interventi Intervento[]\n}\n\nmodel Cliente {\n id Int @id @default(autoincrement())\n ragione_sociale String @unique @db.VarChar(255)\n email String @db.VarChar(255)\n partita_iva String @db.VarChar(255)\n telefono String @db.VarChar(255)\n sede String @db.VarChar(255)\n sede_url String @db.VarChar(255)\n contratto String @db.VarChar(255)\n lat Float\n lon Float\n registratori Registratore[]\n}\n", "inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n output = \"../src/generated/prisma\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n url = env(\"DATABASE_URL\")\n}\n\nenum Modello {\n FORM100\n FORM200\n FORM200PLUS\n FORM500\n}\n\nmodel Intervento {\n id Int @id @default(autoincrement())\n id_registratore String\n data DateTime @db.Date\n lavoro String @db.Text\n fattura Boolean @db.Boolean\n registratore Registratore @relation(fields: [id_registratore], references: [id])\n}\n\nmodel Registratore {\n id String @id\n id_cliente Int\n modello Modello?\n data_acquisto DateTime? @db.Date\n ultima_verifica DateTime? @db.Date\n prossima_verifica DateTime? @db.Date\n cliente Cliente @relation(fields: [id_cliente], references: [id])\n interventi Intervento[]\n}\n\nmodel Cliente {\n id Int @id @default(autoincrement())\n ragione_sociale String @unique @db.VarChar(255)\n email String @db.VarChar(255)\n partita_iva String @db.VarChar(255)\n telefono String @db.VarChar(255)\n sede String @db.VarChar(255)\n sede_url String\n contratto String @db.VarChar(255)\n lat Float\n lon Float\n registratori Registratore[]\n}\n",
"inlineSchemaHash": "3424ce1a172605bbf2b32e4c6ada582172d780cc98a6e12f826a26c0cc5b9555", "inlineSchemaHash": "9bd9d1485d1021de6ddd08a2040ad878357151b96b361e965ef2ca00c0bca296",
"copyEngine": true "copyEngine": true
} }
config.dirname = '/' config.dirname = '/'