@burdenoff/microfe-proserviceworld 2026.706.2 → 2026.709.1
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/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 +2 -1
- package/dist/proserviceworld/ProServiceWorldRoot.d.ts +5 -0
- package/dist/proserviceworld/ProServiceWorldRoot.d.ts.map +1 -0
- package/dist/proserviceworld/ProServiceWorldRoutes.d.ts +2 -0
- package/dist/proserviceworld/ProServiceWorldRoutes.d.ts.map +1 -0
- package/dist/proserviceworld/components/DiscussionThread.d.ts +12 -0
- package/dist/proserviceworld/components/DiscussionThread.d.ts.map +1 -0
- package/dist/proserviceworld/components/DiscussionThread.js +1 -1
- package/dist/proserviceworld/components/DiscussionThread.js.map +1 -1
- package/dist/proserviceworld/components/ui.d.ts +82 -0
- package/dist/proserviceworld/components/ui.d.ts.map +1 -0
- package/dist/proserviceworld/components/ui.js +18 -18
- package/dist/proserviceworld/components/ui.js.map +1 -1
- package/dist/proserviceworld/hooks/useAnalytics.d.ts +18 -0
- package/dist/proserviceworld/hooks/useAnalytics.d.ts.map +1 -0
- package/dist/proserviceworld/hooks/useAnalytics.js +21 -0
- package/dist/proserviceworld/hooks/useAnalytics.js.map +1 -0
- package/dist/proserviceworld/hooks/useEntityComments.d.ts +27 -0
- package/dist/proserviceworld/hooks/useEntityComments.d.ts.map +1 -0
- package/dist/proserviceworld/hooks/useEntityComments.js.map +1 -1
- package/dist/proserviceworld/hooks/useFiles.d.ts +23 -0
- package/dist/proserviceworld/hooks/useFiles.d.ts.map +1 -0
- package/dist/proserviceworld/hooks/useProServiceWorldApi.d.ts +351 -0
- package/dist/proserviceworld/hooks/useProServiceWorldApi.d.ts.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 +1 -0
- package/dist/proserviceworld/pages/AnalyticsPage.d.ts +4 -0
- package/dist/proserviceworld/pages/AnalyticsPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/AnalyticsPage.js +277 -111
- package/dist/proserviceworld/pages/AnalyticsPage.js.map +1 -1
- package/dist/proserviceworld/pages/ClientDetailPage.d.ts +4 -0
- package/dist/proserviceworld/pages/ClientDetailPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/ClientDetailPage.js +219 -151
- package/dist/proserviceworld/pages/ClientDetailPage.js.map +1 -1
- package/dist/proserviceworld/pages/ClientsPage.d.ts +9 -0
- package/dist/proserviceworld/pages/ClientsPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/ClientsPage.js +180 -148
- package/dist/proserviceworld/pages/ClientsPage.js.map +1 -1
- package/dist/proserviceworld/pages/CompliancePage.d.ts +4 -0
- package/dist/proserviceworld/pages/CompliancePage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/CompliancePage.js +140 -96
- package/dist/proserviceworld/pages/CompliancePage.js.map +1 -1
- package/dist/proserviceworld/pages/ConflictsPage.d.ts +4 -0
- package/dist/proserviceworld/pages/ConflictsPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/DashboardPage.d.ts +4 -0
- package/dist/proserviceworld/pages/DashboardPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/DashboardPage.js +221 -104
- package/dist/proserviceworld/pages/DashboardPage.js.map +1 -1
- package/dist/proserviceworld/pages/DocumentsPage.d.ts +4 -0
- package/dist/proserviceworld/pages/DocumentsPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/EngagementDetailPage.d.ts +4 -0
- package/dist/proserviceworld/pages/EngagementDetailPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/EngagementDetailPage.js +233 -197
- package/dist/proserviceworld/pages/EngagementDetailPage.js.map +1 -1
- package/dist/proserviceworld/pages/EngagementsPage.d.ts +4 -0
- package/dist/proserviceworld/pages/EngagementsPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/EngagementsPage.js +187 -136
- package/dist/proserviceworld/pages/EngagementsPage.js.map +1 -1
- package/dist/proserviceworld/pages/InvoicesPage.d.ts +4 -0
- package/dist/proserviceworld/pages/InvoicesPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/InvoicesPage.js +144 -129
- package/dist/proserviceworld/pages/InvoicesPage.js.map +1 -1
- package/dist/proserviceworld/pages/MattersPage.d.ts +4 -0
- package/dist/proserviceworld/pages/MattersPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/MattersPage.js +198 -142
- package/dist/proserviceworld/pages/MattersPage.js.map +1 -1
- package/dist/proserviceworld/pages/PracticeAreasPage.d.ts +4 -0
- package/dist/proserviceworld/pages/PracticeAreasPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/TimePage.d.ts +4 -0
- package/dist/proserviceworld/pages/TimePage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/TimePage.js +112 -92
- package/dist/proserviceworld/pages/TimePage.js.map +1 -1
- package/dist/proserviceworld/providers/ProServiceWorldProvider.d.ts +6 -0
- package/dist/proserviceworld/providers/ProServiceWorldProvider.d.ts.map +1 -0
- package/dist/proserviceworld/services/assistantApi.d.ts +74 -0
- package/dist/proserviceworld/services/assistantApi.d.ts.map +1 -0
- package/dist/proserviceworld/services/assistantApi.js +203 -0
- package/dist/proserviceworld/services/assistantApi.js.map +1 -0
- package/dist/proserviceworld/services/createSandboxAssistantTransport.d.ts +28 -0
- package/dist/proserviceworld/services/createSandboxAssistantTransport.d.ts.map +1 -0
- package/dist/proserviceworld/services/createSandboxAssistantTransport.js +120 -0
- package/dist/proserviceworld/services/createSandboxAssistantTransport.js.map +1 -0
- package/dist/proserviceworld/types/index.d.ts +57 -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/nav.d.ts +6 -0
- package/dist/proserviceworld/utils/nav.d.ts.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/pageContext.d.ts +12 -0
- package/dist/proserviceworld/utils/pageContext.d.ts.map +1 -0
- package/dist/proserviceworld/utils/pageContext.js +74 -0
- package/dist/proserviceworld/utils/pageContext.js.map +1 -0
- package/package.json +1 -1
|
@@ -2,13 +2,14 @@ import { useCompleteMilestone as e, useCreateDeliverable as t, useCreateMileston
|
|
|
2
2
|
import { useNav as s } from "../utils/nav.js";
|
|
3
3
|
import { Banner as c, Empty as l, ErrorState as u, Field as d, LoadingBlock as f, MetricCard as p, Modal as m, NativeSelect as h, PageHeader as g, SectionCard as _, StatusPill as v, TextArea as y, TextInput as b, fmtDate as x, fmtMinutesAsHours as S, fmtMoney as C, humanize as w } from "../components/ui.js";
|
|
4
4
|
import { DiscussionThread as T } from "../components/DiscussionThread.js";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
5
|
+
import { useAnalytics as E } from "../hooks/useAnalytics.js";
|
|
6
|
+
import { useState as D } from "react";
|
|
7
|
+
import { ArrowLeft as O, ArrowRight as k, CheckCircle2 as A, Clock as j, DollarSign as M, FileText as N, Flag as P, Plus as F } from "lucide-react";
|
|
8
|
+
import { useParams as I } from "react-router-dom";
|
|
9
|
+
import { Fragment as L, jsx as R, jsxs as z } from "react/jsx-runtime";
|
|
10
|
+
import { Button as B } from "@burdenoff/fe-libs/ui";
|
|
10
11
|
//#region src/proserviceworld/pages/EngagementDetailPage.tsx
|
|
11
|
-
var
|
|
12
|
+
var V = {
|
|
12
13
|
PROPOSAL: ["ACCEPTED", "CANCELLED"],
|
|
13
14
|
ACCEPTED: ["IN_PROGRESS", "CANCELLED"],
|
|
14
15
|
IN_PROGRESS: ["REVIEW", "CANCELLED"],
|
|
@@ -21,220 +22,255 @@ var R = {
|
|
|
21
22
|
INVOICED: ["CLOSED"],
|
|
22
23
|
CLOSED: [],
|
|
23
24
|
CANCELLED: []
|
|
24
|
-
},
|
|
25
|
+
}, H = [
|
|
25
26
|
"DRAFT",
|
|
26
27
|
"INTERNAL_REVIEW",
|
|
27
28
|
"CLIENT_REVIEW",
|
|
28
29
|
"ACCEPTED",
|
|
29
30
|
"REJECTED"
|
|
30
|
-
],
|
|
31
|
-
let { id: e = "" } =
|
|
32
|
-
if (
|
|
33
|
-
if (
|
|
34
|
-
error:
|
|
35
|
-
onRetry: () => void
|
|
31
|
+
], U = () => {
|
|
32
|
+
let { id: e = "" } = I(), t = s(), { emitFact: n } = E(), { data: a, isLoading: d, error: m, refetch: h } = r(e), y = i({ engagementId: e }), b = o(), [A, L] = D(!1), [H, U] = D(!1), [J, Y] = D(null);
|
|
33
|
+
if (d) return /* @__PURE__ */ R(f, {});
|
|
34
|
+
if (m) return /* @__PURE__ */ R(u, {
|
|
35
|
+
error: m,
|
|
36
|
+
onRetry: () => void h()
|
|
36
37
|
});
|
|
37
|
-
if (!
|
|
38
|
-
let
|
|
39
|
-
return /* @__PURE__ */
|
|
38
|
+
if (!a) return /* @__PURE__ */ R(l, { title: "Engagement not found" });
|
|
39
|
+
let X = V[a.status] ?? [], Z = (y.data?.items ?? []).reduce((e, t) => e + t.minutes, 0);
|
|
40
|
+
return /* @__PURE__ */ z("div", {
|
|
40
41
|
className: "space-y-6",
|
|
41
42
|
children: [
|
|
42
|
-
/* @__PURE__ */
|
|
43
|
+
/* @__PURE__ */ z("button", {
|
|
43
44
|
type: "button",
|
|
44
45
|
onClick: () => t("engagements"),
|
|
45
|
-
className: "flex items-center gap-1.5 text-sm text-text-secondary hover:text-accent",
|
|
46
|
-
children: [/* @__PURE__ */
|
|
46
|
+
className: "flex items-center gap-1.5 text-sm text-text-secondary transition-colors hover:text-accent",
|
|
47
|
+
children: [/* @__PURE__ */ R(O, { className: "h-4 w-4" }), " Back to engagements"]
|
|
47
48
|
}),
|
|
48
|
-
/* @__PURE__ */
|
|
49
|
-
title:
|
|
50
|
-
subtitle:
|
|
51
|
-
actions: /* @__PURE__ */
|
|
49
|
+
/* @__PURE__ */ R(g, {
|
|
50
|
+
title: a.name,
|
|
51
|
+
subtitle: a.client ? `${a.client.name} · ${w(a.feeArrangement)}` : w(a.feeArrangement),
|
|
52
|
+
actions: /* @__PURE__ */ R(v, { status: a.status })
|
|
52
53
|
}),
|
|
53
|
-
|
|
54
|
-
tone:
|
|
55
|
-
onClose: () =>
|
|
56
|
-
children:
|
|
54
|
+
J && /* @__PURE__ */ R(c, {
|
|
55
|
+
tone: J.tone,
|
|
56
|
+
onClose: () => Y(null),
|
|
57
|
+
children: J.text
|
|
57
58
|
}),
|
|
58
|
-
/* @__PURE__ */
|
|
59
|
+
/* @__PURE__ */ z("div", {
|
|
59
60
|
className: "grid grid-cols-2 gap-3 lg:grid-cols-4",
|
|
60
61
|
children: [
|
|
61
|
-
/* @__PURE__ */
|
|
62
|
+
/* @__PURE__ */ R(p, {
|
|
62
63
|
label: "Fee",
|
|
63
|
-
value: C(
|
|
64
|
-
hint: w(
|
|
64
|
+
value: C(a.feeAmount, a.currency),
|
|
65
|
+
hint: w(a.feeArrangement),
|
|
66
|
+
icon: /* @__PURE__ */ R(M, { className: "h-4 w-4" }),
|
|
67
|
+
tone: "success"
|
|
65
68
|
}),
|
|
66
|
-
/* @__PURE__ */
|
|
69
|
+
/* @__PURE__ */ R(p, {
|
|
67
70
|
label: "Deliverables",
|
|
68
|
-
value:
|
|
71
|
+
value: a.deliverables.length,
|
|
72
|
+
icon: /* @__PURE__ */ R(N, { className: "h-4 w-4" }),
|
|
73
|
+
tone: "info"
|
|
69
74
|
}),
|
|
70
|
-
/* @__PURE__ */
|
|
75
|
+
/* @__PURE__ */ R(p, {
|
|
71
76
|
label: "Milestones",
|
|
72
|
-
value:
|
|
77
|
+
value: a.milestones.length,
|
|
78
|
+
icon: /* @__PURE__ */ R(P, { className: "h-4 w-4" }),
|
|
79
|
+
tone: "accent"
|
|
73
80
|
}),
|
|
74
|
-
/* @__PURE__ */
|
|
81
|
+
/* @__PURE__ */ R(p, {
|
|
75
82
|
label: "Time logged",
|
|
76
|
-
value: S(
|
|
77
|
-
hint: `${
|
|
83
|
+
value: S(Z),
|
|
84
|
+
hint: `${y.data?.totalCount ?? 0} entries`,
|
|
85
|
+
icon: /* @__PURE__ */ R(j, { className: "h-4 w-4" }),
|
|
86
|
+
tone: "warning"
|
|
78
87
|
})
|
|
79
88
|
]
|
|
80
89
|
}),
|
|
81
|
-
|
|
90
|
+
X.length > 0 && /* @__PURE__ */ R(_, {
|
|
82
91
|
title: "Advance lifecycle",
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
92
|
+
children: /* @__PURE__ */ z("div", {
|
|
93
|
+
className: "flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",
|
|
94
|
+
children: [/* @__PURE__ */ z("div", {
|
|
95
|
+
className: "flex items-center gap-2 text-sm text-text-secondary",
|
|
96
|
+
children: [/* @__PURE__ */ R("span", { children: "Currently" }), /* @__PURE__ */ R(v, { status: a.status })]
|
|
97
|
+
}), /* @__PURE__ */ R("div", {
|
|
98
|
+
className: "flex flex-wrap gap-2",
|
|
99
|
+
children: X.map((e) => {
|
|
100
|
+
let t = e === "CANCELLED";
|
|
101
|
+
return /* @__PURE__ */ z(B, {
|
|
102
|
+
size: "sm",
|
|
103
|
+
variant: t ? "outline" : "default",
|
|
104
|
+
disabled: b.isPending,
|
|
105
|
+
onClick: () => b.mutate({
|
|
106
|
+
id: a.id,
|
|
107
|
+
status: e
|
|
108
|
+
}, {
|
|
109
|
+
onSuccess: () => {
|
|
110
|
+
n("psw.engagement.transitioned", {
|
|
111
|
+
engagementId: a.id,
|
|
112
|
+
status: e
|
|
113
|
+
}), Y({
|
|
114
|
+
tone: "success",
|
|
115
|
+
text: `Moved to ${w(e)}.`
|
|
116
|
+
});
|
|
117
|
+
},
|
|
118
|
+
onError: (e) => Y({
|
|
119
|
+
tone: "danger",
|
|
120
|
+
text: e instanceof Error ? e.message : "Transition failed."
|
|
121
|
+
})
|
|
122
|
+
}),
|
|
123
|
+
children: [w(e), !t && /* @__PURE__ */ R(k, { className: "ml-1.5 h-4 w-4" })]
|
|
124
|
+
}, e);
|
|
125
|
+
})
|
|
126
|
+
})]
|
|
105
127
|
})
|
|
106
128
|
}),
|
|
107
|
-
/* @__PURE__ */
|
|
129
|
+
/* @__PURE__ */ z("div", {
|
|
108
130
|
className: "grid grid-cols-1 gap-4 lg:grid-cols-2",
|
|
109
|
-
children: [/* @__PURE__ */
|
|
131
|
+
children: [/* @__PURE__ */ R(_, {
|
|
110
132
|
title: "Deliverables",
|
|
111
|
-
action: /* @__PURE__ */
|
|
133
|
+
action: /* @__PURE__ */ z(B, {
|
|
112
134
|
size: "sm",
|
|
113
135
|
variant: "outline",
|
|
114
|
-
onClick: () =>
|
|
115
|
-
children: [/* @__PURE__ */ F
|
|
136
|
+
onClick: () => L(!0),
|
|
137
|
+
children: [/* @__PURE__ */ R(F, { className: "mr-1.5 h-4 w-4" }), "Add"]
|
|
116
138
|
}),
|
|
117
|
-
children:
|
|
139
|
+
children: a.deliverables.length === 0 ? /* @__PURE__ */ R(l, {
|
|
118
140
|
title: "No deliverables",
|
|
119
141
|
description: "Track the tangible outputs of this engagement.",
|
|
120
|
-
icon: /* @__PURE__ */
|
|
121
|
-
}) : /* @__PURE__ */
|
|
122
|
-
className: "space-y-2",
|
|
123
|
-
children:
|
|
124
|
-
className: "rounded-
|
|
125
|
-
children: /* @__PURE__ */
|
|
126
|
-
className: "flex items-start justify-between gap-
|
|
127
|
-
children: [/* @__PURE__ */
|
|
128
|
-
className: "
|
|
129
|
-
children: [
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
142
|
+
icon: /* @__PURE__ */ R(N, { className: "h-7 w-7" })
|
|
143
|
+
}) : /* @__PURE__ */ R("ul", {
|
|
144
|
+
className: "space-y-2.5",
|
|
145
|
+
children: a.deliverables.map((e) => /* @__PURE__ */ R("li", {
|
|
146
|
+
className: "rounded-xl border border-border-seam bg-bg-canvas p-3.5 transition-colors hover:border-accent/40",
|
|
147
|
+
children: /* @__PURE__ */ z("div", {
|
|
148
|
+
className: "flex items-start justify-between gap-3",
|
|
149
|
+
children: [/* @__PURE__ */ z("div", {
|
|
150
|
+
className: "min-w-0",
|
|
151
|
+
children: [/* @__PURE__ */ z("div", {
|
|
152
|
+
className: "flex items-center gap-2 text-sm font-medium text-text-primary",
|
|
153
|
+
children: [/* @__PURE__ */ R("span", {
|
|
154
|
+
className: "truncate",
|
|
155
|
+
children: e.name
|
|
156
|
+
}), /* @__PURE__ */ z("span", {
|
|
157
|
+
className: "shrink-0 rounded-md bg-bg-sunken px-1.5 py-0.5 text-[10px] font-semibold text-text-tertiary",
|
|
134
158
|
children: ["v", e.version]
|
|
135
|
-
})
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
})
|
|
159
|
+
})]
|
|
160
|
+
}), e.dueDate && /* @__PURE__ */ z("div", {
|
|
161
|
+
className: "mt-0.5 text-xs text-text-tertiary",
|
|
162
|
+
children: ["Due ", x(e.dueDate)]
|
|
163
|
+
})]
|
|
164
|
+
}), /* @__PURE__ */ R(W, {
|
|
141
165
|
id: e.id,
|
|
142
|
-
engagementId:
|
|
166
|
+
engagementId: a.id,
|
|
143
167
|
status: e.status,
|
|
144
|
-
onDone: () => void
|
|
168
|
+
onDone: () => void h()
|
|
145
169
|
})]
|
|
146
170
|
})
|
|
147
171
|
}, e.id))
|
|
148
172
|
})
|
|
149
|
-
}), /* @__PURE__ */
|
|
173
|
+
}), /* @__PURE__ */ R(_, {
|
|
150
174
|
title: "Milestones",
|
|
151
|
-
action: /* @__PURE__ */
|
|
175
|
+
action: /* @__PURE__ */ z(B, {
|
|
152
176
|
size: "sm",
|
|
153
177
|
variant: "outline",
|
|
154
|
-
onClick: () =>
|
|
155
|
-
children: [/* @__PURE__ */ F
|
|
178
|
+
onClick: () => U(!0),
|
|
179
|
+
children: [/* @__PURE__ */ R(F, { className: "mr-1.5 h-4 w-4" }), "Add"]
|
|
156
180
|
}),
|
|
157
|
-
children:
|
|
181
|
+
children: a.milestones.length === 0 ? /* @__PURE__ */ R(l, {
|
|
158
182
|
title: "No milestones",
|
|
159
183
|
description: "Add checkpoints — some can trigger billing.",
|
|
160
|
-
icon: /* @__PURE__ */
|
|
161
|
-
}) : /* @__PURE__ */
|
|
162
|
-
className: "space-y-2",
|
|
163
|
-
children:
|
|
164
|
-
className: "flex items-center justify-between rounded-
|
|
165
|
-
children: [/* @__PURE__ */
|
|
166
|
-
className: "
|
|
167
|
-
children:
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
184
|
+
icon: /* @__PURE__ */ R(P, { className: "h-7 w-7" })
|
|
185
|
+
}) : /* @__PURE__ */ R("ul", {
|
|
186
|
+
className: "space-y-2.5",
|
|
187
|
+
children: a.milestones.map((e) => /* @__PURE__ */ z("li", {
|
|
188
|
+
className: "flex items-center justify-between gap-3 rounded-xl border border-border-seam bg-bg-canvas p-3.5 transition-colors hover:border-accent/40",
|
|
189
|
+
children: [/* @__PURE__ */ z("div", {
|
|
190
|
+
className: "min-w-0",
|
|
191
|
+
children: [/* @__PURE__ */ R("div", {
|
|
192
|
+
className: "truncate text-sm font-medium text-text-primary",
|
|
193
|
+
children: e.name
|
|
194
|
+
}), /* @__PURE__ */ z("div", {
|
|
195
|
+
className: "mt-0.5 text-xs text-text-tertiary",
|
|
196
|
+
children: [
|
|
197
|
+
e.triggersInvoice ? `Bills ${C(e.triggerAmount, a.currency)} · ` : "",
|
|
198
|
+
"Due ",
|
|
199
|
+
x(e.dueDate)
|
|
200
|
+
]
|
|
201
|
+
})]
|
|
202
|
+
}), /* @__PURE__ */ z("div", {
|
|
203
|
+
className: "flex shrink-0 items-center gap-2",
|
|
204
|
+
children: [/* @__PURE__ */ R(v, { status: e.status }), e.status !== "COMPLETED" && e.status !== "CANCELLED" && /* @__PURE__ */ R(G, {
|
|
178
205
|
id: e.id,
|
|
179
|
-
engagementId:
|
|
180
|
-
onDone: () => void
|
|
206
|
+
engagementId: a.id,
|
|
207
|
+
onDone: () => void h()
|
|
181
208
|
})]
|
|
182
209
|
})]
|
|
183
210
|
}, e.id))
|
|
184
211
|
})
|
|
185
212
|
})]
|
|
186
213
|
}),
|
|
187
|
-
/* @__PURE__ */
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
title: "
|
|
197
|
-
description:
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
children: [/* @__PURE__ */
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
214
|
+
/* @__PURE__ */ z("div", {
|
|
215
|
+
className: "grid grid-cols-1 gap-4 lg:grid-cols-3",
|
|
216
|
+
children: [/* @__PURE__ */ R("div", {
|
|
217
|
+
className: "lg:col-span-2",
|
|
218
|
+
children: /* @__PURE__ */ R(T, {
|
|
219
|
+
entityType: "proserviceworld-engagement",
|
|
220
|
+
entityId: a.id
|
|
221
|
+
})
|
|
222
|
+
}), /* @__PURE__ */ R(_, {
|
|
223
|
+
title: "Time logged",
|
|
224
|
+
description: S(Z),
|
|
225
|
+
action: /* @__PURE__ */ z(B, {
|
|
226
|
+
size: "sm",
|
|
227
|
+
variant: "outline",
|
|
228
|
+
onClick: () => t("time"),
|
|
229
|
+
children: [/* @__PURE__ */ R(j, { className: "mr-1.5 h-4 w-4" }), "Log time"]
|
|
230
|
+
}),
|
|
231
|
+
children: y.isLoading ? /* @__PURE__ */ R(f, { label: "Loading…" }) : !y.data || y.data.items.length === 0 ? /* @__PURE__ */ R(l, {
|
|
232
|
+
title: "No time logged",
|
|
233
|
+
description: "Time logged against this engagement will appear here.",
|
|
234
|
+
icon: /* @__PURE__ */ R(j, { className: "h-7 w-7" })
|
|
235
|
+
}) : /* @__PURE__ */ R("ul", {
|
|
236
|
+
className: "space-y-2",
|
|
237
|
+
children: y.data.items.slice(0, 8).map((e) => /* @__PURE__ */ z("li", {
|
|
238
|
+
className: "rounded-lg border border-border-seam bg-bg-canvas p-3 text-sm",
|
|
239
|
+
children: [/* @__PURE__ */ z("div", {
|
|
240
|
+
className: "flex items-center justify-between gap-2",
|
|
241
|
+
children: [/* @__PURE__ */ R("span", {
|
|
242
|
+
className: "whitespace-nowrap text-xs text-text-tertiary",
|
|
243
|
+
children: x(e.date)
|
|
244
|
+
}), /* @__PURE__ */ z("span", {
|
|
245
|
+
className: "flex items-center gap-2",
|
|
246
|
+
children: [/* @__PURE__ */ R("span", {
|
|
247
|
+
className: "font-medium text-text-primary",
|
|
248
|
+
children: S(e.minutes)
|
|
249
|
+
}), /* @__PURE__ */ R(v, { status: e.status })]
|
|
250
|
+
})]
|
|
251
|
+
}), /* @__PURE__ */ R("div", {
|
|
252
|
+
className: "mt-1 truncate text-text-secondary",
|
|
253
|
+
children: e.narrative || "Time entry"
|
|
254
|
+
})]
|
|
255
|
+
}, e.id))
|
|
256
|
+
})
|
|
257
|
+
})]
|
|
222
258
|
}),
|
|
223
|
-
|
|
224
|
-
engagementId:
|
|
225
|
-
onClose: () =>
|
|
259
|
+
A && /* @__PURE__ */ R(K, {
|
|
260
|
+
engagementId: a.id,
|
|
261
|
+
onClose: () => L(!1),
|
|
226
262
|
onDone: () => {
|
|
227
|
-
|
|
263
|
+
h(), Y({
|
|
228
264
|
tone: "success",
|
|
229
265
|
text: "Deliverable added."
|
|
230
266
|
});
|
|
231
267
|
}
|
|
232
268
|
}),
|
|
233
|
-
|
|
234
|
-
engagementId:
|
|
235
|
-
onClose: () =>
|
|
269
|
+
H && /* @__PURE__ */ R(q, {
|
|
270
|
+
engagementId: a.id,
|
|
271
|
+
onClose: () => U(!1),
|
|
236
272
|
onDone: () => {
|
|
237
|
-
|
|
273
|
+
h(), Y({
|
|
238
274
|
tone: "success",
|
|
239
275
|
text: "Milestone added."
|
|
240
276
|
});
|
|
@@ -242,9 +278,9 @@ var R = {
|
|
|
242
278
|
})
|
|
243
279
|
]
|
|
244
280
|
});
|
|
245
|
-
},
|
|
281
|
+
}, W = ({ id: e, engagementId: t, status: n, onDone: r }) => {
|
|
246
282
|
let i = a();
|
|
247
|
-
return /* @__PURE__ */
|
|
283
|
+
return /* @__PURE__ */ R(h, {
|
|
248
284
|
value: n,
|
|
249
285
|
disabled: i.isPending,
|
|
250
286
|
onChange: (n) => i.mutate({
|
|
@@ -252,15 +288,15 @@ var R = {
|
|
|
252
288
|
status: n.target.value,
|
|
253
289
|
engagementId: t
|
|
254
290
|
}, { onSuccess: r }),
|
|
255
|
-
className: "w-40",
|
|
256
|
-
children:
|
|
291
|
+
className: "w-40 shrink-0",
|
|
292
|
+
children: H.map((e) => /* @__PURE__ */ R("option", {
|
|
257
293
|
value: e,
|
|
258
294
|
children: w(e)
|
|
259
295
|
}, e))
|
|
260
296
|
});
|
|
261
|
-
},
|
|
297
|
+
}, G = ({ id: t, engagementId: n, onDone: r }) => {
|
|
262
298
|
let i = e();
|
|
263
|
-
return /* @__PURE__ */
|
|
299
|
+
return /* @__PURE__ */ R(B, {
|
|
264
300
|
variant: "ghost",
|
|
265
301
|
size: "sm",
|
|
266
302
|
"aria-label": "Complete milestone",
|
|
@@ -269,28 +305,28 @@ var R = {
|
|
|
269
305
|
id: t,
|
|
270
306
|
engagementId: n
|
|
271
307
|
}, { onSuccess: r }),
|
|
272
|
-
children: /* @__PURE__ */
|
|
308
|
+
children: /* @__PURE__ */ R(A, { className: "h-4 w-4" })
|
|
273
309
|
});
|
|
274
|
-
},
|
|
275
|
-
let i = t(), [a, o] =
|
|
310
|
+
}, K = ({ engagementId: e, onClose: n, onDone: r }) => {
|
|
311
|
+
let i = t(), [a, o] = D({
|
|
276
312
|
name: "",
|
|
277
313
|
description: "",
|
|
278
314
|
dueDate: "",
|
|
279
315
|
acceptanceCriteria: ""
|
|
280
|
-
}), [s, l] =
|
|
316
|
+
}), [s, l] = D(null), u = (e) => (t) => o((n) => ({
|
|
281
317
|
...n,
|
|
282
318
|
[e]: t.target.value
|
|
283
319
|
}));
|
|
284
|
-
return /* @__PURE__ */
|
|
320
|
+
return /* @__PURE__ */ R(m, {
|
|
285
321
|
open: !0,
|
|
286
322
|
onClose: n,
|
|
287
323
|
title: "Add deliverable",
|
|
288
|
-
footer: /* @__PURE__ */
|
|
324
|
+
footer: /* @__PURE__ */ z(L, { children: [/* @__PURE__ */ R(B, {
|
|
289
325
|
variant: "outline",
|
|
290
326
|
onClick: n,
|
|
291
327
|
disabled: i.isPending,
|
|
292
328
|
children: "Cancel"
|
|
293
|
-
}), /* @__PURE__ */
|
|
329
|
+
}), /* @__PURE__ */ R(B, {
|
|
294
330
|
onClick: () => {
|
|
295
331
|
if (l(null), !a.name.trim()) return l("Name is required.");
|
|
296
332
|
i.mutate({
|
|
@@ -309,40 +345,40 @@ var R = {
|
|
|
309
345
|
disabled: i.isPending,
|
|
310
346
|
children: i.isPending ? "Adding…" : "Add"
|
|
311
347
|
})] }),
|
|
312
|
-
children: /* @__PURE__ */
|
|
348
|
+
children: /* @__PURE__ */ z("div", {
|
|
313
349
|
className: "space-y-3",
|
|
314
350
|
children: [
|
|
315
|
-
s && /* @__PURE__ */
|
|
351
|
+
s && /* @__PURE__ */ R(c, {
|
|
316
352
|
tone: "danger",
|
|
317
353
|
children: s
|
|
318
354
|
}),
|
|
319
|
-
/* @__PURE__ */
|
|
355
|
+
/* @__PURE__ */ R(d, {
|
|
320
356
|
label: "Name",
|
|
321
357
|
required: !0,
|
|
322
|
-
children: /* @__PURE__ */
|
|
358
|
+
children: /* @__PURE__ */ R(b, {
|
|
323
359
|
value: a.name,
|
|
324
360
|
onChange: u("name"),
|
|
325
361
|
placeholder: "Draft audit report"
|
|
326
362
|
})
|
|
327
363
|
}),
|
|
328
|
-
/* @__PURE__ */
|
|
364
|
+
/* @__PURE__ */ R(d, {
|
|
329
365
|
label: "Due date",
|
|
330
|
-
children: /* @__PURE__ */
|
|
366
|
+
children: /* @__PURE__ */ R(b, {
|
|
331
367
|
type: "date",
|
|
332
368
|
value: a.dueDate,
|
|
333
369
|
onChange: u("dueDate")
|
|
334
370
|
})
|
|
335
371
|
}),
|
|
336
|
-
/* @__PURE__ */
|
|
372
|
+
/* @__PURE__ */ R(d, {
|
|
337
373
|
label: "Acceptance criteria",
|
|
338
|
-
children: /* @__PURE__ */
|
|
374
|
+
children: /* @__PURE__ */ R(y, {
|
|
339
375
|
value: a.acceptanceCriteria,
|
|
340
376
|
onChange: u("acceptanceCriteria")
|
|
341
377
|
})
|
|
342
378
|
}),
|
|
343
|
-
/* @__PURE__ */
|
|
379
|
+
/* @__PURE__ */ R(d, {
|
|
344
380
|
label: "Description",
|
|
345
|
-
children: /* @__PURE__ */
|
|
381
|
+
children: /* @__PURE__ */ R(y, {
|
|
346
382
|
value: a.description,
|
|
347
383
|
onChange: u("description")
|
|
348
384
|
})
|
|
@@ -350,23 +386,23 @@ var R = {
|
|
|
350
386
|
]
|
|
351
387
|
})
|
|
352
388
|
});
|
|
353
|
-
},
|
|
354
|
-
let i = n(), [a, o] =
|
|
389
|
+
}, q = ({ engagementId: e, onClose: t, onDone: r }) => {
|
|
390
|
+
let i = n(), [a, o] = D({
|
|
355
391
|
name: "",
|
|
356
392
|
dueDate: "",
|
|
357
393
|
triggerAmount: "",
|
|
358
394
|
triggersInvoice: !1
|
|
359
|
-
}), [s, l] =
|
|
360
|
-
return /* @__PURE__ */
|
|
395
|
+
}), [s, l] = D(null);
|
|
396
|
+
return /* @__PURE__ */ R(m, {
|
|
361
397
|
open: !0,
|
|
362
398
|
onClose: t,
|
|
363
399
|
title: "Add milestone",
|
|
364
|
-
footer: /* @__PURE__ */
|
|
400
|
+
footer: /* @__PURE__ */ z(L, { children: [/* @__PURE__ */ R(B, {
|
|
365
401
|
variant: "outline",
|
|
366
402
|
onClick: t,
|
|
367
403
|
disabled: i.isPending,
|
|
368
404
|
children: "Cancel"
|
|
369
|
-
}), /* @__PURE__ */
|
|
405
|
+
}), /* @__PURE__ */ R(B, {
|
|
370
406
|
onClick: () => {
|
|
371
407
|
if (l(null), !a.name.trim()) return l("Name is required.");
|
|
372
408
|
i.mutate({
|
|
@@ -385,17 +421,17 @@ var R = {
|
|
|
385
421
|
disabled: i.isPending,
|
|
386
422
|
children: i.isPending ? "Adding…" : "Add"
|
|
387
423
|
})] }),
|
|
388
|
-
children: /* @__PURE__ */
|
|
424
|
+
children: /* @__PURE__ */ z("div", {
|
|
389
425
|
className: "space-y-3",
|
|
390
426
|
children: [
|
|
391
|
-
s && /* @__PURE__ */
|
|
427
|
+
s && /* @__PURE__ */ R(c, {
|
|
392
428
|
tone: "danger",
|
|
393
429
|
children: s
|
|
394
430
|
}),
|
|
395
|
-
/* @__PURE__ */
|
|
431
|
+
/* @__PURE__ */ R(d, {
|
|
396
432
|
label: "Name",
|
|
397
433
|
required: !0,
|
|
398
|
-
children: /* @__PURE__ */
|
|
434
|
+
children: /* @__PURE__ */ R(b, {
|
|
399
435
|
value: a.name,
|
|
400
436
|
onChange: (e) => o((t) => ({
|
|
401
437
|
...t,
|
|
@@ -404,9 +440,9 @@ var R = {
|
|
|
404
440
|
placeholder: "Phase 1 sign-off"
|
|
405
441
|
})
|
|
406
442
|
}),
|
|
407
|
-
/* @__PURE__ */
|
|
443
|
+
/* @__PURE__ */ R(d, {
|
|
408
444
|
label: "Due date",
|
|
409
|
-
children: /* @__PURE__ */
|
|
445
|
+
children: /* @__PURE__ */ R(b, {
|
|
410
446
|
type: "date",
|
|
411
447
|
value: a.dueDate,
|
|
412
448
|
onChange: (e) => o((t) => ({
|
|
@@ -415,10 +451,10 @@ var R = {
|
|
|
415
451
|
}))
|
|
416
452
|
})
|
|
417
453
|
}),
|
|
418
|
-
/* @__PURE__ */
|
|
454
|
+
/* @__PURE__ */ R(d, {
|
|
419
455
|
label: "Trigger amount",
|
|
420
456
|
hint: "Amount billed when this milestone completes (if it triggers an invoice).",
|
|
421
|
-
children: /* @__PURE__ */
|
|
457
|
+
children: /* @__PURE__ */ R(b, {
|
|
422
458
|
type: "number",
|
|
423
459
|
min: "0",
|
|
424
460
|
value: a.triggerAmount,
|
|
@@ -428,9 +464,9 @@ var R = {
|
|
|
428
464
|
}))
|
|
429
465
|
})
|
|
430
466
|
}),
|
|
431
|
-
/* @__PURE__ */
|
|
467
|
+
/* @__PURE__ */ z("label", {
|
|
432
468
|
className: "flex items-center gap-2 text-sm text-text-secondary",
|
|
433
|
-
children: [/* @__PURE__ */
|
|
469
|
+
children: [/* @__PURE__ */ R("input", {
|
|
434
470
|
type: "checkbox",
|
|
435
471
|
checked: a.triggersInvoice,
|
|
436
472
|
onChange: (e) => o((t) => ({
|
|
@@ -444,6 +480,6 @@ var R = {
|
|
|
444
480
|
});
|
|
445
481
|
};
|
|
446
482
|
//#endregion
|
|
447
|
-
export {
|
|
483
|
+
export { U as EngagementDetailPage };
|
|
448
484
|
|
|
449
485
|
//# sourceMappingURL=EngagementDetailPage.js.map
|