feat: Add project type and status fields to project forms and views, including database migrations

This commit is contained in:
Chop
2025-06-04 22:53:33 +02:00
parent e136c9f0e8
commit 49d49b42f1
6 changed files with 138 additions and 6 deletions

View File

@@ -17,6 +17,8 @@ export default function ProjectForm({ initialData = null }) {
wp: "",
contact: "",
notes: "",
project_type: initialData?.project_type || "design",
// project_status is not included in the form for creation or editing
...initialData,
});
@@ -74,6 +76,24 @@ export default function ProjectForm({ initialData = null }) {
</select>
</div>
{/* Project Type Dropdown */}
<div>
<label className="block font-medium">Typ projektu</label>
<select
name="project_type"
value={form.project_type}
onChange={handleChange}
className="border p-2 w-full"
required
>
<option value="design">Projektowanie</option>
<option value="construction">Realizacja</option>
<option value="design+construction">
Projektowanie + Realizacja
</option>
</select>
</div>
{/* Other fields */}
{[
["project_name", "Nazwa projektu"],

View File

@@ -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 (
<select
name="project_status"
value={status}
onChange={handleChange}
className="ml-2 border p-1 rounded"
disabled={loading}
>
<option value="registered">Zarejestrowany</option>
<option value="in_progress_design">W realizacji (projektowanie)</option>
<option value="in_progress_construction">
W realizacji (realizacja)
</option>
<option value="fulfilled">Zakończony</option>
</select>
);
}