@burdenoff/microfe-proserviceworld 2026.1014.1 → 2026.1015.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/proserviceworld/hooks/useProServiceWorldApi.d.ts +8 -0
- package/dist/proserviceworld/hooks/useProServiceWorldApi.d.ts.map +1 -1
- package/dist/proserviceworld/hooks/useProServiceWorldApi.js +21 -13
- package/dist/proserviceworld/hooks/useProServiceWorldApi.js.map +1 -1
- package/dist/proserviceworld/pages/CompliancePage.d.ts.map +1 -1
- package/dist/proserviceworld/pages/CompliancePage.js +136 -118
- package/dist/proserviceworld/pages/CompliancePage.js.map +1 -1
- package/dist/proserviceworld/pages/ConflictsPage.d.ts.map +1 -1
- package/dist/proserviceworld/pages/ConflictsPage.js +87 -71
- package/dist/proserviceworld/pages/ConflictsPage.js.map +1 -1
- package/dist/proserviceworld/pages/DocumentsPage.d.ts.map +1 -1
- package/dist/proserviceworld/pages/DocumentsPage.js +104 -86
- package/dist/proserviceworld/pages/DocumentsPage.js.map +1 -1
- package/dist/proserviceworld/pages/InvoicesPage.d.ts.map +1 -1
- package/dist/proserviceworld/pages/InvoicesPage.js +122 -104
- package/dist/proserviceworld/pages/InvoicesPage.js.map +1 -1
- package/dist/proserviceworld/pages/TimePage.d.ts.map +1 -1
- package/dist/proserviceworld/pages/TimePage.js +132 -114
- package/dist/proserviceworld/pages/TimePage.js.map +1 -1
- package/dist/proserviceworld/pages/TrustPage.d.ts.map +1 -1
- package/dist/proserviceworld/pages/TrustPage.js +226 -207
- package/dist/proserviceworld/pages/TrustPage.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,87 +1,105 @@
|
|
|
1
1
|
import { useClients as e, useComplianceChecks as t, useCreateComplianceCheck as n, useEngagements as r, useMatters as i, useResolveComplianceCheck as a } from "../hooks/useProServiceWorldApi.js";
|
|
2
2
|
import { Banner as o, Empty as s, ErrorState as c, Field as l, LoadingBlock as u, MetricCard as d, Modal as f, NativeSelect as p, PageHeader as m, SectionCard as h, StatusPill as g, TableWrap as _, Td as v, TextArea as y, TextInput as b, Th as x, enumOptions as S, fmtDate as C, humanize as w } from "../components/ui.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
3
|
+
import { useAnalytics as T } from "../hooks/useAnalytics.js";
|
|
4
|
+
import { useDeferredValue as E, useState as D } from "react";
|
|
5
|
+
import { BadgeCheck as O, CheckCircle2 as k, Clock as A, Database as j, FileCheck as M, GraduationCap as N, ListChecks as P, Lock as F, Plus as I, Scale as L, Search as R, ShieldCheck as z } from "lucide-react";
|
|
6
|
+
import { Fragment as B, jsx as V, jsxs as H } from "react/jsx-runtime";
|
|
7
|
+
import { Button as U } from "@burdenoff/fe-libs/ui";
|
|
7
8
|
//#region src/proserviceworld/pages/CompliancePage.tsx
|
|
8
|
-
var
|
|
9
|
+
var W = [
|
|
9
10
|
"ENGAGEMENT_ACCEPTANCE",
|
|
10
11
|
"INDEPENDENCE",
|
|
11
12
|
"LICENSING",
|
|
12
13
|
"CONTINUING_EDUCATION",
|
|
13
14
|
"DATA_RETENTION",
|
|
14
15
|
"LEGAL_HOLD"
|
|
15
|
-
],
|
|
16
|
+
], G = [
|
|
16
17
|
"IN_REVIEW",
|
|
17
18
|
"PASSED",
|
|
18
19
|
"FAILED",
|
|
19
20
|
"WAIVED"
|
|
20
|
-
],
|
|
21
|
+
], K = [
|
|
21
22
|
"CLIENT",
|
|
22
23
|
"ENGAGEMENT",
|
|
23
24
|
"MATTER"
|
|
24
|
-
],
|
|
25
|
-
ENGAGEMENT_ACCEPTANCE: /* @__PURE__ */
|
|
26
|
-
INDEPENDENCE: /* @__PURE__ */
|
|
27
|
-
LICENSING: /* @__PURE__ */
|
|
28
|
-
CONTINUING_EDUCATION: /* @__PURE__ */
|
|
29
|
-
DATA_RETENTION: /* @__PURE__ */
|
|
30
|
-
LEGAL_HOLD: /* @__PURE__ */
|
|
31
|
-
},
|
|
32
|
-
let [e, n] =
|
|
33
|
-
|
|
25
|
+
], q = {
|
|
26
|
+
ENGAGEMENT_ACCEPTANCE: /* @__PURE__ */ V(M, { className: "h-3.5 w-3.5" }),
|
|
27
|
+
INDEPENDENCE: /* @__PURE__ */ V(L, { className: "h-3.5 w-3.5" }),
|
|
28
|
+
LICENSING: /* @__PURE__ */ V(O, { className: "h-3.5 w-3.5" }),
|
|
29
|
+
CONTINUING_EDUCATION: /* @__PURE__ */ V(N, { className: "h-3.5 w-3.5" }),
|
|
30
|
+
DATA_RETENTION: /* @__PURE__ */ V(j, { className: "h-3.5 w-3.5" }),
|
|
31
|
+
LEGAL_HOLD: /* @__PURE__ */ V(F, { className: "h-3.5 w-3.5" })
|
|
32
|
+
}, J = () => {
|
|
33
|
+
let [e, n] = D(""), [r, i] = D(""), a = E(r), [l, f] = D(!1), [y, O] = D(null), [j, M] = D(null), { data: N, isLoading: F, error: L, refetch: B } = t({
|
|
34
|
+
status: e || void 0,
|
|
35
|
+
search: a.trim() || void 0
|
|
36
|
+
}), { emitFact: W } = T(), G = N?.items ?? [], K = G.filter((e) => e.status === "PENDING").length, J = G.filter((e) => e.status === "IN_REVIEW").length, Z = G.filter((e) => e.status === "PASSED" || e.status === "FAILED" || e.status === "WAIVED").length;
|
|
37
|
+
return /* @__PURE__ */ H("div", {
|
|
34
38
|
className: "space-y-6",
|
|
35
39
|
children: [
|
|
36
|
-
/* @__PURE__ */
|
|
40
|
+
/* @__PURE__ */ V(m, {
|
|
37
41
|
title: "Compliance",
|
|
38
42
|
subtitle: "The duties that travel with the work — acceptance, independence, licensing, CE, retention and legal hold — as gates, not afterthoughts.",
|
|
39
|
-
icon: /* @__PURE__ */
|
|
40
|
-
actions: /* @__PURE__ */
|
|
41
|
-
onClick: () =>
|
|
42
|
-
children: [/* @__PURE__ */
|
|
43
|
+
icon: /* @__PURE__ */ V(z, { className: "h-6 w-6" }),
|
|
44
|
+
actions: /* @__PURE__ */ H(U, {
|
|
45
|
+
onClick: () => f(!0),
|
|
46
|
+
children: [/* @__PURE__ */ V(I, { className: "mr-1.5 h-4 w-4" }), "New check"]
|
|
43
47
|
})
|
|
44
48
|
}),
|
|
45
|
-
|
|
49
|
+
j && /* @__PURE__ */ V(o, {
|
|
46
50
|
tone: "success",
|
|
47
|
-
onClose: () =>
|
|
48
|
-
children:
|
|
51
|
+
onClose: () => M(null),
|
|
52
|
+
children: j
|
|
49
53
|
}),
|
|
50
|
-
|
|
54
|
+
G.length > 0 && /* @__PURE__ */ H("div", {
|
|
51
55
|
className: "grid grid-cols-2 gap-3 lg:grid-cols-4",
|
|
52
56
|
children: [
|
|
53
|
-
/* @__PURE__ */
|
|
57
|
+
/* @__PURE__ */ V(d, {
|
|
54
58
|
label: "Checks",
|
|
55
|
-
value:
|
|
56
|
-
icon: /* @__PURE__ */
|
|
59
|
+
value: G.length,
|
|
60
|
+
icon: /* @__PURE__ */ V(P, { className: "h-4 w-4" })
|
|
57
61
|
}),
|
|
58
|
-
/* @__PURE__ */
|
|
62
|
+
/* @__PURE__ */ V(d, {
|
|
59
63
|
label: "Pending",
|
|
60
|
-
value:
|
|
61
|
-
icon: /* @__PURE__ */
|
|
62
|
-
tone:
|
|
64
|
+
value: K,
|
|
65
|
+
icon: /* @__PURE__ */ V(A, { className: "h-4 w-4" }),
|
|
66
|
+
tone: K ? "warning" : "neutral"
|
|
63
67
|
}),
|
|
64
|
-
/* @__PURE__ */
|
|
68
|
+
/* @__PURE__ */ V(d, {
|
|
65
69
|
label: "In review",
|
|
66
|
-
value:
|
|
67
|
-
icon: /* @__PURE__ */
|
|
70
|
+
value: J,
|
|
71
|
+
icon: /* @__PURE__ */ V(z, { className: "h-4 w-4" }),
|
|
68
72
|
tone: "info"
|
|
69
73
|
}),
|
|
70
|
-
/* @__PURE__ */
|
|
74
|
+
/* @__PURE__ */ V(d, {
|
|
71
75
|
label: "Resolved",
|
|
72
|
-
value:
|
|
73
|
-
icon: /* @__PURE__ */
|
|
76
|
+
value: Z,
|
|
77
|
+
icon: /* @__PURE__ */ V(k, { className: "h-4 w-4" }),
|
|
74
78
|
tone: "success"
|
|
75
79
|
})
|
|
76
80
|
]
|
|
77
81
|
}),
|
|
78
|
-
/* @__PURE__ */
|
|
79
|
-
className: "flex
|
|
80
|
-
children: /* @__PURE__ */
|
|
82
|
+
/* @__PURE__ */ H("div", {
|
|
83
|
+
className: "flex flex-col gap-2 sm:flex-row sm:items-center",
|
|
84
|
+
children: [/* @__PURE__ */ H("div", {
|
|
85
|
+
className: "relative flex-1",
|
|
86
|
+
children: [/* @__PURE__ */ V(R, { className: "pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-tertiary" }), /* @__PURE__ */ V(b, {
|
|
87
|
+
placeholder: "Search compliance checks…",
|
|
88
|
+
value: r,
|
|
89
|
+
onChange: (e) => i(e.target.value),
|
|
90
|
+
onKeyDown: (e) => {
|
|
91
|
+
e.key === "Enter" && r.trim() && W("psw.search.performed", {
|
|
92
|
+
entityType: "compliance-check",
|
|
93
|
+
queryLength: r.trim().length
|
|
94
|
+
});
|
|
95
|
+
},
|
|
96
|
+
className: "pl-9"
|
|
97
|
+
})]
|
|
98
|
+
}), /* @__PURE__ */ H(p, {
|
|
81
99
|
value: e,
|
|
82
100
|
onChange: (e) => n(e.target.value),
|
|
83
101
|
className: "sm:w-52",
|
|
84
|
-
children: [/* @__PURE__ */
|
|
102
|
+
children: [/* @__PURE__ */ V("option", {
|
|
85
103
|
value: "",
|
|
86
104
|
children: "All statuses"
|
|
87
105
|
}), S([
|
|
@@ -91,62 +109,62 @@ var V = [
|
|
|
91
109
|
"FAILED",
|
|
92
110
|
"WAIVED"
|
|
93
111
|
])]
|
|
94
|
-
})
|
|
112
|
+
})]
|
|
95
113
|
}),
|
|
96
|
-
|
|
97
|
-
error:
|
|
98
|
-
onRetry: () => void
|
|
99
|
-
}) :
|
|
114
|
+
F ? /* @__PURE__ */ V(u, {}) : L ? /* @__PURE__ */ V(c, {
|
|
115
|
+
error: L,
|
|
116
|
+
onRetry: () => void B()
|
|
117
|
+
}) : G.length === 0 ? /* @__PURE__ */ V(s, {
|
|
100
118
|
title: "No compliance checks",
|
|
101
119
|
description: "Raise a check to gate acceptance or track a professional obligation.",
|
|
102
|
-
icon: /* @__PURE__ */
|
|
103
|
-
action: /* @__PURE__ */
|
|
104
|
-
onClick: () =>
|
|
105
|
-
children: [/* @__PURE__ */
|
|
120
|
+
icon: /* @__PURE__ */ V(z, { className: "h-8 w-8" }),
|
|
121
|
+
action: /* @__PURE__ */ H(U, {
|
|
122
|
+
onClick: () => f(!0),
|
|
123
|
+
children: [/* @__PURE__ */ V(I, { className: "mr-1.5 h-4 w-4" }), "New check"]
|
|
106
124
|
})
|
|
107
|
-
}) : /* @__PURE__ */
|
|
108
|
-
title: `${
|
|
109
|
-
children: /* @__PURE__ */
|
|
110
|
-
/* @__PURE__ */
|
|
111
|
-
/* @__PURE__ */
|
|
112
|
-
/* @__PURE__ */
|
|
113
|
-
/* @__PURE__ */
|
|
114
|
-
/* @__PURE__ */
|
|
115
|
-
/* @__PURE__ */
|
|
125
|
+
}) : /* @__PURE__ */ V(h, {
|
|
126
|
+
title: `${G.length} check${G.length === 1 ? "" : "s"}`,
|
|
127
|
+
children: /* @__PURE__ */ H(_, { children: [/* @__PURE__ */ V("thead", { children: /* @__PURE__ */ H("tr", { children: [
|
|
128
|
+
/* @__PURE__ */ V(x, { children: "Title" }),
|
|
129
|
+
/* @__PURE__ */ V(x, { children: "Type" }),
|
|
130
|
+
/* @__PURE__ */ V(x, { children: "Subject" }),
|
|
131
|
+
/* @__PURE__ */ V(x, { children: "Due" }),
|
|
132
|
+
/* @__PURE__ */ V(x, { children: "Status" }),
|
|
133
|
+
/* @__PURE__ */ V(x, {
|
|
116
134
|
className: "text-right",
|
|
117
135
|
children: "Actions"
|
|
118
136
|
})
|
|
119
|
-
] }) }), /* @__PURE__ */
|
|
137
|
+
] }) }), /* @__PURE__ */ V("tbody", { children: G.map((e) => /* @__PURE__ */ H("tr", {
|
|
120
138
|
className: "transition-colors hover:bg-bg-sunken/60",
|
|
121
139
|
children: [
|
|
122
|
-
/* @__PURE__ */
|
|
140
|
+
/* @__PURE__ */ V(v, { children: /* @__PURE__ */ V("span", {
|
|
123
141
|
className: "font-medium text-text-primary",
|
|
124
142
|
children: e.title
|
|
125
143
|
}) }),
|
|
126
|
-
/* @__PURE__ */
|
|
144
|
+
/* @__PURE__ */ V(v, { children: /* @__PURE__ */ H("span", {
|
|
127
145
|
className: "inline-flex items-center gap-2 whitespace-nowrap",
|
|
128
|
-
children: [/* @__PURE__ */
|
|
146
|
+
children: [/* @__PURE__ */ V("span", {
|
|
129
147
|
className: "flex h-6 w-6 items-center justify-center rounded-md bg-bg-sunken text-accent",
|
|
130
|
-
children:
|
|
148
|
+
children: q[e.type]
|
|
131
149
|
}), w(e.type)]
|
|
132
150
|
}) }),
|
|
133
|
-
/* @__PURE__ */
|
|
134
|
-
/* @__PURE__ */
|
|
151
|
+
/* @__PURE__ */ V(v, { children: w(e.subjectType) }),
|
|
152
|
+
/* @__PURE__ */ V(v, {
|
|
135
153
|
className: "whitespace-nowrap",
|
|
136
154
|
children: C(e.dueDate)
|
|
137
155
|
}),
|
|
138
|
-
/* @__PURE__ */
|
|
139
|
-
/* @__PURE__ */
|
|
156
|
+
/* @__PURE__ */ V(v, { children: /* @__PURE__ */ V(g, { status: e.status }) }),
|
|
157
|
+
/* @__PURE__ */ V(v, {
|
|
140
158
|
className: "text-right",
|
|
141
|
-
children: e.status === "PENDING" || e.status === "IN_REVIEW" ? /* @__PURE__ */
|
|
159
|
+
children: e.status === "PENDING" || e.status === "IN_REVIEW" ? /* @__PURE__ */ V(U, {
|
|
142
160
|
variant: "ghost",
|
|
143
161
|
size: "sm",
|
|
144
|
-
onClick: () =>
|
|
162
|
+
onClick: () => O({
|
|
145
163
|
id: e.id,
|
|
146
164
|
title: e.title
|
|
147
165
|
}),
|
|
148
166
|
children: "Resolve"
|
|
149
|
-
}) : /* @__PURE__ */
|
|
167
|
+
}) : /* @__PURE__ */ V("span", {
|
|
150
168
|
className: "text-xs text-text-tertiary",
|
|
151
169
|
children: e.resolvedAt ? C(e.resolvedAt) : ""
|
|
152
170
|
})
|
|
@@ -154,30 +172,30 @@ var V = [
|
|
|
154
172
|
]
|
|
155
173
|
}, e.id)) })] })
|
|
156
174
|
}),
|
|
157
|
-
|
|
158
|
-
onClose: () =>
|
|
175
|
+
l && /* @__PURE__ */ V(Y, {
|
|
176
|
+
onClose: () => f(!1),
|
|
159
177
|
onDone: () => {
|
|
160
|
-
|
|
178
|
+
B(), M("Compliance check created.");
|
|
161
179
|
}
|
|
162
180
|
}),
|
|
163
|
-
|
|
164
|
-
check:
|
|
165
|
-
onClose: () =>
|
|
181
|
+
y && /* @__PURE__ */ V(X, {
|
|
182
|
+
check: y,
|
|
183
|
+
onClose: () => O(null),
|
|
166
184
|
onDone: () => {
|
|
167
|
-
|
|
185
|
+
B(), M("Compliance check resolved.");
|
|
168
186
|
}
|
|
169
187
|
})
|
|
170
188
|
]
|
|
171
189
|
});
|
|
172
|
-
},
|
|
173
|
-
let s = n(), [c, u] =
|
|
190
|
+
}, Y = ({ onClose: t, onDone: a }) => {
|
|
191
|
+
let s = n(), [c, u] = D({
|
|
174
192
|
type: "ENGAGEMENT_ACCEPTANCE",
|
|
175
193
|
subjectType: "ENGAGEMENT",
|
|
176
194
|
subjectId: "",
|
|
177
195
|
title: "",
|
|
178
196
|
dueDate: "",
|
|
179
197
|
details: ""
|
|
180
|
-
}), [d, m] =
|
|
198
|
+
}), [d, m] = D(null), h = (e) => (t) => u((n) => ({
|
|
181
199
|
...n,
|
|
182
200
|
[e]: t.target.value
|
|
183
201
|
})), g = e({ pagination: { limit: 100 } }), _ = r({ pagination: { limit: 100 } }), v = i({ pagination: { limit: 100 } }), x = c.subjectType === "CLIENT" ? (g.data?.items ?? []).map((e) => ({
|
|
@@ -190,16 +208,16 @@ var V = [
|
|
|
190
208
|
id: e.id,
|
|
191
209
|
label: e.title
|
|
192
210
|
}));
|
|
193
|
-
return /* @__PURE__ */
|
|
211
|
+
return /* @__PURE__ */ V(f, {
|
|
194
212
|
open: !0,
|
|
195
213
|
onClose: t,
|
|
196
214
|
title: "New compliance check",
|
|
197
|
-
footer: /* @__PURE__ */
|
|
215
|
+
footer: /* @__PURE__ */ H(B, { children: [/* @__PURE__ */ V(U, {
|
|
198
216
|
variant: "outline",
|
|
199
217
|
onClick: t,
|
|
200
218
|
disabled: s.isPending,
|
|
201
219
|
children: "Cancel"
|
|
202
|
-
}), /* @__PURE__ */
|
|
220
|
+
}), /* @__PURE__ */ V(U, {
|
|
203
221
|
onClick: () => {
|
|
204
222
|
if (m(null), !c.title.trim()) return m("Title is required.");
|
|
205
223
|
if (!c.subjectId) return m("Select a subject.");
|
|
@@ -220,70 +238,70 @@ var V = [
|
|
|
220
238
|
disabled: s.isPending,
|
|
221
239
|
children: s.isPending ? "Creating…" : "Create check"
|
|
222
240
|
})] }),
|
|
223
|
-
children: /* @__PURE__ */
|
|
241
|
+
children: /* @__PURE__ */ H("div", {
|
|
224
242
|
className: "space-y-3",
|
|
225
243
|
children: [
|
|
226
|
-
d && /* @__PURE__ */
|
|
244
|
+
d && /* @__PURE__ */ V(o, {
|
|
227
245
|
tone: "danger",
|
|
228
246
|
children: d
|
|
229
247
|
}),
|
|
230
|
-
/* @__PURE__ */
|
|
248
|
+
/* @__PURE__ */ V(l, {
|
|
231
249
|
label: "Title",
|
|
232
250
|
required: !0,
|
|
233
|
-
children: /* @__PURE__ */
|
|
251
|
+
children: /* @__PURE__ */ V(b, {
|
|
234
252
|
value: c.title,
|
|
235
253
|
onChange: h("title"),
|
|
236
254
|
placeholder: "Independence confirmation — FY26 audit"
|
|
237
255
|
})
|
|
238
256
|
}),
|
|
239
|
-
/* @__PURE__ */
|
|
257
|
+
/* @__PURE__ */ V(l, {
|
|
240
258
|
label: "Type",
|
|
241
|
-
children: /* @__PURE__ */
|
|
259
|
+
children: /* @__PURE__ */ V(p, {
|
|
242
260
|
value: c.type,
|
|
243
261
|
onChange: h("type"),
|
|
244
|
-
children: S(
|
|
262
|
+
children: S(W)
|
|
245
263
|
})
|
|
246
264
|
}),
|
|
247
|
-
/* @__PURE__ */
|
|
265
|
+
/* @__PURE__ */ H("div", {
|
|
248
266
|
className: "grid grid-cols-2 gap-3",
|
|
249
|
-
children: [/* @__PURE__ */
|
|
267
|
+
children: [/* @__PURE__ */ V(l, {
|
|
250
268
|
label: "Subject type",
|
|
251
|
-
children: /* @__PURE__ */
|
|
269
|
+
children: /* @__PURE__ */ V(p, {
|
|
252
270
|
value: c.subjectType,
|
|
253
271
|
onChange: (e) => u((t) => ({
|
|
254
272
|
...t,
|
|
255
273
|
subjectType: e.target.value,
|
|
256
274
|
subjectId: ""
|
|
257
275
|
})),
|
|
258
|
-
children: S(
|
|
276
|
+
children: S(K)
|
|
259
277
|
})
|
|
260
|
-
}), /* @__PURE__ */
|
|
278
|
+
}), /* @__PURE__ */ V(l, {
|
|
261
279
|
label: "Subject",
|
|
262
280
|
required: !0,
|
|
263
|
-
children: /* @__PURE__ */
|
|
281
|
+
children: /* @__PURE__ */ H(p, {
|
|
264
282
|
value: c.subjectId,
|
|
265
283
|
onChange: h("subjectId"),
|
|
266
|
-
children: [/* @__PURE__ */
|
|
284
|
+
children: [/* @__PURE__ */ V("option", {
|
|
267
285
|
value: "",
|
|
268
286
|
children: "Select…"
|
|
269
|
-
}), x.map((e) => /* @__PURE__ */
|
|
287
|
+
}), x.map((e) => /* @__PURE__ */ V("option", {
|
|
270
288
|
value: e.id,
|
|
271
289
|
children: e.label
|
|
272
290
|
}, e.id))]
|
|
273
291
|
})
|
|
274
292
|
})]
|
|
275
293
|
}),
|
|
276
|
-
/* @__PURE__ */
|
|
294
|
+
/* @__PURE__ */ V(l, {
|
|
277
295
|
label: "Due date",
|
|
278
|
-
children: /* @__PURE__ */
|
|
296
|
+
children: /* @__PURE__ */ V(b, {
|
|
279
297
|
type: "date",
|
|
280
298
|
value: c.dueDate,
|
|
281
299
|
onChange: h("dueDate")
|
|
282
300
|
})
|
|
283
301
|
}),
|
|
284
|
-
/* @__PURE__ */
|
|
302
|
+
/* @__PURE__ */ V(l, {
|
|
285
303
|
label: "Details",
|
|
286
|
-
children: /* @__PURE__ */
|
|
304
|
+
children: /* @__PURE__ */ V(y, {
|
|
287
305
|
value: c.details,
|
|
288
306
|
onChange: h("details")
|
|
289
307
|
})
|
|
@@ -291,18 +309,18 @@ var V = [
|
|
|
291
309
|
]
|
|
292
310
|
})
|
|
293
311
|
});
|
|
294
|
-
},
|
|
295
|
-
let r = a(), [i, s] =
|
|
296
|
-
return /* @__PURE__ */
|
|
312
|
+
}, X = ({ check: e, onClose: t, onDone: n }) => {
|
|
313
|
+
let r = a(), [i, s] = D("PASSED"), [c, u] = D(""), [d, m] = D(null);
|
|
314
|
+
return /* @__PURE__ */ V(f, {
|
|
297
315
|
open: !0,
|
|
298
316
|
onClose: t,
|
|
299
317
|
title: `Resolve: ${e.title}`,
|
|
300
|
-
footer: /* @__PURE__ */
|
|
318
|
+
footer: /* @__PURE__ */ H(B, { children: [/* @__PURE__ */ V(U, {
|
|
301
319
|
variant: "outline",
|
|
302
320
|
onClick: t,
|
|
303
321
|
disabled: r.isPending,
|
|
304
322
|
children: "Cancel"
|
|
305
|
-
}), /* @__PURE__ */
|
|
323
|
+
}), /* @__PURE__ */ V(U, {
|
|
306
324
|
onClick: () => r.mutate({
|
|
307
325
|
id: e.id,
|
|
308
326
|
status: i,
|
|
@@ -316,27 +334,27 @@ var V = [
|
|
|
316
334
|
disabled: r.isPending,
|
|
317
335
|
children: r.isPending ? "Saving…" : "Resolve"
|
|
318
336
|
})] }),
|
|
319
|
-
children: /* @__PURE__ */
|
|
337
|
+
children: /* @__PURE__ */ H("div", {
|
|
320
338
|
className: "space-y-3",
|
|
321
339
|
children: [
|
|
322
|
-
d && /* @__PURE__ */
|
|
340
|
+
d && /* @__PURE__ */ V(o, {
|
|
323
341
|
tone: "danger",
|
|
324
342
|
children: d
|
|
325
343
|
}),
|
|
326
|
-
/* @__PURE__ */
|
|
344
|
+
/* @__PURE__ */ V(l, {
|
|
327
345
|
label: "Outcome",
|
|
328
|
-
children: /* @__PURE__ */
|
|
346
|
+
children: /* @__PURE__ */ V(p, {
|
|
329
347
|
value: i,
|
|
330
348
|
onChange: (e) => s(e.target.value),
|
|
331
|
-
children:
|
|
349
|
+
children: G.map((e) => /* @__PURE__ */ V("option", {
|
|
332
350
|
value: e,
|
|
333
351
|
children: w(e)
|
|
334
352
|
}, e))
|
|
335
353
|
})
|
|
336
354
|
}),
|
|
337
|
-
/* @__PURE__ */
|
|
355
|
+
/* @__PURE__ */ V(l, {
|
|
338
356
|
label: "Notes",
|
|
339
|
-
children: /* @__PURE__ */
|
|
357
|
+
children: /* @__PURE__ */ V(y, {
|
|
340
358
|
value: c,
|
|
341
359
|
onChange: (e) => u(e.target.value)
|
|
342
360
|
})
|
|
@@ -346,6 +364,6 @@ var V = [
|
|
|
346
364
|
});
|
|
347
365
|
};
|
|
348
366
|
//#endregion
|
|
349
|
-
export {
|
|
367
|
+
export { J as CompliancePage };
|
|
350
368
|
|
|
351
369
|
//# sourceMappingURL=CompliancePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CompliancePage.js","names":[],"sources":["../../../src/proserviceworld/pages/CompliancePage.tsx"],"sourcesContent":["import type { FC, ReactNode } from 'react';\nimport { useState } from 'react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport {\n Plus,\n ShieldCheck,\n FileCheck,\n Scale,\n BadgeCheck,\n GraduationCap,\n Database,\n Lock,\n Clock,\n ListChecks,\n CheckCircle2,\n} from 'lucide-react';\nimport {\n useComplianceChecks,\n useCreateComplianceCheck,\n useResolveComplianceCheck,\n useClients,\n useEngagements,\n useMatters,\n type PswComplianceStatus,\n type PswComplianceType,\n} from '../hooks/useProServiceWorldApi';\nimport {\n PageHeader,\n SectionCard,\n MetricCard,\n LoadingBlock,\n ErrorState,\n Empty,\n StatusPill,\n Modal,\n Field,\n TextInput,\n TextArea,\n NativeSelect,\n Banner,\n TableWrap,\n Th,\n Td,\n enumOptions,\n fmtDate,\n humanize,\n} from '../components/ui';\n\nconst TYPES = [\n 'ENGAGEMENT_ACCEPTANCE',\n 'INDEPENDENCE',\n 'LICENSING',\n 'CONTINUING_EDUCATION',\n 'DATA_RETENTION',\n 'LEGAL_HOLD',\n] as const;\nconst RESOLVE_STATUSES: PswComplianceStatus[] = ['IN_REVIEW', 'PASSED', 'FAILED', 'WAIVED'];\nconst SUBJECT_TYPES = ['CLIENT', 'ENGAGEMENT', 'MATTER'] as const;\n\nconst TYPE_ICON: Record<PswComplianceType, ReactNode> = {\n ENGAGEMENT_ACCEPTANCE: <FileCheck className=\"h-3.5 w-3.5\" />,\n INDEPENDENCE: <Scale className=\"h-3.5 w-3.5\" />,\n LICENSING: <BadgeCheck className=\"h-3.5 w-3.5\" />,\n CONTINUING_EDUCATION: <GraduationCap className=\"h-3.5 w-3.5\" />,\n DATA_RETENTION: <Database className=\"h-3.5 w-3.5\" />,\n LEGAL_HOLD: <Lock className=\"h-3.5 w-3.5\" />,\n};\n\nexport const CompliancePage: FC = () => {\n const [statusFilter, setStatusFilter] = useState<PswComplianceStatus | ''>('');\n const [creating, setCreating] = useState(false);\n const [resolving, setResolving] = useState<{ id: string; title: string } | null>(null);\n const [banner, setBanner] = useState<string | null>(null);\n const { data, isLoading, error, refetch } = useComplianceChecks({\n status: statusFilter || undefined,\n });\n\n const checks = data?.items ?? [];\n const pendingCount = checks.filter((c) => c.status === 'PENDING').length;\n const inReviewCount = checks.filter((c) => c.status === 'IN_REVIEW').length;\n const resolvedCount = checks.filter(\n (c) => c.status === 'PASSED' || c.status === 'FAILED' || c.status === 'WAIVED'\n ).length;\n\n return (\n <div className=\"space-y-6\">\n <PageHeader\n title=\"Compliance\"\n subtitle=\"The duties that travel with the work — acceptance, independence, licensing, CE, retention and legal hold — as gates, not afterthoughts.\"\n icon={<ShieldCheck className=\"h-6 w-6\" />}\n actions={\n <Button onClick={() => setCreating(true)}>\n <Plus className=\"mr-1.5 h-4 w-4\" />\n New check\n </Button>\n }\n />\n\n {banner && (\n <Banner tone=\"success\" onClose={() => setBanner(null)}>\n {banner}\n </Banner>\n )}\n\n {checks.length > 0 && (\n <div className=\"grid grid-cols-2 gap-3 lg:grid-cols-4\">\n <MetricCard\n label=\"Checks\"\n value={checks.length}\n icon={<ListChecks className=\"h-4 w-4\" />}\n />\n <MetricCard\n label=\"Pending\"\n value={pendingCount}\n icon={<Clock className=\"h-4 w-4\" />}\n tone={pendingCount ? 'warning' : 'neutral'}\n />\n <MetricCard\n label=\"In review\"\n value={inReviewCount}\n icon={<ShieldCheck className=\"h-4 w-4\" />}\n tone=\"info\"\n />\n <MetricCard\n label=\"Resolved\"\n value={resolvedCount}\n icon={<CheckCircle2 className=\"h-4 w-4\" />}\n tone=\"success\"\n />\n </div>\n )}\n\n <div className=\"flex justify-end\">\n <NativeSelect\n value={statusFilter}\n onChange={(e) => setStatusFilter(e.target.value as PswComplianceStatus | '')}\n className=\"sm:w-52\"\n >\n <option value=\"\">All statuses</option>\n {enumOptions(['PENDING', 'IN_REVIEW', 'PASSED', 'FAILED', 'WAIVED'])}\n </NativeSelect>\n </div>\n\n {isLoading ? (\n <LoadingBlock />\n ) : error ? (\n <ErrorState error={error} onRetry={() => void refetch()} />\n ) : checks.length === 0 ? (\n <Empty\n title=\"No compliance checks\"\n description=\"Raise a check to gate acceptance or track a professional obligation.\"\n icon={<ShieldCheck className=\"h-8 w-8\" />}\n action={\n <Button onClick={() => setCreating(true)}>\n <Plus className=\"mr-1.5 h-4 w-4\" />\n New check\n </Button>\n }\n />\n ) : (\n <SectionCard title={`${checks.length} check${checks.length === 1 ? '' : 's'}`}>\n <TableWrap>\n <thead>\n <tr>\n <Th>Title</Th>\n <Th>Type</Th>\n <Th>Subject</Th>\n <Th>Due</Th>\n <Th>Status</Th>\n <Th className=\"text-right\">Actions</Th>\n </tr>\n </thead>\n <tbody>\n {checks.map((c) => (\n <tr key={c.id} className=\"transition-colors hover:bg-bg-sunken/60\">\n <Td>\n <span className=\"font-medium text-text-primary\">{c.title}</span>\n </Td>\n <Td>\n <span className=\"inline-flex items-center gap-2 whitespace-nowrap\">\n <span className=\"flex h-6 w-6 items-center justify-center rounded-md bg-bg-sunken text-accent\">\n {TYPE_ICON[c.type]}\n </span>\n {humanize(c.type)}\n </span>\n </Td>\n <Td>{humanize(c.subjectType)}</Td>\n <Td className=\"whitespace-nowrap\">{fmtDate(c.dueDate)}</Td>\n <Td>\n <StatusPill status={c.status} />\n </Td>\n <Td className=\"text-right\">\n {c.status === 'PENDING' || c.status === 'IN_REVIEW' ? (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setResolving({ id: c.id, title: c.title })}\n >\n Resolve\n </Button>\n ) : (\n <span className=\"text-xs text-text-tertiary\">\n {c.resolvedAt ? fmtDate(c.resolvedAt) : ''}\n </span>\n )}\n </Td>\n </tr>\n ))}\n </tbody>\n </TableWrap>\n </SectionCard>\n )}\n\n {creating && (\n <ComplianceModal\n onClose={() => setCreating(false)}\n onDone={() => {\n void refetch();\n setBanner('Compliance check created.');\n }}\n />\n )}\n {resolving && (\n <ResolveModal\n check={resolving}\n onClose={() => setResolving(null)}\n onDone={() => {\n void refetch();\n setBanner('Compliance check resolved.');\n }}\n />\n )}\n </div>\n );\n};\n\nconst ComplianceModal: FC<{ onClose: () => void; onDone: () => void }> = ({ onClose, onDone }) => {\n const create = useCreateComplianceCheck();\n const [form, setForm] = useState({\n type: 'ENGAGEMENT_ACCEPTANCE',\n subjectType: 'ENGAGEMENT',\n subjectId: '',\n title: '',\n dueDate: '',\n details: '',\n });\n const [err, setErr] = useState<string | null>(null);\n const set = (k: keyof typeof form) => (e: { target: { value: string } }) =>\n setForm((f) => ({ ...f, [k]: e.target.value }));\n\n const clients = useClients({ pagination: { limit: 100 } });\n const engagements = useEngagements({ pagination: { limit: 100 } });\n const matters = useMatters({ pagination: { limit: 100 } });\n const subjects =\n form.subjectType === 'CLIENT'\n ? (clients.data?.items ?? []).map((c) => ({ id: c.id, label: c.name }))\n : form.subjectType === 'ENGAGEMENT'\n ? (engagements.data?.items ?? []).map((e) => ({ id: e.id, label: e.name }))\n : (matters.data?.items ?? []).map((m) => ({ id: m.id, label: m.title }));\n\n const submit = () => {\n setErr(null);\n if (!form.title.trim()) return setErr('Title is required.');\n if (!form.subjectId) return setErr('Select a subject.');\n create.mutate(\n {\n type: form.type,\n subjectType: form.subjectType,\n subjectId: form.subjectId,\n title: form.title.trim(),\n dueDate: form.dueDate ? new Date(form.dueDate).toISOString() : null,\n details: form.details.trim() || null,\n },\n {\n onSuccess: () => {\n onDone();\n onClose();\n },\n onError: (e) => setErr(e instanceof Error ? e.message : 'Failed.'),\n }\n );\n };\n\n return (\n <Modal\n open\n onClose={onClose}\n title=\"New compliance check\"\n footer={\n <>\n <Button variant=\"outline\" onClick={onClose} disabled={create.isPending}>\n Cancel\n </Button>\n <Button onClick={submit} disabled={create.isPending}>\n {create.isPending ? 'Creating…' : 'Create check'}\n </Button>\n </>\n }\n >\n <div className=\"space-y-3\">\n {err && <Banner tone=\"danger\">{err}</Banner>}\n <Field label=\"Title\" required>\n <TextInput\n value={form.title}\n onChange={set('title')}\n placeholder=\"Independence confirmation — FY26 audit\"\n />\n </Field>\n <Field label=\"Type\">\n <NativeSelect value={form.type} onChange={set('type')}>\n {enumOptions(TYPES)}\n </NativeSelect>\n </Field>\n <div className=\"grid grid-cols-2 gap-3\">\n <Field label=\"Subject type\">\n <NativeSelect\n value={form.subjectType}\n onChange={(e) =>\n setForm((f) => ({ ...f, subjectType: e.target.value, subjectId: '' }))\n }\n >\n {enumOptions(SUBJECT_TYPES)}\n </NativeSelect>\n </Field>\n <Field label=\"Subject\" required>\n <NativeSelect value={form.subjectId} onChange={set('subjectId')}>\n <option value=\"\">Select…</option>\n {subjects.map((s) => (\n <option key={s.id} value={s.id}>\n {s.label}\n </option>\n ))}\n </NativeSelect>\n </Field>\n </div>\n <Field label=\"Due date\">\n <TextInput type=\"date\" value={form.dueDate} onChange={set('dueDate')} />\n </Field>\n <Field label=\"Details\">\n <TextArea value={form.details} onChange={set('details')} />\n </Field>\n </div>\n </Modal>\n );\n};\n\nconst ResolveModal: FC<{\n check: { id: string; title: string };\n onClose: () => void;\n onDone: () => void;\n}> = ({ check, onClose, onDone }) => {\n const resolve = useResolveComplianceCheck();\n const [status, setStatus] = useState<PswComplianceStatus>('PASSED');\n const [details, setDetails] = useState('');\n const [err, setErr] = useState<string | null>(null);\n const submit = () =>\n resolve.mutate(\n { id: check.id, status, details: details.trim() || undefined },\n {\n onSuccess: () => {\n onDone();\n onClose();\n },\n onError: (e) => setErr(e instanceof Error ? e.message : 'Failed.'),\n }\n );\n return (\n <Modal\n open\n onClose={onClose}\n title={`Resolve: ${check.title}`}\n footer={\n <>\n <Button variant=\"outline\" onClick={onClose} disabled={resolve.isPending}>\n Cancel\n </Button>\n <Button onClick={submit} disabled={resolve.isPending}>\n {resolve.isPending ? 'Saving…' : 'Resolve'}\n </Button>\n </>\n }\n >\n <div className=\"space-y-3\">\n {err && <Banner tone=\"danger\">{err}</Banner>}\n <Field label=\"Outcome\">\n <NativeSelect\n value={status}\n onChange={(e) => setStatus(e.target.value as PswComplianceStatus)}\n >\n {RESOLVE_STATUSES.map((s) => (\n <option key={s} value={s}>\n {humanize(s)}\n </option>\n ))}\n </NativeSelect>\n </Field>\n <Field label=\"Notes\">\n <TextArea value={details} onChange={(e) => setDetails(e.target.value)} />\n </Field>\n </div>\n </Modal>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CompliancePage.js","names":[],"sources":["../../../src/proserviceworld/pages/CompliancePage.tsx"],"sourcesContent":["import type { FC, ReactNode } from 'react';\nimport { useDeferredValue, useState } from 'react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport {\n Plus,\n ShieldCheck,\n FileCheck,\n Scale,\n BadgeCheck,\n GraduationCap,\n Database,\n Lock,\n Clock,\n ListChecks,\n CheckCircle2,\n Search,\n} from 'lucide-react';\nimport {\n useComplianceChecks,\n useCreateComplianceCheck,\n useResolveComplianceCheck,\n useClients,\n useEngagements,\n useMatters,\n type PswComplianceStatus,\n type PswComplianceType,\n} from '../hooks/useProServiceWorldApi';\nimport {\n PageHeader,\n SectionCard,\n MetricCard,\n LoadingBlock,\n ErrorState,\n Empty,\n StatusPill,\n Modal,\n Field,\n TextInput,\n TextArea,\n NativeSelect,\n Banner,\n TableWrap,\n Th,\n Td,\n enumOptions,\n fmtDate,\n humanize,\n} from '../components/ui';\nimport { useAnalytics } from '../hooks/useAnalytics';\n\nconst TYPES = [\n 'ENGAGEMENT_ACCEPTANCE',\n 'INDEPENDENCE',\n 'LICENSING',\n 'CONTINUING_EDUCATION',\n 'DATA_RETENTION',\n 'LEGAL_HOLD',\n] as const;\nconst RESOLVE_STATUSES: PswComplianceStatus[] = ['IN_REVIEW', 'PASSED', 'FAILED', 'WAIVED'];\nconst SUBJECT_TYPES = ['CLIENT', 'ENGAGEMENT', 'MATTER'] as const;\n\nconst TYPE_ICON: Record<PswComplianceType, ReactNode> = {\n ENGAGEMENT_ACCEPTANCE: <FileCheck className=\"h-3.5 w-3.5\" />,\n INDEPENDENCE: <Scale className=\"h-3.5 w-3.5\" />,\n LICENSING: <BadgeCheck className=\"h-3.5 w-3.5\" />,\n CONTINUING_EDUCATION: <GraduationCap className=\"h-3.5 w-3.5\" />,\n DATA_RETENTION: <Database className=\"h-3.5 w-3.5\" />,\n LEGAL_HOLD: <Lock className=\"h-3.5 w-3.5\" />,\n};\n\nexport const CompliancePage: FC = () => {\n const [statusFilter, setStatusFilter] = useState<PswComplianceStatus | ''>('');\n const [search, setSearch] = useState('');\n const deferredSearch = useDeferredValue(search);\n const [creating, setCreating] = useState(false);\n const [resolving, setResolving] = useState<{ id: string; title: string } | null>(null);\n const [banner, setBanner] = useState<string | null>(null);\n const { data, isLoading, error, refetch } = useComplianceChecks({\n status: statusFilter || undefined,\n search: deferredSearch.trim() || undefined,\n });\n const { emitFact } = useAnalytics();\n\n const checks = data?.items ?? [];\n const pendingCount = checks.filter((c) => c.status === 'PENDING').length;\n const inReviewCount = checks.filter((c) => c.status === 'IN_REVIEW').length;\n const resolvedCount = checks.filter(\n (c) => c.status === 'PASSED' || c.status === 'FAILED' || c.status === 'WAIVED'\n ).length;\n\n return (\n <div className=\"space-y-6\">\n <PageHeader\n title=\"Compliance\"\n subtitle=\"The duties that travel with the work — acceptance, independence, licensing, CE, retention and legal hold — as gates, not afterthoughts.\"\n icon={<ShieldCheck className=\"h-6 w-6\" />}\n actions={\n <Button onClick={() => setCreating(true)}>\n <Plus className=\"mr-1.5 h-4 w-4\" />\n New check\n </Button>\n }\n />\n\n {banner && (\n <Banner tone=\"success\" onClose={() => setBanner(null)}>\n {banner}\n </Banner>\n )}\n\n {checks.length > 0 && (\n <div className=\"grid grid-cols-2 gap-3 lg:grid-cols-4\">\n <MetricCard\n label=\"Checks\"\n value={checks.length}\n icon={<ListChecks className=\"h-4 w-4\" />}\n />\n <MetricCard\n label=\"Pending\"\n value={pendingCount}\n icon={<Clock className=\"h-4 w-4\" />}\n tone={pendingCount ? 'warning' : 'neutral'}\n />\n <MetricCard\n label=\"In review\"\n value={inReviewCount}\n icon={<ShieldCheck className=\"h-4 w-4\" />}\n tone=\"info\"\n />\n <MetricCard\n label=\"Resolved\"\n value={resolvedCount}\n icon={<CheckCircle2 className=\"h-4 w-4\" />}\n tone=\"success\"\n />\n </div>\n )}\n\n <div className=\"flex flex-col gap-2 sm:flex-row sm:items-center\">\n <div className=\"relative flex-1\">\n <Search className=\"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-tertiary\" />\n <TextInput\n placeholder=\"Search compliance checks…\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && search.trim()) {\n emitFact('psw.search.performed', {\n entityType: 'compliance-check',\n queryLength: search.trim().length,\n });\n }\n }}\n className=\"pl-9\"\n />\n </div>\n <NativeSelect\n value={statusFilter}\n onChange={(e) => setStatusFilter(e.target.value as PswComplianceStatus | '')}\n className=\"sm:w-52\"\n >\n <option value=\"\">All statuses</option>\n {enumOptions(['PENDING', 'IN_REVIEW', 'PASSED', 'FAILED', 'WAIVED'])}\n </NativeSelect>\n </div>\n\n {isLoading ? (\n <LoadingBlock />\n ) : error ? (\n <ErrorState error={error} onRetry={() => void refetch()} />\n ) : checks.length === 0 ? (\n <Empty\n title=\"No compliance checks\"\n description=\"Raise a check to gate acceptance or track a professional obligation.\"\n icon={<ShieldCheck className=\"h-8 w-8\" />}\n action={\n <Button onClick={() => setCreating(true)}>\n <Plus className=\"mr-1.5 h-4 w-4\" />\n New check\n </Button>\n }\n />\n ) : (\n <SectionCard title={`${checks.length} check${checks.length === 1 ? '' : 's'}`}>\n <TableWrap>\n <thead>\n <tr>\n <Th>Title</Th>\n <Th>Type</Th>\n <Th>Subject</Th>\n <Th>Due</Th>\n <Th>Status</Th>\n <Th className=\"text-right\">Actions</Th>\n </tr>\n </thead>\n <tbody>\n {checks.map((c) => (\n <tr key={c.id} className=\"transition-colors hover:bg-bg-sunken/60\">\n <Td>\n <span className=\"font-medium text-text-primary\">{c.title}</span>\n </Td>\n <Td>\n <span className=\"inline-flex items-center gap-2 whitespace-nowrap\">\n <span className=\"flex h-6 w-6 items-center justify-center rounded-md bg-bg-sunken text-accent\">\n {TYPE_ICON[c.type]}\n </span>\n {humanize(c.type)}\n </span>\n </Td>\n <Td>{humanize(c.subjectType)}</Td>\n <Td className=\"whitespace-nowrap\">{fmtDate(c.dueDate)}</Td>\n <Td>\n <StatusPill status={c.status} />\n </Td>\n <Td className=\"text-right\">\n {c.status === 'PENDING' || c.status === 'IN_REVIEW' ? (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setResolving({ id: c.id, title: c.title })}\n >\n Resolve\n </Button>\n ) : (\n <span className=\"text-xs text-text-tertiary\">\n {c.resolvedAt ? fmtDate(c.resolvedAt) : ''}\n </span>\n )}\n </Td>\n </tr>\n ))}\n </tbody>\n </TableWrap>\n </SectionCard>\n )}\n\n {creating && (\n <ComplianceModal\n onClose={() => setCreating(false)}\n onDone={() => {\n void refetch();\n setBanner('Compliance check created.');\n }}\n />\n )}\n {resolving && (\n <ResolveModal\n check={resolving}\n onClose={() => setResolving(null)}\n onDone={() => {\n void refetch();\n setBanner('Compliance check resolved.');\n }}\n />\n )}\n </div>\n );\n};\n\nconst ComplianceModal: FC<{ onClose: () => void; onDone: () => void }> = ({ onClose, onDone }) => {\n const create = useCreateComplianceCheck();\n const [form, setForm] = useState({\n type: 'ENGAGEMENT_ACCEPTANCE',\n subjectType: 'ENGAGEMENT',\n subjectId: '',\n title: '',\n dueDate: '',\n details: '',\n });\n const [err, setErr] = useState<string | null>(null);\n const set = (k: keyof typeof form) => (e: { target: { value: string } }) =>\n setForm((f) => ({ ...f, [k]: e.target.value }));\n\n const clients = useClients({ pagination: { limit: 100 } });\n const engagements = useEngagements({ pagination: { limit: 100 } });\n const matters = useMatters({ pagination: { limit: 100 } });\n const subjects =\n form.subjectType === 'CLIENT'\n ? (clients.data?.items ?? []).map((c) => ({ id: c.id, label: c.name }))\n : form.subjectType === 'ENGAGEMENT'\n ? (engagements.data?.items ?? []).map((e) => ({ id: e.id, label: e.name }))\n : (matters.data?.items ?? []).map((m) => ({ id: m.id, label: m.title }));\n\n const submit = () => {\n setErr(null);\n if (!form.title.trim()) return setErr('Title is required.');\n if (!form.subjectId) return setErr('Select a subject.');\n create.mutate(\n {\n type: form.type,\n subjectType: form.subjectType,\n subjectId: form.subjectId,\n title: form.title.trim(),\n dueDate: form.dueDate ? new Date(form.dueDate).toISOString() : null,\n details: form.details.trim() || null,\n },\n {\n onSuccess: () => {\n onDone();\n onClose();\n },\n onError: (e) => setErr(e instanceof Error ? e.message : 'Failed.'),\n }\n );\n };\n\n return (\n <Modal\n open\n onClose={onClose}\n title=\"New compliance check\"\n footer={\n <>\n <Button variant=\"outline\" onClick={onClose} disabled={create.isPending}>\n Cancel\n </Button>\n <Button onClick={submit} disabled={create.isPending}>\n {create.isPending ? 'Creating…' : 'Create check'}\n </Button>\n </>\n }\n >\n <div className=\"space-y-3\">\n {err && <Banner tone=\"danger\">{err}</Banner>}\n <Field label=\"Title\" required>\n <TextInput\n value={form.title}\n onChange={set('title')}\n placeholder=\"Independence confirmation — FY26 audit\"\n />\n </Field>\n <Field label=\"Type\">\n <NativeSelect value={form.type} onChange={set('type')}>\n {enumOptions(TYPES)}\n </NativeSelect>\n </Field>\n <div className=\"grid grid-cols-2 gap-3\">\n <Field label=\"Subject type\">\n <NativeSelect\n value={form.subjectType}\n onChange={(e) =>\n setForm((f) => ({ ...f, subjectType: e.target.value, subjectId: '' }))\n }\n >\n {enumOptions(SUBJECT_TYPES)}\n </NativeSelect>\n </Field>\n <Field label=\"Subject\" required>\n <NativeSelect value={form.subjectId} onChange={set('subjectId')}>\n <option value=\"\">Select…</option>\n {subjects.map((s) => (\n <option key={s.id} value={s.id}>\n {s.label}\n </option>\n ))}\n </NativeSelect>\n </Field>\n </div>\n <Field label=\"Due date\">\n <TextInput type=\"date\" value={form.dueDate} onChange={set('dueDate')} />\n </Field>\n <Field label=\"Details\">\n <TextArea value={form.details} onChange={set('details')} />\n </Field>\n </div>\n </Modal>\n );\n};\n\nconst ResolveModal: FC<{\n check: { id: string; title: string };\n onClose: () => void;\n onDone: () => void;\n}> = ({ check, onClose, onDone }) => {\n const resolve = useResolveComplianceCheck();\n const [status, setStatus] = useState<PswComplianceStatus>('PASSED');\n const [details, setDetails] = useState('');\n const [err, setErr] = useState<string | null>(null);\n const submit = () =>\n resolve.mutate(\n { id: check.id, status, details: details.trim() || undefined },\n {\n onSuccess: () => {\n onDone();\n onClose();\n },\n onError: (e) => setErr(e instanceof Error ? e.message : 'Failed.'),\n }\n );\n return (\n <Modal\n open\n onClose={onClose}\n title={`Resolve: ${check.title}`}\n footer={\n <>\n <Button variant=\"outline\" onClick={onClose} disabled={resolve.isPending}>\n Cancel\n </Button>\n <Button onClick={submit} disabled={resolve.isPending}>\n {resolve.isPending ? 'Saving…' : 'Resolve'}\n </Button>\n </>\n }\n >\n <div className=\"space-y-3\">\n {err && <Banner tone=\"danger\">{err}</Banner>}\n <Field label=\"Outcome\">\n <NativeSelect\n value={status}\n onChange={(e) => setStatus(e.target.value as PswComplianceStatus)}\n >\n {RESOLVE_STATUSES.map((s) => (\n <option key={s} value={s}>\n {humanize(s)}\n </option>\n ))}\n </NativeSelect>\n </Field>\n <Field label=\"Notes\">\n <TextArea value={details} onChange={(e) => setDetails(e.target.value)} />\n </Field>\n </div>\n </Modal>\n );\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConflictsPage.d.ts","sourceRoot":"","sources":["../../../src/proserviceworld/pages/ConflictsPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"ConflictsPage.d.ts","sourceRoot":"","sources":["../../../src/proserviceworld/pages/ConflictsPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAuChC,eAAO,MAAM,aAAa,EAAE,EAuI3B,CAAC"}
|