@burdenoff/microfe-proserviceworld 2026.1026.2 → 2026.1031.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/components/CredentialDirectory.js +44 -43
- package/dist/proserviceworld/components/CredentialDirectory.js.map +1 -1
- package/dist/proserviceworld/components/CredentialReminderPanel.js +5 -4
- package/dist/proserviceworld/components/CredentialReminderPanel.js.map +1 -1
- package/dist/proserviceworld/components/ui.d.ts +7 -3
- package/dist/proserviceworld/components/ui.d.ts.map +1 -1
- package/dist/proserviceworld/components/ui.js +135 -121
- package/dist/proserviceworld/components/ui.js.map +1 -1
- package/dist/proserviceworld/hooks/useProServiceWorldApi.d.ts +28 -0
- package/dist/proserviceworld/hooks/useProServiceWorldApi.d.ts.map +1 -1
- package/dist/proserviceworld/hooks/useProServiceWorldApi.js +95 -73
- package/dist/proserviceworld/hooks/useProServiceWorldApi.js.map +1 -1
- package/dist/proserviceworld/hooks/useTr.d.ts +49 -8
- package/dist/proserviceworld/hooks/useTr.d.ts.map +1 -1
- package/dist/proserviceworld/hooks/useTr.js +45 -21
- package/dist/proserviceworld/hooks/useTr.js.map +1 -1
- package/dist/proserviceworld/i18n/catalog/analytics.d.ts +5 -0
- package/dist/proserviceworld/i18n/catalog/analytics.d.ts.map +1 -0
- package/dist/proserviceworld/i18n/catalog/analytics.js +271 -0
- package/dist/proserviceworld/i18n/catalog/analytics.js.map +1 -0
- package/dist/proserviceworld/i18n/catalog/common.d.ts +9 -0
- package/dist/proserviceworld/i18n/catalog/common.d.ts.map +1 -0
- package/dist/proserviceworld/i18n/catalog/common.js +163 -0
- package/dist/proserviceworld/i18n/catalog/common.js.map +1 -0
- package/dist/proserviceworld/i18n/catalog/compliance.d.ts +5 -0
- package/dist/proserviceworld/i18n/catalog/compliance.d.ts.map +1 -0
- package/dist/proserviceworld/i18n/catalog/compliance.js +157 -0
- package/dist/proserviceworld/i18n/catalog/compliance.js.map +1 -0
- package/dist/proserviceworld/i18n/catalog/conflicts.d.ts +5 -0
- package/dist/proserviceworld/i18n/catalog/conflicts.d.ts.map +1 -0
- package/dist/proserviceworld/i18n/catalog/conflicts.js +145 -0
- package/dist/proserviceworld/i18n/catalog/conflicts.js.map +1 -0
- package/dist/proserviceworld/i18n/catalog/documents.d.ts +5 -0
- package/dist/proserviceworld/i18n/catalog/documents.d.ts.map +1 -0
- package/dist/proserviceworld/i18n/catalog/documents.js +157 -0
- package/dist/proserviceworld/i18n/catalog/documents.js.map +1 -0
- package/dist/proserviceworld/i18n/catalog/enums.d.ts +10 -0
- package/dist/proserviceworld/i18n/catalog/enums.d.ts.map +1 -0
- package/dist/proserviceworld/i18n/catalog/enums.js +481 -0
- package/dist/proserviceworld/i18n/catalog/enums.js.map +1 -0
- package/dist/proserviceworld/i18n/catalog/index.d.ts +9 -0
- package/dist/proserviceworld/i18n/catalog/index.d.ts.map +1 -0
- package/dist/proserviceworld/i18n/catalog/index.js +25 -0
- package/dist/proserviceworld/i18n/catalog/index.js.map +1 -0
- package/dist/proserviceworld/i18n/catalog/invoices.d.ts +5 -0
- package/dist/proserviceworld/i18n/catalog/invoices.d.ts.map +1 -0
- package/dist/proserviceworld/i18n/catalog/invoices.js +247 -0
- package/dist/proserviceworld/i18n/catalog/invoices.js.map +1 -0
- package/dist/proserviceworld/i18n/catalog/practiceAreas.d.ts +5 -0
- package/dist/proserviceworld/i18n/catalog/practiceAreas.d.ts.map +1 -0
- package/dist/proserviceworld/i18n/catalog/practiceAreas.js +97 -0
- package/dist/proserviceworld/i18n/catalog/practiceAreas.js.map +1 -0
- package/dist/proserviceworld/i18n/catalog/time.d.ts +5 -0
- package/dist/proserviceworld/i18n/catalog/time.d.ts.map +1 -0
- package/dist/proserviceworld/i18n/catalog/time.js +301 -0
- package/dist/proserviceworld/i18n/catalog/time.js.map +1 -0
- package/dist/proserviceworld/i18n/index.d.ts +10 -9
- package/dist/proserviceworld/i18n/index.d.ts.map +1 -1
- package/dist/proserviceworld/i18n/index.js +16 -12
- package/dist/proserviceworld/i18n/index.js.map +1 -1
- package/dist/proserviceworld/i18n/types.d.ts +13 -0
- package/dist/proserviceworld/i18n/types.d.ts.map +1 -0
- package/dist/proserviceworld/i18n/types.js +18 -0
- package/dist/proserviceworld/i18n/types.js.map +1 -0
- package/dist/proserviceworld/pages/AnalyticsPage.d.ts.map +1 -1
- package/dist/proserviceworld/pages/AnalyticsPage.js +236 -152
- package/dist/proserviceworld/pages/AnalyticsPage.js.map +1 -1
- package/dist/proserviceworld/pages/ClientDetailPage.js +99 -98
- package/dist/proserviceworld/pages/ClientDetailPage.js.map +1 -1
- package/dist/proserviceworld/pages/ClientsPage.d.ts.map +1 -1
- package/dist/proserviceworld/pages/ClientsPage.js +181 -181
- package/dist/proserviceworld/pages/ClientsPage.js.map +1 -1
- package/dist/proserviceworld/pages/CompliancePage.d.ts.map +1 -1
- package/dist/proserviceworld/pages/CompliancePage.js +210 -209
- 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 +139 -138
- 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 +150 -149
- package/dist/proserviceworld/pages/DocumentsPage.js.map +1 -1
- package/dist/proserviceworld/pages/EngagementDetailPage.js +105 -104
- package/dist/proserviceworld/pages/EngagementDetailPage.js.map +1 -1
- package/dist/proserviceworld/pages/EngagementsPage.d.ts.map +1 -1
- package/dist/proserviceworld/pages/EngagementsPage.js +137 -137
- package/dist/proserviceworld/pages/EngagementsPage.js.map +1 -1
- package/dist/proserviceworld/pages/InvoicesPage.d.ts.map +1 -1
- package/dist/proserviceworld/pages/InvoicesPage.js +275 -258
- package/dist/proserviceworld/pages/InvoicesPage.js.map +1 -1
- package/dist/proserviceworld/pages/MattersPage.d.ts.map +1 -1
- package/dist/proserviceworld/pages/MattersPage.js +166 -166
- package/dist/proserviceworld/pages/MattersPage.js.map +1 -1
- package/dist/proserviceworld/pages/PracticeAreasPage.d.ts.map +1 -1
- package/dist/proserviceworld/pages/PracticeAreasPage.js +100 -99
- package/dist/proserviceworld/pages/PracticeAreasPage.js.map +1 -1
- package/dist/proserviceworld/pages/PractitionerCredentialsPage.js +30 -29
- package/dist/proserviceworld/pages/PractitionerCredentialsPage.js.map +1 -1
- package/dist/proserviceworld/pages/TimePage.d.ts.map +1 -1
- package/dist/proserviceworld/pages/TimePage.js +343 -350
- package/dist/proserviceworld/pages/TimePage.js.map +1 -1
- package/dist/proserviceworld/utils/humanize.d.ts +3 -0
- package/dist/proserviceworld/utils/humanize.d.ts.map +1 -0
- package/dist/proserviceworld/utils/humanize.js +6 -0
- package/dist/proserviceworld/utils/humanize.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { useProServiceWorld as e } from "../providers/ProServiceWorldProvider.js";
|
|
2
|
-
import {
|
|
2
|
+
import { humanize as t } from "../utils/humanize.js";
|
|
3
|
+
import { Banner as n, Empty as r, ErrorState as i, LoadingBlock as a, PageHeader as o, SectionCard as s, TableWrap as c, Td as l, Th as u } from "../components/ui.js";
|
|
3
4
|
import { CredentialReminderPanel as d } from "../components/CredentialReminderPanel.js";
|
|
4
5
|
import { useCredentialReviews as f, usePractitionerCredentials as p } from "../hooks/usePractitionerCredentials.js";
|
|
5
6
|
import { credentialSourceLink as m } from "../utils/credentialSourceLink.js";
|
|
@@ -23,7 +24,7 @@ function T() {
|
|
|
23
24
|
return /* @__PURE__ */ C("div", {
|
|
24
25
|
className: "space-y-6",
|
|
25
26
|
children: [
|
|
26
|
-
/* @__PURE__ */ S(
|
|
27
|
+
/* @__PURE__ */ S(o, {
|
|
27
28
|
title: "Practitioner credentials",
|
|
28
29
|
subtitle: "Issuers, jurisdictions and source observations recorded by your firm.",
|
|
29
30
|
icon: /* @__PURE__ */ S(y, { className: "h-6 w-6" }),
|
|
@@ -34,7 +35,7 @@ function T() {
|
|
|
34
35
|
children: [/* @__PURE__ */ S(b, { className: "mr-2 h-4 w-4" }), "Refresh"]
|
|
35
36
|
})
|
|
36
37
|
}),
|
|
37
|
-
/* @__PURE__ */ S(
|
|
38
|
+
/* @__PURE__ */ S(n, {
|
|
38
39
|
tone: "info",
|
|
39
40
|
children: "Recorded evidence and source reviews do not certify legal authority to practise."
|
|
40
41
|
}),
|
|
@@ -62,23 +63,23 @@ function T() {
|
|
|
62
63
|
})
|
|
63
64
|
}, `${O}:${q.operation}`)
|
|
64
65
|
] }),
|
|
65
|
-
H ? P.isLoading ? /* @__PURE__ */ S(
|
|
66
|
+
H ? P.isLoading ? /* @__PURE__ */ S(a, {}) : P.error ? /* @__PURE__ */ S(i, {
|
|
66
67
|
error: P.error,
|
|
67
68
|
onRetry: () => void P.refetch()
|
|
68
|
-
}) : F.length === 0 ? /* @__PURE__ */ S(
|
|
69
|
+
}) : F.length === 0 ? /* @__PURE__ */ S(r, {
|
|
69
70
|
title: "No credential records",
|
|
70
71
|
description: "This firm has no recorded practitioner credentials on this page."
|
|
71
|
-
}) : /* @__PURE__ */ C(
|
|
72
|
+
}) : /* @__PURE__ */ C(s, {
|
|
72
73
|
title: `${P.data?.totalCount ?? F.length} recorded credentials`,
|
|
73
|
-
children: [/* @__PURE__ */ C(
|
|
74
|
-
/* @__PURE__ */ S(
|
|
75
|
-
/* @__PURE__ */ S(
|
|
76
|
-
/* @__PURE__ */ S(
|
|
77
|
-
/* @__PURE__ */ S(
|
|
78
|
-
/* @__PURE__ */ S(
|
|
79
|
-
/* @__PURE__ */ S(
|
|
74
|
+
children: [/* @__PURE__ */ C(c, { children: [/* @__PURE__ */ S("thead", { children: /* @__PURE__ */ C("tr", { children: [
|
|
75
|
+
/* @__PURE__ */ S(u, { children: "Credential" }),
|
|
76
|
+
/* @__PURE__ */ S(u, { children: "Jurisdiction" }),
|
|
77
|
+
/* @__PURE__ */ S(u, { children: "Practice scope" }),
|
|
78
|
+
/* @__PURE__ */ S(u, { children: "Recorded validity" }),
|
|
79
|
+
/* @__PURE__ */ S(u, { children: "Recorded expiry" }),
|
|
80
|
+
/* @__PURE__ */ S(u, { children: "Reviews" })
|
|
80
81
|
] }) }), /* @__PURE__ */ S("tbody", { children: F.map((e) => /* @__PURE__ */ C("tr", { children: [
|
|
81
|
-
/* @__PURE__ */ C(
|
|
82
|
+
/* @__PURE__ */ C(l, { children: [e.identifier, /* @__PURE__ */ C("span", {
|
|
82
83
|
className: "block break-all text-xs",
|
|
83
84
|
children: [
|
|
84
85
|
"ID: ",
|
|
@@ -87,14 +88,14 @@ function T() {
|
|
|
87
88
|
e.revision
|
|
88
89
|
]
|
|
89
90
|
})] }),
|
|
90
|
-
/* @__PURE__ */ S(
|
|
91
|
-
/* @__PURE__ */ S(
|
|
92
|
-
/* @__PURE__ */ S(
|
|
93
|
-
/* @__PURE__ */ C(
|
|
91
|
+
/* @__PURE__ */ S(l, { children: e.jurisdiction }),
|
|
92
|
+
/* @__PURE__ */ S(l, { children: e.practiceScope }),
|
|
93
|
+
/* @__PURE__ */ S(l, { children: t(e.validityKind) }),
|
|
94
|
+
/* @__PURE__ */ C(l, { children: [e.expiresAt ?? (e.validityKind === "NO_EXPIRY_REPORTED" ? "No expiry reported" : "Unknown"), /* @__PURE__ */ C("span", {
|
|
94
95
|
className: "block text-xs text-text-tertiary",
|
|
95
96
|
children: ["Source zone: ", e.sourceTimezone]
|
|
96
97
|
})] }),
|
|
97
|
-
/* @__PURE__ */ S(
|
|
98
|
+
/* @__PURE__ */ S(l, { children: /* @__PURE__ */ S(w, {
|
|
98
99
|
size: "sm",
|
|
99
100
|
variant: "outline",
|
|
100
101
|
onClick: () => M({
|
|
@@ -131,11 +132,11 @@ function T() {
|
|
|
131
132
|
})
|
|
132
133
|
]
|
|
133
134
|
})]
|
|
134
|
-
}) : /* @__PURE__ */ S(
|
|
135
|
+
}) : /* @__PURE__ */ S(r, {
|
|
135
136
|
title: "Choose a workspace",
|
|
136
137
|
description: "Sign in and choose the firm workspace to view its credential records."
|
|
137
138
|
}),
|
|
138
|
-
I && /* @__PURE__ */ C(
|
|
139
|
+
I && /* @__PURE__ */ C(s, {
|
|
139
140
|
title: `Recorded status and history: ${I.identifier}`,
|
|
140
141
|
children: [
|
|
141
142
|
B.data?.readiness && /* @__PURE__ */ C("div", {
|
|
@@ -143,7 +144,7 @@ function T() {
|
|
|
143
144
|
children: [
|
|
144
145
|
/* @__PURE__ */ S("p", {
|
|
145
146
|
className: "font-semibold",
|
|
146
|
-
children:
|
|
147
|
+
children: t(B.data.readiness.recordedState)
|
|
147
148
|
}),
|
|
148
149
|
/* @__PURE__ */ C("p", {
|
|
149
150
|
className: "text-sm",
|
|
@@ -157,7 +158,7 @@ function T() {
|
|
|
157
158
|
}),
|
|
158
159
|
/* @__PURE__ */ C("p", { children: [
|
|
159
160
|
"Source observation: ",
|
|
160
|
-
|
|
161
|
+
t(B.data.readiness.observation),
|
|
161
162
|
" ·",
|
|
162
163
|
" ",
|
|
163
164
|
B.data.readiness.reviewIsForCurrentRevision ? "Review matches current recorded facts" : "Current facts need a source review"
|
|
@@ -178,19 +179,19 @@ function T() {
|
|
|
178
179
|
})
|
|
179
180
|
]
|
|
180
181
|
}),
|
|
181
|
-
B.isLoading ? /* @__PURE__ */ S(
|
|
182
|
+
B.isLoading ? /* @__PURE__ */ S(a, {}) : B.error ? /* @__PURE__ */ S(i, {
|
|
182
183
|
error: B.error,
|
|
183
184
|
onRetry: () => void B.refetch()
|
|
184
185
|
}) : V.length === 0 ? /* @__PURE__ */ S("p", { children: "No source review has been recorded. Authority remains unknown." }) : /* @__PURE__ */ S("div", {
|
|
185
186
|
className: "space-y-4",
|
|
186
187
|
children: V.map((e) => {
|
|
187
|
-
let
|
|
188
|
+
let n = m(e.sourceUrl);
|
|
188
189
|
return /* @__PURE__ */ C("article", {
|
|
189
190
|
className: "min-w-0 rounded-xl border border-border p-4",
|
|
190
191
|
children: [
|
|
191
192
|
/* @__PURE__ */ S("h3", {
|
|
192
193
|
className: "font-semibold",
|
|
193
|
-
children:
|
|
194
|
+
children: t(e.observation)
|
|
194
195
|
}),
|
|
195
196
|
/* @__PURE__ */ C("p", {
|
|
196
197
|
className: "text-sm text-text-secondary",
|
|
@@ -206,12 +207,12 @@ function T() {
|
|
|
206
207
|
className: "mt-2 whitespace-pre-wrap break-words",
|
|
207
208
|
children: e.note
|
|
208
209
|
}),
|
|
209
|
-
|
|
210
|
-
href:
|
|
210
|
+
n ? /* @__PURE__ */ C("a", {
|
|
211
|
+
href: n,
|
|
211
212
|
target: "_blank",
|
|
212
213
|
rel: "noopener noreferrer",
|
|
213
214
|
className: "mt-2 block break-all underline",
|
|
214
|
-
children: ["Source reference: ", new URL(
|
|
215
|
+
children: ["Source reference: ", new URL(n).hostname]
|
|
215
216
|
}) : /* @__PURE__ */ S("p", {
|
|
216
217
|
className: "mt-2 text-sm",
|
|
217
218
|
children: "Source reference unavailable."
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PractitionerCredentialsPage.js","names":[],"sources":["../../../src/proserviceworld/pages/PractitionerCredentialsPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { BadgeCheck, RefreshCw } from 'lucide-react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { CredentialReminderPanel } from '../components/CredentialReminderPanel';\nimport { CredentialDirectory } from '../components/CredentialDirectory';\nimport { CredentialRecordForm } from '../components/CredentialRecordForm';\nimport { CREDENTIAL_FORMS } from '../components/credentialFormDefinitions';\nimport { credentialSourceLink } from '../utils/credentialSourceLink';\nimport { useProServiceWorld } from '../providers/ProServiceWorldProvider';\nimport {\n usePractitionerCredentials,\n useCredentialReviews,\n} from '../hooks/usePractitionerCredentials';\nimport {\n Banner,\n Empty,\n ErrorState,\n LoadingBlock,\n PageHeader,\n SectionCard,\n TableWrap,\n Th,\n Td,\n humanize,\n} from '../components/ui';\n\nexport function PractitionerCredentialsPage() {\n const { workspaceId, tenantId, currentUser } = useProServiceWorld();\n const scope = JSON.stringify([tenantId, workspaceId, currentUser?.id]);\n const [page, setPage] = useState({ scope, offset: 0 });\n const [selection, setSelection] = useState<{ scope: string; id: string; asOf: string } | null>(\n null\n );\n const offset = page.scope === scope ? page.offset : 0;\n const query = usePractitionerCredentials(offset);\n const items = query.data?.items ?? [];\n const selected =\n selection?.scope === scope ? items.find((item) => item.id === selection.id) : undefined;\n const [reviewPage, setReviewPage] = useState<{\n scope: string;\n credentialId: string;\n offset: number;\n } | null>(null);\n const reviewOffset =\n reviewPage?.scope === scope && reviewPage.credentialId === selected?.id ? reviewPage.offset : 0;\n const history = useCredentialReviews(\n selected?.id,\n reviewOffset,\n selection?.scope === scope ? selection.asOf : undefined\n );\n const reviews = history.data?.items ?? [];\n const ready = Boolean(tenantId && workspaceId && currentUser?.id);\n const [formSelection, setFormSelection] = useState(0);\n const [preparedReminder, setPreparedReminder] = useState<{ scope: string; id: string } | null>(\n null\n );\n const definition = CREDENTIAL_FORMS[formSelection] ?? CREDENTIAL_FORMS[0];\n\n return (\n <div className=\"space-y-6\">\n <PageHeader\n title=\"Practitioner credentials\"\n subtitle=\"Issuers, jurisdictions and source observations recorded by your firm.\"\n icon={<BadgeCheck className=\"h-6 w-6\" />}\n actions={\n <Button\n variant=\"outline\"\n disabled={!ready || query.isFetching}\n onClick={() => void query.refetch()}\n >\n <RefreshCw className=\"mr-2 h-4 w-4\" />\n Refresh\n </Button>\n }\n />\n <Banner tone=\"info\">\n Recorded evidence and source reviews do not certify legal authority to practise.\n </Banner>\n {ready && (\n <>\n <CredentialDirectory key={`directory:${scope}`} />\n <CredentialReminderPanel\n key={`reminder:${scope}:${preparedReminder?.scope === scope ? preparedReminder.id : ''}`}\n preparedId={preparedReminder?.scope === scope ? preparedReminder.id : undefined}\n />\n <label className=\"block text-sm font-medium\">\n Record an action\n <select\n className=\"mt-1 block w-full rounded border border-border bg-bg-surface p-2\"\n value={formSelection}\n onChange={(event) => setFormSelection(Number(event.target.value))}\n >\n {CREDENTIAL_FORMS.map((form, index) => (\n <option key={form.operation} value={index}>\n {form.title}\n </option>\n ))}\n </select>\n </label>\n {definition && (\n <CredentialRecordForm\n key={`${scope}:${definition.operation}`}\n scope={scope}\n definition={definition}\n onPreparedReminder={(id) => setPreparedReminder({ scope, id })}\n />\n )}\n </>\n )}\n {!ready ? (\n <Empty\n title=\"Choose a workspace\"\n description=\"Sign in and choose the firm workspace to view its credential records.\"\n />\n ) : query.isLoading ? (\n <LoadingBlock />\n ) : query.error ? (\n <ErrorState error={query.error} onRetry={() => void query.refetch()} />\n ) : items.length === 0 ? (\n <Empty\n title=\"No credential records\"\n description=\"This firm has no recorded practitioner credentials on this page.\"\n />\n ) : (\n <SectionCard title={`${query.data?.totalCount ?? items.length} recorded credentials`}>\n <TableWrap>\n <thead>\n <tr>\n <Th>Credential</Th>\n <Th>Jurisdiction</Th>\n <Th>Practice scope</Th>\n <Th>Recorded validity</Th>\n <Th>Recorded expiry</Th>\n <Th>Reviews</Th>\n </tr>\n </thead>\n <tbody>\n {items.map((item) => (\n <tr key={item.id}>\n <Td>\n {item.identifier}\n <span className=\"block break-all text-xs\">\n ID: {item.id} · Revision {item.revision}\n </span>\n </Td>\n <Td>{item.jurisdiction}</Td>\n <Td>{item.practiceScope}</Td>\n <Td>{humanize(item.validityKind)}</Td>\n <Td>\n {item.expiresAt ??\n (item.validityKind === 'NO_EXPIRY_REPORTED'\n ? 'No expiry reported'\n : 'Unknown')}\n <span className=\"block text-xs text-text-tertiary\">\n Source zone: {item.sourceTimezone}\n </span>\n </Td>\n <Td>\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() =>\n setSelection({ scope, id: item.id, asOf: new Date().toISOString() })\n }\n >\n Status and history\n </Button>\n </Td>\n </tr>\n ))}\n </tbody>\n </TableWrap>\n <div className=\"mt-4 flex flex-wrap items-center justify-between gap-3\">\n <Button\n variant=\"outline\"\n disabled={offset === 0 || query.isFetching}\n onClick={() => setPage({ scope, offset: Math.max(0, offset - 25) })}\n >\n Previous\n </Button>\n <span className=\"text-sm text-text-secondary\">Page {Math.floor(offset / 25) + 1}</span>\n <Button\n variant=\"outline\"\n disabled={!query.data?.hasMore || query.isFetching}\n onClick={() => setPage({ scope, offset: offset + 25 })}\n >\n Next\n </Button>\n </div>\n </SectionCard>\n )}\n {selected && (\n <SectionCard title={`Recorded status and history: ${selected.identifier}`}>\n {history.data?.readiness && (\n <div className=\"mb-4 space-y-2\">\n <p className=\"font-semibold\">{humanize(history.data.readiness.recordedState)}</p>\n <p className=\"text-sm\">\n As of {history.data.readiness.asOf} · Credential revision{' '}\n {history.data.readiness.revision}\n </p>\n <p>\n Source observation: {humanize(history.data.readiness.observation)} ·{' '}\n {history.data.readiness.reviewIsForCurrentRevision\n ? 'Review matches current recorded facts'\n : 'Current facts need a source review'}\n </p>\n <p className=\"text-sm\">\n Legal authorization is not certified. No automatic source-freshness interval is\n assumed.\n </p>\n <Button\n variant=\"outline\"\n disabled={history.isFetching}\n onClick={() =>\n setSelection({ scope, id: selected.id, asOf: new Date().toISOString() })\n }\n >\n Refresh recorded status\n </Button>\n </div>\n )}\n {history.isLoading ? (\n <LoadingBlock />\n ) : history.error ? (\n <ErrorState error={history.error} onRetry={() => void history.refetch()} />\n ) : reviews.length === 0 ? (\n <p>No source review has been recorded. Authority remains unknown.</p>\n ) : (\n <div className=\"space-y-4\">\n {reviews.map((review) => {\n const href = credentialSourceLink(review.sourceUrl);\n return (\n <article key={review.id} className=\"min-w-0 rounded-xl border border-border p-4\">\n <h3 className=\"font-semibold\">{humanize(review.observation)}</h3>\n <p className=\"text-sm text-text-secondary\">\n Observed {review.checkedAt} · Revision {review.credentialRevision}\n {review.credentialRevision !== selected.revision\n ? ' · Previous credential facts'\n : ''}\n </p>\n <p className=\"mt-2 whitespace-pre-wrap break-words\">{review.note}</p>\n {href ? (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-2 block break-all underline\"\n >\n Source reference: {new URL(href).hostname}\n </a>\n ) : (\n <p className=\"mt-2 text-sm\">Source reference unavailable.</p>\n )}\n <p className=\"mt-2 break-all text-xs text-text-secondary\">\n Evidence version: {review.evidenceVersionId}\n </p>\n <p className=\"break-all text-xs text-text-secondary\">\n SHA-256: {review.evidenceSha256}\n </p>\n </article>\n );\n })}\n </div>\n )}\n <div className=\"mt-4 flex flex-wrap items-center justify-between gap-3\">\n <Button\n variant=\"outline\"\n disabled={reviewOffset === 0 || history.isFetching}\n onClick={() =>\n setReviewPage({\n scope,\n credentialId: selected.id,\n offset: Math.max(0, reviewOffset - 25),\n })\n }\n >\n Previous reviews\n </Button>\n <span className=\"text-sm text-text-secondary\">\n Review page {Math.floor(reviewOffset / 25) + 1}\n </span>\n <Button\n variant=\"outline\"\n disabled={!history.data?.hasMore || history.isFetching}\n onClick={() =>\n setReviewPage({ scope, credentialId: selected.id, offset: reviewOffset + 25 })\n }\n >\n Next reviews\n </Button>\n </div>\n </SectionCard>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PractitionerCredentialsPage.js","names":[],"sources":["../../../src/proserviceworld/pages/PractitionerCredentialsPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { BadgeCheck, RefreshCw } from 'lucide-react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { CredentialReminderPanel } from '../components/CredentialReminderPanel';\nimport { CredentialDirectory } from '../components/CredentialDirectory';\nimport { CredentialRecordForm } from '../components/CredentialRecordForm';\nimport { CREDENTIAL_FORMS } from '../components/credentialFormDefinitions';\nimport { credentialSourceLink } from '../utils/credentialSourceLink';\nimport { useProServiceWorld } from '../providers/ProServiceWorldProvider';\nimport {\n usePractitionerCredentials,\n useCredentialReviews,\n} from '../hooks/usePractitionerCredentials';\nimport {\n Banner,\n Empty,\n ErrorState,\n LoadingBlock,\n PageHeader,\n SectionCard,\n TableWrap,\n Th,\n Td,\n humanize,\n} from '../components/ui';\n\nexport function PractitionerCredentialsPage() {\n const { workspaceId, tenantId, currentUser } = useProServiceWorld();\n const scope = JSON.stringify([tenantId, workspaceId, currentUser?.id]);\n const [page, setPage] = useState({ scope, offset: 0 });\n const [selection, setSelection] = useState<{ scope: string; id: string; asOf: string } | null>(\n null\n );\n const offset = page.scope === scope ? page.offset : 0;\n const query = usePractitionerCredentials(offset);\n const items = query.data?.items ?? [];\n const selected =\n selection?.scope === scope ? items.find((item) => item.id === selection.id) : undefined;\n const [reviewPage, setReviewPage] = useState<{\n scope: string;\n credentialId: string;\n offset: number;\n } | null>(null);\n const reviewOffset =\n reviewPage?.scope === scope && reviewPage.credentialId === selected?.id ? reviewPage.offset : 0;\n const history = useCredentialReviews(\n selected?.id,\n reviewOffset,\n selection?.scope === scope ? selection.asOf : undefined\n );\n const reviews = history.data?.items ?? [];\n const ready = Boolean(tenantId && workspaceId && currentUser?.id);\n const [formSelection, setFormSelection] = useState(0);\n const [preparedReminder, setPreparedReminder] = useState<{ scope: string; id: string } | null>(\n null\n );\n const definition = CREDENTIAL_FORMS[formSelection] ?? CREDENTIAL_FORMS[0];\n\n return (\n <div className=\"space-y-6\">\n <PageHeader\n title=\"Practitioner credentials\"\n subtitle=\"Issuers, jurisdictions and source observations recorded by your firm.\"\n icon={<BadgeCheck className=\"h-6 w-6\" />}\n actions={\n <Button\n variant=\"outline\"\n disabled={!ready || query.isFetching}\n onClick={() => void query.refetch()}\n >\n <RefreshCw className=\"mr-2 h-4 w-4\" />\n Refresh\n </Button>\n }\n />\n <Banner tone=\"info\">\n Recorded evidence and source reviews do not certify legal authority to practise.\n </Banner>\n {ready && (\n <>\n <CredentialDirectory key={`directory:${scope}`} />\n <CredentialReminderPanel\n key={`reminder:${scope}:${preparedReminder?.scope === scope ? preparedReminder.id : ''}`}\n preparedId={preparedReminder?.scope === scope ? preparedReminder.id : undefined}\n />\n <label className=\"block text-sm font-medium\">\n Record an action\n <select\n className=\"mt-1 block w-full rounded border border-border bg-bg-surface p-2\"\n value={formSelection}\n onChange={(event) => setFormSelection(Number(event.target.value))}\n >\n {CREDENTIAL_FORMS.map((form, index) => (\n <option key={form.operation} value={index}>\n {form.title}\n </option>\n ))}\n </select>\n </label>\n {definition && (\n <CredentialRecordForm\n key={`${scope}:${definition.operation}`}\n scope={scope}\n definition={definition}\n onPreparedReminder={(id) => setPreparedReminder({ scope, id })}\n />\n )}\n </>\n )}\n {!ready ? (\n <Empty\n title=\"Choose a workspace\"\n description=\"Sign in and choose the firm workspace to view its credential records.\"\n />\n ) : query.isLoading ? (\n <LoadingBlock />\n ) : query.error ? (\n <ErrorState error={query.error} onRetry={() => void query.refetch()} />\n ) : items.length === 0 ? (\n <Empty\n title=\"No credential records\"\n description=\"This firm has no recorded practitioner credentials on this page.\"\n />\n ) : (\n <SectionCard title={`${query.data?.totalCount ?? items.length} recorded credentials`}>\n <TableWrap>\n <thead>\n <tr>\n <Th>Credential</Th>\n <Th>Jurisdiction</Th>\n <Th>Practice scope</Th>\n <Th>Recorded validity</Th>\n <Th>Recorded expiry</Th>\n <Th>Reviews</Th>\n </tr>\n </thead>\n <tbody>\n {items.map((item) => (\n <tr key={item.id}>\n <Td>\n {item.identifier}\n <span className=\"block break-all text-xs\">\n ID: {item.id} · Revision {item.revision}\n </span>\n </Td>\n <Td>{item.jurisdiction}</Td>\n <Td>{item.practiceScope}</Td>\n <Td>{humanize(item.validityKind)}</Td>\n <Td>\n {item.expiresAt ??\n (item.validityKind === 'NO_EXPIRY_REPORTED'\n ? 'No expiry reported'\n : 'Unknown')}\n <span className=\"block text-xs text-text-tertiary\">\n Source zone: {item.sourceTimezone}\n </span>\n </Td>\n <Td>\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() =>\n setSelection({ scope, id: item.id, asOf: new Date().toISOString() })\n }\n >\n Status and history\n </Button>\n </Td>\n </tr>\n ))}\n </tbody>\n </TableWrap>\n <div className=\"mt-4 flex flex-wrap items-center justify-between gap-3\">\n <Button\n variant=\"outline\"\n disabled={offset === 0 || query.isFetching}\n onClick={() => setPage({ scope, offset: Math.max(0, offset - 25) })}\n >\n Previous\n </Button>\n <span className=\"text-sm text-text-secondary\">Page {Math.floor(offset / 25) + 1}</span>\n <Button\n variant=\"outline\"\n disabled={!query.data?.hasMore || query.isFetching}\n onClick={() => setPage({ scope, offset: offset + 25 })}\n >\n Next\n </Button>\n </div>\n </SectionCard>\n )}\n {selected && (\n <SectionCard title={`Recorded status and history: ${selected.identifier}`}>\n {history.data?.readiness && (\n <div className=\"mb-4 space-y-2\">\n <p className=\"font-semibold\">{humanize(history.data.readiness.recordedState)}</p>\n <p className=\"text-sm\">\n As of {history.data.readiness.asOf} · Credential revision{' '}\n {history.data.readiness.revision}\n </p>\n <p>\n Source observation: {humanize(history.data.readiness.observation)} ·{' '}\n {history.data.readiness.reviewIsForCurrentRevision\n ? 'Review matches current recorded facts'\n : 'Current facts need a source review'}\n </p>\n <p className=\"text-sm\">\n Legal authorization is not certified. No automatic source-freshness interval is\n assumed.\n </p>\n <Button\n variant=\"outline\"\n disabled={history.isFetching}\n onClick={() =>\n setSelection({ scope, id: selected.id, asOf: new Date().toISOString() })\n }\n >\n Refresh recorded status\n </Button>\n </div>\n )}\n {history.isLoading ? (\n <LoadingBlock />\n ) : history.error ? (\n <ErrorState error={history.error} onRetry={() => void history.refetch()} />\n ) : reviews.length === 0 ? (\n <p>No source review has been recorded. Authority remains unknown.</p>\n ) : (\n <div className=\"space-y-4\">\n {reviews.map((review) => {\n const href = credentialSourceLink(review.sourceUrl);\n return (\n <article key={review.id} className=\"min-w-0 rounded-xl border border-border p-4\">\n <h3 className=\"font-semibold\">{humanize(review.observation)}</h3>\n <p className=\"text-sm text-text-secondary\">\n Observed {review.checkedAt} · Revision {review.credentialRevision}\n {review.credentialRevision !== selected.revision\n ? ' · Previous credential facts'\n : ''}\n </p>\n <p className=\"mt-2 whitespace-pre-wrap break-words\">{review.note}</p>\n {href ? (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-2 block break-all underline\"\n >\n Source reference: {new URL(href).hostname}\n </a>\n ) : (\n <p className=\"mt-2 text-sm\">Source reference unavailable.</p>\n )}\n <p className=\"mt-2 break-all text-xs text-text-secondary\">\n Evidence version: {review.evidenceVersionId}\n </p>\n <p className=\"break-all text-xs text-text-secondary\">\n SHA-256: {review.evidenceSha256}\n </p>\n </article>\n );\n })}\n </div>\n )}\n <div className=\"mt-4 flex flex-wrap items-center justify-between gap-3\">\n <Button\n variant=\"outline\"\n disabled={reviewOffset === 0 || history.isFetching}\n onClick={() =>\n setReviewPage({\n scope,\n credentialId: selected.id,\n offset: Math.max(0, reviewOffset - 25),\n })\n }\n >\n Previous reviews\n </Button>\n <span className=\"text-sm text-text-secondary\">\n Review page {Math.floor(reviewOffset / 25) + 1}\n </span>\n <Button\n variant=\"outline\"\n disabled={!history.data?.hasMore || history.isFetching}\n onClick={() =>\n setReviewPage({ scope, credentialId: selected.id, offset: reviewOffset + 25 })\n }\n >\n Next reviews\n </Button>\n </div>\n </SectionCard>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimePage.d.ts","sourceRoot":"","sources":["../../../src/proserviceworld/pages/TimePage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAkDhC,OAAO,EAIL,KAAK,SAAS,EACd,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"TimePage.d.ts","sourceRoot":"","sources":["../../../src/proserviceworld/pages/TimePage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAkDhC,OAAO,EAIL,KAAK,SAAS,EACd,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAqB/B,eAAO,MAAM,QAAQ,EAAE,EA6QtB,CAAC;AAoLF,KAAK,QAAQ,GAAG,cAAc,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAcpE,eAAO,MAAM,cAAc,GAAI,OAAO,SAAS,EAAE,YAAgB,KAAG,QAOnE,CAAC"}
|