From 49d49b42f1bf5d9f4ef905a28e01db4a6ea1030a Mon Sep 17 00:00:00 2001 From: Chop <28534054+RChopin@users.noreply.github.com> Date: Wed, 4 Jun 2025 22:53:33 +0200 Subject: [PATCH] feat: Add project type and status fields to project forms and views, including database migrations --- src/app/projects/[id]/page.js | 34 ++++++++++++++++++++-- src/app/projects/page.js | 20 +++++++++++++ src/components/ProjectForm.js | 20 +++++++++++++ src/components/ProjectStatusDropdown.js | 38 +++++++++++++++++++++++++ src/lib/init-db.js | 20 +++++++++++++ src/lib/queries/projects.js | 12 +++++--- 6 files changed, 138 insertions(+), 6 deletions(-) create mode 100644 src/components/ProjectStatusDropdown.js diff --git a/src/app/projects/[id]/page.js b/src/app/projects/[id]/page.js index 7f3f2fe..6cd521e 100644 --- a/src/app/projects/[id]/page.js +++ b/src/app/projects/[id]/page.js @@ -12,8 +12,8 @@ import { differenceInCalendarDays, parseISO } from "date-fns"; import PageContainer from "@/components/ui/PageContainer"; import PageHeader from "@/components/ui/PageHeader"; -export default async function ProjectViewPage({ params }) { - const { id } = await params; +export default function ProjectViewPage({ params }) { + const { id } = params; const project = getProjectWithContract(id); const notes = getNotesForProject(id); const daysRemaining = differenceInCalendarDays( @@ -141,6 +141,36 @@ export default async function ProjectViewPage({ params }) {

{project.notes}

)} +
+ + Typ projektu + +

+ {project.project_type === "design" + ? "Projektowanie" + : project.project_type === "construction" + ? "Realizacja" + : project.project_type === "design+construction" + ? "Projektowanie + Realizacja" + : "-"} +

+
+
+ + Status projektu + +

+ {project.project_status === "registered" + ? "Zarejestrowany" + : project.project_status === "in_progress_design" + ? "W realizacji (projektowanie)" + : project.project_status === "in_progress_construction" + ? "W realizacji (realizacja)" + : project.project_status === "fulfilled" + ? "Zakończony" + : "-"} +

+
diff --git a/src/app/projects/page.js b/src/app/projects/page.js index a712b71..1495415 100644 --- a/src/app/projects/page.js +++ b/src/app/projects/page.js @@ -192,6 +192,26 @@ export default function ProjectListPage() {
{project.finish_date || "N/A"}
+
+ {project.project_type === "design" + ? "Projektowanie" + : project.project_type === "construction" + ? "Realizacja" + : project.project_type === "design+construction" + ? "Projektowanie + Realizacja" + : "-"} +
+
+ {project.project_status === "registered" + ? "Zarejestrowany" + : project.project_status === "in_progress_design" + ? "W realizacji (projektowanie)" + : project.project_status === "in_progress_construction" + ? "W realizacji (realizacja)" + : project.project_status === "fulfilled" + ? "Zakończony" + : "-"} +
+ {/* Project Type Dropdown */} +
+ + +
+ {/* Other fields */} {[ ["project_name", "Nazwa projektu"], diff --git a/src/components/ProjectStatusDropdown.js b/src/components/ProjectStatusDropdown.js new file mode 100644 index 0000000..0033f99 --- /dev/null +++ b/src/components/ProjectStatusDropdown.js @@ -0,0 +1,38 @@ +"use client"; + +import { useState } from "react"; + +export default function ProjectStatusDropdown({ project, onStatusChange }) { + const [status, setStatus] = useState(project.project_status); + const [loading, setLoading] = useState(false); + + const handleChange = async (e) => { + const newStatus = e.target.value; + setStatus(newStatus); + setLoading(true); + await fetch(`/api/projects/${project.project_id}`, { + method: "PUT", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ ...project, project_status: newStatus }), + }); + setLoading(false); + if (onStatusChange) onStatusChange(newStatus); + }; + + return ( + + ); +} diff --git a/src/lib/init-db.js b/src/lib/init-db.js index ef08fdd..d893042 100644 --- a/src/lib/init-db.js +++ b/src/lib/init-db.js @@ -30,6 +30,8 @@ export default function initializeDatabase() { wp TEXT, contact TEXT, notes TEXT, + project_type TEXT CHECK(project_type IN ('design', 'construction', 'design+construction')) DEFAULT 'design', + project_status TEXT CHECK(project_status IN ('registered', 'in_progress_design', 'in_progress_construction', 'fulfilled')) DEFAULT 'registered', FOREIGN KEY (contract_id) REFERENCES contracts(contract_id) ); @@ -98,4 +100,22 @@ export default function initializeDatabase() { } catch (e) { // Column already exists, ignore error } + + // Migration: Add project_type column to projects table + try { + db.exec(` + ALTER TABLE projects ADD COLUMN project_type TEXT CHECK(project_type IN ('design', 'construction', 'design+construction')) DEFAULT 'design'; + `); + } catch (e) { + // Column already exists, ignore error + } + + // Migration: Add project_status column to projects table + try { + db.exec(` + ALTER TABLE projects ADD COLUMN project_status TEXT CHECK(project_status IN ('registered', 'in_progress_design', 'in_progress_construction', 'fulfilled')) DEFAULT 'registered'; + `); + } catch (e) { + // Column already exists, ignore error + } } diff --git a/src/lib/queries/projects.js b/src/lib/queries/projects.js index 03d2964..a39b7ca 100644 --- a/src/lib/queries/projects.js +++ b/src/lib/queries/projects.js @@ -42,8 +42,8 @@ export function createProject(data) { const stmt = db.prepare(` INSERT INTO projects ( contract_id, project_name, project_number, address, plot, district, unit, city, investment_number, finish_date, - wp, contact, notes - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + wp, contact, notes, project_type, project_status + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) `); stmt.run( data.contract_id, @@ -58,7 +58,9 @@ export function createProject(data) { data.finish_date, data.wp, data.contact, - data.notes + data.notes, + data.project_type || "design", + data.project_status || "registered" ); } @@ -66,7 +68,7 @@ export function updateProject(id, data) { const stmt = db.prepare(` UPDATE projects SET contract_id = ?, project_name = ?, project_number = ?, address = ?, plot = ?, district = ?, unit = ?, city = ?, - investment_number = ?, finish_date = ?, wp = ?, contact = ?, notes = ? + investment_number = ?, finish_date = ?, wp = ?, contact = ?, notes = ?, project_type = ?, project_status = ? WHERE project_id = ? `); stmt.run( @@ -83,6 +85,8 @@ export function updateProject(id, data) { data.wp, data.contact, data.notes, + data.project_type || "design", + data.project_status || "registered", id ); }