@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.
@@ -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 { useState as T } from "react";
4
- import { BadgeCheck as E, CheckCircle2 as D, Clock as O, Database as k, FileCheck as A, GraduationCap as j, ListChecks as M, Lock as N, Plus as P, Scale as F, ShieldCheck as I } from "lucide-react";
5
- import { Fragment as L, jsx as R, jsxs as z } from "react/jsx-runtime";
6
- import { Button as B } from "@burdenoff/fe-libs/ui";
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 V = [
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
- ], H = [
16
+ ], G = [
16
17
  "IN_REVIEW",
17
18
  "PASSED",
18
19
  "FAILED",
19
20
  "WAIVED"
20
- ], U = [
21
+ ], K = [
21
22
  "CLIENT",
22
23
  "ENGAGEMENT",
23
24
  "MATTER"
24
- ], W = {
25
- ENGAGEMENT_ACCEPTANCE: /* @__PURE__ */ R(A, { className: "h-3.5 w-3.5" }),
26
- INDEPENDENCE: /* @__PURE__ */ R(F, { className: "h-3.5 w-3.5" }),
27
- LICENSING: /* @__PURE__ */ R(E, { className: "h-3.5 w-3.5" }),
28
- CONTINUING_EDUCATION: /* @__PURE__ */ R(j, { className: "h-3.5 w-3.5" }),
29
- DATA_RETENTION: /* @__PURE__ */ R(k, { className: "h-3.5 w-3.5" }),
30
- LEGAL_HOLD: /* @__PURE__ */ R(N, { className: "h-3.5 w-3.5" })
31
- }, G = () => {
32
- let [e, n] = T(""), [r, i] = T(!1), [a, l] = T(null), [f, y] = T(null), { data: b, isLoading: E, error: k, refetch: A } = t({ status: e || void 0 }), j = b?.items ?? [], N = j.filter((e) => e.status === "PENDING").length, F = j.filter((e) => e.status === "IN_REVIEW").length, L = j.filter((e) => e.status === "PASSED" || e.status === "FAILED" || e.status === "WAIVED").length;
33
- return /* @__PURE__ */ z("div", {
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__ */ R(m, {
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__ */ R(I, { className: "h-6 w-6" }),
40
- actions: /* @__PURE__ */ z(B, {
41
- onClick: () => i(!0),
42
- children: [/* @__PURE__ */ R(P, { className: "mr-1.5 h-4 w-4" }), "New check"]
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
- f && /* @__PURE__ */ R(o, {
49
+ j && /* @__PURE__ */ V(o, {
46
50
  tone: "success",
47
- onClose: () => y(null),
48
- children: f
51
+ onClose: () => M(null),
52
+ children: j
49
53
  }),
50
- j.length > 0 && /* @__PURE__ */ z("div", {
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__ */ R(d, {
57
+ /* @__PURE__ */ V(d, {
54
58
  label: "Checks",
55
- value: j.length,
56
- icon: /* @__PURE__ */ R(M, { className: "h-4 w-4" })
59
+ value: G.length,
60
+ icon: /* @__PURE__ */ V(P, { className: "h-4 w-4" })
57
61
  }),
58
- /* @__PURE__ */ R(d, {
62
+ /* @__PURE__ */ V(d, {
59
63
  label: "Pending",
60
- value: N,
61
- icon: /* @__PURE__ */ R(O, { className: "h-4 w-4" }),
62
- tone: N ? "warning" : "neutral"
64
+ value: K,
65
+ icon: /* @__PURE__ */ V(A, { className: "h-4 w-4" }),
66
+ tone: K ? "warning" : "neutral"
63
67
  }),
64
- /* @__PURE__ */ R(d, {
68
+ /* @__PURE__ */ V(d, {
65
69
  label: "In review",
66
- value: F,
67
- icon: /* @__PURE__ */ R(I, { className: "h-4 w-4" }),
70
+ value: J,
71
+ icon: /* @__PURE__ */ V(z, { className: "h-4 w-4" }),
68
72
  tone: "info"
69
73
  }),
70
- /* @__PURE__ */ R(d, {
74
+ /* @__PURE__ */ V(d, {
71
75
  label: "Resolved",
72
- value: L,
73
- icon: /* @__PURE__ */ R(D, { className: "h-4 w-4" }),
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__ */ R("div", {
79
- className: "flex justify-end",
80
- children: /* @__PURE__ */ z(p, {
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__ */ R("option", {
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
- E ? /* @__PURE__ */ R(u, {}) : k ? /* @__PURE__ */ R(c, {
97
- error: k,
98
- onRetry: () => void A()
99
- }) : j.length === 0 ? /* @__PURE__ */ R(s, {
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__ */ R(I, { className: "h-8 w-8" }),
103
- action: /* @__PURE__ */ z(B, {
104
- onClick: () => i(!0),
105
- children: [/* @__PURE__ */ R(P, { className: "mr-1.5 h-4 w-4" }), "New check"]
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__ */ R(h, {
108
- title: `${j.length} check${j.length === 1 ? "" : "s"}`,
109
- children: /* @__PURE__ */ z(_, { children: [/* @__PURE__ */ R("thead", { children: /* @__PURE__ */ z("tr", { children: [
110
- /* @__PURE__ */ R(x, { children: "Title" }),
111
- /* @__PURE__ */ R(x, { children: "Type" }),
112
- /* @__PURE__ */ R(x, { children: "Subject" }),
113
- /* @__PURE__ */ R(x, { children: "Due" }),
114
- /* @__PURE__ */ R(x, { children: "Status" }),
115
- /* @__PURE__ */ R(x, {
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__ */ R("tbody", { children: j.map((e) => /* @__PURE__ */ z("tr", {
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__ */ R(v, { children: /* @__PURE__ */ R("span", {
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__ */ R(v, { children: /* @__PURE__ */ z("span", {
144
+ /* @__PURE__ */ V(v, { children: /* @__PURE__ */ H("span", {
127
145
  className: "inline-flex items-center gap-2 whitespace-nowrap",
128
- children: [/* @__PURE__ */ R("span", {
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: W[e.type]
148
+ children: q[e.type]
131
149
  }), w(e.type)]
132
150
  }) }),
133
- /* @__PURE__ */ R(v, { children: w(e.subjectType) }),
134
- /* @__PURE__ */ R(v, {
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__ */ R(v, { children: /* @__PURE__ */ R(g, { status: e.status }) }),
139
- /* @__PURE__ */ R(v, {
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__ */ R(B, {
159
+ children: e.status === "PENDING" || e.status === "IN_REVIEW" ? /* @__PURE__ */ V(U, {
142
160
  variant: "ghost",
143
161
  size: "sm",
144
- onClick: () => l({
162
+ onClick: () => O({
145
163
  id: e.id,
146
164
  title: e.title
147
165
  }),
148
166
  children: "Resolve"
149
- }) : /* @__PURE__ */ R("span", {
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
- r && /* @__PURE__ */ R(K, {
158
- onClose: () => i(!1),
175
+ l && /* @__PURE__ */ V(Y, {
176
+ onClose: () => f(!1),
159
177
  onDone: () => {
160
- A(), y("Compliance check created.");
178
+ B(), M("Compliance check created.");
161
179
  }
162
180
  }),
163
- a && /* @__PURE__ */ R(q, {
164
- check: a,
165
- onClose: () => l(null),
181
+ y && /* @__PURE__ */ V(X, {
182
+ check: y,
183
+ onClose: () => O(null),
166
184
  onDone: () => {
167
- A(), y("Compliance check resolved.");
185
+ B(), M("Compliance check resolved.");
168
186
  }
169
187
  })
170
188
  ]
171
189
  });
172
- }, K = ({ onClose: t, onDone: a }) => {
173
- let s = n(), [c, u] = T({
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] = T(null), h = (e) => (t) => u((n) => ({
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__ */ R(f, {
211
+ return /* @__PURE__ */ V(f, {
194
212
  open: !0,
195
213
  onClose: t,
196
214
  title: "New compliance check",
197
- footer: /* @__PURE__ */ z(L, { children: [/* @__PURE__ */ R(B, {
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__ */ R(B, {
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__ */ z("div", {
241
+ children: /* @__PURE__ */ H("div", {
224
242
  className: "space-y-3",
225
243
  children: [
226
- d && /* @__PURE__ */ R(o, {
244
+ d && /* @__PURE__ */ V(o, {
227
245
  tone: "danger",
228
246
  children: d
229
247
  }),
230
- /* @__PURE__ */ R(l, {
248
+ /* @__PURE__ */ V(l, {
231
249
  label: "Title",
232
250
  required: !0,
233
- children: /* @__PURE__ */ R(b, {
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__ */ R(l, {
257
+ /* @__PURE__ */ V(l, {
240
258
  label: "Type",
241
- children: /* @__PURE__ */ R(p, {
259
+ children: /* @__PURE__ */ V(p, {
242
260
  value: c.type,
243
261
  onChange: h("type"),
244
- children: S(V)
262
+ children: S(W)
245
263
  })
246
264
  }),
247
- /* @__PURE__ */ z("div", {
265
+ /* @__PURE__ */ H("div", {
248
266
  className: "grid grid-cols-2 gap-3",
249
- children: [/* @__PURE__ */ R(l, {
267
+ children: [/* @__PURE__ */ V(l, {
250
268
  label: "Subject type",
251
- children: /* @__PURE__ */ R(p, {
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(U)
276
+ children: S(K)
259
277
  })
260
- }), /* @__PURE__ */ R(l, {
278
+ }), /* @__PURE__ */ V(l, {
261
279
  label: "Subject",
262
280
  required: !0,
263
- children: /* @__PURE__ */ z(p, {
281
+ children: /* @__PURE__ */ H(p, {
264
282
  value: c.subjectId,
265
283
  onChange: h("subjectId"),
266
- children: [/* @__PURE__ */ R("option", {
284
+ children: [/* @__PURE__ */ V("option", {
267
285
  value: "",
268
286
  children: "Select…"
269
- }), x.map((e) => /* @__PURE__ */ R("option", {
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__ */ R(l, {
294
+ /* @__PURE__ */ V(l, {
277
295
  label: "Due date",
278
- children: /* @__PURE__ */ R(b, {
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__ */ R(l, {
302
+ /* @__PURE__ */ V(l, {
285
303
  label: "Details",
286
- children: /* @__PURE__ */ R(y, {
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
- }, q = ({ check: e, onClose: t, onDone: n }) => {
295
- let r = a(), [i, s] = T("PASSED"), [c, u] = T(""), [d, m] = T(null);
296
- return /* @__PURE__ */ R(f, {
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__ */ z(L, { children: [/* @__PURE__ */ R(B, {
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__ */ R(B, {
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__ */ z("div", {
337
+ children: /* @__PURE__ */ H("div", {
320
338
  className: "space-y-3",
321
339
  children: [
322
- d && /* @__PURE__ */ R(o, {
340
+ d && /* @__PURE__ */ V(o, {
323
341
  tone: "danger",
324
342
  children: d
325
343
  }),
326
- /* @__PURE__ */ R(l, {
344
+ /* @__PURE__ */ V(l, {
327
345
  label: "Outcome",
328
- children: /* @__PURE__ */ R(p, {
346
+ children: /* @__PURE__ */ V(p, {
329
347
  value: i,
330
348
  onChange: (e) => s(e.target.value),
331
- children: H.map((e) => /* @__PURE__ */ R("option", {
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__ */ R(l, {
355
+ /* @__PURE__ */ V(l, {
338
356
  label: "Notes",
339
- children: /* @__PURE__ */ R(y, {
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 { G as CompliancePage };
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;AAsChC,eAAO,MAAM,aAAa,EAAE,EAgH3B,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"}