@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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InvoicesPage.js","names":[],"sources":["../../../src/proserviceworld/pages/InvoicesPage.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { useDeferredValue, useMemo, useState } from 'react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport {\n Plus,\n Receipt,\n CheckCircle2,\n AlertCircle,\n Wallet,\n Search,\n Eye,\n XCircle,\n} from 'lucide-react';\nimport {\n useInvoices,\n useInvoice,\n useCreateInvoice,\n useMarkInvoicePaid,\n useCancelInvoice,\n useClients,\n useEngagements,\n type PswInvoiceStatus,\n} from '../hooks/useProServiceWorldApi';\nimport {\n PageHeader,\n SectionCard,\n LoadingBlock,\n ErrorState,\n Empty,\n StatusPill,\n Modal,\n Field,\n TextInput,\n TextArea,\n NativeSelect,\n Banner,\n MetricCard,\n TableWrap,\n Th,\n Td,\n enumOptions,\n fmtDate,\n fmtMoney,\n} from '../components/ui';\nimport { useAnalytics } from '../hooks/useAnalytics';\nimport { cn } from '../utils/cn';\n\nconst STATUSES: PswInvoiceStatus[] = ['DRAFT', 'SENT', 'PAID', 'OVERDUE', 'CANCELLED'];\n\nexport const InvoicesPage: FC = () => {\n const [statusFilter, setStatusFilter] = useState<PswInvoiceStatus | ''>('');\n const [search, setSearch] = useState('');\n const deferredSearch = useDeferredValue(search);\n const [creating, setCreating] = useState(false);\n const [detailId, setDetailId] = useState<string | null>(null);\n const [banner, setBanner] = useState<{ tone: 'success' | 'danger'; text: string } | null>(null);\n const { data, isLoading, error, refetch } = useInvoices({\n status: statusFilter || undefined,\n search: deferredSearch.trim() || undefined,\n });\n const { emitFact } = useAnalytics();\n const markPaid = useMarkInvoicePaid();\n const cancelInvoice = useCancelInvoice();\n const clients = useClients({ pagination: { limit: 100 } });\n const clientName = useMemo(\n () => new Map((clients.data?.items ?? []).map((c) => [c.id, c.name])),\n [clients.data]\n );\n\n const outstandingInvoices = (data?.items ?? []).filter(\n (i) => i.status === 'SENT' || i.status === 'OVERDUE'\n );\n const paidInvoices = (data?.items ?? []).filter((i) => i.status === 'PAID');\n const outstanding = outstandingInvoices.reduce((s, i) => s + i.total, 0);\n const collected = paidInvoices.reduce((s, i) => s + i.total, 0);\n\n return (\n <div className=\"space-y-6\">\n <PageHeader\n title=\"Invoices\"\n subtitle=\"Assemble invoices from time, milestones and fixed-fee schedules — and track what's outstanding.\"\n icon={<Receipt className=\"h-6 w-6\" />}\n actions={\n <Button onClick={() => setCreating(true)}>\n <Plus className=\"mr-1.5 h-4 w-4\" />\n New invoice\n </Button>\n }\n />\n\n {banner && (\n <Banner tone={banner.tone} onClose={() => setBanner(null)}>\n {banner.text}\n </Banner>\n )}\n\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-3\">\n <MetricCard\n label=\"Invoices\"\n value={data?.totalCount ?? 0}\n icon={<Receipt className=\"h-4 w-4\" />}\n />\n <MetricCard\n label=\"Outstanding\"\n value={fmtMoney(outstanding)}\n hint={`${outstandingInvoices.length} sent + overdue`}\n icon={<AlertCircle className=\"h-4 w-4\" />}\n tone=\"warning\"\n />\n <MetricCard\n label=\"Collected\"\n value={fmtMoney(collected)}\n hint={`${paidInvoices.length} paid`}\n icon={<Wallet className=\"h-4 w-4\" />}\n tone=\"success\"\n />\n </div>\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 invoices…\"\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: 'invoice',\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 PswInvoiceStatus | '')}\n className=\"sm:w-48\"\n >\n <option value=\"\">All statuses</option>\n {enumOptions(STATUSES)}\n </NativeSelect>\n </div>\n\n {isLoading ? (\n <LoadingBlock />\n ) : error ? (\n <ErrorState error={error} onRetry={() => void refetch()} />\n ) : !data || data.items.length === 0 ? (\n <Empty\n title=\"No invoices yet\"\n description=\"Raise an invoice for a client to start tracking receivables.\"\n icon={<Receipt className=\"h-8 w-8\" />}\n action={\n <Button onClick={() => setCreating(true)}>\n <Plus className=\"mr-1.5 h-4 w-4\" />\n New invoice\n </Button>\n }\n />\n ) : (\n <SectionCard title=\"Invoices\">\n <TableWrap>\n <thead>\n <tr>\n <Th>Number</Th>\n <Th>Client</Th>\n <Th>Total</Th>\n <Th>Status</Th>\n <Th>Due</Th>\n <Th className=\"text-right\">Actions</Th>\n </tr>\n </thead>\n <tbody>\n {data.items.map((i) => (\n <tr key={i.id} className=\"transition-colors hover:bg-bg-sunken/60\">\n <Td>\n <span className=\"font-medium text-text-primary\">{i.number}</span>\n </Td>\n <Td className=\"text-text-primary\">{clientName.get(i.clientId) ?? '—'}</Td>\n <Td className=\"whitespace-nowrap font-semibold text-text-primary\">\n {fmtMoney(i.total, i.currency)}\n </Td>\n <Td>\n <StatusPill status={i.status} />\n </Td>\n <Td\n className={cn(\n 'whitespace-nowrap',\n i.status === 'OVERDUE' && 'font-medium text-status-error-text'\n )}\n >\n {fmtDate(i.dueDate)}\n </Td>\n <Td className=\"text-right\">\n <div className=\"flex items-center justify-end gap-1\">\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setDetailId(i.id)}>\n <Eye className=\"mr-1 h-4 w-4\" />\n View\n </Button>\n {i.status !== 'PAID' && i.status !== 'CANCELLED' && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={markPaid.isPending}\n onClick={() =>\n markPaid.mutate(i.id, {\n onSuccess: () =>\n setBanner({ tone: 'success', text: `${i.number} marked paid.` }),\n onError: (e) =>\n setBanner({\n tone: 'danger',\n text: e instanceof Error ? e.message : 'Failed.',\n }),\n })\n }\n >\n <CheckCircle2 className=\"mr-1 h-4 w-4\" />\n Mark paid\n </Button>\n )}\n {(i.status === 'DRAFT' || i.status === 'SENT') && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={cancelInvoice.isPending}\n onClick={() =>\n cancelInvoice.mutate(i.id, {\n onSuccess: () =>\n setBanner({ tone: 'success', text: `${i.number} cancelled.` }),\n onError: (e) =>\n setBanner({\n tone: 'danger',\n text: e instanceof Error ? e.message : 'Failed.',\n }),\n })\n }\n >\n <XCircle className=\"mr-1 h-4 w-4\" />\n Cancel\n </Button>\n )}\n </div>\n </Td>\n </tr>\n ))}\n </tbody>\n </TableWrap>\n </SectionCard>\n )}\n\n {creating && (\n <InvoiceModal\n onClose={() => setCreating(false)}\n onSaved={(n) => setBanner({ tone: 'success', text: `${n} created.` })}\n />\n )}\n\n {detailId && (\n <InvoiceDetailModal\n id={detailId}\n clientName={clientName}\n onClose={() => setDetailId(null)}\n onCancelled={(n) => {\n setDetailId(null);\n setBanner({ tone: 'success', text: `${n} cancelled.` });\n }}\n />\n )}\n </div>\n );\n};\n\nconst InvoiceDetailModal: FC<{\n id: string;\n clientName: Map<string, string>;\n onClose: () => void;\n onCancelled: (number: string) => void;\n}> = ({ id, clientName, onClose, onCancelled }) => {\n const { data: invoice, isLoading, error } = useInvoice(id);\n const cancelInvoice = useCancelInvoice();\n const [err, setErr] = useState<string | null>(null);\n\n return (\n <Modal\n open\n onClose={onClose}\n title={invoice ? `Invoice ${invoice.number}` : 'Invoice'}\n footer={\n <>\n <Button variant=\"outline\" onClick={onClose}>\n Close\n </Button>\n {invoice && (invoice.status === 'DRAFT' || invoice.status === 'SENT') && (\n <Button\n variant=\"destructive\"\n disabled={cancelInvoice.isPending}\n onClick={() => {\n setErr(null);\n cancelInvoice.mutate(invoice.id, {\n onSuccess: () => onCancelled(invoice.number),\n onError: (e) => setErr(e instanceof Error ? e.message : 'Failed.'),\n });\n }}\n >\n <XCircle className=\"mr-1.5 h-4 w-4\" />\n {cancelInvoice.isPending ? 'Cancelling…' : 'Cancel invoice'}\n </Button>\n )}\n </>\n }\n >\n <div className=\"space-y-3\">\n {err && <Banner tone=\"danger\">{err}</Banner>}\n {isLoading ? (\n <LoadingBlock />\n ) : error ? (\n <ErrorState error={error} />\n ) : !invoice ? (\n <Empty title=\"Invoice not found\" icon={<Receipt className=\"h-8 w-8\" />} />\n ) : (\n <>\n <div className=\"grid grid-cols-2 gap-3 text-sm\">\n <div>\n <div className=\"text-text-tertiary\">Client</div>\n <div className=\"font-medium text-text-primary\">\n {clientName.get(invoice.clientId) ?? '—'}\n </div>\n </div>\n <div>\n <div className=\"text-text-tertiary\">Status</div>\n <StatusPill status={invoice.status} />\n </div>\n <div>\n <div className=\"text-text-tertiary\">Issue date</div>\n <div className=\"text-text-primary\">{fmtDate(invoice.issueDate)}</div>\n </div>\n <div>\n <div className=\"text-text-tertiary\">Due date</div>\n <div className=\"text-text-primary\">{fmtDate(invoice.dueDate)}</div>\n </div>\n <div>\n <div className=\"text-text-tertiary\">Sent</div>\n <div className=\"text-text-primary\">{fmtDate(invoice.sentAt)}</div>\n </div>\n <div>\n <div className=\"text-text-tertiary\">Paid</div>\n <div className=\"text-text-primary\">{fmtDate(invoice.paidAt)}</div>\n </div>\n </div>\n\n {invoice.lineItems && invoice.lineItems.length > 0 && (\n <TableWrap>\n <thead>\n <tr>\n <Th>Source</Th>\n <Th>Description</Th>\n <Th className=\"text-right\">Amount</Th>\n </tr>\n </thead>\n <tbody>\n {invoice.lineItems.map((li, idx) => (\n <tr key={`${li.sourceType}-${li.sourceId}-${idx}`}>\n <Td>{li.sourceType}</Td>\n <Td>{li.description ?? li.sourceId}</Td>\n <Td className=\"text-right\">{fmtMoney(li.amount, invoice.currency)}</Td>\n </tr>\n ))}\n </tbody>\n </TableWrap>\n )}\n\n <div className=\"rounded-lg bg-bg-sunken px-3 py-2 text-sm text-text-secondary\">\n <div className=\"flex justify-between\">\n <span>Subtotal</span>\n <span>{fmtMoney(invoice.subtotal, invoice.currency)}</span>\n </div>\n <div className=\"flex justify-between\">\n <span>Tax</span>\n <span>{fmtMoney(invoice.taxAmount, invoice.currency)}</span>\n </div>\n <div className=\"flex justify-between font-semibold text-text-primary\">\n <span>Total</span>\n <span>{fmtMoney(invoice.total, invoice.currency)}</span>\n </div>\n </div>\n\n {invoice.notes && (\n <div>\n <div className=\"text-sm text-text-tertiary\">Notes</div>\n <div className=\"text-sm text-text-primary\">{invoice.notes}</div>\n </div>\n )}\n </>\n )}\n </div>\n </Modal>\n );\n};\n\nconst InvoiceModal: FC<{ onClose: () => void; onSaved: (number: string) => void }> = ({\n onClose,\n onSaved,\n}) => {\n const create = useCreateInvoice();\n const clients = useClients({ pagination: { limit: 100 } });\n const [form, setForm] = useState({\n clientId: '',\n engagementId: '',\n number: '',\n currency: 'USD',\n subtotal: '',\n taxAmount: '',\n issueDate: new Date().toISOString().slice(0, 10),\n dueDate: '',\n notes: '',\n });\n const [err, setErr] = useState<string | null>(null);\n const engagements = useEngagements({\n clientId: form.clientId || undefined,\n pagination: { limit: 100 },\n });\n const set = (k: keyof typeof form) => (e: { target: { value: string } }) =>\n setForm((f) => ({ ...f, [k]: e.target.value }));\n const total = (Number(form.subtotal) || 0) + (Number(form.taxAmount) || 0);\n\n const submit = () => {\n setErr(null);\n if (!form.clientId) return setErr('Select a client.');\n if (!form.number.trim()) return setErr('Invoice number is required.');\n create.mutate(\n {\n clientId: form.clientId,\n engagementId: form.engagementId || null,\n number: form.number.trim(),\n currency: form.currency || 'USD',\n subtotal: Number(form.subtotal) || 0,\n taxAmount: Number(form.taxAmount) || 0,\n total,\n issueDate: form.issueDate ? new Date(form.issueDate).toISOString() : null,\n dueDate: form.dueDate ? new Date(form.dueDate).toISOString() : null,\n notes: form.notes.trim() || null,\n },\n {\n onSuccess: () => {\n onSaved(form.number.trim());\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 invoice\"\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 invoice'}\n </Button>\n </>\n }\n >\n <div className=\"space-y-3\">\n {err && <Banner tone=\"danger\">{err}</Banner>}\n <div className=\"grid grid-cols-2 gap-3\">\n <Field label=\"Client\" required>\n <NativeSelect value={form.clientId} onChange={set('clientId')}>\n <option value=\"\">Select…</option>\n {clients.data?.items.map((c) => (\n <option key={c.id} value={c.id}>\n {c.name}\n </option>\n ))}\n </NativeSelect>\n </Field>\n <Field label=\"Number\" required>\n <TextInput value={form.number} onChange={set('number')} placeholder=\"INV-2026-014\" />\n </Field>\n </div>\n <Field label=\"Engagement (optional)\">\n <NativeSelect\n value={form.engagementId}\n onChange={set('engagementId')}\n disabled={!form.clientId}\n >\n <option value=\"\">None</option>\n {engagements.data?.items.map((e) => (\n <option key={e.id} value={e.id}>\n {e.name}\n </option>\n ))}\n </NativeSelect>\n </Field>\n <div className=\"grid grid-cols-3 gap-3\">\n <Field label=\"Subtotal\">\n <TextInput type=\"number\" min=\"0\" value={form.subtotal} onChange={set('subtotal')} />\n </Field>\n <Field label=\"Tax\">\n <TextInput type=\"number\" min=\"0\" value={form.taxAmount} onChange={set('taxAmount')} />\n </Field>\n <Field label=\"Currency\">\n <TextInput value={form.currency} onChange={set('currency')} maxLength={3} />\n </Field>\n </div>\n <div className=\"rounded-lg bg-bg-sunken px-3 py-2 text-sm text-text-secondary\">\n Total:{' '}\n <span className=\"font-semibold text-text-primary\">{fmtMoney(total, form.currency)}</span>\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <Field label=\"Issue date\">\n <TextInput type=\"date\" value={form.issueDate} onChange={set('issueDate')} />\n </Field>\n <Field label=\"Due date\">\n <TextInput type=\"date\" value={form.dueDate} onChange={set('dueDate')} />\n </Field>\n </div>\n <Field label=\"Notes\">\n <TextArea value={form.notes} onChange={set('notes')} />\n </Field>\n </div>\n </Modal>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"InvoicesPage.js","names":[],"sources":["../../../src/proserviceworld/pages/InvoicesPage.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { useDeferredValue, useMemo, useState } from 'react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport {\n Plus,\n Receipt,\n CheckCircle2,\n AlertCircle,\n Wallet,\n Search,\n Eye,\n XCircle,\n Send,\n} from 'lucide-react';\nimport {\n useInvoices,\n useInvoice,\n useCreateInvoice,\n useSendInvoice,\n useMarkInvoicePaid,\n useCancelInvoice,\n useClients,\n useEngagements,\n type PswInvoiceStatus,\n} from '../hooks/useProServiceWorldApi';\nimport {\n PageHeader,\n SectionCard,\n LoadingBlock,\n ErrorState,\n Empty,\n StatusPill,\n Modal,\n Field,\n TextInput,\n TextArea,\n NativeSelect,\n Banner,\n MetricCard,\n TableWrap,\n Th,\n Td,\n enumOptions,\n fmtDate,\n fmtMoney,\n} from '../components/ui';\nimport { useAnalytics } from '../hooks/useAnalytics';\nimport { cn } from '../utils/cn';\nimport { plural, useEnumLabel, useTr } from '../hooks/useTr';\n\nconst STATUSES: PswInvoiceStatus[] = ['DRAFT', 'SENT', 'PAID', 'OVERDUE', 'CANCELLED'];\n\nexport const InvoicesPage: FC = () => {\n const tr = useTr();\n const enumLabel = useEnumLabel();\n const [statusFilter, setStatusFilter] = useState<PswInvoiceStatus | ''>('');\n const [search, setSearch] = useState('');\n const deferredSearch = useDeferredValue(search);\n const [creating, setCreating] = useState(false);\n const [detailId, setDetailId] = useState<string | null>(null);\n const [banner, setBanner] = useState<{ tone: 'success' | 'danger'; text: string } | null>(null);\n const { data, isLoading, error, refetch } = useInvoices({\n status: statusFilter || undefined,\n search: deferredSearch.trim() || undefined,\n });\n const { emitFact } = useAnalytics();\n const sendInvoice = useSendInvoice();\n const markPaid = useMarkInvoicePaid();\n const cancelInvoice = useCancelInvoice();\n const clients = useClients({ pagination: { limit: 100 } });\n const clientName = useMemo(\n () => new Map((clients.data?.items ?? []).map((c) => [c.id, c.name])),\n [clients.data]\n );\n\n const outstandingInvoices = (data?.items ?? []).filter(\n (i) => i.status === 'SENT' || i.status === 'OVERDUE'\n );\n const paidInvoices = (data?.items ?? []).filter((i) => i.status === 'PAID');\n const outstanding = outstandingInvoices.reduce((s, i) => s + i.total, 0);\n const collected = paidInvoices.reduce((s, i) => s + i.total, 0);\n\n return (\n <div className=\"space-y-6\">\n <PageHeader\n title={tr('psw.invoices.title', 'Invoices')}\n subtitle={tr(\n 'psw.invoices.subtitle',\n \"Assemble invoices from time, milestones and fixed-fee schedules — and track what's outstanding.\"\n )}\n icon={<Receipt className=\"h-6 w-6\" />}\n actions={\n <Button onClick={() => setCreating(true)}>\n <Plus className=\"me-1.5 h-4 w-4\" />\n {tr('psw.invoices.new', 'New invoice')}\n </Button>\n }\n />\n\n {banner && (\n <Banner tone={banner.tone} onClose={() => setBanner(null)}>\n {banner.text}\n </Banner>\n )}\n\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-3\">\n <MetricCard\n label={tr('psw.invoices.title', 'Invoices')}\n value={data?.totalCount ?? 0}\n icon={<Receipt className=\"h-4 w-4\" />}\n />\n <MetricCard\n label={tr('psw.invoices.outstanding', 'Outstanding')}\n value={fmtMoney(outstanding)}\n hint={tr('psw.invoices.outstandingHint', '{{count}} sent + overdue', {\n count: outstandingInvoices.length,\n })}\n icon={<AlertCircle className=\"h-4 w-4\" />}\n tone=\"warning\"\n />\n <MetricCard\n label={tr('psw.invoices.collected', 'Collected')}\n value={fmtMoney(collected)}\n hint={tr('psw.invoices.paidHint', '{{count}} paid', { count: paidInvoices.length })}\n icon={<Wallet className=\"h-4 w-4\" />}\n tone=\"success\"\n />\n </div>\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 start-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-tertiary\" />\n <TextInput\n placeholder={tr('psw.invoices.searchPlaceholder', 'Search invoices…')}\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: 'invoice',\n queryLength: search.trim().length,\n });\n }\n }}\n className=\"ps-9\"\n />\n </div>\n <NativeSelect\n value={statusFilter}\n onChange={(e) => setStatusFilter(e.target.value as PswInvoiceStatus | '')}\n className=\"sm:w-48\"\n >\n <option value=\"\">{tr('psw.common.allStatuses', 'All statuses')}</option>\n {enumOptions(STATUSES, enumLabel)}\n </NativeSelect>\n </div>\n\n {isLoading ? (\n <LoadingBlock />\n ) : error ? (\n <ErrorState error={error} onRetry={() => void refetch()} />\n ) : !data || data.items.length === 0 ? (\n <Empty\n title={tr('psw.invoices.emptyTitle', 'No invoices yet')}\n description={tr(\n 'psw.invoices.emptyDescription',\n 'Raise an invoice for a client to start tracking receivables.'\n )}\n icon={<Receipt className=\"h-8 w-8\" />}\n action={\n <Button onClick={() => setCreating(true)}>\n <Plus className=\"me-1.5 h-4 w-4\" />\n {tr('psw.invoices.new', 'New invoice')}\n </Button>\n }\n />\n ) : (\n <SectionCard\n title={plural(\n tr,\n 'psw.invoices.count',\n data.totalCount,\n '{{count}} invoice',\n '{{count}} invoices'\n )}\n >\n <TableWrap>\n <thead>\n <tr>\n <Th>{tr('psw.invoices.number', 'Number')}</Th>\n <Th>{tr('psw.common.client', 'Client')}</Th>\n <Th>{tr('psw.invoices.total', 'Total')}</Th>\n <Th>{tr('psw.common.status', 'Status')}</Th>\n <Th>{tr('psw.common.due', 'Due')}</Th>\n <Th className=\"text-end\">{tr('psw.common.actions', 'Actions')}</Th>\n </tr>\n </thead>\n <tbody>\n {data.items.map((i) => (\n <tr key={i.id} className=\"transition-colors hover:bg-bg-sunken/60\">\n <Td>\n <span className=\"font-medium text-text-primary\">{i.number}</span>\n </Td>\n <Td className=\"text-text-primary\">{clientName.get(i.clientId) ?? '—'}</Td>\n <Td className=\"whitespace-nowrap font-semibold text-text-primary\">\n {fmtMoney(i.total, i.currency)}\n </Td>\n <Td>\n <StatusPill status={i.status} />\n </Td>\n <Td\n className={cn(\n 'whitespace-nowrap',\n i.status === 'OVERDUE' && 'font-medium text-status-error-text'\n )}\n >\n {fmtDate(i.dueDate)}\n </Td>\n <Td className=\"text-end\">\n <div className=\"flex items-center justify-end gap-1\">\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setDetailId(i.id)}>\n <Eye className=\"me-1 h-4 w-4\" />\n {tr('psw.invoices.view', 'View')}\n </Button>\n {i.status === 'DRAFT' && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={sendInvoice.isPending}\n onClick={() =>\n sendInvoice.mutate(i.id, {\n onSuccess: () =>\n setBanner({\n tone: 'success',\n text: tr('psw.invoices.sent', '{{number}} sent.', {\n number: i.number,\n }),\n }),\n onError: (e) =>\n setBanner({\n tone: 'danger',\n text:\n e instanceof Error\n ? e.message\n : tr('psw.common.failed', 'Failed.'),\n }),\n })\n }\n >\n <Send className=\"me-1 h-4 w-4\" />\n {tr('psw.invoices.send', 'Send')}\n </Button>\n )}\n {(i.status === 'SENT' || i.status === 'OVERDUE') && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={markPaid.isPending}\n onClick={() =>\n markPaid.mutate(i.id, {\n onSuccess: () =>\n setBanner({\n tone: 'success',\n text: tr('psw.invoices.markedPaid', '{{number}} marked paid.', {\n number: i.number,\n }),\n }),\n onError: (e) =>\n setBanner({\n tone: 'danger',\n text:\n e instanceof Error\n ? e.message\n : tr('psw.common.failed', 'Failed.'),\n }),\n })\n }\n >\n <CheckCircle2 className=\"me-1 h-4 w-4\" />\n {tr('psw.invoices.markPaid', 'Mark paid')}\n </Button>\n )}\n {(i.status === 'DRAFT' || i.status === 'SENT') && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={cancelInvoice.isPending}\n onClick={() =>\n cancelInvoice.mutate(i.id, {\n onSuccess: () =>\n setBanner({\n tone: 'success',\n text: tr('psw.invoices.cancelled', '{{number}} cancelled.', {\n number: i.number,\n }),\n }),\n onError: (e) =>\n setBanner({\n tone: 'danger',\n text:\n e instanceof Error\n ? e.message\n : tr('psw.common.failed', 'Failed.'),\n }),\n })\n }\n >\n <XCircle className=\"me-1 h-4 w-4\" />\n {tr('psw.common.cancel', 'Cancel')}\n </Button>\n )}\n </div>\n </Td>\n </tr>\n ))}\n </tbody>\n </TableWrap>\n </SectionCard>\n )}\n\n {creating && (\n <InvoiceModal\n onClose={() => setCreating(false)}\n onSaved={(n) =>\n setBanner({\n tone: 'success',\n text: tr('psw.invoices.created', '{{number}} created.', { number: n }),\n })\n }\n />\n )}\n\n {detailId && (\n <InvoiceDetailModal\n id={detailId}\n clientName={clientName}\n onClose={() => setDetailId(null)}\n onCancelled={(n) => {\n setDetailId(null);\n setBanner({\n tone: 'success',\n text: tr('psw.invoices.cancelled', '{{number}} cancelled.', { number: n }),\n });\n }}\n />\n )}\n </div>\n );\n};\n\nconst InvoiceDetailModal: FC<{\n id: string;\n clientName: Map<string, string>;\n onClose: () => void;\n onCancelled: (number: string) => void;\n}> = ({ id, clientName, onClose, onCancelled }) => {\n const tr = useTr();\n const enumLabel = useEnumLabel();\n const { data: invoice, isLoading, error } = useInvoice(id);\n const cancelInvoice = useCancelInvoice();\n const [err, setErr] = useState<string | null>(null);\n\n return (\n <Modal\n open\n onClose={onClose}\n title={\n invoice\n ? tr('psw.invoices.detailTitle', 'Invoice {{number}}', { number: invoice.number })\n : tr('psw.invoices.invoice', 'Invoice')\n }\n footer={\n <>\n <Button variant=\"outline\" onClick={onClose}>\n {tr('psw.common.close', 'Close')}\n </Button>\n {invoice && (invoice.status === 'DRAFT' || invoice.status === 'SENT') && (\n <Button\n variant=\"destructive\"\n disabled={cancelInvoice.isPending}\n onClick={() => {\n setErr(null);\n cancelInvoice.mutate(invoice.id, {\n onSuccess: () => onCancelled(invoice.number),\n onError: (e) =>\n setErr(e instanceof Error ? e.message : tr('psw.common.failed', 'Failed.')),\n });\n }}\n >\n <XCircle className=\"me-1.5 h-4 w-4\" />\n {cancelInvoice.isPending\n ? tr('psw.invoices.cancelling', 'Cancelling…')\n : tr('psw.invoices.cancelInvoice', 'Cancel invoice')}\n </Button>\n )}\n </>\n }\n >\n <div className=\"space-y-3\">\n {err && <Banner tone=\"danger\">{err}</Banner>}\n {isLoading ? (\n <LoadingBlock />\n ) : error ? (\n <ErrorState error={error} />\n ) : !invoice ? (\n <Empty\n title={tr('psw.invoices.notFound', 'Invoice not found')}\n icon={<Receipt className=\"h-8 w-8\" />}\n />\n ) : (\n <>\n <div className=\"grid grid-cols-2 gap-3 text-sm\">\n <div>\n <div className=\"text-text-tertiary\">{tr('psw.common.client', 'Client')}</div>\n <div className=\"font-medium text-text-primary\">\n {clientName.get(invoice.clientId) ?? '—'}\n </div>\n </div>\n <div>\n <div className=\"text-text-tertiary\">{tr('psw.common.status', 'Status')}</div>\n <StatusPill status={invoice.status} />\n </div>\n <div>\n <div className=\"text-text-tertiary\">\n {tr('psw.invoices.issueDate', 'Issue date')}\n </div>\n <div className=\"text-text-primary\">{fmtDate(invoice.issueDate)}</div>\n </div>\n <div>\n <div className=\"text-text-tertiary\">{tr('psw.common.dueDate', 'Due date')}</div>\n <div className=\"text-text-primary\">{fmtDate(invoice.dueDate)}</div>\n </div>\n <div>\n <div className=\"text-text-tertiary\">{tr('psw.invoices.sentAt', 'Sent')}</div>\n <div className=\"text-text-primary\">{fmtDate(invoice.sentAt)}</div>\n </div>\n <div>\n <div className=\"text-text-tertiary\">{tr('psw.invoices.paidAt', 'Paid')}</div>\n <div className=\"text-text-primary\">{fmtDate(invoice.paidAt)}</div>\n </div>\n </div>\n\n {invoice.lineItems && invoice.lineItems.length > 0 && (\n <TableWrap>\n <thead>\n <tr>\n <Th>{tr('psw.invoices.source', 'Source')}</Th>\n <Th>{tr('psw.common.description', 'Description')}</Th>\n <Th className=\"text-end\">{tr('psw.common.amount', 'Amount')}</Th>\n </tr>\n </thead>\n <tbody>\n {invoice.lineItems.map((li, idx) => (\n <tr key={`${li.sourceType}-${li.sourceId}-${idx}`}>\n <Td>{enumLabel(li.sourceType)}</Td>\n <Td>{li.description ?? li.sourceId}</Td>\n <Td className=\"text-end\">{fmtMoney(li.amount, invoice.currency)}</Td>\n </tr>\n ))}\n </tbody>\n </TableWrap>\n )}\n\n <div className=\"rounded-lg bg-bg-sunken px-3 py-2 text-sm text-text-secondary\">\n <div className=\"flex justify-between\">\n <span>{tr('psw.invoices.subtotal', 'Subtotal')}</span>\n <span>{fmtMoney(invoice.subtotal, invoice.currency)}</span>\n </div>\n <div className=\"flex justify-between\">\n <span>{tr('psw.invoices.tax', 'Tax')}</span>\n <span>{fmtMoney(invoice.taxAmount, invoice.currency)}</span>\n </div>\n <div className=\"flex justify-between font-semibold text-text-primary\">\n <span>{tr('psw.invoices.total', 'Total')}</span>\n <span>{fmtMoney(invoice.total, invoice.currency)}</span>\n </div>\n </div>\n\n {invoice.notes && (\n <div>\n <div className=\"text-sm text-text-tertiary\">{tr('psw.common.notes', 'Notes')}</div>\n <div className=\"text-sm text-text-primary\">{invoice.notes}</div>\n </div>\n )}\n </>\n )}\n </div>\n </Modal>\n );\n};\n\nconst InvoiceModal: FC<{ onClose: () => void; onSaved: (number: string) => void }> = ({\n onClose,\n onSaved,\n}) => {\n const tr = useTr();\n const create = useCreateInvoice();\n const clients = useClients({ pagination: { limit: 100 } });\n const [form, setForm] = useState({\n clientId: '',\n engagementId: '',\n number: '',\n currency: 'USD',\n subtotal: '',\n taxAmount: '',\n issueDate: new Date().toISOString().slice(0, 10),\n dueDate: '',\n notes: '',\n });\n const [err, setErr] = useState<string | null>(null);\n const engagements = useEngagements({\n clientId: form.clientId || undefined,\n pagination: { limit: 100 },\n });\n const set = (k: keyof typeof form) => (e: { target: { value: string } }) =>\n setForm((f) => ({ ...f, [k]: e.target.value }));\n const total = (Number(form.subtotal) || 0) + (Number(form.taxAmount) || 0);\n\n const submit = () => {\n setErr(null);\n if (!form.clientId) return setErr(tr('psw.invoices.selectClient', 'Select a client.'));\n if (!form.number.trim())\n return setErr(tr('psw.invoices.numberRequired', 'Invoice number is required.'));\n create.mutate(\n {\n clientId: form.clientId,\n engagementId: form.engagementId || null,\n number: form.number.trim(),\n currency: form.currency || 'USD',\n subtotal: Number(form.subtotal) || 0,\n taxAmount: Number(form.taxAmount) || 0,\n total,\n issueDate: form.issueDate ? new Date(form.issueDate).toISOString() : null,\n dueDate: form.dueDate ? new Date(form.dueDate).toISOString() : null,\n notes: form.notes.trim() || null,\n },\n {\n onSuccess: () => {\n onSaved(form.number.trim());\n onClose();\n },\n onError: (e) => setErr(e instanceof Error ? e.message : tr('psw.common.failed', 'Failed.')),\n }\n );\n };\n\n return (\n <Modal\n open\n onClose={onClose}\n title={tr('psw.invoices.new', 'New invoice')}\n footer={\n <>\n <Button variant=\"outline\" onClick={onClose} disabled={create.isPending}>\n {tr('psw.common.cancel', 'Cancel')}\n </Button>\n <Button onClick={submit} disabled={create.isPending}>\n {create.isPending\n ? tr('psw.common.creating', 'Creating…')\n : tr('psw.invoices.create', 'Create invoice')}\n </Button>\n </>\n }\n >\n <div className=\"space-y-3\">\n {err && <Banner tone=\"danger\">{err}</Banner>}\n <div className=\"grid grid-cols-2 gap-3\">\n <Field label={tr('psw.common.client', 'Client')} required>\n <NativeSelect value={form.clientId} onChange={set('clientId')}>\n <option value=\"\">{tr('psw.common.select', 'Select…')}</option>\n {clients.data?.items.map((c) => (\n <option key={c.id} value={c.id}>\n {c.name}\n </option>\n ))}\n </NativeSelect>\n </Field>\n <Field label={tr('psw.invoices.number', 'Number')} required>\n <TextInput value={form.number} onChange={set('number')} placeholder=\"INV-2026-014\" />\n </Field>\n </div>\n <Field label={tr('psw.invoices.engagementOptional', 'Engagement (optional)')}>\n <NativeSelect\n value={form.engagementId}\n onChange={set('engagementId')}\n disabled={!form.clientId}\n >\n <option value=\"\">{tr('psw.common.none', 'None')}</option>\n {engagements.data?.items.map((e) => (\n <option key={e.id} value={e.id}>\n {e.name}\n </option>\n ))}\n </NativeSelect>\n </Field>\n <div className=\"grid grid-cols-3 gap-3\">\n <Field label={tr('psw.invoices.subtotal', 'Subtotal')}>\n <TextInput type=\"number\" min=\"0\" value={form.subtotal} onChange={set('subtotal')} />\n </Field>\n <Field label={tr('psw.invoices.tax', 'Tax')}>\n <TextInput type=\"number\" min=\"0\" value={form.taxAmount} onChange={set('taxAmount')} />\n </Field>\n <Field label={tr('psw.invoices.currency', 'Currency')}>\n <TextInput value={form.currency} onChange={set('currency')} maxLength={3} />\n </Field>\n </div>\n <div className=\"rounded-lg bg-bg-sunken px-3 py-2 text-sm text-text-secondary\">\n {tr('psw.invoices.totalLabel', 'Total:')}{' '}\n <span className=\"font-semibold text-text-primary\">{fmtMoney(total, form.currency)}</span>\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <Field label={tr('psw.invoices.issueDate', 'Issue date')}>\n <TextInput type=\"date\" value={form.issueDate} onChange={set('issueDate')} />\n </Field>\n <Field label={tr('psw.common.dueDate', 'Due date')}>\n <TextInput type=\"date\" value={form.dueDate} onChange={set('dueDate')} />\n </Field>\n </div>\n <Field label={tr('psw.common.notes', 'Notes')}>\n <TextArea value={form.notes} onChange={set('notes')} />\n </Field>\n </div>\n </Modal>\n );\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MattersPage.d.ts","sourceRoot":"","sources":["../../../src/proserviceworld/pages/MattersPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAmEhC,eAAO,MAAM,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"MattersPage.d.ts","sourceRoot":"","sources":["../../../src/proserviceworld/pages/MattersPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAmEhC,eAAO,MAAM,WAAW,EAAE,EAoQzB,CAAC"}
|