@openrails/billing-ui 0.242.0 → 0.243.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-CC7I4n0_.js +1189 -0
- package/dist/admin-catalog-CC7I4n0_.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-BGAXbT23.js +1702 -0
- package/dist/admin-metering-BGAXbT23.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/generated/error-codes.d.ts +1 -1
- package/dist/client/generated/routes.d.ts +2171 -176
- package/dist/client/generated/wire.d.ts +1273 -0
- package/dist/{hooks-Uiw-zW3H.js → hooks-Ckd8F2JF.js} +7 -7
- package/dist/hooks-Ckd8F2JF.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +11 -11
- 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/hooks-Uiw-zW3H.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-subscriptions-CLYc_HEV.js","names":[],"sources":["../src/admin/pages/subscriptions/views.ts","../src/admin/pages/subscriptions/index.tsx"],"sourcesContent":["import type { SubscriptionFilters } from \"#orck/admin/lib/api/endpoints\"\n\n// Views are named filters relative to today, kept in the URL as ?view=.\nexport const subscriptionViews = {\n renewing_soon: { label: \"Renewing soon\", days: 7 },\n recently_canceled: { label: \"Recently canceled\", days: -30 },\n} as const\ntype SubscriptionView = keyof typeof subscriptionViews\n\nconst utcDay = (days: number, now = new Date()) =>\n new Date(now.getTime() + days * 86_400_000).toISOString().slice(0, 10)\n\n// viewFilters is a view's filters on the day it is opened (UTC dates, as the\n// API takes them).\nexport function viewFilters(\n view: string,\n now = new Date()\n): SubscriptionFilters | null {\n switch (view) {\n case \"renewing_soon\":\n return {\n status: \"active\",\n expires_before: utcDay(subscriptionViews.renewing_soon.days, now),\n sort: \"current_period_ends_at\",\n }\n case \"recently_canceled\":\n return {\n canceled_after: utcDay(subscriptionViews.recently_canceled.days, now),\n sort: \"canceled_at\",\n }\n }\n return null\n}\n\nexport const isView = (v: string): v is SubscriptionView =>\n v in subscriptionViews\n","import { AdminMessage, useAdminUI } from \"#orck/admin/ui-context\"\nimport { useAdminServices } from \"#orck/admin/context\"\nimport { HugeiconsIcon } from \"@hugeicons/react\"\nimport {\n Cancel01Icon,\n Download01Icon,\n Search01Icon,\n} from \"@hugeicons/core-free-icons\"\nimport * as React from \"react\"\nimport { useNavigate, useSearchParams } from \"#orck/admin/router\"\nimport { useMutation, 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 { StatusBadge } from \"#orck/admin/components/status-badge\"\nimport { Button } from \"#orck/admin/components/ui/button\"\nimport { Input } from \"#orck/admin/components/ui/input\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"#orck/admin/components/ui/select\"\nimport { Tabs, TabsList, TabsTrigger } from \"#orck/admin/components/ui/tabs\"\nimport type { SubscriptionFilters } from \"#orck/admin/lib/api/endpoints\"\nimport type { AdminSubscription } from \"#orck/admin/lib/api/types\"\nimport { downloadCsv } from \"#orck/admin/lib/csv\"\nimport { useCursorPages } from \"#orck/admin/lib/cursor-pages\"\nimport { customerName, formatDate, shortId } from \"#orck/admin/lib/format\"\n\nimport { dunningSummary } from \"./dunning\"\nimport { isView, subscriptionViews, viewFilters } from \"./views\"\n\nconst RAILS = [\"nmi\", \"ccbill\", \"stripe\", \"solana\"]\n\n// Dunning is past_due and awaiting_method: parked, not canceled.\nconst statusTabs = [\n { value: \"\", label: \"All\" },\n { value: \"active\", label: \"Active\" },\n { value: \"dunning\", label: \"Dunning\" },\n { value: \"pending\", label: \"Pending\" },\n { value: \"canceled\", label: \"Canceled\" },\n { value: \"awaiting_method\", label: \"Needs card\" },\n { value: \"unverified\", label: \"Unverified\" },\n]\n\nconst canceledColumn: ColumnDef<AdminSubscription, unknown> = {\n header: \"Canceled\",\n cell: ({ row }) => (\n <span className=\"text-muted-foreground tabular-nums\">\n {formatDate(row.original.canceled_at)}\n </span>\n ),\n}\n\nconst columns: ColumnDef<AdminSubscription, unknown>[] = [\n {\n header: \"Customer\",\n cell: ({ row }) => (\n <span className=\"font-mono text-xs\">\n {shortId(row.original.customer_id, 13)}\n </span>\n ),\n },\n {\n header: \"Status\",\n cell: ({ row }) => <StatusBadge status={row.original.status} />,\n },\n { header: \"Rail\", cell: ({ row }) => row.original.rail },\n {\n header: \"Subscription\",\n cell: ({ row }) => (\n <span className=\"text-xs text-muted-foreground\">\n {shortId(row.original.id, 13)}\n </span>\n ),\n },\n {\n header: \"Started\",\n cell: ({ row }) => (\n <span className=\"text-muted-foreground tabular-nums\">\n {formatDate(row.original.started_at)}\n </span>\n ),\n },\n {\n header: \"Period ends\",\n cell: ({ row }) => (\n <span className=\"text-muted-foreground tabular-nums\">\n {formatDate(row.original.current_period_ends_at)}\n </span>\n ),\n },\n {\n header: \"Dunning\",\n cell: ({ row }) =>\n row.original.dunning ? (\n dunningSummary(row.original.dunning)\n ) : (\n <span className=\"text-muted-foreground\">—</span>\n ),\n },\n]\n\nexport function SubscriptionsPage() {\n const { toast, toastApiError, adminMutations, adminQueries } =\n useAdminServices()\n\n const { text: adminText } = useAdminUI()\n\n const [params, setParams] = useSearchParams()\n const view = params.get(\"view\") ?? \"\"\n const status = params.get(\"status\") ?? \"\"\n const dunning = params.get(\"dunning\") === \"true\"\n const rail = params.get(\"rail\") ?? \"\"\n const userId = params.get(\"customer_id\") ?? \"\"\n const customerLabel = params.get(\"customer\") ?? \"\"\n const [input, setInput] = React.useState(\"\")\n const navigate = useNavigate()\n const customerLookup = useMutation(adminMutations.findCustomer())\n const exportSubscriptions = useMutation(adminMutations.exportSubscriptions())\n\n const viewed = isView(view) ? viewFilters(view) : null\n const filters: SubscriptionFilters = {\n ...(viewed ?? {\n ...(status ? { status } : {}),\n ...(dunning ? { dunning: \"true\" } : {}),\n }),\n ...(rail ? { rail } : {}),\n ...(userId ? { customer_id: userId } : {}),\n }\n const pages = useCursorPages(JSON.stringify(filters))\n const {\n data,\n isPending: loading,\n isFetching,\n } = useQuery(adminQueries.subscriptions(filters, pages.size, pages.cursor))\n const shownColumns =\n view === \"recently_canceled\" || status === \"canceled\"\n ? [...columns.slice(0, -2), canceledColumn, columns.at(-1)!]\n : columns\n\n const setParam = (key: string, value: string) => {\n const p = new URLSearchParams(params)\n if (value) p.set(key, value)\n else p.delete(key)\n setParams(p)\n }\n\n // The subscriptions API has no free-text search: resolve the term to a\n // customer, then filter by its id.\n const searchCustomer = async () => {\n const term = input.trim()\n if (!term) return\n try {\n const c = await customerLookup.mutateAsync(term)\n if (!c) {\n toast.info(\"No customer matches\")\n return\n }\n const p = new URLSearchParams(params)\n p.set(\"customer_id\", c.id)\n p.set(\"customer\", customerName(c))\n setParams(p)\n setInput(\"\")\n } catch (err) {\n toastApiError(err, \"Search customers\")\n }\n }\n\n const clearCustomer = () => {\n const p = new URLSearchParams(params)\n p.delete(\"customer_id\")\n p.delete(\"customer\")\n setParams(p)\n }\n\n const exportCsv = async () => {\n try {\n const rows = await exportSubscriptions.mutateAsync(filters)\n downloadCsv(\n `subscriptions-${view || status || \"all\"}-${new Date().toISOString().slice(0, 10)}.csv`,\n [\n \"id\",\n \"status\",\n \"rail\",\n \"customer_id\",\n \"started_at\",\n \"current_period_ends_at\",\n \"canceled_at\",\n ],\n rows.map((r) => [\n r.id,\n r.status,\n r.rail,\n r.customer_id,\n r.started_at,\n r.current_period_ends_at,\n r.canceled_at,\n ])\n )\n } catch (err) {\n toastApiError(err, \"Export subscriptions\")\n }\n }\n\n return (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">\n <AdminMessage id={\"Subscriptions\"} />\n </h1>\n <div className=\"flex flex-wrap items-center gap-3\">\n <form\n className=\"relative\"\n aria-busy={customerLookup.isPending}\n onSubmit={(e) => {\n e.preventDefault()\n void searchCustomer()\n }}\n >\n <HugeiconsIcon\n icon={Search01Icon}\n className=\"absolute top-1/2 left-2.5 size-4 -translate-y-1/2 text-muted-foreground\"\n />\n <Input\n className=\"w-64 pl-8\"\n placeholder={adminText(\"Search customer email, ref, or id…\")}\n value={input}\n disabled={customerLookup.isPending}\n onChange={(e) => setInput(e.target.value)}\n />\n </form>\n <Select\n items={[\n { value: \"all\", label: \"All rails\" },\n ...RAILS.map((r) => ({ value: r, label: r })),\n ]}\n value={rail || \"all\"}\n onValueChange={(v) => setParam(\"rail\", !v || v === \"all\" ? \"\" : v)}\n >\n <SelectTrigger className=\"w-36\">\n <SelectValue placeholder={adminText(\"Rail\")} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">\n <AdminMessage id={\"All rails\"} />\n </SelectItem>\n {RAILS.map((r) => (\n <SelectItem key={r} value={r}>\n {r}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Button\n size=\"sm\"\n onClick={exportCsv}\n disabled={\n exportSubscriptions.isPending ||\n loading ||\n (data?.data.length ?? 0) === 0\n }\n >\n <HugeiconsIcon icon={Download01Icon} className=\"size-4\" />\n {exportSubscriptions.isPending ? \"Exporting…\" : \"Export CSV\"}\n </Button>\n </div>\n </div>\n\n <Tabs\n value={isView(view) ? view : dunning ? \"dunning\" : status}\n onValueChange={(v) => {\n const p = new URLSearchParams(params)\n p.delete(\"status\")\n p.delete(\"dunning\")\n p.delete(\"view\")\n if (v === \"dunning\") p.set(\"dunning\", \"true\")\n else if (isView(v)) p.set(\"view\", v)\n else if (v) p.set(\"status\", v)\n setParams(p)\n }}\n >\n <TabsList\n variant=\"line\"\n className=\"w-full justify-start gap-6 overflow-x-auto rounded-none p-0\"\n >\n {[\n ...statusTabs,\n ...Object.entries(subscriptionViews).map(([value, v]) => ({\n value,\n label: v.label,\n })),\n ].map((t) => (\n <TabsTrigger\n key={t.value}\n value={t.value}\n className=\"flex-none px-0 after:bg-primary group-data-horizontal/tabs:after:bottom-[-1px]\"\n >\n {t.label}\n </TabsTrigger>\n ))}\n </TabsList>\n </Tabs>\n\n {userId ? (\n <div className=\"flex items-center gap-2 text-sm\">\n <span className=\"text-muted-foreground\">\n <AdminMessage id={\"Customer\"} />\n </span>\n <span className=\"inline-flex items-center gap-1 rounded-md bg-muted py-0.5 pr-1 pl-2 font-medium\">\n {customerLabel || shortId(userId, 13)}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-5\"\n aria-label={adminText(\"Clear customer filter\")}\n onClick={clearCustomer}\n >\n <HugeiconsIcon icon={Cancel01Icon} className=\"size-3\" />\n </Button>\n </span>\n </div>\n ) : null}\n\n <DataTable\n columns={shownColumns}\n data={data?.data ?? []}\n loading={loading}\n onRowClick={(row) => navigate(`/subscriptions/${row.id}`)}\n emptyMessage=\"No subscriptions match.\"\n />\n <CursorPager\n pages={pages}\n rows={data?.data?.length ?? 0}\n nextCursor={data?.next_cursor}\n busy={isFetching}\n />\n </div>\n )\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { t as e } from "./admin-utils-BK4Vh1o_.js";
|
|
2
|
+
import { jsx as t } from "react/jsx-runtime";
|
|
3
|
+
import { Switch as n } from "@base-ui/react/switch";
|
|
4
|
+
//#region src/admin/components/ui/switch.tsx
|
|
5
|
+
function r({ className: r, size: i = "default", ...a }) {
|
|
6
|
+
return /* @__PURE__ */ t(n.Root, {
|
|
7
|
+
"data-slot": "switch",
|
|
8
|
+
"data-size": i,
|
|
9
|
+
className: e("peer group/switch relative inline-flex shrink-0 items-center rounded-full border border-transparent transition-all outline-none after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-checked:bg-primary data-disabled:cursor-not-allowed data-disabled:opacity-50 data-unchecked:bg-input data-[size=default]:h-[18.4px] data-[size=default]:w-[32px] data-[size=sm]:h-[14px] data-[size=sm]:w-[24px] dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 dark:data-unchecked:bg-input/80", r),
|
|
10
|
+
...a,
|
|
11
|
+
children: /* @__PURE__ */ t(n.Thumb, {
|
|
12
|
+
"data-slot": "switch-thumb",
|
|
13
|
+
className: "pointer-events-none block rounded-full bg-background ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 group-data-[size=default]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=sm]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=default]/switch:data-unchecked:translate-x-0 group-data-[size=sm]/switch:data-unchecked:translate-x-0 dark:data-checked:bg-primary-foreground dark:data-unchecked:bg-foreground"
|
|
14
|
+
})
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
//#endregion
|
|
18
|
+
export { r as t };
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=admin-switch-BJUxLCsa.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-switch-BJUxLCsa.js","names":[],"sources":["../src/admin/components/ui/switch.tsx"],"sourcesContent":["import { Switch as SwitchPrimitive } from \"@base-ui/react/switch\"\n\nimport { cn } from \"#orck/admin/lib/utils\"\n\nfunction Switch({\n className,\n size = \"default\",\n ...props\n}: SwitchPrimitive.Root.Props & {\n size?: \"sm\" | \"default\"\n}) {\n return (\n <SwitchPrimitive.Root\n data-slot=\"switch\"\n data-size={size}\n className={cn(\n \"peer group/switch relative inline-flex shrink-0 items-center rounded-full border border-transparent transition-all outline-none after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-checked:bg-primary data-disabled:cursor-not-allowed data-disabled:opacity-50 data-unchecked:bg-input data-[size=default]:h-[18.4px] data-[size=default]:w-[32px] data-[size=sm]:h-[14px] data-[size=sm]:w-[24px] dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 dark:data-unchecked:bg-input/80\",\n className\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb\n data-slot=\"switch-thumb\"\n className=\"pointer-events-none block rounded-full bg-background ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 group-data-[size=default]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=sm]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=default]/switch:data-unchecked:translate-x-0 group-data-[size=sm]/switch:data-unchecked:translate-x-0 dark:data-checked:bg-primary-foreground dark:data-unchecked:bg-foreground\"\n />\n </SwitchPrimitive.Root>\n )\n}\n\nexport { Switch }\n"],"mappings":";;;;AAIA,SAAS,EAAO,EACd,cACA,UAAO,WACP,GAAG,KAGF;CACD,OACE,kBAAC,EAAgB,MAAjB;EACE,aAAU;EACV,aAAW;EACX,WAAW,EACT,upBACA,CACF;EACA,GAAI;EAEJ,UAAA,kBAAC,EAAgB,OAAjB;GACE,aAAU;GACV,WAAU;EACX,CAAA;CACmB,CAAA;AAE1B"}
|
|
@@ -0,0 +1,61 @@
|
|
|
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/table.tsx
|
|
5
|
+
function n({ className: n, ...r }) {
|
|
6
|
+
return /* @__PURE__ */ t("div", {
|
|
7
|
+
"data-slot": "table-container",
|
|
8
|
+
className: "relative w-full overflow-x-auto",
|
|
9
|
+
children: /* @__PURE__ */ t("table", {
|
|
10
|
+
"data-slot": "table",
|
|
11
|
+
className: e("w-full caption-bottom text-sm", n),
|
|
12
|
+
...r
|
|
13
|
+
})
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
function r({ className: n, ...r }) {
|
|
17
|
+
return /* @__PURE__ */ t("thead", {
|
|
18
|
+
"data-slot": "table-header",
|
|
19
|
+
className: e("[&_tr]:border-b", n),
|
|
20
|
+
...r
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
function i({ className: n, ...r }) {
|
|
24
|
+
return /* @__PURE__ */ t("tbody", {
|
|
25
|
+
"data-slot": "table-body",
|
|
26
|
+
className: e("[&_tr:last-child]:border-0", n),
|
|
27
|
+
...r
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
function a({ className: n, ...r }) {
|
|
31
|
+
return /* @__PURE__ */ t("tfoot", {
|
|
32
|
+
"data-slot": "table-footer",
|
|
33
|
+
className: e("border-t bg-muted/50 font-medium [&>tr]:last:border-b-0", n),
|
|
34
|
+
...r
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
function o({ className: n, ...r }) {
|
|
38
|
+
return /* @__PURE__ */ t("tr", {
|
|
39
|
+
"data-slot": "table-row",
|
|
40
|
+
className: e("border-b transition-colors hover:bg-muted/50 has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted", n),
|
|
41
|
+
...r
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
function s({ className: n, ...r }) {
|
|
45
|
+
return /* @__PURE__ */ t("th", {
|
|
46
|
+
"data-slot": "table-head",
|
|
47
|
+
className: e("h-10 px-2 text-left align-middle font-medium whitespace-nowrap text-foreground [&:has([role=checkbox])]:pr-0", n),
|
|
48
|
+
...r
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
function c({ className: n, ...r }) {
|
|
52
|
+
return /* @__PURE__ */ t("td", {
|
|
53
|
+
"data-slot": "table-cell",
|
|
54
|
+
className: e("p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0", n),
|
|
55
|
+
...r
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
//#endregion
|
|
59
|
+
export { s as a, a as i, i as n, r as o, c as r, o as s, n as t };
|
|
60
|
+
|
|
61
|
+
//# sourceMappingURL=admin-table-CH9TrXJf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-table-CH9TrXJf.js","names":[],"sources":["../src/admin/components/ui/table.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"#orck/admin/lib/utils\"\n\nfunction Table({ className, ...props }: React.ComponentProps<\"table\">) {\n return (\n <div\n data-slot=\"table-container\"\n className=\"relative w-full overflow-x-auto\"\n >\n <table\n data-slot=\"table\"\n className={cn(\"w-full caption-bottom text-sm\", className)}\n {...props}\n />\n </div>\n )\n}\n\nfunction TableHeader({ className, ...props }: React.ComponentProps<\"thead\">) {\n return (\n <thead\n data-slot=\"table-header\"\n className={cn(\"[&_tr]:border-b\", className)}\n {...props}\n />\n )\n}\n\nfunction TableBody({ className, ...props }: React.ComponentProps<\"tbody\">) {\n return (\n <tbody\n data-slot=\"table-body\"\n className={cn(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n )\n}\n\nfunction TableFooter({ className, ...props }: React.ComponentProps<\"tfoot\">) {\n return (\n <tfoot\n data-slot=\"table-footer\"\n className={cn(\n \"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableRow({ className, ...props }: React.ComponentProps<\"tr\">) {\n return (\n <tr\n data-slot=\"table-row\"\n className={cn(\n \"border-b transition-colors hover:bg-muted/50 has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableHead({ className, ...props }: React.ComponentProps<\"th\">) {\n return (\n <th\n data-slot=\"table-head\"\n className={cn(\n \"h-10 px-2 text-left align-middle font-medium whitespace-nowrap text-foreground [&:has([role=checkbox])]:pr-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableCell({ className, ...props }: React.ComponentProps<\"td\">) {\n return (\n <td\n data-slot=\"table-cell\"\n className={cn(\n \"p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableCaption({\n className,\n ...props\n}: React.ComponentProps<\"caption\">) {\n return (\n <caption\n data-slot=\"table-caption\"\n className={cn(\"mt-4 text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n}\n"],"mappings":";;;;AAMA,SAAS,EAAM,EAAE,cAAW,GAAG,KAAwC;CACrE,OACE,kBAAC,OAAD;EACE,aAAU;EACV,WAAU;EAEV,UAAA,kBAAC,SAAD;GACE,aAAU;GACV,WAAW,EAAG,iCAAiC,CAAS;GACxD,GAAI;EACL,CAAA;CACE,CAAA;AAET;AAEA,SAAS,EAAY,EAAE,cAAW,GAAG,KAAwC;CAC3E,OACE,kBAAC,SAAD;EACE,aAAU;EACV,WAAW,EAAG,mBAAmB,CAAS;EAC1C,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAU,EAAE,cAAW,GAAG,KAAwC;CACzE,OACE,kBAAC,SAAD;EACE,aAAU;EACV,WAAW,EAAG,8BAA8B,CAAS;EACrD,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAY,EAAE,cAAW,GAAG,KAAwC;CAC3E,OACE,kBAAC,SAAD;EACE,aAAU;EACV,WAAW,EACT,2DACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAS,EAAE,cAAW,GAAG,KAAqC;CACrE,OACE,kBAAC,MAAD;EACE,aAAU;EACV,WAAW,EACT,6GACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAU,EAAE,cAAW,GAAG,KAAqC;CACtE,OACE,kBAAC,MAAD;EACE,aAAU;EACV,WAAW,EACT,gHACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAU,EAAE,cAAW,GAAG,KAAqC;CACtE,OACE,kBAAC,MAAD;EACE,aAAU;EACV,WAAW,EACT,oEACA,CACF;EACA,GAAI;CACL,CAAA;AAEL"}
|
|
@@ -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 { Tabs as r } from "@base-ui/react/tabs";
|
|
5
|
+
//#region src/admin/components/ui/tabs.tsx
|
|
6
|
+
function i({ className: n, orientation: i = "horizontal", ...a }) {
|
|
7
|
+
return /* @__PURE__ */ t(r.Root, {
|
|
8
|
+
"data-slot": "tabs",
|
|
9
|
+
"data-orientation": i,
|
|
10
|
+
className: e("group/tabs flex gap-2 data-horizontal:flex-col", n),
|
|
11
|
+
...a
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
var a = n("group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-horizontal/tabs:h-8 group-data-vertical/tabs:h-fit group-data-vertical/tabs:flex-col data-[variant=line]:rounded-none", {
|
|
15
|
+
variants: { variant: {
|
|
16
|
+
default: "bg-muted",
|
|
17
|
+
line: "gap-1 bg-transparent"
|
|
18
|
+
} },
|
|
19
|
+
defaultVariants: { variant: "default" }
|
|
20
|
+
});
|
|
21
|
+
function o({ className: n, variant: i = "default", ...o }) {
|
|
22
|
+
return /* @__PURE__ */ t(r.List, {
|
|
23
|
+
"data-slot": "tabs-list",
|
|
24
|
+
"data-variant": i,
|
|
25
|
+
className: e(a({ variant: i }), n),
|
|
26
|
+
...o
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
function s({ className: n, ...i }) {
|
|
30
|
+
return /* @__PURE__ */ t(r.Tab, {
|
|
31
|
+
"data-slot": "tabs-trigger",
|
|
32
|
+
className: e("relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-1.5 py-0.5 text-sm font-medium whitespace-nowrap text-foreground/60 transition-all group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 has-data-[icon=inline-end]:pr-1 has-data-[icon=inline-start]:pl-1 aria-disabled:pointer-events-none aria-disabled:opacity-50 group-data-[variant=default]/tabs-list:data-active:shadow-sm group-data-[variant=line]/tabs-list:data-active:shadow-none dark:text-muted-foreground dark:hover:text-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", "group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent dark:group-data-[variant=line]/tabs-list:data-active:border-transparent dark:group-data-[variant=line]/tabs-list:data-active:bg-transparent", "data-active:bg-background data-active:text-foreground dark:data-active:border-input dark:data-active:bg-input/30 dark:data-active:text-foreground", "after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-horizontal/tabs:after:inset-x-0 group-data-horizontal/tabs:after:bottom-[-5px] group-data-horizontal/tabs:after:h-0.5 group-data-vertical/tabs:after:inset-y-0 group-data-vertical/tabs:after:-right-1 group-data-vertical/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100", n),
|
|
33
|
+
...i
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
function c({ className: n, ...i }) {
|
|
37
|
+
return /* @__PURE__ */ t(r.Panel, {
|
|
38
|
+
"data-slot": "tabs-content",
|
|
39
|
+
className: e("flex-1 text-sm outline-none", n),
|
|
40
|
+
...i
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
//#endregion
|
|
44
|
+
export { s as i, c as n, o as r, i as t };
|
|
45
|
+
|
|
46
|
+
//# sourceMappingURL=admin-tabs-528FJMjt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-tabs-528FJMjt.js","names":[],"sources":["../src/admin/components/ui/tabs.tsx"],"sourcesContent":["import { Tabs as TabsPrimitive } from \"@base-ui/react/tabs\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"#orck/admin/lib/utils\"\n\nfunction Tabs({\n className,\n orientation = \"horizontal\",\n ...props\n}: TabsPrimitive.Root.Props) {\n return (\n <TabsPrimitive.Root\n data-slot=\"tabs\"\n data-orientation={orientation}\n className={cn(\n \"group/tabs flex gap-2 data-horizontal:flex-col\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst tabsListVariants = cva(\n \"group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-horizontal/tabs:h-8 group-data-vertical/tabs:h-fit group-data-vertical/tabs:flex-col data-[variant=line]:rounded-none\",\n {\n variants: {\n variant: {\n default: \"bg-muted\",\n line: \"gap-1 bg-transparent\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction TabsList({\n className,\n variant = \"default\",\n ...props\n}: TabsPrimitive.List.Props & VariantProps<typeof tabsListVariants>) {\n return (\n <TabsPrimitive.List\n data-slot=\"tabs-list\"\n data-variant={variant}\n className={cn(tabsListVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nfunction TabsTrigger({ className, ...props }: TabsPrimitive.Tab.Props) {\n return (\n <TabsPrimitive.Tab\n data-slot=\"tabs-trigger\"\n className={cn(\n \"relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-1.5 py-0.5 text-sm font-medium whitespace-nowrap text-foreground/60 transition-all group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 has-data-[icon=inline-end]:pr-1 has-data-[icon=inline-start]:pl-1 aria-disabled:pointer-events-none aria-disabled:opacity-50 group-data-[variant=default]/tabs-list:data-active:shadow-sm group-data-[variant=line]/tabs-list:data-active:shadow-none dark:text-muted-foreground dark:hover:text-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n \"group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent dark:group-data-[variant=line]/tabs-list:data-active:border-transparent dark:group-data-[variant=line]/tabs-list:data-active:bg-transparent\",\n \"data-active:bg-background data-active:text-foreground dark:data-active:border-input dark:data-active:bg-input/30 dark:data-active:text-foreground\",\n \"after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-horizontal/tabs:after:inset-x-0 group-data-horizontal/tabs:after:bottom-[-5px] group-data-horizontal/tabs:after:h-0.5 group-data-vertical/tabs:after:inset-y-0 group-data-vertical/tabs:after:-right-1 group-data-vertical/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TabsContent({ className, ...props }: TabsPrimitive.Panel.Props) {\n return (\n <TabsPrimitive.Panel\n data-slot=\"tabs-content\"\n className={cn(\"flex-1 text-sm outline-none\", className)}\n {...props}\n />\n )\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent, tabsListVariants }\n"],"mappings":";;;;;AAKA,SAAS,EAAK,EACZ,cACA,iBAAc,cACd,GAAG,KACwB;CAC3B,OACE,kBAAC,EAAc,MAAf;EACE,aAAU;EACV,oBAAkB;EAClB,WAAW,EACT,kDACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,IAAM,IAAmB,EACvB,2OACA;CACE,UAAU,EACR,SAAS;EACP,SAAS;EACT,MAAM;CACR,EACF;CACA,iBAAiB,EACf,SAAS,UACX;AACF,CACF;AAEA,SAAS,EAAS,EAChB,cACA,aAAU,WACV,GAAG,KACgE;CACnE,OACE,kBAAC,EAAc,MAAf;EACE,aAAU;EACV,gBAAc;EACd,WAAW,EAAG,EAAiB,EAAE,WAAQ,CAAC,GAAG,CAAS;EACtD,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAY,EAAE,cAAW,GAAG,KAAkC;CACrE,OACE,kBAAC,EAAc,KAAf;EACE,aAAU;EACV,WAAW,EACT,81BACA,iQACA,qJACA,wYACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAY,EAAE,cAAW,GAAG,KAAoC;CACvE,OACE,kBAAC,EAAc,OAAf;EACE,aAAU;EACV,WAAW,EAAG,+BAA+B,CAAS;EACtD,GAAI;CACL,CAAA;AAEL"}
|
|
@@ -0,0 +1,15 @@
|
|
|
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/textarea.tsx
|
|
5
|
+
function n({ className: n, ...r }) {
|
|
6
|
+
return /* @__PURE__ */ t("textarea", {
|
|
7
|
+
"data-slot": "textarea",
|
|
8
|
+
className: e("flex field-sizing-content min-h-16 w-full rounded-lg border border-input bg-transparent px-2.5 py-2 text-base transition-colors outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40", n),
|
|
9
|
+
...r
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
//#endregion
|
|
13
|
+
export { n as t };
|
|
14
|
+
|
|
15
|
+
//# sourceMappingURL=admin-textarea-DEz38RaI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-textarea-DEz38RaI.js","names":[],"sources":["../src/admin/components/ui/textarea.tsx"],"sourcesContent":["import * as React from \"react\"\n\nimport { cn } from \"#orck/admin/lib/utils\"\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n \"flex field-sizing-content min-h-16 w-full rounded-lg border border-input bg-transparent px-2.5 py-2 text-base transition-colors outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Textarea }\n"],"mappings":";;;;AAIA,SAAS,EAAS,EAAE,cAAW,GAAG,KAA2C;CAC3E,OACE,kBAAC,YAAD;EACE,aAAU;EACV,WAAW,EACT,0hBACA,CACF;EACA,GAAI;CACL,CAAA;AAEL"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { E as e, w as t } from "./admin-utils-BK4Vh1o_.js";
|
|
2
|
+
import { t as n } from "./admin-button-CTL3DgOt.js";
|
|
3
|
+
import { t as r } from "./admin-input-CcfQfJFN.js";
|
|
4
|
+
import { a as i, i as a, n as o, o as s, r as c, t as l } from "./admin-dialog-BjuKI5Hp.js";
|
|
5
|
+
import { t as u } from "./admin-label-BiEN5cjb.js";
|
|
6
|
+
import { t as d } from "./admin-dialog-width-BPrgdYlj.js";
|
|
7
|
+
import * as f from "react";
|
|
8
|
+
import { jsx as p, jsxs as m } from "react/jsx-runtime";
|
|
9
|
+
//#region src/admin/components/typed-confirm-dialog.tsx
|
|
10
|
+
function h({ open: h, onOpenChange: g, title: _, description: v, confirmationWord: y, actionLabel: b, onConfirm: x, children: S }) {
|
|
11
|
+
let { id: C } = e(), [w, T] = f.useState(""), [E, D] = f.useState(!1), O = (e) => {
|
|
12
|
+
e || T(""), g(e);
|
|
13
|
+
};
|
|
14
|
+
return /* @__PURE__ */ p(l, {
|
|
15
|
+
open: h,
|
|
16
|
+
onOpenChange: O,
|
|
17
|
+
children: /* @__PURE__ */ m(o, {
|
|
18
|
+
className: d,
|
|
19
|
+
children: [
|
|
20
|
+
/* @__PURE__ */ m(i, { children: [/* @__PURE__ */ p(s, { children: _ }), /* @__PURE__ */ p(c, { children: v })] }),
|
|
21
|
+
S,
|
|
22
|
+
/* @__PURE__ */ m("div", {
|
|
23
|
+
className: "grid gap-2",
|
|
24
|
+
children: [/* @__PURE__ */ m(u, {
|
|
25
|
+
htmlFor: C("typed-confirm"),
|
|
26
|
+
children: [
|
|
27
|
+
/* @__PURE__ */ p(t, { id: "Type " }),
|
|
28
|
+
/* @__PURE__ */ p("span", {
|
|
29
|
+
className: "font-semibold",
|
|
30
|
+
children: y
|
|
31
|
+
}),
|
|
32
|
+
/* @__PURE__ */ p(t, { id: " to confirm" })
|
|
33
|
+
]
|
|
34
|
+
}), /* @__PURE__ */ p(r, {
|
|
35
|
+
id: C("typed-confirm"),
|
|
36
|
+
value: w,
|
|
37
|
+
onChange: (e) => T(e.target.value),
|
|
38
|
+
autoComplete: "off"
|
|
39
|
+
})]
|
|
40
|
+
}),
|
|
41
|
+
/* @__PURE__ */ m(a, { children: [/* @__PURE__ */ p(n, {
|
|
42
|
+
variant: "outline",
|
|
43
|
+
onClick: () => O(!1),
|
|
44
|
+
disabled: E,
|
|
45
|
+
children: /* @__PURE__ */ p(t, { id: "Keep it" })
|
|
46
|
+
}), /* @__PURE__ */ p(n, {
|
|
47
|
+
variant: "destructive",
|
|
48
|
+
disabled: w !== y || E,
|
|
49
|
+
onClick: async () => {
|
|
50
|
+
D(!0);
|
|
51
|
+
try {
|
|
52
|
+
await x(), O(!1);
|
|
53
|
+
} finally {
|
|
54
|
+
D(!1);
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
children: E ? "Working…" : b
|
|
58
|
+
})] })
|
|
59
|
+
]
|
|
60
|
+
})
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
//#endregion
|
|
64
|
+
export { h as t };
|
|
65
|
+
|
|
66
|
+
//# sourceMappingURL=admin-typed-confirm-dialog-DU7m9-O7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-typed-confirm-dialog-DU7m9-O7.js","names":[],"sources":["../src/admin/components/typed-confirm-dialog.tsx"],"sourcesContent":["import { AdminMessage, useAdminUI } from \"#orck/admin/ui-context\"\nimport * as React from \"react\"\n\nimport { Button } from \"#orck/admin/components/ui/button\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"#orck/admin/components/ui/dialog\"\nimport { Input } from \"#orck/admin/components/ui/input\"\nimport { Label } from \"#orck/admin/components/ui/label\"\nimport { DIALOG_CONFIRM } from \"#orck/admin/lib/dialog-width\"\n\n// TypedConfirmDialog requires typing a confirmation phrase before a\n// destructive action (e.g. cancelling a subscription) can proceed.\nexport function TypedConfirmDialog({\n open,\n onOpenChange,\n title,\n description,\n confirmationWord,\n actionLabel,\n onConfirm,\n children,\n}: {\n open: boolean\n onOpenChange: (open: boolean) => void\n title: string\n description: string\n confirmationWord: string\n actionLabel: string\n onConfirm: () => Promise<void> | void\n children?: React.ReactNode\n}) {\n const { id: adminId } = useAdminUI()\n\n const [typed, setTyped] = React.useState(\"\")\n const [busy, setBusy] = React.useState(false)\n\n const handleOpenChange = (next: boolean) => {\n if (!next) setTyped(\"\")\n onOpenChange(next)\n }\n\n return (\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogContent className={DIALOG_CONFIRM}>\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n {children}\n <div className=\"grid gap-2\">\n <Label htmlFor={adminId(\"typed-confirm\")}>\n <AdminMessage id={\"Type \"} />\n <span className=\"font-semibold\">{confirmationWord}</span>\n <AdminMessage id={\" to confirm\"} />\n </Label>\n <Input\n id={adminId(\"typed-confirm\")}\n value={typed}\n onChange={(e) => setTyped(e.target.value)}\n autoComplete=\"off\"\n />\n </div>\n <DialogFooter>\n <Button\n variant=\"outline\"\n onClick={() => handleOpenChange(false)}\n disabled={busy}\n >\n <AdminMessage id={\"Keep it\"} />\n </Button>\n <Button\n variant=\"destructive\"\n disabled={typed !== confirmationWord || busy}\n onClick={async () => {\n setBusy(true)\n try {\n await onConfirm()\n handleOpenChange(false)\n } finally {\n setBusy(false)\n }\n }}\n >\n {busy ? \"Working…\" : actionLabel}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n"],"mappings":";;;;;;;;;AAkBA,SAAgB,EAAmB,EACjC,SACA,iBACA,UACA,gBACA,qBACA,gBACA,cACA,eAUC;CACD,IAAM,EAAE,IAAI,MAAY,EAAW,GAE7B,CAAC,GAAO,KAAY,EAAM,SAAS,EAAE,GACrC,CAAC,GAAM,KAAW,EAAM,SAAS,EAAK,GAEtC,KAAoB,MAAkB;EAE1C,AADK,KAAM,EAAS,EAAE,GACtB,EAAa,CAAI;CACnB;CAEA,OACE,kBAAC,GAAD;EAAc;EAAM,cAAc;EAChC,UAAA,kBAAC,GAAD;GAAe,WAAW;GAA1B,UAAA;IACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAc,EAAmB,CAAA,GACjC,kBAAC,GAAD,EAAA,UAAoB,EAA+B,CAAA,CACvC,EAAA,CAAA;IACb;IACD,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,kBAAC,GAAD;MAAO,SAAS,EAAQ,eAAe;MAAvC,UAAA;OACE,kBAAC,GAAD,EAAc,IAAI,QAAU,CAAA;OAC5B,kBAAC,QAAD;QAAM,WAAU;QAAiB,UAAA;OAAuB,CAAA;OACxD,kBAAC,GAAD,EAAc,IAAI,cAAgB,CAAA;MAC7B;KACP,CAAA,GAAA,kBAAC,GAAD;MACE,IAAI,EAAQ,eAAe;MAC3B,OAAO;MACP,WAAW,MAAM,EAAS,EAAE,OAAO,KAAK;MACxC,cAAa;KACd,CAAA,CACE;;IACL,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;KACE,SAAQ;KACR,eAAe,EAAiB,EAAK;KACrC,UAAU;KAEV,UAAA,kBAAC,GAAD,EAAc,IAAI,UAAY,CAAA;IACxB,CAAA,GACR,kBAAC,GAAD;KACE,SAAQ;KACR,UAAU,MAAU,KAAoB;KACxC,SAAS,YAAY;MACnB,EAAQ,EAAI;MACZ,IAAI;OAEF,AADA,MAAM,EAAU,GAChB,EAAiB,EAAK;MACxB,UAAU;OACR,EAAQ,EAAK;MACf;KACF;KAEC,UAAA,IAAO,aAAa;IACf,CAAA,CACI,EAAA,CAAA;GACD;;CACT,CAAA;AAEZ"}
|