@openrails/billing-ui 0.242.0 → 0.244.0
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/CHANGELOG.md +27 -11
- package/README.md +41 -8
- package/dist/admin/billing-admin.d.ts +3 -0
- package/dist/admin/components/app-sidebar.d.ts +1 -0
- package/dist/admin/components/confirm.d.ts +4 -0
- package/dist/admin/components/cursor-pager.d.ts +8 -0
- package/dist/admin/components/data-table.d.ts +14 -0
- package/dist/admin/components/fact-card.d.ts +5 -0
- package/dist/admin/components/form-field-errors.d.ts +3 -0
- package/dist/admin/components/linked-table-row.d.ts +5 -0
- package/dist/admin/components/logo.d.ts +3 -0
- package/dist/admin/components/no-access.d.ts +3 -0
- package/dist/admin/components/no-merchants.d.ts +1 -0
- package/dist/admin/components/notification-bell.d.ts +2 -0
- package/dist/admin/components/route-error.d.ts +3 -0
- package/dist/admin/components/site-header.d.ts +9 -0
- package/dist/admin/components/status-badge.d.ts +3 -0
- package/dist/admin/components/typed-confirm-dialog.d.ts +11 -0
- package/dist/admin/components/ui/alert-dialog.d.ts +18 -0
- package/dist/admin/components/ui/avatar.d.ts +11 -0
- package/dist/admin/components/ui/badge.d.ts +7 -0
- package/dist/admin/components/ui/breadcrumb.d.ts +10 -0
- package/dist/admin/components/ui/button.d.ts +8 -0
- package/dist/admin/components/ui/card.d.ts +11 -0
- package/dist/admin/components/ui/chart.d.ts +44 -0
- package/dist/admin/components/ui/dialog.d.ts +17 -0
- package/dist/admin/components/ui/dropdown-menu.d.ts +29 -0
- package/dist/admin/components/ui/input.d.ts +3 -0
- package/dist/admin/components/ui/label.d.ts +3 -0
- package/dist/admin/components/ui/select.d.ts +15 -0
- package/dist/admin/components/ui/separator.d.ts +3 -0
- package/dist/admin/components/ui/sheet.d.ts +14 -0
- package/dist/admin/components/ui/sidebar.d.ts +63 -0
- package/dist/admin/components/ui/skeleton.d.ts +2 -0
- package/dist/admin/components/ui/sonner.d.ts +3 -0
- package/dist/admin/components/ui/switch.d.ts +5 -0
- package/dist/admin/components/ui/table.d.ts +10 -0
- package/dist/admin/components/ui/tabs.d.ts +10 -0
- package/dist/admin/components/ui/textarea.d.ts +3 -0
- package/dist/admin/components/ui/tooltip.d.ts +6 -0
- package/dist/admin/context.d.ts +1193 -0
- package/dist/admin/hooks/use-mobile.d.ts +1 -0
- package/dist/admin/index.d.ts +5 -0
- package/dist/admin/layouts/app-layout.d.ts +4 -0
- package/dist/admin/lib/api/client.d.ts +64 -0
- package/dist/admin/lib/api/copilot.d.ts +6 -0
- package/dist/admin/lib/api/credit-endpoints.d.ts +8 -0
- package/dist/admin/lib/api/credit-types.d.ts +9 -0
- package/dist/admin/lib/api/endpoints.d.ts +133 -0
- package/dist/admin/lib/api/index.d.ts +89 -0
- package/dist/admin/lib/api/invoice-profile-endpoints.d.ts +6 -0
- package/dist/admin/lib/api/metrics.d.ts +68 -0
- package/dist/admin/lib/api/order-endpoints.d.ts +21 -0
- package/dist/admin/lib/api/types.d.ts +122 -0
- package/dist/admin/lib/auth.d.ts +6 -0
- package/dist/admin/lib/capabilities.d.ts +13 -0
- package/dist/admin/lib/chunk-error.d.ts +1 -0
- package/dist/admin/lib/confirm.d.ts +11 -0
- package/dist/admin/lib/credit-queries.d.ts +23 -0
- package/dist/admin/lib/csv.d.ts +3 -0
- package/dist/admin/lib/cursor-pages.d.ts +13 -0
- package/dist/admin/lib/dialog-width.d.ts +6 -0
- package/dist/admin/lib/dom.d.ts +1 -0
- package/dist/admin/lib/duration.d.ts +3 -0
- package/dist/admin/lib/format.d.ts +23 -0
- package/dist/admin/lib/mount.d.ts +6 -0
- package/dist/admin/lib/mutations.d.ts +125 -0
- package/dist/admin/lib/order-queries.d.ts +29 -0
- package/dist/admin/lib/queries.d.ts +369 -0
- package/dist/admin/lib/query-client.d.ts +3 -0
- package/dist/admin/lib/toast.d.ts +10 -0
- package/dist/admin/lib/utils.d.ts +2 -0
- package/dist/admin/messages.d.ts +670 -0
- package/dist/admin/navigation.d.ts +14 -0
- package/dist/admin/pages/catalog/application-dialog.d.ts +2 -0
- package/dist/admin/pages/catalog/copilot-panel.d.ts +4 -0
- package/dist/admin/pages/catalog/index.d.ts +4 -0
- package/dist/admin/pages/catalog/meter-form.d.ts +6 -0
- package/dist/admin/pages/catalog/metering-model.d.ts +67 -0
- package/dist/admin/pages/catalog/metering.d.ts +3 -0
- package/dist/admin/pages/catalog/price-detail.d.ts +2 -0
- package/dist/admin/pages/catalog/price-format.d.ts +3 -0
- package/dist/admin/pages/catalog/price-wizard-logic.d.ts +20 -0
- package/dist/admin/pages/catalog/price-wizard.d.ts +10 -0
- package/dist/admin/pages/catalog/psp-links.d.ts +10 -0
- package/dist/admin/pages/catalog/rate-card-editor.d.ts +10 -0
- package/dist/admin/pages/customers/credit-form.d.ts +14 -0
- package/dist/admin/pages/customers/credits.d.ts +5 -0
- package/dist/admin/pages/customers/default-card-badges.d.ts +3 -0
- package/dist/admin/pages/customers/detail.d.ts +5 -0
- package/dist/admin/pages/customers/grant-duration.d.ts +32 -0
- package/dist/admin/pages/customers/index.d.ts +2 -0
- package/dist/admin/pages/customers/invoice-profile-model.d.ts +18 -0
- package/dist/admin/pages/customers/invoice-profile.d.ts +9 -0
- package/dist/admin/pages/dashboard/index.d.ts +2 -0
- package/dist/admin/pages/dashboard/lib.d.ts +48 -0
- package/dist/admin/pages/dashboard/range-picker.d.ts +1 -0
- package/dist/admin/pages/dashboard/range.d.ts +34 -0
- package/dist/admin/pages/dashboard/reports-model.d.ts +29 -0
- package/dist/admin/pages/dashboard/reports.d.ts +2 -0
- package/dist/admin/pages/dashboard/use-range.d.ts +5 -0
- package/dist/admin/pages/dashboard/widget-editor.d.ts +8 -0
- package/dist/admin/pages/dashboard/widget-tile.d.ts +9 -0
- package/dist/admin/pages/dashboard/widget-viz.d.ts +12 -0
- package/dist/admin/pages/ops/index.d.ts +2 -0
- package/dist/admin/pages/orders/detail.d.ts +5 -0
- package/dist/admin/pages/orders/index.d.ts +1 -0
- package/dist/admin/pages/orders/model.d.ts +7 -0
- package/dist/admin/pages/payments/attempts.d.ts +7 -0
- package/dist/admin/pages/payments/detail.d.ts +2 -0
- package/dist/admin/pages/payments/health-model.d.ts +149 -0
- package/dist/admin/pages/payments/health.d.ts +2 -0
- package/dist/admin/pages/payments/index.d.ts +2 -0
- package/dist/admin/pages/settings/configuration-edit.d.ts +9 -0
- package/dist/admin/pages/settings/index.d.ts +9 -0
- package/dist/admin/pages/settings/notifications.d.ts +2 -0
- package/dist/admin/pages/settings/setting-fields.d.ts +20 -0
- package/dist/admin/pages/subscriptions/change-subscription-dialog.d.ts +16 -0
- package/dist/admin/pages/subscriptions/detail.d.ts +2 -0
- package/dist/admin/pages/subscriptions/dunning.d.ts +2 -0
- package/dist/admin/pages/subscriptions/index.d.ts +2 -0
- package/dist/admin/pages/subscriptions/subscription-change-options.d.ts +23 -0
- package/dist/admin/pages/subscriptions/views.d.ts +15 -0
- package/dist/admin/router.d.ts +32 -0
- package/dist/admin/routes.d.ts +5 -0
- package/dist/admin/summary.d.ts +27 -0
- package/dist/admin/theme.d.ts +2 -0
- package/dist/admin/types.d.ts +56 -0
- package/dist/admin/ui-context.d.ts +14 -0
- package/dist/admin-attempts-lAoW-Urd.js +419 -0
- package/dist/admin-attempts-lAoW-Urd.js.map +1 -0
- package/dist/admin-auth-DQGHtt0j.js +14 -0
- package/dist/admin-auth-DQGHtt0j.js.map +1 -0
- package/dist/admin-badge-DR5-1qd8.js +31 -0
- package/dist/admin-badge-DR5-1qd8.js.map +1 -0
- package/dist/admin-button-CTL3DgOt.js +46 -0
- package/dist/admin-button-CTL3DgOt.js.map +1 -0
- package/dist/admin-capabilities-BuigAgtm.js +59 -0
- package/dist/admin-capabilities-BuigAgtm.js.map +1 -0
- package/dist/admin-card-bzAks3-3.js +51 -0
- package/dist/admin-card-bzAks3-3.js.map +1 -0
- package/dist/admin-catalog-CK6CM9I2.js +1199 -0
- package/dist/admin-catalog-CK6CM9I2.js.map +1 -0
- package/dist/admin-confirm-katGq0Qo.js +12 -0
- package/dist/admin-confirm-katGq0Qo.js.map +1 -0
- package/dist/admin-csv-CPoNZj2D.js +16 -0
- package/dist/admin-csv-CPoNZj2D.js.map +1 -0
- package/dist/admin-customers-D8u5gq3M.js +160 -0
- package/dist/admin-customers-D8u5gq3M.js.map +1 -0
- package/dist/admin-dashboard-DqqFjOzq.js +420 -0
- package/dist/admin-dashboard-DqqFjOzq.js.map +1 -0
- package/dist/admin-data-table-qfXLOFmN.js +96 -0
- package/dist/admin-data-table-qfXLOFmN.js.map +1 -0
- package/dist/admin-detail-5aNNvrc0.js +324 -0
- package/dist/admin-detail-5aNNvrc0.js.map +1 -0
- package/dist/admin-detail-7p684Uyc.js +342 -0
- package/dist/admin-detail-7p684Uyc.js.map +1 -0
- package/dist/admin-detail-CGOyqs7s.js +1312 -0
- package/dist/admin-detail-CGOyqs7s.js.map +1 -0
- package/dist/admin-detail-DUAJQg8G.js +710 -0
- package/dist/admin-detail-DUAJQg8G.js.map +1 -0
- package/dist/admin-dialog-BjuKI5Hp.js +88 -0
- package/dist/admin-dialog-BjuKI5Hp.js.map +1 -0
- package/dist/admin-dialog-width-BPrgdYlj.js +6 -0
- package/dist/admin-dialog-width-BPrgdYlj.js.map +1 -0
- package/dist/admin-dom-uMmZzRvU.js +149 -0
- package/dist/admin-dom-uMmZzRvU.js.map +1 -0
- package/dist/admin-dropdown-menu-BW1D_h6s.js +69 -0
- package/dist/admin-dropdown-menu-BW1D_h6s.js.map +1 -0
- package/dist/admin-dunning-B2zgtrOo.js +10 -0
- package/dist/admin-dunning-B2zgtrOo.js.map +1 -0
- package/dist/admin-fact-card-DO_fHosg.js +20 -0
- package/dist/admin-fact-card-DO_fHosg.js.map +1 -0
- package/dist/admin-form-field-errors-hbUMIriS.js +14 -0
- package/dist/admin-form-field-errors-hbUMIriS.js.map +1 -0
- package/dist/admin-format-DoohJ7Fg.js +136 -0
- package/dist/admin-format-DoohJ7Fg.js.map +1 -0
- package/dist/admin-health-B4jN2LwR.js +983 -0
- package/dist/admin-health-B4jN2LwR.js.map +1 -0
- package/dist/admin-input-CcfQfJFN.js +17 -0
- package/dist/admin-input-CcfQfJFN.js.map +1 -0
- package/dist/admin-invoice-profile-model-Cgjy3zV8.js +53 -0
- package/dist/admin-invoice-profile-model-Cgjy3zV8.js.map +1 -0
- package/dist/admin-label-BiEN5cjb.js +15 -0
- package/dist/admin-label-BiEN5cjb.js.map +1 -0
- package/dist/admin-linked-table-row-BsaUruCN.js +26 -0
- package/dist/admin-linked-table-row-BsaUruCN.js.map +1 -0
- package/dist/admin-metering-COFcSPQy.js +1721 -0
- package/dist/admin-metering-COFcSPQy.js.map +1 -0
- package/dist/admin-ops-B3mcr76u.js +217 -0
- package/dist/admin-ops-B3mcr76u.js.map +1 -0
- package/dist/admin-orders-dxC99Idl.js +192 -0
- package/dist/admin-orders-dxC99Idl.js.map +1 -0
- package/dist/admin-payments-Bs7HSfP0.js +246 -0
- package/dist/admin-payments-Bs7HSfP0.js.map +1 -0
- package/dist/admin-price-detail-DRquxpA9.js +482 -0
- package/dist/admin-price-detail-DRquxpA9.js.map +1 -0
- package/dist/admin-price-format-DM1qORWI.js +44 -0
- package/dist/admin-price-format-DM1qORWI.js.map +1 -0
- package/dist/admin-price-wizard-CI7K-2Nz.js +357 -0
- package/dist/admin-price-wizard-CI7K-2Nz.js.map +1 -0
- package/dist/admin-range-picker-Dr2M1EZr.js +192 -0
- package/dist/admin-range-picker-Dr2M1EZr.js.map +1 -0
- package/dist/admin-reports-CywKLiSA.js +320 -0
- package/dist/admin-reports-CywKLiSA.js.map +1 -0
- package/dist/admin-select-DBgprVW6.js +81 -0
- package/dist/admin-select-DBgprVW6.js.map +1 -0
- package/dist/admin-settings-Bmoy95uO.js +1434 -0
- package/dist/admin-settings-Bmoy95uO.js.map +1 -0
- package/dist/admin-skeleton-DsM7crYi.js +14 -0
- package/dist/admin-skeleton-DsM7crYi.js.map +1 -0
- package/dist/admin-status-badge-BFPgo71d.js +38 -0
- package/dist/admin-status-badge-BFPgo71d.js.map +1 -0
- package/dist/admin-subscriptions-CLYc_HEV.js +301 -0
- package/dist/admin-subscriptions-CLYc_HEV.js.map +1 -0
- package/dist/admin-switch-BJUxLCsa.js +20 -0
- package/dist/admin-switch-BJUxLCsa.js.map +1 -0
- package/dist/admin-table-CH9TrXJf.js +61 -0
- package/dist/admin-table-CH9TrXJf.js.map +1 -0
- package/dist/admin-tabs-528FJMjt.js +46 -0
- package/dist/admin-tabs-528FJMjt.js.map +1 -0
- package/dist/admin-textarea-DEz38RaI.js +15 -0
- package/dist/admin-textarea-DEz38RaI.js.map +1 -0
- package/dist/admin-typed-confirm-dialog-DU7m9-O7.js +66 -0
- package/dist/admin-typed-confirm-dialog-DU7m9-O7.js.map +1 -0
- package/dist/admin-utils-BK4Vh1o_.js +1809 -0
- package/dist/admin-utils-BK4Vh1o_.js.map +1 -0
- package/dist/admin-widget-viz-Da48c-Zf.js +581 -0
- package/dist/admin-widget-viz-Da48c-Zf.js.map +1 -0
- package/dist/admin.css +3 -0
- package/dist/admin.js +2164 -0
- package/dist/admin.js.map +1 -0
- package/dist/appearance.d.ts +1 -1
- package/dist/client/client.d.ts +13 -6
- package/dist/client/generated/error-codes.d.ts +1 -1
- package/dist/client/generated/routes.d.ts +2173 -178
- package/dist/client/generated/wire.d.ts +1287 -1
- package/dist/client/index.d.ts +1 -1
- package/dist/client/types.d.ts +14 -2
- package/dist/{client-PjivPHmE.js → client-D5Af726I.js} +8 -7
- package/dist/client-D5Af726I.js.map +1 -0
- package/dist/client.js +1 -1
- package/dist/{hooks-Uiw-zW3H.js → hooks-CYjlHS28.js} +8 -8
- package/dist/hooks-CYjlHS28.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +12 -12
- package/dist/index.js.map +1 -1
- package/dist/lib/{offer-label.d.ts → price-label.d.ts} +1 -1
- package/dist/locales/de.js +1 -1
- package/dist/locales/de.js.map +1 -1
- package/dist/locales/en.d.ts +1 -1
- package/dist/locales/en.js +1 -1
- package/dist/locales/en.js.map +1 -1
- package/dist/locales/es.js +1 -1
- package/dist/locales/es.js.map +1 -1
- package/dist/locales/ja.js +1 -1
- package/dist/locales/ja.js.map +1 -1
- package/dist/locales/ko.js +1 -1
- package/dist/locales/ko.js.map +1 -1
- package/dist/locales/zh.js +1 -1
- package/dist/locales/zh.js.map +1 -1
- package/dist/{offers.d.ts → product-list.d.ts} +5 -5
- package/dist/react.js +1 -1
- package/dist/styles.css +1 -1
- package/package.json +28 -6
- package/dist/client-PjivPHmE.js.map +0 -1
- package/dist/hooks-Uiw-zW3H.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-attempts-lAoW-Urd.js","names":[],"sources":["../src/admin/pages/payments/attempts.tsx"],"sourcesContent":["import { AdminMessage, useAdminUI } from \"#orck/admin/ui-context\"\nimport { useAdminServices } from \"#orck/admin/context\"\n// Payments → Attempts and Renewals (#1117): the #1116 lists and details.\n// A list's filters are its URL's query parameters, as the API names them, so\n// the health page links straight into a filtered list.\nimport { HugeiconsIcon } from \"@hugeicons/react\"\nimport { ArrowLeft01Icon, Cancel01Icon } from \"@hugeicons/core-free-icons\"\nimport {\n Link,\n useNavigate,\n useParams,\n useSearchParams,\n} from \"#orck/admin/router\"\nimport { useQuery } from \"@tanstack/react-query\"\nimport type { ColumnDef } from \"@tanstack/react-table\"\n\nimport { CursorPager } from \"#orck/admin/components/cursor-pager\"\nimport { DataTable } from \"#orck/admin/components/data-table\"\nimport { Fact } from \"#orck/admin/components/fact-card\"\nimport { StatusBadge } from \"#orck/admin/components/status-badge\"\nimport { Button } from \"#orck/admin/components/ui/button\"\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n} from \"#orck/admin/components/ui/card\"\nimport {\n ATTEMPT_FILTERS,\n CYCLE_FILTERS,\n filtersFrom,\n type AttemptFilters,\n type CycleFilters,\n} from \"#orck/admin/lib/api/endpoints\"\nimport type { PaymentAttempt, Renewal } from \"#orck/client/generated/wire\"\nimport { useUrlCursor } from \"#orck/admin/lib/cursor-pages\"\nimport {\n formatCard,\n formatDate,\n formatNativeAmount,\n shortId,\n} from \"#orck/admin/lib/format\"\n\nexport function Outcome({ category }: { category: string }) {\n return (\n <StatusBadge status={category === \"approved\" ? \"approved\" : \"declined\"} />\n )\n}\n\nconst attemptColumns: ColumnDef<PaymentAttempt, unknown>[] = [\n {\n header: \"Attempted\",\n cell: ({ row }) => (\n <span className=\"text-muted-foreground tabular-nums\">\n {formatDate(row.original.attempted_at)}\n </span>\n ),\n },\n { header: \"Kind\", cell: ({ row }) => row.original.kind },\n {\n header: \"Outcome\",\n cell: ({ row }) => <Outcome category={row.original.category} />,\n },\n {\n header: \"Reason\",\n cell: ({ row }) =>\n row.original.category === \"approved\" ? (\n <span className=\"text-muted-foreground\">—</span>\n ) : (\n <span>\n {row.original.reason || row.original.category}\n {row.original.response_code ? (\n <span className=\"ml-1 font-mono text-xs text-muted-foreground\">\n {row.original.response_code}\n </span>\n ) : null}\n </span>\n ),\n },\n { header: \"Owner\", cell: ({ row }) => row.original.owner },\n { header: \"Card\", cell: ({ row }) => formatCard(row.original.card) },\n {\n header: \"Amount\",\n cell: ({ row }) =>\n row.original.currency ? (\n <span className=\"tabular-nums\">\n {formatNativeAmount(row.original.amount, row.original.currency)}\n </span>\n ) : (\n <span className=\"text-muted-foreground\">—</span>\n ),\n },\n { header: \"Rail\", cell: ({ row }) => row.original.rail },\n]\n\nfunction FilterChips({ keys }: { keys: readonly string[] }) {\n const [params, setParams] = useSearchParams()\n const active = keys.filter((k) => params.get(k))\n if (active.length === 0) return null\n const drop = (key?: string) => {\n const p = new URLSearchParams(params)\n for (const k of key ? [key] : active) p.delete(k)\n p.delete(\"cursor\")\n setParams(p)\n }\n return (\n <div className=\"flex flex-wrap items-center gap-2 text-sm\">\n {active.map((k) => (\n <span\n key={k}\n className=\"inline-flex items-center gap-1 rounded-md bg-muted py-0.5 pr-1 pl-2\"\n >\n <span className=\"text-muted-foreground\">{k}</span>\n <span className=\"font-medium\">{params.get(k)}</span>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-5\"\n aria-label={`Clear ${k}`}\n onClick={() => drop(k)}\n >\n <HugeiconsIcon icon={Cancel01Icon} className=\"size-3\" />\n </Button>\n </span>\n ))}\n <Button variant=\"ghost\" size=\"sm\" onClick={() => drop()}>\n <AdminMessage id={\"Clear all\"} />\n </Button>\n </div>\n )\n}\n\nexport function AttemptsPage() {\n const { adminQueries } = useAdminServices()\n\n const [params] = useSearchParams()\n const paging = useUrlCursor()\n const navigate = useNavigate()\n const filters: AttemptFilters = filtersFrom(params, ATTEMPT_FILTERS)\n const { data, isPending, isFetching } = useQuery(\n adminQueries.attempts(filters, paging.size, paging.cursor)\n )\n return (\n <div className=\"flex flex-col gap-4\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">\n <AdminMessage id={\"Payment attempts\"} />\n </h1>\n <FilterChips keys={ATTEMPT_FILTERS} />\n <DataTable\n columns={attemptColumns}\n data={data?.data ?? []}\n loading={isPending}\n onRowClick={(row) => navigate(`/payments/attempts/${row.id}`)}\n emptyMessage=\"No attempts match.\"\n />\n <CursorPager\n pages={paging}\n rows={data?.data?.length ?? 0}\n nextCursor={data?.next_cursor}\n busy={isFetching}\n />\n </div>\n )\n}\n\nfunction Back() {\n const { text: adminText } = useAdminUI()\n\n const navigate = useNavigate()\n return (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => navigate(-1)}\n aria-label={adminText(\"Back\")}\n >\n <HugeiconsIcon icon={ArrowLeft01Icon} className=\"size-4\" />\n </Button>\n )\n}\n\nfunction To({ to, children }: { to: string; children: string }) {\n return (\n <Link className=\"text-xs underline-offset-2 hover:underline\" to={to}>\n {children}\n </Link>\n )\n}\n\nexport function AttemptDetailPage() {\n const { text: adminText } = useAdminUI()\n\n const { adminQueries } = useAdminServices()\n\n const { id = \"\" } = useParams()\n const { data: a, isPending } = useQuery(adminQueries.attempt(id))\n if (isPending)\n return (\n <p className=\"text-sm text-muted-foreground\">\n <AdminMessage id={\"Loading…\"} />\n </p>\n )\n if (!a)\n return (\n <p className=\"text-sm text-muted-foreground\">\n <AdminMessage id={\"Attempt not found.\"} />\n </p>\n )\n const answer = [\n [\"Response\", [a.response_code, a.response_text].filter(Boolean).join(\" \")],\n [\"Issuer\", [a.issuer_code, a.issuer_text].filter(Boolean).join(\" \")],\n [\"AVS\", a.avs_result],\n [\"CVV\", a.cvv_result],\n [\"Action\", a.action],\n [\"Token\", a.token_type],\n [\"BIN\", a.card_bin],\n [\"Transaction\", a.transaction_id],\n [\"Observed via\", `${a.source} · ${a.observed_via}`],\n [\"Enriched\", a.enriched_at ? formatDate(a.enriched_at) : \"\"],\n ] as const\n return (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex items-center gap-3\">\n <Back />\n <div>\n <h2 className=\"flex items-center gap-2 text-sm\">\n {a.id} <Outcome category={a.category} />\n </h2>\n <p className=\"text-xs text-muted-foreground\">\n {a.kind} · {a.owner} · {a.rail} · {formatDate(a.attempted_at)}\n </p>\n </div>\n </div>\n <div className=\"grid gap-3 sm:grid-cols-2 lg:grid-cols-4\">\n <Fact label={adminText(\"Outcome\")}>\n {a.category === \"approved\"\n ? \"approved\"\n : `${a.category}${a.reason ? ` · ${a.reason}` : \"\"}`}\n </Fact>\n <Fact label={adminText(\"Amount\")}>\n {a.currency ? formatNativeAmount(a.amount, a.currency) : \"—\"}\n </Fact>\n <Fact label={adminText(\"Card\")}>\n {formatCard(a.card)} ({a.card_entry})\n </Fact>\n <Fact label={adminText(\"Customer\")}>\n <To to={`/customers/${a.customer_id}`}>\n {shortId(a.customer_id, 16)}\n </To>\n </Fact>\n <Fact label={adminText(\"Subscription\")}>\n {a.subscription_id ? (\n <To to={`/subscriptions/${a.subscription_id}`}>\n {shortId(a.subscription_id, 16)}\n </To>\n ) : (\n \"—\"\n )}\n </Fact>\n <Fact label={adminText(\"Renewal\")}>\n {a.cycle_id ? (\n <To to={`/payments/cycles/${a.cycle_id}`}>\n {shortId(a.cycle_id, 16)}\n </To>\n ) : (\n \"—\"\n )}\n </Fact>\n <Fact label={adminText(\"Payment\")}>\n {a.payment_id ? (\n <To to={`/payments/${a.payment_id}`}>\n {shortId(a.payment_id, 16)}\n </To>\n ) : (\n \"—\"\n )}\n </Fact>\n <Fact label={adminText(\"Paying\")}>\n {a.order_id ? (\n <To to={`/orders/${a.order_id}`}>{shortId(a.order_id, 16)}</To>\n ) : (\n \"—\"\n )}\n </Fact>\n </div>\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">\n <AdminMessage id={\"PSP answer\"} />\n </CardTitle>\n </CardHeader>\n <CardContent>\n <dl className=\"grid gap-x-6 gap-y-2 text-sm sm:grid-cols-2\">\n {answer.map(([label, value]) => (\n <div key={label} className=\"flex gap-2\">\n <dt className=\"w-28 shrink-0 text-muted-foreground\">{label}</dt>\n <dd className=\"font-mono text-xs break-all\">{value || \"—\"}</dd>\n </div>\n ))}\n </dl>\n </CardContent>\n </Card>\n </div>\n )\n}\n\n// --- renewals ----------------------------------------------------------------------\n\nconst cycleColumns: ColumnDef<Renewal, unknown>[] = [\n {\n header: \"Due\",\n cell: ({ row }) => (\n <span className=\"text-muted-foreground tabular-nums\">\n {formatDate(row.original.due_at)}\n </span>\n ),\n },\n { header: \"Owner\", cell: ({ row }) => row.original.owner },\n {\n header: \"First outcome\",\n cell: ({ row }) =>\n row.original.miss_reason\n ? `missed · ${row.original.miss_reason}`\n : row.original.first_outcome,\n },\n {\n header: \"Outcome\",\n cell: ({ row }) => <StatusBadge status={row.original.outcome} />,\n },\n {\n header: \"Recovered by\",\n cell: ({ row }) => row.original.recovered_by || \"—\",\n },\n {\n header: \"Amount\",\n cell: ({ row }) => (\n <span className=\"tabular-nums\">\n {formatNativeAmount(row.original.amount, row.original.currency)}\n </span>\n ),\n },\n { header: \"Rail\", cell: ({ row }) => row.original.rail },\n]\n\nexport function CyclesPage() {\n const { adminQueries } = useAdminServices()\n\n const [params] = useSearchParams()\n const paging = useUrlCursor()\n const navigate = useNavigate()\n const filters: CycleFilters = filtersFrom(params, CYCLE_FILTERS)\n const { data, isPending, isFetching } = useQuery(\n adminQueries.cycles(filters, paging.size, paging.cursor)\n )\n return (\n <div className=\"flex flex-col gap-4\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">\n <AdminMessage id={\"Renewals\"} />\n </h1>\n <FilterChips keys={CYCLE_FILTERS} />\n <DataTable\n columns={cycleColumns}\n data={data?.data ?? []}\n loading={isPending}\n onRowClick={(row) => navigate(`/payments/cycles/${row.id}`)}\n emptyMessage=\"No renewals match.\"\n />\n <CursorPager\n pages={paging}\n rows={data?.data?.length ?? 0}\n nextCursor={data?.next_cursor}\n busy={isFetching}\n />\n </div>\n )\n}\n\nexport function CycleDetailPage() {\n const { text: adminText } = useAdminUI()\n\n const { adminQueries } = useAdminServices()\n\n const { id = \"\" } = useParams()\n const navigate = useNavigate()\n const { data: c, isPending } = useQuery(adminQueries.cycle(id))\n if (isPending)\n return (\n <p className=\"text-sm text-muted-foreground\">\n <AdminMessage id={\"Loading…\"} />\n </p>\n )\n if (!c)\n return (\n <p className=\"text-sm text-muted-foreground\">\n <AdminMessage id={\"Renewal not found.\"} />\n </p>\n )\n return (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex items-center gap-3\">\n <Back />\n <div>\n <h2 className=\"flex items-center gap-2 text-sm\">\n {c.id} <StatusBadge status={c.outcome} />\n </h2>\n <p className=\"text-xs text-muted-foreground\">\n {c.owner} · {c.rail}\n <AdminMessage id={\" · due \"} />\n {formatDate(c.due_at)}\n </p>\n </div>\n </div>\n <div className=\"grid gap-3 sm:grid-cols-2 lg:grid-cols-4\">\n <Fact label={adminText(\"Amount\")}>\n {formatNativeAmount(c.amount, c.currency)}\n </Fact>\n <Fact label={adminText(\"First outcome\")}>\n {c.miss_reason ? `missed · ${c.miss_reason}` : c.first_outcome}\n </Fact>\n <Fact label={adminText(\"Collected\")}>\n {c.collected_at\n ? `${formatDate(c.collected_at)}${c.recovered_by ? ` · ${c.recovered_by}` : \"\"}`\n : \"—\"}\n </Fact>\n <Fact label={c.outcome === \"open\" ? \"Closes\" : \"Closed\"}>\n {formatDate(c.closes_at)}\n </Fact>\n <Fact label={adminText(\"Subscription\")}>\n <To to={`/subscriptions/${c.subscription_id}`}>\n {shortId(c.subscription_id, 16)}\n </To>\n </Fact>\n <Fact label={adminText(\"Customer\")}>\n <To to={`/customers/${c.customer_id}`}>\n {shortId(c.customer_id, 16)}\n </To>\n </Fact>\n </div>\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">\n <AdminMessage id={\"Attempts\"} />\n </CardTitle>\n </CardHeader>\n <CardContent>\n <DataTable\n columns={attemptColumns}\n data={c.attempts ?? []}\n onRowClick={(row) => navigate(`/payments/attempts/${row.id}`)}\n emptyMessage={\n c.miss_reason ? \"Never attempted.\" : \"No attempts yet.\"\n }\n />\n </CardContent>\n </Card>\n </div>\n )\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { f as e } from "./admin-utils-BK4Vh1o_.js";
|
|
2
|
+
//#region src/admin/lib/auth.tsx
|
|
3
|
+
function t() {
|
|
4
|
+
let { merchants: t, activeMerchant: n, selectMerchant: r } = e();
|
|
5
|
+
return {
|
|
6
|
+
merchants: t,
|
|
7
|
+
activeMerchant: n,
|
|
8
|
+
selectMerchant: r
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
//#endregion
|
|
12
|
+
export { t };
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=admin-auth-DQGHtt0j.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-auth-DQGHtt0j.js","names":[],"sources":["../src/admin/lib/auth.tsx"],"sourcesContent":["import { useAdminContext } from \"../context\"\n\n// BillingAdmin uses its host's session and merchant directory.\nexport function useAuth() {\n const { merchants, activeMerchant, selectMerchant } = useAdminContext()\n return { merchants, activeMerchant, selectMerchant }\n}\n\nexport function useSelectedMerchant() {\n return useAdminContext().activeMerchant?.slug\n}\n"],"mappings":";;AAGA,SAAgB,IAAU;CACxB,IAAM,EAAE,cAAW,mBAAgB,sBAAmB,EAAgB;CACtE,OAAO;EAAE;EAAW;EAAgB;CAAe;AACrD"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { t as e } from "./admin-utils-BK4Vh1o_.js";
|
|
2
|
+
import { mergeProps as t } from "@base-ui/react/merge-props";
|
|
3
|
+
import { useRender as n } from "@base-ui/react/use-render";
|
|
4
|
+
import { cva as r } from "class-variance-authority";
|
|
5
|
+
//#region src/admin/components/ui/badge.tsx
|
|
6
|
+
var i = r("group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!", {
|
|
7
|
+
variants: { variant: {
|
|
8
|
+
default: "bg-primary text-primary-foreground [a]:hover:bg-primary/80",
|
|
9
|
+
secondary: "bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80",
|
|
10
|
+
destructive: "bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20",
|
|
11
|
+
outline: "border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground",
|
|
12
|
+
ghost: "hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50",
|
|
13
|
+
link: "text-primary underline-offset-4 hover:underline"
|
|
14
|
+
} },
|
|
15
|
+
defaultVariants: { variant: "default" }
|
|
16
|
+
});
|
|
17
|
+
function a({ className: r, variant: a = "default", render: o, ...s }) {
|
|
18
|
+
return n({
|
|
19
|
+
defaultTagName: "span",
|
|
20
|
+
props: t({ className: e(i({ variant: a }), r) }, s),
|
|
21
|
+
render: o,
|
|
22
|
+
state: {
|
|
23
|
+
slot: "badge",
|
|
24
|
+
variant: a
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
//#endregion
|
|
29
|
+
export { a as t };
|
|
30
|
+
|
|
31
|
+
//# sourceMappingURL=admin-badge-DR5-1qd8.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-badge-DR5-1qd8.js","names":[],"sources":["../src/admin/components/ui/badge.tsx"],"sourcesContent":["import { mergeProps } from \"@base-ui/react/merge-props\"\nimport { useRender } from \"@base-ui/react/use-render\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"#orck/admin/lib/utils\"\n\nconst badgeVariants = cva(\n \"group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground [a]:hover:bg-primary/80\",\n secondary:\n \"bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80\",\n destructive:\n \"bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20\",\n outline:\n \"border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground\",\n ghost:\n \"hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Badge({\n className,\n variant = \"default\",\n render,\n ...props\n}: useRender.ComponentProps<\"span\"> & VariantProps<typeof badgeVariants>) {\n return useRender({\n defaultTagName: \"span\",\n props: mergeProps<\"span\">(\n {\n className: cn(badgeVariants({ variant }), className),\n },\n props\n ),\n render,\n state: {\n slot: \"badge\",\n variant,\n },\n })\n}\n\nexport { Badge, badgeVariants }\n"],"mappings":";;;;;AAMA,IAAM,IAAgB,EACpB,8eACA;CACE,UAAU,EACR,SAAS;EACP,SAAS;EACT,WACE;EACF,aACE;EACF,SACE;EACF,OACE;EACF,MAAM;CACR,EACF;CACA,iBAAiB,EACf,SAAS,UACX;AACF,CACF;AAEA,SAAS,EAAM,EACb,cACA,aAAU,WACV,WACA,GAAG,KACqE;CACxE,OAAO,EAAU;EACf,gBAAgB;EAChB,OAAO,EACL,EACE,WAAW,EAAG,EAAc,EAAE,WAAQ,CAAC,GAAG,CAAS,EACrD,GACA,CACF;EACA;EACA,OAAO;GACL,MAAM;GACN;EACF;CACF,CAAC;AACH"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { t as e } from "./admin-utils-BK4Vh1o_.js";
|
|
2
|
+
import { jsx as t } from "react/jsx-runtime";
|
|
3
|
+
import { cva as n } from "class-variance-authority";
|
|
4
|
+
import { Button as r } from "@base-ui/react/button";
|
|
5
|
+
//#region src/admin/components/ui/button.tsx
|
|
6
|
+
var i = n("group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", {
|
|
7
|
+
variants: {
|
|
8
|
+
variant: {
|
|
9
|
+
default: "bg-primary text-primary-foreground hover:bg-primary/80",
|
|
10
|
+
outline: "border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",
|
|
11
|
+
secondary: "bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",
|
|
12
|
+
ghost: "hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",
|
|
13
|
+
destructive: "bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",
|
|
14
|
+
link: "text-primary underline-offset-4 hover:underline"
|
|
15
|
+
},
|
|
16
|
+
size: {
|
|
17
|
+
default: "h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
|
|
18
|
+
xs: "h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",
|
|
19
|
+
sm: "h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",
|
|
20
|
+
lg: "h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
|
|
21
|
+
icon: "size-8",
|
|
22
|
+
"icon-xs": "size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3",
|
|
23
|
+
"icon-sm": "size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg",
|
|
24
|
+
"icon-lg": "size-9"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
defaultVariants: {
|
|
28
|
+
variant: "default",
|
|
29
|
+
size: "default"
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
function a({ className: n, variant: a = "default", size: o = "default", ...s }) {
|
|
33
|
+
return /* @__PURE__ */ t(r, {
|
|
34
|
+
"data-slot": "button",
|
|
35
|
+
className: e(i({
|
|
36
|
+
variant: a,
|
|
37
|
+
size: o,
|
|
38
|
+
className: n
|
|
39
|
+
})),
|
|
40
|
+
...s
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
//#endregion
|
|
44
|
+
export { a as t };
|
|
45
|
+
|
|
46
|
+
//# sourceMappingURL=admin-button-CTL3DgOt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-button-CTL3DgOt.js","names":[],"sources":["../src/admin/components/ui/button.tsx"],"sourcesContent":["import { Button as ButtonPrimitive } from \"@base-ui/react/button\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"#orck/admin/lib/utils\"\n\nconst buttonVariants = cva(\n \"group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/80\",\n outline:\n \"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground\",\n ghost:\n \"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50\",\n destructive:\n \"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default:\n \"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n xs: \"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5\",\n lg: \"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n icon: \"size-8\",\n \"icon-xs\":\n \"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\":\n \"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg\",\n \"icon-lg\": \"size-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n ...props\n}: ButtonPrimitive.Props & VariantProps<typeof buttonVariants>) {\n return (\n <ButtonPrimitive\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n"],"mappings":";;;;;AAKA,IAAM,IAAiB,EACrB,8lBACA;CACE,UAAU;EACR,SAAS;GACP,SAAS;GACT,SACE;GACF,WACE;GACF,OACE;GACF,aACE;GACF,MAAM;EACR;EACA,MAAM;GACJ,SACE;GACF,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,MAAM;GACN,WACE;GACF,WACE;GACF,WAAW;EACb;CACF;CACA,iBAAiB;EACf,SAAS;EACT,MAAM;CACR;AACF,CACF;AAEA,SAAS,EAAO,EACd,cACA,aAAU,WACV,UAAO,WACP,GAAG,KAC2D;CAC9D,OACE,kBAAC,GAAD;EACE,aAAU;EACV,WAAW,EAAG,EAAe;GAAE;GAAS;GAAM;EAAU,CAAC,CAAC;EAC1D,GAAI;CACL,CAAA;AAEL"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { p as e } from "./admin-utils-BK4Vh1o_.js";
|
|
2
|
+
import { useQuery as t } from "@tanstack/react-query";
|
|
3
|
+
//#region src/admin/lib/capabilities.ts
|
|
4
|
+
function n() {
|
|
5
|
+
let { adminQueries: n } = e();
|
|
6
|
+
return t(n.access()).data;
|
|
7
|
+
}
|
|
8
|
+
function r(e) {
|
|
9
|
+
return e.admin === "read" || e.admin === "update" || e.catalog === "read" || e.catalog === "update" || e.merchant_config === "read" || e.merchant_config === "update" || e.metrics === !0;
|
|
10
|
+
}
|
|
11
|
+
function i() {
|
|
12
|
+
let e = n()?.admin;
|
|
13
|
+
return e === "read" || e === "update";
|
|
14
|
+
}
|
|
15
|
+
function a() {
|
|
16
|
+
return n()?.admin === "update";
|
|
17
|
+
}
|
|
18
|
+
function o() {
|
|
19
|
+
let e = n()?.catalog;
|
|
20
|
+
return e === "read" || e === "update";
|
|
21
|
+
}
|
|
22
|
+
function s() {
|
|
23
|
+
let { adminQueries: n } = e(), { data: r } = t(n.config());
|
|
24
|
+
return u() && (r?.capabilities.features?.merchant_config_edits ?? !1);
|
|
25
|
+
}
|
|
26
|
+
function c() {
|
|
27
|
+
return n()?.catalog === "update";
|
|
28
|
+
}
|
|
29
|
+
function l() {
|
|
30
|
+
let e = n()?.merchant_config;
|
|
31
|
+
return e === "read" || e === "update";
|
|
32
|
+
}
|
|
33
|
+
function u() {
|
|
34
|
+
return n()?.merchant_config === "update";
|
|
35
|
+
}
|
|
36
|
+
function d() {
|
|
37
|
+
return n()?.metrics === !0;
|
|
38
|
+
}
|
|
39
|
+
function f() {
|
|
40
|
+
let e = n();
|
|
41
|
+
return e?.metrics === !0 && e.merchant_config === "update";
|
|
42
|
+
}
|
|
43
|
+
var p = [
|
|
44
|
+
"merchant",
|
|
45
|
+
"notifications",
|
|
46
|
+
"psps"
|
|
47
|
+
], m = ["customer-controls"];
|
|
48
|
+
function h(e, t, n, r = []) {
|
|
49
|
+
let i = [
|
|
50
|
+
...t ? p : [],
|
|
51
|
+
...n ? m : [],
|
|
52
|
+
...r
|
|
53
|
+
], a = i[0] ?? "merchant";
|
|
54
|
+
return !e || !i.includes(e) ? a : e;
|
|
55
|
+
}
|
|
56
|
+
//#endregion
|
|
57
|
+
export { a, f as c, u as d, d as f, i, l, h as n, o, n as r, c as s, r as t, s as u };
|
|
58
|
+
|
|
59
|
+
//# sourceMappingURL=admin-capabilities-BuigAgtm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-capabilities-BuigAgtm.js","names":[],"sources":["../src/admin/lib/capabilities.ts"],"sourcesContent":["import { useAdminServices } from \"#orck/admin/context\"\nimport { useQuery } from \"@tanstack/react-query\"\n\nimport type { AdminAccess } from \"#orck/client/generated/wire\"\n\n// useAccess is what the signed-in staff member may use of each staff route\n// group mounted here (GET /v1/admin/access): the console's four areas.\n// Undefined while it loads.\nexport function useAccess(): AdminAccess | undefined {\n const { adminQueries } = useAdminServices()\n\n return useQuery(adminQueries.access()).data\n}\n\n// hasAnyArea reports a caller who may use at least one area; one who may use\n// none sees only that they have no access.\nexport function hasAnyArea(access: AdminAccess): boolean {\n return (\n access.admin === \"read\" ||\n access.admin === \"update\" ||\n access.catalog === \"read\" ||\n access.catalog === \"update\" ||\n access.merchant_config === \"read\" ||\n access.merchant_config === \"update\" ||\n access.metrics === true\n )\n}\n\n// useAdminArea reports customer support: customers, subscriptions, payments,\n// and orders.\nexport function useAdminArea(): boolean {\n const level = useAccess()?.admin\n return level === \"read\" || level === \"update\"\n}\n\n// useAdminUpdates reports whether the caller may change customers' billing;\n// without it customer support is read-only.\nexport function useAdminUpdates(): boolean {\n return useAccess()?.admin === \"update\"\n}\n\n// useCatalogArea reports the catalog area: its reads and its edits.\nexport function useCatalogArea(): boolean {\n const level = useAccess()?.catalog\n return level === \"read\" || level === \"update\"\n}\n\n// useMerchantConfigEdits reports whether that configuration can change here:\n// Vault holds it. Read from a file it is read-only and its edit routes are not\n// mounted, so the console offers no edits.\nexport function useMerchantConfigEdits(): boolean {\n const { adminQueries } = useAdminServices()\n\n const { data } = useQuery(adminQueries.config())\n const updates = useMerchantConfigUpdates()\n return (\n updates && (data?.capabilities.features?.merchant_config_edits ?? false)\n )\n}\n\n// useCatalogWrites reports whether the caller may edit the catalog: the\n// catalog area is theirs.\nexport function useCatalogWrites(): boolean {\n return useAccess()?.catalog === \"update\"\n}\n\n// useMerchantConfig reports the merchant's own configuration: PSPs, settings,\n// findings and notifications.\nexport function useMerchantConfig(): boolean {\n const level = useAccess()?.merchant_config\n return level === \"read\" || level === \"update\"\n}\n\n// useMerchantConfigUpdates reports authority to change merchant configuration,\n// including operational actions that do not edit its source document.\nexport function useMerchantConfigUpdates(): boolean {\n return useAccess()?.merchant_config === \"update\"\n}\n\n// useMetrics reports business metrics: the dashboard, its widgets, the Ops\n// gauges.\nexport function useMetrics(): boolean {\n return useAccess()?.metrics === true\n}\n\n// useDashboardLayout reports whether the caller may edit the dashboard's\n// layout: it shows metrics and is the merchant's configuration.\nexport function useDashboardLayout(): boolean {\n const access = useAccess()\n return access?.metrics === true && access.merchant_config === \"update\"\n}\n\n// configTabs are the settings tabs that are the merchant's configuration.\nconst configTabs = [\"merchant\", \"notifications\", \"psps\"]\n\n// adminTabs are the settings tabs that are customer support's.\nconst adminTabs = [\"customer-controls\"]\n\n// settingsTab is the settings tab shown for the requested one: the first tab\n// when none is requested, the requested one is not shown, or the tabs are not\n// the caller's: the configuration tabs need MerchantConfig, customer controls\n// customer support. others are the host's additional settings tabs.\nexport function settingsTab(\n requested: string | null,\n config: boolean,\n admin: boolean,\n others: string[] = []\n) {\n const shown = [\n ...(config ? configTabs : []),\n ...(admin ? adminTabs : []),\n ...others,\n ]\n const first = shown[0] ?? \"merchant\"\n if (!requested || !shown.includes(requested)) return first\n return requested\n}\n"],"mappings":";;;AAQA,SAAgB,IAAqC;CACnD,IAAM,EAAE,oBAAiB,EAAiB;CAE1C,OAAO,EAAS,EAAa,OAAO,CAAC,CAAC,CAAC;AACzC;AAIA,SAAgB,EAAW,GAA8B;CACvD,OACE,EAAO,UAAU,UACjB,EAAO,UAAU,YACjB,EAAO,YAAY,UACnB,EAAO,YAAY,YACnB,EAAO,oBAAoB,UAC3B,EAAO,oBAAoB,YAC3B,EAAO,YAAY;AAEvB;AAIA,SAAgB,IAAwB;CACtC,IAAM,IAAQ,EAAU,CAAC,EAAE;CAC3B,OAAO,MAAU,UAAU,MAAU;AACvC;AAIA,SAAgB,IAA2B;CACzC,OAAO,EAAU,CAAC,EAAE,UAAU;AAChC;AAGA,SAAgB,IAA0B;CACxC,IAAM,IAAQ,EAAU,CAAC,EAAE;CAC3B,OAAO,MAAU,UAAU,MAAU;AACvC;AAKA,SAAgB,IAAkC;CAChD,IAAM,EAAE,oBAAiB,EAAiB,GAEpC,EAAE,YAAS,EAAS,EAAa,OAAO,CAAC;CAE/C,OADgB,EAEd,MAAY,GAAM,aAAa,UAAU,yBAAyB;AAEtE;AAIA,SAAgB,IAA4B;CAC1C,OAAO,EAAU,CAAC,EAAE,YAAY;AAClC;AAIA,SAAgB,IAA6B;CAC3C,IAAM,IAAQ,EAAU,CAAC,EAAE;CAC3B,OAAO,MAAU,UAAU,MAAU;AACvC;AAIA,SAAgB,IAAoC;CAClD,OAAO,EAAU,CAAC,EAAE,oBAAoB;AAC1C;AAIA,SAAgB,IAAsB;CACpC,OAAO,EAAU,CAAC,EAAE,YAAY;AAClC;AAIA,SAAgB,IAA8B;CAC5C,IAAM,IAAS,EAAU;CACzB,OAAO,GAAQ,YAAY,MAAQ,EAAO,oBAAoB;AAChE;AAGA,IAAM,IAAa;CAAC;CAAY;CAAiB;AAAM,GAGjD,IAAY,CAAC,mBAAmB;AAMtC,SAAgB,EACd,GACA,GACA,GACA,IAAmB,CAAC,GACpB;CACA,IAAM,IAAQ;EACZ,GAAI,IAAS,IAAa,CAAC;EAC3B,GAAI,IAAQ,IAAY,CAAC;EACzB,GAAG;CACL,GACM,IAAQ,EAAM,MAAM;CAE1B,OADI,CAAC,KAAa,CAAC,EAAM,SAAS,CAAS,IAAU,IAC9C;AACT"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { t as e } from "./admin-utils-BK4Vh1o_.js";
|
|
2
|
+
import "react";
|
|
3
|
+
import { jsx as t } from "react/jsx-runtime";
|
|
4
|
+
//#region src/admin/components/ui/card.tsx
|
|
5
|
+
function n({ className: n, size: r = "default", ...i }) {
|
|
6
|
+
return /* @__PURE__ */ t("div", {
|
|
7
|
+
"data-slot": "card",
|
|
8
|
+
"data-size": r,
|
|
9
|
+
className: e("group/card flex flex-col gap-(--card-spacing) overflow-hidden rounded-xl bg-card py-(--card-spacing) text-sm text-card-foreground ring-1 ring-foreground/10 [--card-spacing:--spacing(4)] has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:[--card-spacing:--spacing(3)] data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl", n),
|
|
10
|
+
...i
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
function r({ className: n, ...r }) {
|
|
14
|
+
return /* @__PURE__ */ t("div", {
|
|
15
|
+
"data-slot": "card-header",
|
|
16
|
+
className: e("group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-xl px-(--card-spacing) has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-(--card-spacing)", n),
|
|
17
|
+
...r
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
function i({ className: n, ...r }) {
|
|
21
|
+
return /* @__PURE__ */ t("div", {
|
|
22
|
+
"data-slot": "card-title",
|
|
23
|
+
className: e("font-heading text-base leading-snug font-medium group-data-[size=sm]/card:text-sm", n),
|
|
24
|
+
...r
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
function a({ className: n, ...r }) {
|
|
28
|
+
return /* @__PURE__ */ t("div", {
|
|
29
|
+
"data-slot": "card-description",
|
|
30
|
+
className: e("text-sm text-muted-foreground", n),
|
|
31
|
+
...r
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
function o({ className: n, ...r }) {
|
|
35
|
+
return /* @__PURE__ */ t("div", {
|
|
36
|
+
"data-slot": "card-action",
|
|
37
|
+
className: e("col-start-2 row-span-2 row-start-1 self-start justify-self-end", n),
|
|
38
|
+
...r
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
function s({ className: n, ...r }) {
|
|
42
|
+
return /* @__PURE__ */ t("div", {
|
|
43
|
+
"data-slot": "card-content",
|
|
44
|
+
className: e("px-(--card-spacing)", n),
|
|
45
|
+
...r
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
//#endregion
|
|
49
|
+
export { r as a, a as i, o as n, i as o, s as r, n as t };
|
|
50
|
+
|
|
51
|
+
//# sourceMappingURL=admin-card-bzAks3-3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-card-bzAks3-3.js","names":[],"sources":["../src/admin/components/ui/card.tsx"],"sourcesContent":["import * as React from \"react\"\n\nimport { cn } from \"#orck/admin/lib/utils\"\n\nfunction Card({\n className,\n size = \"default\",\n ...props\n}: React.ComponentProps<\"div\"> & { size?: \"default\" | \"sm\" }) {\n return (\n <div\n data-slot=\"card\"\n data-size={size}\n className={cn(\n \"group/card flex flex-col gap-(--card-spacing) overflow-hidden rounded-xl bg-card py-(--card-spacing) text-sm text-card-foreground ring-1 ring-foreground/10 [--card-spacing:--spacing(4)] has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:[--card-spacing:--spacing(3)] data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n \"group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-xl px-(--card-spacing) has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-(--card-spacing)\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn(\n \"font-heading text-base leading-snug font-medium group-data-[size=sm]/card:text-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn(\n \"col-start-2 row-span-2 row-start-1 self-start justify-self-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn(\"px-(--card-spacing)\", className)}\n {...props}\n />\n )\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\n \"flex items-center rounded-b-xl border-t bg-muted/50 p-(--card-spacing)\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardDescription,\n CardContent,\n}\n"],"mappings":";;;;AAIA,SAAS,EAAK,EACZ,cACA,UAAO,WACP,GAAG,KACyD;CAC5D,OACE,kBAAC,OAAD;EACE,aAAU;EACV,aAAW;EACX,WAAW,EACT,wZACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAW,EAAE,cAAW,GAAG,KAAsC;CACxE,OACE,kBAAC,OAAD;EACE,aAAU;EACV,WAAW,EACT,0PACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAU,EAAE,cAAW,GAAG,KAAsC;CACvE,OACE,kBAAC,OAAD;EACE,aAAU;EACV,WAAW,EACT,qFACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAgB,EAAE,cAAW,GAAG,KAAsC;CAC7E,OACE,kBAAC,OAAD;EACE,aAAU;EACV,WAAW,EAAG,iCAAiC,CAAS;EACxD,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAW,EAAE,cAAW,GAAG,KAAsC;CACxE,OACE,kBAAC,OAAD;EACE,aAAU;EACV,WAAW,EACT,kEACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAY,EAAE,cAAW,GAAG,KAAsC;CACzE,OACE,kBAAC,OAAD;EACE,aAAU;EACV,WAAW,EAAG,uBAAuB,CAAS;EAC9C,GAAI;CACL,CAAA;AAEL"}
|