Fixed Projects/Proposals/Time

This commit is contained in:
JCBSComputer
2026-07-01 12:08:22 +02:00
parent b75351112e
commit cb1944a9ea
14 changed files with 50 additions and 45 deletions
+7 -5
View File
@@ -42,7 +42,9 @@ export default function ProjectDetail() {
useEffect(() => {
fetch(`/client-portal/api/projects/${id}`, { credentials: "include" })
.then((r) => r.json())
.then(setData)
.then((d) => {
if (d.project) setData({ ...d, milestones: d.milestones || [], deliverables: d.deliverables || [] })
})
.catch(() => {})
}, [id])
@@ -60,10 +62,10 @@ export default function ProjectDetail() {
if (!prev) return prev
return {
...prev,
milestones: prev.milestones.map((m) =>
milestones: (prev.milestones || []).map((m) =>
m.id === milestoneId ? { ...m, ...updated.milestone } : m,
),
deliverables: prev.deliverables.map((d) =>
deliverables: (prev.deliverables || []).map((d) =>
d.milestone_id === milestoneId
? { ...d, status: action === "approve" ? "approved" : "rejected" }
: d,
@@ -120,7 +122,7 @@ export default function ProjectDetail() {
{milestones.length === 0 ? (
<p className="text-sm text-[#6a6a75]">No milestones yet</p>
) : (
milestones.map((m) => {
(milestones || []).map((m) => {
const si = statusIcon[m.status] || { icon: Clock, color: "#6a6a75" }
const Icon = si.icon
const milestoneDeliverables = deliverables.filter((d) => d.milestone_id === m.id)
@@ -163,7 +165,7 @@ export default function ProjectDetail() {
{milestoneDeliverables.length > 0 && (
<div className="space-y-2 mb-3">
<span className="text-[11px] text-[#6a6a75] uppercase tracking-wider">Deliverables</span>
{milestoneDeliverables.map((d) => (
{(milestoneDeliverables || []).map((d) => (
<div key={d.id} className="flex items-center justify-between bg-[#1a1a24] rounded-lg px-3 py-2">
<div className="flex items-center gap-2">
<FileText className="h-3.5 w-3.5 text-[#6a6a75]" />