@burdenoff/microfe-proserviceworld 2026.509.101
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -0
- package/dist/dev/main.d.ts +2 -0
- package/dist/dev/main.d.ts.map +1 -0
- package/dist/generated/global-operations.d.ts +2 -0
- package/dist/generated/global-operations.d.ts.map +1 -0
- package/dist/generated/global-types.d.ts +18199 -0
- package/dist/generated/global-types.d.ts.map +1 -0
- package/dist/generated/wspace-operations.d.ts +2 -0
- package/dist/generated/wspace-operations.d.ts.map +1 -0
- package/dist/generated/wspace-types.d.ts +43046 -0
- package/dist/generated/wspace-types.d.ts.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/proserviceworld/ProServiceWorldRoot.d.ts +5 -0
- package/dist/proserviceworld/ProServiceWorldRoot.d.ts.map +1 -0
- package/dist/proserviceworld/ProServiceWorldRoot.js +151 -0
- package/dist/proserviceworld/ProServiceWorldRoot.js.map +1 -0
- package/dist/proserviceworld/ProServiceWorldRoutes.d.ts +2 -0
- package/dist/proserviceworld/ProServiceWorldRoutes.d.ts.map +1 -0
- package/dist/proserviceworld/ProServiceWorldRoutes.js +91 -0
- package/dist/proserviceworld/ProServiceWorldRoutes.js.map +1 -0
- package/dist/proserviceworld/index.d.ts +5 -0
- package/dist/proserviceworld/index.d.ts.map +1 -0
- package/dist/proserviceworld/index.js +3 -0
- package/dist/proserviceworld/pages/AdminReportsPage.d.ts +2 -0
- package/dist/proserviceworld/pages/AdminReportsPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/AdminReportsPage.js +512 -0
- package/dist/proserviceworld/pages/AdminReportsPage.js.map +1 -0
- package/dist/proserviceworld/pages/AdminUsersPage.d.ts +2 -0
- package/dist/proserviceworld/pages/AdminUsersPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/AdminUsersPage.js +444 -0
- package/dist/proserviceworld/pages/AdminUsersPage.js.map +1 -0
- package/dist/proserviceworld/pages/AnalyticsPage.d.ts +2 -0
- package/dist/proserviceworld/pages/AnalyticsPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/AnalyticsPage.js +433 -0
- package/dist/proserviceworld/pages/AnalyticsPage.js.map +1 -0
- package/dist/proserviceworld/pages/BookingsPage.d.ts +2 -0
- package/dist/proserviceworld/pages/BookingsPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/BookingsPage.js +425 -0
- package/dist/proserviceworld/pages/BookingsPage.js.map +1 -0
- package/dist/proserviceworld/pages/DashboardPage.d.ts +2 -0
- package/dist/proserviceworld/pages/DashboardPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/DashboardPage.js +583 -0
- package/dist/proserviceworld/pages/DashboardPage.js.map +1 -0
- package/dist/proserviceworld/pages/DocumentsPage.d.ts +2 -0
- package/dist/proserviceworld/pages/DocumentsPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/DocumentsPage.js +494 -0
- package/dist/proserviceworld/pages/DocumentsPage.js.map +1 -0
- package/dist/proserviceworld/pages/MessagesPage.d.ts +2 -0
- package/dist/proserviceworld/pages/MessagesPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/MessagesPage.js +229 -0
- package/dist/proserviceworld/pages/MessagesPage.js.map +1 -0
- package/dist/proserviceworld/pages/PaymentsPage.d.ts +2 -0
- package/dist/proserviceworld/pages/PaymentsPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/PaymentsPage.js +479 -0
- package/dist/proserviceworld/pages/PaymentsPage.js.map +1 -0
- package/dist/proserviceworld/pages/ProjectsPage.d.ts +2 -0
- package/dist/proserviceworld/pages/ProjectsPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/ProjectsPage.js +547 -0
- package/dist/proserviceworld/pages/ProjectsPage.js.map +1 -0
- package/dist/proserviceworld/pages/ProviderDetailPage.d.ts +2 -0
- package/dist/proserviceworld/pages/ProviderDetailPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/ProviderDetailPage.js +464 -0
- package/dist/proserviceworld/pages/ProviderDetailPage.js.map +1 -0
- package/dist/proserviceworld/pages/ProvidersPage.d.ts +2 -0
- package/dist/proserviceworld/pages/ProvidersPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/ProvidersPage.js +342 -0
- package/dist/proserviceworld/pages/ProvidersPage.js.map +1 -0
- package/dist/proserviceworld/pages/ReviewsPage.d.ts +2 -0
- package/dist/proserviceworld/pages/ReviewsPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/ReviewsPage.js +339 -0
- package/dist/proserviceworld/pages/ReviewsPage.js.map +1 -0
- package/dist/proserviceworld/pages/ServiceDetailsPage.d.ts +2 -0
- package/dist/proserviceworld/pages/ServiceDetailsPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/ServiceDetailsPage.js +563 -0
- package/dist/proserviceworld/pages/ServiceDetailsPage.js.map +1 -0
- package/dist/proserviceworld/pages/ServicesPage.d.ts +2 -0
- package/dist/proserviceworld/pages/ServicesPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/ServicesPage.js +337 -0
- package/dist/proserviceworld/pages/ServicesPage.js.map +1 -0
- package/dist/proserviceworld/pages/VerificationPage.d.ts +2 -0
- package/dist/proserviceworld/pages/VerificationPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/VerificationPage.js +357 -0
- package/dist/proserviceworld/pages/VerificationPage.js.map +1 -0
- package/dist/proserviceworld/providers/ProServiceWorldProvider.d.ts +6 -0
- package/dist/proserviceworld/providers/ProServiceWorldProvider.d.ts.map +1 -0
- package/dist/proserviceworld/providers/ProServiceWorldProvider.js +27 -0
- package/dist/proserviceworld/providers/ProServiceWorldProvider.js.map +1 -0
- package/dist/proserviceworld/store/proserviceworldStore.d.ts +32 -0
- package/dist/proserviceworld/store/proserviceworldStore.d.ts.map +1 -0
- package/dist/proserviceworld/store/proserviceworldStore.js +2490 -0
- package/dist/proserviceworld/store/proserviceworldStore.js.map +1 -0
- package/dist/proserviceworld/types/index.d.ts +338 -0
- package/dist/proserviceworld/types/index.d.ts.map +1 -0
- package/dist/proserviceworld/utils/cn.d.ts +4 -0
- package/dist/proserviceworld/utils/cn.d.ts.map +1 -0
- package/dist/proserviceworld/utils/i18n.d.ts +6 -0
- package/dist/proserviceworld/utils/i18n.d.ts.map +1 -0
- package/dist/proserviceworld/utils/i18n.js +15 -0
- package/dist/proserviceworld/utils/i18n.js.map +1 -0
- package/dist/proserviceworld/utils/navigation.d.ts +2 -0
- package/dist/proserviceworld/utils/navigation.d.ts.map +1 -0
- package/dist/proserviceworld/utils/navigation.js +8 -0
- package/dist/proserviceworld/utils/navigation.js.map +1 -0
- package/package.json +107 -0
|
@@ -0,0 +1,547 @@
|
|
|
1
|
+
import { useProServiceWorldStore as e } from "../store/proserviceworldStore.js";
|
|
2
|
+
import { useMemo as t, useState as n } from "react";
|
|
3
|
+
import { AlertTriangle as r, BarChart3 as i, Calendar as a, CheckCircle2 as o, ChevronRight as s, Clock as c, DollarSign as l, Flag as u, Plus as d, Search as f, Tag as p, Target as m, Users as h } from "lucide-react";
|
|
4
|
+
import { Fragment as g, jsx as _, jsxs as v } from "react/jsx-runtime";
|
|
5
|
+
import { Badge as y, Button as b, Card as x, CardContent as S, CardHeader as C, CardTitle as w, Input as T } from "@burdenoff/fe-libs/ui";
|
|
6
|
+
//#region src/proserviceworld/pages/ProjectsPage.tsx
|
|
7
|
+
var E = {
|
|
8
|
+
planning: {
|
|
9
|
+
label: "Planning",
|
|
10
|
+
color: "text-yellow-600",
|
|
11
|
+
bgColor: "bg-yellow-100 dark:bg-yellow-950"
|
|
12
|
+
},
|
|
13
|
+
active: {
|
|
14
|
+
label: "Active",
|
|
15
|
+
color: "text-blue-600",
|
|
16
|
+
bgColor: "bg-blue-100 dark:bg-blue-950"
|
|
17
|
+
},
|
|
18
|
+
on_hold: {
|
|
19
|
+
label: "On Hold",
|
|
20
|
+
color: "text-orange-600",
|
|
21
|
+
bgColor: "bg-orange-100 dark:bg-orange-950"
|
|
22
|
+
},
|
|
23
|
+
completed: {
|
|
24
|
+
label: "Completed",
|
|
25
|
+
color: "text-green-600",
|
|
26
|
+
bgColor: "bg-green-100 dark:bg-green-950"
|
|
27
|
+
},
|
|
28
|
+
cancelled: {
|
|
29
|
+
label: "Cancelled",
|
|
30
|
+
color: "text-red-600",
|
|
31
|
+
bgColor: "bg-red-100 dark:bg-red-950"
|
|
32
|
+
}
|
|
33
|
+
}, D = {
|
|
34
|
+
low: {
|
|
35
|
+
label: "Low",
|
|
36
|
+
variant: "outline"
|
|
37
|
+
},
|
|
38
|
+
medium: {
|
|
39
|
+
label: "Medium",
|
|
40
|
+
variant: "secondary"
|
|
41
|
+
},
|
|
42
|
+
high: {
|
|
43
|
+
label: "High",
|
|
44
|
+
variant: "default"
|
|
45
|
+
},
|
|
46
|
+
critical: {
|
|
47
|
+
label: "Critical",
|
|
48
|
+
variant: "destructive"
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
function O() {
|
|
52
|
+
let { projects: O } = e(), [k, A] = n(""), [j, M] = n("all"), [N, P] = n(O[0]?.id ?? ""), [F, I] = n("overview"), L = t(() => {
|
|
53
|
+
let e = [...O];
|
|
54
|
+
if (j !== "all" && (e = e.filter((e) => e.status === j)), k.trim()) {
|
|
55
|
+
let t = k.toLowerCase();
|
|
56
|
+
e = e.filter((e) => e.title.toLowerCase().includes(t) || e.category.toLowerCase().includes(t));
|
|
57
|
+
}
|
|
58
|
+
return e;
|
|
59
|
+
}, [
|
|
60
|
+
O,
|
|
61
|
+
j,
|
|
62
|
+
k
|
|
63
|
+
]), R = O.find((e) => e.id === N);
|
|
64
|
+
return /* @__PURE__ */ v("div", {
|
|
65
|
+
className: "space-y-6 p-6",
|
|
66
|
+
children: [/* @__PURE__ */ v("div", {
|
|
67
|
+
className: "flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",
|
|
68
|
+
children: [/* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("h1", {
|
|
69
|
+
className: "text-2xl font-semibold",
|
|
70
|
+
children: "Projects"
|
|
71
|
+
}), /* @__PURE__ */ _("p", {
|
|
72
|
+
className: "text-sm text-muted-foreground",
|
|
73
|
+
children: "Track progress and manage your professional service projects."
|
|
74
|
+
})] }), /* @__PURE__ */ v(b, {
|
|
75
|
+
size: "sm",
|
|
76
|
+
children: [/* @__PURE__ */ _(d, { className: "mr-2 h-4 w-4" }), " New Project"]
|
|
77
|
+
})]
|
|
78
|
+
}), /* @__PURE__ */ v("div", {
|
|
79
|
+
className: "grid gap-6 lg:grid-cols-3",
|
|
80
|
+
children: [/* @__PURE__ */ v("div", {
|
|
81
|
+
className: "space-y-4",
|
|
82
|
+
children: [
|
|
83
|
+
/* @__PURE__ */ v("div", {
|
|
84
|
+
className: "relative",
|
|
85
|
+
children: [/* @__PURE__ */ _(f, { className: "absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" }), /* @__PURE__ */ _(T, {
|
|
86
|
+
placeholder: "Search projects...",
|
|
87
|
+
value: k,
|
|
88
|
+
onChange: (e) => A(e.target.value),
|
|
89
|
+
className: "pl-10"
|
|
90
|
+
})]
|
|
91
|
+
}),
|
|
92
|
+
/* @__PURE__ */ _("div", {
|
|
93
|
+
className: "flex flex-wrap gap-1",
|
|
94
|
+
children: [
|
|
95
|
+
"all",
|
|
96
|
+
"active",
|
|
97
|
+
"planning",
|
|
98
|
+
"completed",
|
|
99
|
+
"on_hold",
|
|
100
|
+
"cancelled"
|
|
101
|
+
].map((e) => /* @__PURE__ */ _("button", {
|
|
102
|
+
onClick: () => M(e),
|
|
103
|
+
className: `rounded px-2 py-1 text-xs font-medium transition-colors ${j === e ? "bg-primary text-primary-foreground" : "bg-muted text-muted-foreground hover:bg-muted/80"}`,
|
|
104
|
+
children: e === "all" ? "All" : E[e].label
|
|
105
|
+
}, e))
|
|
106
|
+
}),
|
|
107
|
+
/* @__PURE__ */ _("div", {
|
|
108
|
+
className: "space-y-2",
|
|
109
|
+
children: L.length === 0 ? /* @__PURE__ */ _("p", {
|
|
110
|
+
className: "py-8 text-center text-sm text-muted-foreground",
|
|
111
|
+
children: "No projects found."
|
|
112
|
+
}) : L.map((e) => {
|
|
113
|
+
let t = E[e.status];
|
|
114
|
+
return /* @__PURE__ */ v("button", {
|
|
115
|
+
onClick: () => {
|
|
116
|
+
P(e.id), I("overview");
|
|
117
|
+
},
|
|
118
|
+
className: `w-full rounded-lg border p-3 text-left transition-colors ${N === e.id ? "border-primary bg-primary/5" : "hover:bg-muted/50"}`,
|
|
119
|
+
children: [
|
|
120
|
+
/* @__PURE__ */ v("div", {
|
|
121
|
+
className: "flex items-center justify-between",
|
|
122
|
+
children: [/* @__PURE__ */ _("h3", {
|
|
123
|
+
className: "font-medium text-sm truncate pr-2",
|
|
124
|
+
children: e.title
|
|
125
|
+
}), /* @__PURE__ */ _(s, { className: "h-4 w-4 shrink-0 text-muted-foreground" })]
|
|
126
|
+
}),
|
|
127
|
+
/* @__PURE__ */ v("div", {
|
|
128
|
+
className: "mt-2 flex items-center gap-2",
|
|
129
|
+
children: [/* @__PURE__ */ _(y, {
|
|
130
|
+
variant: D[e.priority].variant,
|
|
131
|
+
className: "text-xs",
|
|
132
|
+
children: e.priority
|
|
133
|
+
}), /* @__PURE__ */ _("span", {
|
|
134
|
+
className: `text-xs ${t.color}`,
|
|
135
|
+
children: t.label
|
|
136
|
+
})]
|
|
137
|
+
}),
|
|
138
|
+
/* @__PURE__ */ v("div", {
|
|
139
|
+
className: "mt-2",
|
|
140
|
+
children: [/* @__PURE__ */ v("div", {
|
|
141
|
+
className: "flex items-center justify-between text-xs text-muted-foreground",
|
|
142
|
+
children: [/* @__PURE__ */ _("span", { children: "Progress" }), /* @__PURE__ */ v("span", { children: [e.progress, "%"] })]
|
|
143
|
+
}), /* @__PURE__ */ _("div", {
|
|
144
|
+
className: "mt-1 h-1.5 overflow-hidden rounded-full bg-muted",
|
|
145
|
+
children: /* @__PURE__ */ _("div", {
|
|
146
|
+
className: "h-1.5 rounded-full bg-primary transition-all",
|
|
147
|
+
style: { width: `${e.progress}%` }
|
|
148
|
+
})
|
|
149
|
+
})]
|
|
150
|
+
})
|
|
151
|
+
]
|
|
152
|
+
}, e.id);
|
|
153
|
+
})
|
|
154
|
+
})
|
|
155
|
+
]
|
|
156
|
+
}), /* @__PURE__ */ _("div", {
|
|
157
|
+
className: "space-y-4 lg:col-span-2",
|
|
158
|
+
children: R ? /* @__PURE__ */ v(g, { children: [
|
|
159
|
+
/* @__PURE__ */ _(x, { children: /* @__PURE__ */ v(S, {
|
|
160
|
+
className: "pt-6",
|
|
161
|
+
children: [
|
|
162
|
+
/* @__PURE__ */ v("div", {
|
|
163
|
+
className: "flex flex-wrap items-start justify-between gap-4",
|
|
164
|
+
children: [/* @__PURE__ */ v("div", {
|
|
165
|
+
className: "space-y-2",
|
|
166
|
+
children: [
|
|
167
|
+
/* @__PURE__ */ v("div", {
|
|
168
|
+
className: "flex items-center gap-2",
|
|
169
|
+
children: [/* @__PURE__ */ v(y, {
|
|
170
|
+
variant: D[R.priority].variant,
|
|
171
|
+
children: [R.priority, " priority"]
|
|
172
|
+
}), /* @__PURE__ */ _("span", {
|
|
173
|
+
className: `text-sm font-medium ${E[R.status].color}`,
|
|
174
|
+
children: E[R.status].label
|
|
175
|
+
})]
|
|
176
|
+
}),
|
|
177
|
+
/* @__PURE__ */ _("h2", {
|
|
178
|
+
className: "text-xl font-bold",
|
|
179
|
+
children: R.title
|
|
180
|
+
}),
|
|
181
|
+
/* @__PURE__ */ _("p", {
|
|
182
|
+
className: "text-sm text-muted-foreground",
|
|
183
|
+
children: R.description
|
|
184
|
+
})
|
|
185
|
+
]
|
|
186
|
+
}), /* @__PURE__ */ v("div", {
|
|
187
|
+
className: "text-right",
|
|
188
|
+
children: [
|
|
189
|
+
/* @__PURE__ */ _("p", {
|
|
190
|
+
className: "text-sm text-muted-foreground",
|
|
191
|
+
children: "Budget"
|
|
192
|
+
}),
|
|
193
|
+
/* @__PURE__ */ v("p", {
|
|
194
|
+
className: "text-xl font-bold",
|
|
195
|
+
children: ["$", R.budget.toLocaleString()]
|
|
196
|
+
}),
|
|
197
|
+
/* @__PURE__ */ v("p", {
|
|
198
|
+
className: "text-xs text-muted-foreground",
|
|
199
|
+
children: [
|
|
200
|
+
"Spent: $",
|
|
201
|
+
R.spent.toLocaleString(),
|
|
202
|
+
" (",
|
|
203
|
+
Math.round(R.spent / R.budget * 100),
|
|
204
|
+
"%)"
|
|
205
|
+
]
|
|
206
|
+
})
|
|
207
|
+
]
|
|
208
|
+
})]
|
|
209
|
+
}),
|
|
210
|
+
/* @__PURE__ */ v("div", {
|
|
211
|
+
className: "mt-4",
|
|
212
|
+
children: [/* @__PURE__ */ v("div", {
|
|
213
|
+
className: "flex items-center justify-between text-sm",
|
|
214
|
+
children: [/* @__PURE__ */ _("span", {
|
|
215
|
+
className: "text-muted-foreground",
|
|
216
|
+
children: "Overall Progress"
|
|
217
|
+
}), /* @__PURE__ */ v("span", {
|
|
218
|
+
className: "font-medium",
|
|
219
|
+
children: [R.progress, "%"]
|
|
220
|
+
})]
|
|
221
|
+
}), /* @__PURE__ */ _("div", {
|
|
222
|
+
className: "mt-1 h-3 overflow-hidden rounded-full bg-muted",
|
|
223
|
+
children: /* @__PURE__ */ _("div", {
|
|
224
|
+
className: "h-3 rounded-full bg-primary transition-all",
|
|
225
|
+
style: { width: `${R.progress}%` }
|
|
226
|
+
})
|
|
227
|
+
})]
|
|
228
|
+
}),
|
|
229
|
+
/* @__PURE__ */ v("div", {
|
|
230
|
+
className: "mt-4 flex flex-wrap gap-4 text-sm",
|
|
231
|
+
children: [
|
|
232
|
+
/* @__PURE__ */ v("span", {
|
|
233
|
+
className: "flex items-center gap-1 text-muted-foreground",
|
|
234
|
+
children: [
|
|
235
|
+
/* @__PURE__ */ _(a, { className: "h-4 w-4" }),
|
|
236
|
+
" ",
|
|
237
|
+
R.startDate,
|
|
238
|
+
" -",
|
|
239
|
+
" ",
|
|
240
|
+
R.endDate
|
|
241
|
+
]
|
|
242
|
+
}),
|
|
243
|
+
/* @__PURE__ */ v("span", {
|
|
244
|
+
className: "flex items-center gap-1 text-muted-foreground",
|
|
245
|
+
children: [
|
|
246
|
+
/* @__PURE__ */ _(h, { className: "h-4 w-4" }),
|
|
247
|
+
" ",
|
|
248
|
+
R.teamMembers.length,
|
|
249
|
+
" members"
|
|
250
|
+
]
|
|
251
|
+
}),
|
|
252
|
+
/* @__PURE__ */ v("span", {
|
|
253
|
+
className: "flex items-center gap-1 text-muted-foreground",
|
|
254
|
+
children: [
|
|
255
|
+
/* @__PURE__ */ _(m, { className: "h-4 w-4" }),
|
|
256
|
+
" ",
|
|
257
|
+
R.milestones.length,
|
|
258
|
+
" milestones"
|
|
259
|
+
]
|
|
260
|
+
})
|
|
261
|
+
]
|
|
262
|
+
}),
|
|
263
|
+
R.tags.length > 0 && /* @__PURE__ */ v("div", {
|
|
264
|
+
className: "mt-3 flex items-center gap-2",
|
|
265
|
+
children: [/* @__PURE__ */ _(p, { className: "h-4 w-4 text-muted-foreground" }), R.tags.map((e) => /* @__PURE__ */ _(y, {
|
|
266
|
+
variant: "outline",
|
|
267
|
+
className: "text-xs",
|
|
268
|
+
children: e
|
|
269
|
+
}, e))]
|
|
270
|
+
})
|
|
271
|
+
]
|
|
272
|
+
}) }),
|
|
273
|
+
/* @__PURE__ */ _("div", {
|
|
274
|
+
className: "flex gap-1 border-b",
|
|
275
|
+
children: [
|
|
276
|
+
{
|
|
277
|
+
key: "overview",
|
|
278
|
+
label: "Overview"
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
key: "timeline",
|
|
282
|
+
label: "Timeline"
|
|
283
|
+
},
|
|
284
|
+
{
|
|
285
|
+
key: "milestones",
|
|
286
|
+
label: "Milestones"
|
|
287
|
+
},
|
|
288
|
+
{
|
|
289
|
+
key: "team",
|
|
290
|
+
label: "Team"
|
|
291
|
+
}
|
|
292
|
+
].map(({ key: e, label: t }) => /* @__PURE__ */ _("button", {
|
|
293
|
+
onClick: () => I(e),
|
|
294
|
+
className: `border-b-2 px-4 py-2 text-sm font-medium transition-colors ${F === e ? "border-primary text-primary" : "border-transparent text-muted-foreground hover:text-foreground"}`,
|
|
295
|
+
children: t
|
|
296
|
+
}, e))
|
|
297
|
+
}),
|
|
298
|
+
F === "overview" && /* @__PURE__ */ v("div", {
|
|
299
|
+
className: "grid gap-4 sm:grid-cols-2",
|
|
300
|
+
children: [/* @__PURE__ */ v(x, { children: [/* @__PURE__ */ _(C, { children: /* @__PURE__ */ v(w, {
|
|
301
|
+
className: "text-base flex items-center gap-2",
|
|
302
|
+
children: [/* @__PURE__ */ _(l, { className: "h-4 w-4" }), " Budget Overview"]
|
|
303
|
+
}) }), /* @__PURE__ */ v(S, {
|
|
304
|
+
className: "space-y-3",
|
|
305
|
+
children: [
|
|
306
|
+
/* @__PURE__ */ v("div", {
|
|
307
|
+
className: "flex justify-between text-sm",
|
|
308
|
+
children: [/* @__PURE__ */ _("span", {
|
|
309
|
+
className: "text-muted-foreground",
|
|
310
|
+
children: "Total Budget"
|
|
311
|
+
}), /* @__PURE__ */ v("span", {
|
|
312
|
+
className: "font-medium",
|
|
313
|
+
children: ["$", R.budget.toLocaleString()]
|
|
314
|
+
})]
|
|
315
|
+
}),
|
|
316
|
+
/* @__PURE__ */ v("div", {
|
|
317
|
+
className: "flex justify-between text-sm",
|
|
318
|
+
children: [/* @__PURE__ */ _("span", {
|
|
319
|
+
className: "text-muted-foreground",
|
|
320
|
+
children: "Spent"
|
|
321
|
+
}), /* @__PURE__ */ v("span", {
|
|
322
|
+
className: "font-medium",
|
|
323
|
+
children: ["$", R.spent.toLocaleString()]
|
|
324
|
+
})]
|
|
325
|
+
}),
|
|
326
|
+
/* @__PURE__ */ v("div", {
|
|
327
|
+
className: "flex justify-between text-sm",
|
|
328
|
+
children: [/* @__PURE__ */ _("span", {
|
|
329
|
+
className: "text-muted-foreground",
|
|
330
|
+
children: "Remaining"
|
|
331
|
+
}), /* @__PURE__ */ v("span", {
|
|
332
|
+
className: "font-medium text-green-600",
|
|
333
|
+
children: ["$", (R.budget - R.spent).toLocaleString()]
|
|
334
|
+
})]
|
|
335
|
+
}),
|
|
336
|
+
/* @__PURE__ */ _("div", {
|
|
337
|
+
className: "h-2 overflow-hidden rounded-full bg-muted",
|
|
338
|
+
children: /* @__PURE__ */ _("div", {
|
|
339
|
+
className: "h-2 rounded-full bg-primary",
|
|
340
|
+
style: { width: `${Math.round(R.spent / R.budget * 100)}%` }
|
|
341
|
+
})
|
|
342
|
+
})
|
|
343
|
+
]
|
|
344
|
+
})] }), /* @__PURE__ */ v(x, { children: [/* @__PURE__ */ _(C, { children: /* @__PURE__ */ v(w, {
|
|
345
|
+
className: "text-base flex items-center gap-2",
|
|
346
|
+
children: [/* @__PURE__ */ _(i, { className: "h-4 w-4" }), " Milestone Summary"]
|
|
347
|
+
}) }), /* @__PURE__ */ _(S, {
|
|
348
|
+
className: "space-y-3",
|
|
349
|
+
children: [
|
|
350
|
+
"completed",
|
|
351
|
+
"in_progress",
|
|
352
|
+
"pending",
|
|
353
|
+
"overdue"
|
|
354
|
+
].map((e) => {
|
|
355
|
+
let t = R.milestones.filter((t) => t.status === e).length;
|
|
356
|
+
return /* @__PURE__ */ v("div", {
|
|
357
|
+
className: "flex items-center justify-between text-sm",
|
|
358
|
+
children: [/* @__PURE__ */ _("span", {
|
|
359
|
+
className: "text-muted-foreground capitalize",
|
|
360
|
+
children: e.replace("_", " ")
|
|
361
|
+
}), /* @__PURE__ */ _("span", {
|
|
362
|
+
className: "font-medium",
|
|
363
|
+
children: t
|
|
364
|
+
})]
|
|
365
|
+
}, e);
|
|
366
|
+
})
|
|
367
|
+
})] })]
|
|
368
|
+
}),
|
|
369
|
+
F === "timeline" && /* @__PURE__ */ _(x, { children: /* @__PURE__ */ _(S, {
|
|
370
|
+
className: "pt-6",
|
|
371
|
+
children: /* @__PURE__ */ _("div", {
|
|
372
|
+
className: "relative space-y-0",
|
|
373
|
+
children: R.milestones.map((e, t) => /* @__PURE__ */ v("div", {
|
|
374
|
+
className: "relative flex gap-4 pb-8",
|
|
375
|
+
children: [
|
|
376
|
+
t !== R.milestones.length - 1 && /* @__PURE__ */ _("div", { className: "absolute left-[11px] top-6 h-full w-0.5 bg-muted" }),
|
|
377
|
+
/* @__PURE__ */ v("div", {
|
|
378
|
+
className: `relative z-10 mt-1 h-6 w-6 shrink-0 rounded-full ${{
|
|
379
|
+
completed: "bg-green-500",
|
|
380
|
+
in_progress: "bg-blue-500",
|
|
381
|
+
pending: "bg-gray-300",
|
|
382
|
+
overdue: "bg-red-500"
|
|
383
|
+
}[e.status]} flex items-center justify-center`,
|
|
384
|
+
children: [e.status === "completed" && /* @__PURE__ */ _(o, { className: "h-4 w-4 text-white" }), e.status === "in_progress" && /* @__PURE__ */ _(c, { className: "h-4 w-4 text-white" })]
|
|
385
|
+
}),
|
|
386
|
+
/* @__PURE__ */ v("div", {
|
|
387
|
+
className: "flex-1",
|
|
388
|
+
children: [
|
|
389
|
+
/* @__PURE__ */ v("div", {
|
|
390
|
+
className: "flex items-center gap-2",
|
|
391
|
+
children: [/* @__PURE__ */ _("h4", {
|
|
392
|
+
className: "font-medium",
|
|
393
|
+
children: e.title
|
|
394
|
+
}), /* @__PURE__ */ _(y, {
|
|
395
|
+
variant: D[e.priority].variant,
|
|
396
|
+
className: "text-xs",
|
|
397
|
+
children: e.priority
|
|
398
|
+
})]
|
|
399
|
+
}),
|
|
400
|
+
/* @__PURE__ */ _("p", {
|
|
401
|
+
className: "mt-1 text-sm text-muted-foreground",
|
|
402
|
+
children: e.description
|
|
403
|
+
}),
|
|
404
|
+
/* @__PURE__ */ v("div", {
|
|
405
|
+
className: "mt-2 flex flex-wrap gap-3 text-xs text-muted-foreground",
|
|
406
|
+
children: [/* @__PURE__ */ v("span", {
|
|
407
|
+
className: "flex items-center gap-1",
|
|
408
|
+
children: [
|
|
409
|
+
/* @__PURE__ */ _(a, { className: "h-3 w-3" }),
|
|
410
|
+
" Due: ",
|
|
411
|
+
e.dueDate
|
|
412
|
+
]
|
|
413
|
+
}), e.completedAt && /* @__PURE__ */ v("span", {
|
|
414
|
+
className: "flex items-center gap-1 text-green-600",
|
|
415
|
+
children: [
|
|
416
|
+
/* @__PURE__ */ _(o, { className: "h-3 w-3" }),
|
|
417
|
+
" Completed:",
|
|
418
|
+
" ",
|
|
419
|
+
e.completedAt
|
|
420
|
+
]
|
|
421
|
+
})]
|
|
422
|
+
})
|
|
423
|
+
]
|
|
424
|
+
})
|
|
425
|
+
]
|
|
426
|
+
}, e.id))
|
|
427
|
+
})
|
|
428
|
+
}) }),
|
|
429
|
+
F === "milestones" && /* @__PURE__ */ _("div", {
|
|
430
|
+
className: "space-y-3",
|
|
431
|
+
children: R.milestones.map((e) => /* @__PURE__ */ _(x, { children: /* @__PURE__ */ _(S, {
|
|
432
|
+
className: "pt-4",
|
|
433
|
+
children: /* @__PURE__ */ v("div", {
|
|
434
|
+
className: "flex items-start gap-3",
|
|
435
|
+
children: [/* @__PURE__ */ _({
|
|
436
|
+
completed: o,
|
|
437
|
+
in_progress: c,
|
|
438
|
+
pending: m,
|
|
439
|
+
overdue: r
|
|
440
|
+
}[e.status] ?? m, { className: `mt-0.5 h-5 w-5 ${{
|
|
441
|
+
completed: "text-green-600",
|
|
442
|
+
in_progress: "text-blue-600",
|
|
443
|
+
pending: "text-gray-400",
|
|
444
|
+
overdue: "text-red-600"
|
|
445
|
+
}[e.status]}` }), /* @__PURE__ */ v("div", {
|
|
446
|
+
className: "flex-1",
|
|
447
|
+
children: [
|
|
448
|
+
/* @__PURE__ */ v("div", {
|
|
449
|
+
className: "flex items-center gap-2",
|
|
450
|
+
children: [/* @__PURE__ */ _("h4", {
|
|
451
|
+
className: "font-medium",
|
|
452
|
+
children: e.title
|
|
453
|
+
}), /* @__PURE__ */ _(y, {
|
|
454
|
+
variant: D[e.priority].variant,
|
|
455
|
+
className: "text-xs",
|
|
456
|
+
children: e.priority
|
|
457
|
+
})]
|
|
458
|
+
}),
|
|
459
|
+
/* @__PURE__ */ _("p", {
|
|
460
|
+
className: "mt-1 text-sm text-muted-foreground",
|
|
461
|
+
children: e.description
|
|
462
|
+
}),
|
|
463
|
+
e.deliverables.length > 0 && /* @__PURE__ */ v("div", {
|
|
464
|
+
className: "mt-3",
|
|
465
|
+
children: [/* @__PURE__ */ _("p", {
|
|
466
|
+
className: "text-xs font-medium text-muted-foreground",
|
|
467
|
+
children: "Deliverables"
|
|
468
|
+
}), /* @__PURE__ */ _("div", {
|
|
469
|
+
className: "mt-1 flex flex-wrap gap-1",
|
|
470
|
+
children: e.deliverables.map((e) => /* @__PURE__ */ _(y, {
|
|
471
|
+
variant: "outline",
|
|
472
|
+
className: "text-xs",
|
|
473
|
+
children: e
|
|
474
|
+
}, e))
|
|
475
|
+
})]
|
|
476
|
+
}),
|
|
477
|
+
/* @__PURE__ */ v("div", {
|
|
478
|
+
className: "mt-3 flex flex-wrap gap-4 text-xs text-muted-foreground",
|
|
479
|
+
children: [
|
|
480
|
+
/* @__PURE__ */ v("span", {
|
|
481
|
+
className: "flex items-center gap-1",
|
|
482
|
+
children: [
|
|
483
|
+
/* @__PURE__ */ _(a, { className: "h-3 w-3" }),
|
|
484
|
+
" Due: ",
|
|
485
|
+
e.dueDate
|
|
486
|
+
]
|
|
487
|
+
}),
|
|
488
|
+
e.completedAt && /* @__PURE__ */ v("span", {
|
|
489
|
+
className: "flex items-center gap-1 text-green-600",
|
|
490
|
+
children: [
|
|
491
|
+
/* @__PURE__ */ _(o, { className: "h-3 w-3" }),
|
|
492
|
+
" ",
|
|
493
|
+
e.completedAt
|
|
494
|
+
]
|
|
495
|
+
}),
|
|
496
|
+
e.dependencies.length > 0 && /* @__PURE__ */ v("span", {
|
|
497
|
+
className: "flex items-center gap-1",
|
|
498
|
+
children: [
|
|
499
|
+
/* @__PURE__ */ _(u, { className: "h-3 w-3" }),
|
|
500
|
+
" ",
|
|
501
|
+
e.dependencies.length,
|
|
502
|
+
" ",
|
|
503
|
+
"dependencies"
|
|
504
|
+
]
|
|
505
|
+
})
|
|
506
|
+
]
|
|
507
|
+
}),
|
|
508
|
+
e.notes && /* @__PURE__ */ _("p", {
|
|
509
|
+
className: "mt-2 rounded bg-muted/50 p-2 text-xs text-muted-foreground italic",
|
|
510
|
+
children: e.notes
|
|
511
|
+
})
|
|
512
|
+
]
|
|
513
|
+
})]
|
|
514
|
+
})
|
|
515
|
+
}) }, e.id))
|
|
516
|
+
}),
|
|
517
|
+
F === "team" && /* @__PURE__ */ v(x, { children: [/* @__PURE__ */ _(C, { children: /* @__PURE__ */ _(w, {
|
|
518
|
+
className: "text-base",
|
|
519
|
+
children: "Team Members"
|
|
520
|
+
}) }), /* @__PURE__ */ _(S, { children: /* @__PURE__ */ _("div", {
|
|
521
|
+
className: "space-y-3",
|
|
522
|
+
children: R.teamMembers.map((e, t) => /* @__PURE__ */ v("div", {
|
|
523
|
+
className: "flex items-center gap-3 rounded-lg border p-3",
|
|
524
|
+
children: [/* @__PURE__ */ _("div", {
|
|
525
|
+
className: "flex h-10 w-10 items-center justify-center rounded-full bg-primary/10 font-semibold text-primary",
|
|
526
|
+
children: e.name.charAt(0)
|
|
527
|
+
}), /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("p", {
|
|
528
|
+
className: "font-medium",
|
|
529
|
+
children: e.name
|
|
530
|
+
}), /* @__PURE__ */ _("p", {
|
|
531
|
+
className: "text-sm text-muted-foreground",
|
|
532
|
+
children: e.role
|
|
533
|
+
})] })]
|
|
534
|
+
}, t))
|
|
535
|
+
}) })] })
|
|
536
|
+
] }) : /* @__PURE__ */ _(x, { children: /* @__PURE__ */ _(S, {
|
|
537
|
+
className: "py-12 text-center text-muted-foreground",
|
|
538
|
+
children: "Select a project from the sidebar to view details."
|
|
539
|
+
}) })
|
|
540
|
+
})]
|
|
541
|
+
})]
|
|
542
|
+
});
|
|
543
|
+
}
|
|
544
|
+
//#endregion
|
|
545
|
+
export { O as ProjectsPage };
|
|
546
|
+
|
|
547
|
+
//# sourceMappingURL=ProjectsPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectsPage.js","names":[],"sources":["../../../src/proserviceworld/pages/ProjectsPage.tsx"],"sourcesContent":["import { useState, useMemo } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Input,\n} from '@burdenoff/fe-libs/ui';\nimport {\n Search,\n Plus,\n Calendar,\n DollarSign,\n Users,\n CheckCircle2,\n Clock,\n AlertTriangle,\n Target,\n Tag,\n ChevronRight,\n BarChart3,\n Flag,\n Milestone as MilestoneIcon,\n} from 'lucide-react';\nimport { useProServiceWorldStore } from '../store/proserviceworldStore';\nimport type { ProjectStatus, Priority } from '../types';\n\ntype DetailTab = 'overview' | 'timeline' | 'milestones' | 'team';\n\nconst statusConfig: Record<ProjectStatus, { label: string; color: string; bgColor: string }> = {\n planning: {\n label: 'Planning',\n color: 'text-yellow-600',\n bgColor: 'bg-yellow-100 dark:bg-yellow-950',\n },\n active: { label: 'Active', color: 'text-blue-600', bgColor: 'bg-blue-100 dark:bg-blue-950' },\n on_hold: {\n label: 'On Hold',\n color: 'text-orange-600',\n bgColor: 'bg-orange-100 dark:bg-orange-950',\n },\n completed: {\n label: 'Completed',\n color: 'text-green-600',\n bgColor: 'bg-green-100 dark:bg-green-950',\n },\n cancelled: { label: 'Cancelled', color: 'text-red-600', bgColor: 'bg-red-100 dark:bg-red-950' },\n};\n\nconst priorityConfig: Record<\n Priority,\n { label: string; variant: 'default' | 'secondary' | 'outline' | 'destructive' }\n> = {\n low: { label: 'Low', variant: 'outline' },\n medium: { label: 'Medium', variant: 'secondary' },\n high: { label: 'High', variant: 'default' },\n critical: { label: 'Critical', variant: 'destructive' },\n};\n\nexport function ProjectsPage() {\n const { projects } = useProServiceWorldStore();\n const [searchQuery, setSearchQuery] = useState('');\n const [statusFilter, setStatusFilter] = useState<ProjectStatus | 'all'>('all');\n const [selectedProjectId, setSelectedProjectId] = useState<string>(projects[0]?.id ?? '');\n const [detailTab, setDetailTab] = useState<DetailTab>('overview');\n\n const filteredProjects = useMemo(() => {\n let result = [...projects];\n if (statusFilter !== 'all') result = result.filter((p) => p.status === statusFilter);\n if (searchQuery.trim()) {\n const q = searchQuery.toLowerCase();\n result = result.filter(\n (p) => p.title.toLowerCase().includes(q) || p.category.toLowerCase().includes(q)\n );\n }\n return result;\n }, [projects, statusFilter, searchQuery]);\n\n const selectedProject = projects.find((p) => p.id === selectedProjectId);\n\n const detailTabs: { key: DetailTab; label: string }[] = [\n { key: 'overview', label: 'Overview' },\n { key: 'timeline', label: 'Timeline' },\n { key: 'milestones', label: 'Milestones' },\n { key: 'team', label: 'Team' },\n ];\n\n return (\n <div className=\"space-y-6 p-6\">\n {/* Header */}\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">Projects</h1>\n <p className=\"text-sm text-muted-foreground\">\n Track progress and manage your professional service projects.\n </p>\n </div>\n <Button size=\"sm\">\n <Plus className=\"mr-2 h-4 w-4\" /> New Project\n </Button>\n </div>\n\n <div className=\"grid gap-6 lg:grid-cols-3\">\n {/* Project sidebar */}\n <div className=\"space-y-4\">\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n placeholder=\"Search projects...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"pl-10\"\n />\n </div>\n\n <div className=\"flex flex-wrap gap-1\">\n {(['all', 'active', 'planning', 'completed', 'on_hold', 'cancelled'] as const).map(\n (status) => (\n <button\n key={status}\n onClick={() => setStatusFilter(status)}\n className={`rounded px-2 py-1 text-xs font-medium transition-colors ${\n statusFilter === status\n ? 'bg-primary text-primary-foreground'\n : 'bg-muted text-muted-foreground hover:bg-muted/80'\n }`}\n >\n {status === 'all' ? 'All' : statusConfig[status].label}\n </button>\n )\n )}\n </div>\n\n <div className=\"space-y-2\">\n {filteredProjects.length === 0 ? (\n <p className=\"py-8 text-center text-sm text-muted-foreground\">No projects found.</p>\n ) : (\n filteredProjects.map((project) => {\n const cfg = statusConfig[project.status];\n return (\n <button\n key={project.id}\n onClick={() => {\n setSelectedProjectId(project.id);\n setDetailTab('overview');\n }}\n className={`w-full rounded-lg border p-3 text-left transition-colors ${\n selectedProjectId === project.id\n ? 'border-primary bg-primary/5'\n : 'hover:bg-muted/50'\n }`}\n >\n <div className=\"flex items-center justify-between\">\n <h3 className=\"font-medium text-sm truncate pr-2\">{project.title}</h3>\n <ChevronRight className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n </div>\n <div className=\"mt-2 flex items-center gap-2\">\n <Badge variant={priorityConfig[project.priority].variant} className=\"text-xs\">\n {project.priority}\n </Badge>\n <span className={`text-xs ${cfg.color}`}>{cfg.label}</span>\n </div>\n <div className=\"mt-2\">\n <div className=\"flex items-center justify-between text-xs text-muted-foreground\">\n <span>Progress</span>\n <span>{project.progress}%</span>\n </div>\n <div className=\"mt-1 h-1.5 overflow-hidden rounded-full bg-muted\">\n <div\n className=\"h-1.5 rounded-full bg-primary transition-all\"\n style={{ width: `${project.progress}%` }}\n />\n </div>\n </div>\n </button>\n );\n })\n )}\n </div>\n </div>\n\n {/* Detail panel */}\n <div className=\"space-y-4 lg:col-span-2\">\n {selectedProject ? (\n <>\n {/* Project header card */}\n <Card>\n <CardContent className=\"pt-6\">\n <div className=\"flex flex-wrap items-start justify-between gap-4\">\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2\">\n <Badge variant={priorityConfig[selectedProject.priority].variant}>\n {selectedProject.priority} priority\n </Badge>\n <span\n className={`text-sm font-medium ${statusConfig[selectedProject.status].color}`}\n >\n {statusConfig[selectedProject.status].label}\n </span>\n </div>\n <h2 className=\"text-xl font-bold\">{selectedProject.title}</h2>\n <p className=\"text-sm text-muted-foreground\">{selectedProject.description}</p>\n </div>\n <div className=\"text-right\">\n <p className=\"text-sm text-muted-foreground\">Budget</p>\n <p className=\"text-xl font-bold\">\n ${selectedProject.budget.toLocaleString()}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n Spent: ${selectedProject.spent.toLocaleString()} (\n {Math.round((selectedProject.spent / selectedProject.budget) * 100)}%)\n </p>\n </div>\n </div>\n\n {/* Progress bar */}\n <div className=\"mt-4\">\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"text-muted-foreground\">Overall Progress</span>\n <span className=\"font-medium\">{selectedProject.progress}%</span>\n </div>\n <div className=\"mt-1 h-3 overflow-hidden rounded-full bg-muted\">\n <div\n className=\"h-3 rounded-full bg-primary transition-all\"\n style={{ width: `${selectedProject.progress}%` }}\n />\n </div>\n </div>\n\n {/* Quick stats */}\n <div className=\"mt-4 flex flex-wrap gap-4 text-sm\">\n <span className=\"flex items-center gap-1 text-muted-foreground\">\n <Calendar className=\"h-4 w-4\" /> {selectedProject.startDate} -{' '}\n {selectedProject.endDate}\n </span>\n <span className=\"flex items-center gap-1 text-muted-foreground\">\n <Users className=\"h-4 w-4\" /> {selectedProject.teamMembers.length} members\n </span>\n <span className=\"flex items-center gap-1 text-muted-foreground\">\n <Target className=\"h-4 w-4\" /> {selectedProject.milestones.length} milestones\n </span>\n </div>\n\n {/* Tags */}\n {selectedProject.tags.length > 0 && (\n <div className=\"mt-3 flex items-center gap-2\">\n <Tag className=\"h-4 w-4 text-muted-foreground\" />\n {selectedProject.tags.map((tag) => (\n <Badge key={tag} variant=\"outline\" className=\"text-xs\">\n {tag}\n </Badge>\n ))}\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* Detail tabs */}\n <div className=\"flex gap-1 border-b\">\n {detailTabs.map(({ key, label }) => (\n <button\n key={key}\n onClick={() => setDetailTab(key)}\n className={`border-b-2 px-4 py-2 text-sm font-medium transition-colors ${\n detailTab === key\n ? 'border-primary text-primary'\n : 'border-transparent text-muted-foreground hover:text-foreground'\n }`}\n >\n {label}\n </button>\n ))}\n </div>\n\n {/* Overview tab */}\n {detailTab === 'overview' && (\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base flex items-center gap-2\">\n <DollarSign className=\"h-4 w-4\" /> Budget Overview\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-muted-foreground\">Total Budget</span>\n <span className=\"font-medium\">\n ${selectedProject.budget.toLocaleString()}\n </span>\n </div>\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-muted-foreground\">Spent</span>\n <span className=\"font-medium\">\n ${selectedProject.spent.toLocaleString()}\n </span>\n </div>\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-muted-foreground\">Remaining</span>\n <span className=\"font-medium text-green-600\">\n ${(selectedProject.budget - selectedProject.spent).toLocaleString()}\n </span>\n </div>\n <div className=\"h-2 overflow-hidden rounded-full bg-muted\">\n <div\n className=\"h-2 rounded-full bg-primary\"\n style={{\n width: `${Math.round((selectedProject.spent / selectedProject.budget) * 100)}%`,\n }}\n />\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base flex items-center gap-2\">\n <BarChart3 className=\"h-4 w-4\" /> Milestone Summary\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {['completed', 'in_progress', 'pending', 'overdue'].map((status) => {\n const count = selectedProject.milestones.filter(\n (m) => m.status === status\n ).length;\n return (\n <div key={status} className=\"flex items-center justify-between text-sm\">\n <span className=\"text-muted-foreground capitalize\">\n {status.replace('_', ' ')}\n </span>\n <span className=\"font-medium\">{count}</span>\n </div>\n );\n })}\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Timeline tab */}\n {detailTab === 'timeline' && (\n <Card>\n <CardContent className=\"pt-6\">\n <div className=\"relative space-y-0\">\n {selectedProject.milestones.map((milestone, idx) => {\n const isLast = idx === selectedProject.milestones.length - 1;\n const statusColors: Record<string, string> = {\n completed: 'bg-green-500',\n in_progress: 'bg-blue-500',\n pending: 'bg-gray-300',\n overdue: 'bg-red-500',\n };\n return (\n <div key={milestone.id} className=\"relative flex gap-4 pb-8\">\n {/* Timeline line */}\n {!isLast && (\n <div className=\"absolute left-[11px] top-6 h-full w-0.5 bg-muted\" />\n )}\n {/* Dot */}\n <div\n className={`relative z-10 mt-1 h-6 w-6 shrink-0 rounded-full ${statusColors[milestone.status]} flex items-center justify-center`}\n >\n {milestone.status === 'completed' && (\n <CheckCircle2 className=\"h-4 w-4 text-white\" />\n )}\n {milestone.status === 'in_progress' && (\n <Clock className=\"h-4 w-4 text-white\" />\n )}\n </div>\n {/* Content */}\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2\">\n <h4 className=\"font-medium\">{milestone.title}</h4>\n <Badge\n variant={priorityConfig[milestone.priority].variant}\n className=\"text-xs\"\n >\n {milestone.priority}\n </Badge>\n </div>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {milestone.description}\n </p>\n <div className=\"mt-2 flex flex-wrap gap-3 text-xs text-muted-foreground\">\n <span className=\"flex items-center gap-1\">\n <Calendar className=\"h-3 w-3\" /> Due: {milestone.dueDate}\n </span>\n {milestone.completedAt && (\n <span className=\"flex items-center gap-1 text-green-600\">\n <CheckCircle2 className=\"h-3 w-3\" /> Completed:{' '}\n {milestone.completedAt}\n </span>\n )}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </CardContent>\n </Card>\n )}\n\n {/* Milestones tab */}\n {detailTab === 'milestones' && (\n <div className=\"space-y-3\">\n {selectedProject.milestones.map((milestone) => {\n const statusIcons: Record<string, typeof CheckCircle2> = {\n completed: CheckCircle2,\n in_progress: Clock,\n pending: Target,\n overdue: AlertTriangle,\n };\n const statusColors: Record<string, string> = {\n completed: 'text-green-600',\n in_progress: 'text-blue-600',\n pending: 'text-gray-400',\n overdue: 'text-red-600',\n };\n const Icon = statusIcons[milestone.status] ?? Target;\n return (\n <Card key={milestone.id}>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-start gap-3\">\n <Icon className={`mt-0.5 h-5 w-5 ${statusColors[milestone.status]}`} />\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2\">\n <h4 className=\"font-medium\">{milestone.title}</h4>\n <Badge\n variant={priorityConfig[milestone.priority].variant}\n className=\"text-xs\"\n >\n {milestone.priority}\n </Badge>\n </div>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {milestone.description}\n </p>\n\n {/* Deliverables */}\n {milestone.deliverables.length > 0 && (\n <div className=\"mt-3\">\n <p className=\"text-xs font-medium text-muted-foreground\">\n Deliverables\n </p>\n <div className=\"mt-1 flex flex-wrap gap-1\">\n {milestone.deliverables.map((d) => (\n <Badge key={d} variant=\"outline\" className=\"text-xs\">\n {d}\n </Badge>\n ))}\n </div>\n </div>\n )}\n\n <div className=\"mt-3 flex flex-wrap gap-4 text-xs text-muted-foreground\">\n <span className=\"flex items-center gap-1\">\n <Calendar className=\"h-3 w-3\" /> Due: {milestone.dueDate}\n </span>\n {milestone.completedAt && (\n <span className=\"flex items-center gap-1 text-green-600\">\n <CheckCircle2 className=\"h-3 w-3\" /> {milestone.completedAt}\n </span>\n )}\n {milestone.dependencies.length > 0 && (\n <span className=\"flex items-center gap-1\">\n <Flag className=\"h-3 w-3\" /> {milestone.dependencies.length}{' '}\n dependencies\n </span>\n )}\n </div>\n\n {milestone.notes && (\n <p className=\"mt-2 rounded bg-muted/50 p-2 text-xs text-muted-foreground italic\">\n {milestone.notes}\n </p>\n )}\n </div>\n </div>\n </CardContent>\n </Card>\n );\n })}\n </div>\n )}\n\n {/* Team tab */}\n {detailTab === 'team' && (\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">Team Members</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-3\">\n {selectedProject.teamMembers.map((member, idx) => (\n <div key={idx} className=\"flex items-center gap-3 rounded-lg border p-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-primary/10 font-semibold text-primary\">\n {member.name.charAt(0)}\n </div>\n <div>\n <p className=\"font-medium\">{member.name}</p>\n <p className=\"text-sm text-muted-foreground\">{member.role}</p>\n </div>\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n )}\n </>\n ) : (\n <Card>\n <CardContent className=\"py-12 text-center text-muted-foreground\">\n Select a project from the sidebar to view details.\n </CardContent>\n </Card>\n )}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProviderDetailPage.d.ts","sourceRoot":"","sources":["../../../src/proserviceworld/pages/ProviderDetailPage.tsx"],"names":[],"mappings":"AAmBA,wBAAgB,kBAAkB,4CAkVjC"}
|