@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.
Files changed (267) hide show
  1. package/CHANGELOG.md +27 -11
  2. package/README.md +41 -8
  3. package/dist/admin/billing-admin.d.ts +3 -0
  4. package/dist/admin/components/app-sidebar.d.ts +1 -0
  5. package/dist/admin/components/confirm.d.ts +4 -0
  6. package/dist/admin/components/cursor-pager.d.ts +8 -0
  7. package/dist/admin/components/data-table.d.ts +14 -0
  8. package/dist/admin/components/fact-card.d.ts +5 -0
  9. package/dist/admin/components/form-field-errors.d.ts +3 -0
  10. package/dist/admin/components/linked-table-row.d.ts +5 -0
  11. package/dist/admin/components/logo.d.ts +3 -0
  12. package/dist/admin/components/no-access.d.ts +3 -0
  13. package/dist/admin/components/no-merchants.d.ts +1 -0
  14. package/dist/admin/components/notification-bell.d.ts +2 -0
  15. package/dist/admin/components/route-error.d.ts +3 -0
  16. package/dist/admin/components/site-header.d.ts +9 -0
  17. package/dist/admin/components/status-badge.d.ts +3 -0
  18. package/dist/admin/components/typed-confirm-dialog.d.ts +11 -0
  19. package/dist/admin/components/ui/alert-dialog.d.ts +18 -0
  20. package/dist/admin/components/ui/avatar.d.ts +11 -0
  21. package/dist/admin/components/ui/badge.d.ts +7 -0
  22. package/dist/admin/components/ui/breadcrumb.d.ts +10 -0
  23. package/dist/admin/components/ui/button.d.ts +8 -0
  24. package/dist/admin/components/ui/card.d.ts +11 -0
  25. package/dist/admin/components/ui/chart.d.ts +44 -0
  26. package/dist/admin/components/ui/dialog.d.ts +17 -0
  27. package/dist/admin/components/ui/dropdown-menu.d.ts +29 -0
  28. package/dist/admin/components/ui/input.d.ts +3 -0
  29. package/dist/admin/components/ui/label.d.ts +3 -0
  30. package/dist/admin/components/ui/select.d.ts +15 -0
  31. package/dist/admin/components/ui/separator.d.ts +3 -0
  32. package/dist/admin/components/ui/sheet.d.ts +14 -0
  33. package/dist/admin/components/ui/sidebar.d.ts +63 -0
  34. package/dist/admin/components/ui/skeleton.d.ts +2 -0
  35. package/dist/admin/components/ui/sonner.d.ts +3 -0
  36. package/dist/admin/components/ui/switch.d.ts +5 -0
  37. package/dist/admin/components/ui/table.d.ts +10 -0
  38. package/dist/admin/components/ui/tabs.d.ts +10 -0
  39. package/dist/admin/components/ui/textarea.d.ts +3 -0
  40. package/dist/admin/components/ui/tooltip.d.ts +6 -0
  41. package/dist/admin/context.d.ts +1193 -0
  42. package/dist/admin/hooks/use-mobile.d.ts +1 -0
  43. package/dist/admin/index.d.ts +5 -0
  44. package/dist/admin/layouts/app-layout.d.ts +4 -0
  45. package/dist/admin/lib/api/client.d.ts +64 -0
  46. package/dist/admin/lib/api/copilot.d.ts +6 -0
  47. package/dist/admin/lib/api/credit-endpoints.d.ts +8 -0
  48. package/dist/admin/lib/api/credit-types.d.ts +9 -0
  49. package/dist/admin/lib/api/endpoints.d.ts +133 -0
  50. package/dist/admin/lib/api/index.d.ts +89 -0
  51. package/dist/admin/lib/api/invoice-profile-endpoints.d.ts +6 -0
  52. package/dist/admin/lib/api/metrics.d.ts +68 -0
  53. package/dist/admin/lib/api/order-endpoints.d.ts +21 -0
  54. package/dist/admin/lib/api/types.d.ts +122 -0
  55. package/dist/admin/lib/auth.d.ts +6 -0
  56. package/dist/admin/lib/capabilities.d.ts +13 -0
  57. package/dist/admin/lib/chunk-error.d.ts +1 -0
  58. package/dist/admin/lib/confirm.d.ts +11 -0
  59. package/dist/admin/lib/credit-queries.d.ts +23 -0
  60. package/dist/admin/lib/csv.d.ts +3 -0
  61. package/dist/admin/lib/cursor-pages.d.ts +13 -0
  62. package/dist/admin/lib/dialog-width.d.ts +6 -0
  63. package/dist/admin/lib/dom.d.ts +1 -0
  64. package/dist/admin/lib/duration.d.ts +3 -0
  65. package/dist/admin/lib/format.d.ts +23 -0
  66. package/dist/admin/lib/mount.d.ts +6 -0
  67. package/dist/admin/lib/mutations.d.ts +125 -0
  68. package/dist/admin/lib/order-queries.d.ts +29 -0
  69. package/dist/admin/lib/queries.d.ts +369 -0
  70. package/dist/admin/lib/query-client.d.ts +3 -0
  71. package/dist/admin/lib/toast.d.ts +10 -0
  72. package/dist/admin/lib/utils.d.ts +2 -0
  73. package/dist/admin/messages.d.ts +670 -0
  74. package/dist/admin/navigation.d.ts +14 -0
  75. package/dist/admin/pages/catalog/application-dialog.d.ts +2 -0
  76. package/dist/admin/pages/catalog/copilot-panel.d.ts +4 -0
  77. package/dist/admin/pages/catalog/index.d.ts +4 -0
  78. package/dist/admin/pages/catalog/meter-form.d.ts +6 -0
  79. package/dist/admin/pages/catalog/metering-model.d.ts +67 -0
  80. package/dist/admin/pages/catalog/metering.d.ts +3 -0
  81. package/dist/admin/pages/catalog/price-detail.d.ts +2 -0
  82. package/dist/admin/pages/catalog/price-format.d.ts +3 -0
  83. package/dist/admin/pages/catalog/price-wizard-logic.d.ts +20 -0
  84. package/dist/admin/pages/catalog/price-wizard.d.ts +10 -0
  85. package/dist/admin/pages/catalog/psp-links.d.ts +10 -0
  86. package/dist/admin/pages/catalog/rate-card-editor.d.ts +10 -0
  87. package/dist/admin/pages/customers/credit-form.d.ts +14 -0
  88. package/dist/admin/pages/customers/credits.d.ts +5 -0
  89. package/dist/admin/pages/customers/default-card-badges.d.ts +3 -0
  90. package/dist/admin/pages/customers/detail.d.ts +5 -0
  91. package/dist/admin/pages/customers/grant-duration.d.ts +32 -0
  92. package/dist/admin/pages/customers/index.d.ts +2 -0
  93. package/dist/admin/pages/customers/invoice-profile-model.d.ts +18 -0
  94. package/dist/admin/pages/customers/invoice-profile.d.ts +9 -0
  95. package/dist/admin/pages/dashboard/index.d.ts +2 -0
  96. package/dist/admin/pages/dashboard/lib.d.ts +48 -0
  97. package/dist/admin/pages/dashboard/range-picker.d.ts +1 -0
  98. package/dist/admin/pages/dashboard/range.d.ts +34 -0
  99. package/dist/admin/pages/dashboard/reports-model.d.ts +29 -0
  100. package/dist/admin/pages/dashboard/reports.d.ts +2 -0
  101. package/dist/admin/pages/dashboard/use-range.d.ts +5 -0
  102. package/dist/admin/pages/dashboard/widget-editor.d.ts +8 -0
  103. package/dist/admin/pages/dashboard/widget-tile.d.ts +9 -0
  104. package/dist/admin/pages/dashboard/widget-viz.d.ts +12 -0
  105. package/dist/admin/pages/ops/index.d.ts +2 -0
  106. package/dist/admin/pages/orders/detail.d.ts +5 -0
  107. package/dist/admin/pages/orders/index.d.ts +1 -0
  108. package/dist/admin/pages/orders/model.d.ts +7 -0
  109. package/dist/admin/pages/payments/attempts.d.ts +7 -0
  110. package/dist/admin/pages/payments/detail.d.ts +2 -0
  111. package/dist/admin/pages/payments/health-model.d.ts +149 -0
  112. package/dist/admin/pages/payments/health.d.ts +2 -0
  113. package/dist/admin/pages/payments/index.d.ts +2 -0
  114. package/dist/admin/pages/settings/configuration-edit.d.ts +9 -0
  115. package/dist/admin/pages/settings/index.d.ts +9 -0
  116. package/dist/admin/pages/settings/notifications.d.ts +2 -0
  117. package/dist/admin/pages/settings/setting-fields.d.ts +20 -0
  118. package/dist/admin/pages/subscriptions/change-subscription-dialog.d.ts +16 -0
  119. package/dist/admin/pages/subscriptions/detail.d.ts +2 -0
  120. package/dist/admin/pages/subscriptions/dunning.d.ts +2 -0
  121. package/dist/admin/pages/subscriptions/index.d.ts +2 -0
  122. package/dist/admin/pages/subscriptions/subscription-change-options.d.ts +23 -0
  123. package/dist/admin/pages/subscriptions/views.d.ts +15 -0
  124. package/dist/admin/router.d.ts +32 -0
  125. package/dist/admin/routes.d.ts +5 -0
  126. package/dist/admin/summary.d.ts +27 -0
  127. package/dist/admin/theme.d.ts +2 -0
  128. package/dist/admin/types.d.ts +56 -0
  129. package/dist/admin/ui-context.d.ts +14 -0
  130. package/dist/admin-attempts-lAoW-Urd.js +419 -0
  131. package/dist/admin-attempts-lAoW-Urd.js.map +1 -0
  132. package/dist/admin-auth-DQGHtt0j.js +14 -0
  133. package/dist/admin-auth-DQGHtt0j.js.map +1 -0
  134. package/dist/admin-badge-DR5-1qd8.js +31 -0
  135. package/dist/admin-badge-DR5-1qd8.js.map +1 -0
  136. package/dist/admin-button-CTL3DgOt.js +46 -0
  137. package/dist/admin-button-CTL3DgOt.js.map +1 -0
  138. package/dist/admin-capabilities-BuigAgtm.js +59 -0
  139. package/dist/admin-capabilities-BuigAgtm.js.map +1 -0
  140. package/dist/admin-card-bzAks3-3.js +51 -0
  141. package/dist/admin-card-bzAks3-3.js.map +1 -0
  142. package/dist/admin-catalog-CK6CM9I2.js +1199 -0
  143. package/dist/admin-catalog-CK6CM9I2.js.map +1 -0
  144. package/dist/admin-confirm-katGq0Qo.js +12 -0
  145. package/dist/admin-confirm-katGq0Qo.js.map +1 -0
  146. package/dist/admin-csv-CPoNZj2D.js +16 -0
  147. package/dist/admin-csv-CPoNZj2D.js.map +1 -0
  148. package/dist/admin-customers-D8u5gq3M.js +160 -0
  149. package/dist/admin-customers-D8u5gq3M.js.map +1 -0
  150. package/dist/admin-dashboard-DqqFjOzq.js +420 -0
  151. package/dist/admin-dashboard-DqqFjOzq.js.map +1 -0
  152. package/dist/admin-data-table-qfXLOFmN.js +96 -0
  153. package/dist/admin-data-table-qfXLOFmN.js.map +1 -0
  154. package/dist/admin-detail-5aNNvrc0.js +324 -0
  155. package/dist/admin-detail-5aNNvrc0.js.map +1 -0
  156. package/dist/admin-detail-7p684Uyc.js +342 -0
  157. package/dist/admin-detail-7p684Uyc.js.map +1 -0
  158. package/dist/admin-detail-CGOyqs7s.js +1312 -0
  159. package/dist/admin-detail-CGOyqs7s.js.map +1 -0
  160. package/dist/admin-detail-DUAJQg8G.js +710 -0
  161. package/dist/admin-detail-DUAJQg8G.js.map +1 -0
  162. package/dist/admin-dialog-BjuKI5Hp.js +88 -0
  163. package/dist/admin-dialog-BjuKI5Hp.js.map +1 -0
  164. package/dist/admin-dialog-width-BPrgdYlj.js +6 -0
  165. package/dist/admin-dialog-width-BPrgdYlj.js.map +1 -0
  166. package/dist/admin-dom-uMmZzRvU.js +149 -0
  167. package/dist/admin-dom-uMmZzRvU.js.map +1 -0
  168. package/dist/admin-dropdown-menu-BW1D_h6s.js +69 -0
  169. package/dist/admin-dropdown-menu-BW1D_h6s.js.map +1 -0
  170. package/dist/admin-dunning-B2zgtrOo.js +10 -0
  171. package/dist/admin-dunning-B2zgtrOo.js.map +1 -0
  172. package/dist/admin-fact-card-DO_fHosg.js +20 -0
  173. package/dist/admin-fact-card-DO_fHosg.js.map +1 -0
  174. package/dist/admin-form-field-errors-hbUMIriS.js +14 -0
  175. package/dist/admin-form-field-errors-hbUMIriS.js.map +1 -0
  176. package/dist/admin-format-DoohJ7Fg.js +136 -0
  177. package/dist/admin-format-DoohJ7Fg.js.map +1 -0
  178. package/dist/admin-health-B4jN2LwR.js +983 -0
  179. package/dist/admin-health-B4jN2LwR.js.map +1 -0
  180. package/dist/admin-input-CcfQfJFN.js +17 -0
  181. package/dist/admin-input-CcfQfJFN.js.map +1 -0
  182. package/dist/admin-invoice-profile-model-Cgjy3zV8.js +53 -0
  183. package/dist/admin-invoice-profile-model-Cgjy3zV8.js.map +1 -0
  184. package/dist/admin-label-BiEN5cjb.js +15 -0
  185. package/dist/admin-label-BiEN5cjb.js.map +1 -0
  186. package/dist/admin-linked-table-row-BsaUruCN.js +26 -0
  187. package/dist/admin-linked-table-row-BsaUruCN.js.map +1 -0
  188. package/dist/admin-metering-COFcSPQy.js +1721 -0
  189. package/dist/admin-metering-COFcSPQy.js.map +1 -0
  190. package/dist/admin-ops-B3mcr76u.js +217 -0
  191. package/dist/admin-ops-B3mcr76u.js.map +1 -0
  192. package/dist/admin-orders-dxC99Idl.js +192 -0
  193. package/dist/admin-orders-dxC99Idl.js.map +1 -0
  194. package/dist/admin-payments-Bs7HSfP0.js +246 -0
  195. package/dist/admin-payments-Bs7HSfP0.js.map +1 -0
  196. package/dist/admin-price-detail-DRquxpA9.js +482 -0
  197. package/dist/admin-price-detail-DRquxpA9.js.map +1 -0
  198. package/dist/admin-price-format-DM1qORWI.js +44 -0
  199. package/dist/admin-price-format-DM1qORWI.js.map +1 -0
  200. package/dist/admin-price-wizard-CI7K-2Nz.js +357 -0
  201. package/dist/admin-price-wizard-CI7K-2Nz.js.map +1 -0
  202. package/dist/admin-range-picker-Dr2M1EZr.js +192 -0
  203. package/dist/admin-range-picker-Dr2M1EZr.js.map +1 -0
  204. package/dist/admin-reports-CywKLiSA.js +320 -0
  205. package/dist/admin-reports-CywKLiSA.js.map +1 -0
  206. package/dist/admin-select-DBgprVW6.js +81 -0
  207. package/dist/admin-select-DBgprVW6.js.map +1 -0
  208. package/dist/admin-settings-Bmoy95uO.js +1434 -0
  209. package/dist/admin-settings-Bmoy95uO.js.map +1 -0
  210. package/dist/admin-skeleton-DsM7crYi.js +14 -0
  211. package/dist/admin-skeleton-DsM7crYi.js.map +1 -0
  212. package/dist/admin-status-badge-BFPgo71d.js +38 -0
  213. package/dist/admin-status-badge-BFPgo71d.js.map +1 -0
  214. package/dist/admin-subscriptions-CLYc_HEV.js +301 -0
  215. package/dist/admin-subscriptions-CLYc_HEV.js.map +1 -0
  216. package/dist/admin-switch-BJUxLCsa.js +20 -0
  217. package/dist/admin-switch-BJUxLCsa.js.map +1 -0
  218. package/dist/admin-table-CH9TrXJf.js +61 -0
  219. package/dist/admin-table-CH9TrXJf.js.map +1 -0
  220. package/dist/admin-tabs-528FJMjt.js +46 -0
  221. package/dist/admin-tabs-528FJMjt.js.map +1 -0
  222. package/dist/admin-textarea-DEz38RaI.js +15 -0
  223. package/dist/admin-textarea-DEz38RaI.js.map +1 -0
  224. package/dist/admin-typed-confirm-dialog-DU7m9-O7.js +66 -0
  225. package/dist/admin-typed-confirm-dialog-DU7m9-O7.js.map +1 -0
  226. package/dist/admin-utils-BK4Vh1o_.js +1809 -0
  227. package/dist/admin-utils-BK4Vh1o_.js.map +1 -0
  228. package/dist/admin-widget-viz-Da48c-Zf.js +581 -0
  229. package/dist/admin-widget-viz-Da48c-Zf.js.map +1 -0
  230. package/dist/admin.css +3 -0
  231. package/dist/admin.js +2164 -0
  232. package/dist/admin.js.map +1 -0
  233. package/dist/appearance.d.ts +1 -1
  234. package/dist/client/client.d.ts +13 -6
  235. package/dist/client/generated/error-codes.d.ts +1 -1
  236. package/dist/client/generated/routes.d.ts +2173 -178
  237. package/dist/client/generated/wire.d.ts +1287 -1
  238. package/dist/client/index.d.ts +1 -1
  239. package/dist/client/types.d.ts +14 -2
  240. package/dist/{client-PjivPHmE.js → client-D5Af726I.js} +8 -7
  241. package/dist/client-D5Af726I.js.map +1 -0
  242. package/dist/client.js +1 -1
  243. package/dist/{hooks-Uiw-zW3H.js → hooks-CYjlHS28.js} +8 -8
  244. package/dist/hooks-CYjlHS28.js.map +1 -0
  245. package/dist/index.d.ts +1 -1
  246. package/dist/index.js +12 -12
  247. package/dist/index.js.map +1 -1
  248. package/dist/lib/{offer-label.d.ts → price-label.d.ts} +1 -1
  249. package/dist/locales/de.js +1 -1
  250. package/dist/locales/de.js.map +1 -1
  251. package/dist/locales/en.d.ts +1 -1
  252. package/dist/locales/en.js +1 -1
  253. package/dist/locales/en.js.map +1 -1
  254. package/dist/locales/es.js +1 -1
  255. package/dist/locales/es.js.map +1 -1
  256. package/dist/locales/ja.js +1 -1
  257. package/dist/locales/ja.js.map +1 -1
  258. package/dist/locales/ko.js +1 -1
  259. package/dist/locales/ko.js.map +1 -1
  260. package/dist/locales/zh.js +1 -1
  261. package/dist/locales/zh.js.map +1 -1
  262. package/dist/{offers.d.ts → product-list.d.ts} +5 -5
  263. package/dist/react.js +1 -1
  264. package/dist/styles.css +1 -1
  265. package/package.json +28 -6
  266. package/dist/client-PjivPHmE.js.map +0 -1
  267. package/dist/hooks-Uiw-zW3H.js.map +0 -1
@@ -0,0 +1,1199 @@
1
+ import { E as e, S as t, p as n, r, w as i } from "./admin-utils-BK4Vh1o_.js";
2
+ import { t as a } from "./admin-button-CTL3DgOt.js";
3
+ import { t as o } from "./admin-input-CcfQfJFN.js";
4
+ import { t as s } from "./admin-skeleton-DsM7crYi.js";
5
+ import { d as c, l, r as u, s as d } from "./admin-capabilities-BuigAgtm.js";
6
+ import { c as f, d as p, n as m, o as h, s as g, u as _ } from "./admin-format-DoohJ7Fg.js";
7
+ import { t as v } from "./admin-form-field-errors-hbUMIriS.js";
8
+ import { a as y, i as b, n as x, r as S, t as C } from "./admin-select-DBgprVW6.js";
9
+ import { n as w, r as T } from "./admin-dom-uMmZzRvU.js";
10
+ import { a as E, n as D, o as O, r as k, s as A, t as j } from "./admin-table-CH9TrXJf.js";
11
+ import { t as ee } from "./admin-linked-table-row-BsaUruCN.js";
12
+ import { t as M } from "./admin-badge-DR5-1qd8.js";
13
+ import { t as te } from "./admin-status-badge-BFPgo71d.js";
14
+ import { a as N, i as P, n as F, o as I, r as L, s as R, t as z } from "./admin-dialog-BjuKI5Hp.js";
15
+ import { t as B } from "./admin-label-BiEN5cjb.js";
16
+ import { t as ne } from "./admin-switch-BJUxLCsa.js";
17
+ import { n as re, r as ie } from "./admin-dialog-width-BPrgdYlj.js";
18
+ import { i as V, n as ae, r as oe, t as se } from "./admin-price-format-DM1qORWI.js";
19
+ import { t as ce } from "./admin-textarea-DEz38RaI.js";
20
+ import { r as le, t as ue } from "./admin-card-bzAks3-3.js";
21
+ import { t as de } from "./admin-price-wizard-CI7K-2Nz.js";
22
+ import * as H from "react";
23
+ import { useMutation as U, useQuery as W, useQueryClient as G } from "@tanstack/react-query";
24
+ import { Fragment as fe, jsx as K, jsxs as q } from "react/jsx-runtime";
25
+ import { HugeiconsIcon as J } from "@hugeicons/react";
26
+ import { Add01Icon as pe, BubbleChatQuestionIcon as me, Cancel01Icon as he, Loading02Icon as ge, Refresh01Icon as _e, SparklesIcon as ve } from "@hugeicons/core-free-icons";
27
+ import { useForm as Y } from "@tanstack/react-form";
28
+ //#region src/admin/pages/catalog/application-dialog.tsx
29
+ function ye() {
30
+ let { toast: r, toastApiError: o, selectedMerchant: s, adminMutations: c } = n(), { id: l, text: u } = e(), [d, f] = H.useState(!1), [p, m] = H.useState(""), [h, g] = H.useState(!1), [_, v] = H.useState(), [y, b] = H.useState(), [x, S] = H.useState(""), [C, w] = H.useState(!1), [T, E] = H.useState(), D = U(c.applyCatalog(G())), O = () => {
31
+ E(s()), m(JSON.stringify({
32
+ schema_version: 1,
33
+ prune: !1,
34
+ products: {}
35
+ }, null, 2)), v(void 0), b(void 0), g(!1), w(!1), S("");
36
+ }, k = async (e = !1) => {
37
+ if (s() !== T) {
38
+ S("This draft belongs to another selected merchant. Return to that merchant before applying it.");
39
+ return;
40
+ }
41
+ let n = _ ?? p;
42
+ v(n), w(!1), S("");
43
+ try {
44
+ let t = await D.mutateAsync({
45
+ document: n,
46
+ force: e
47
+ });
48
+ b(t);
49
+ let i = t.conflicts?.length ?? 0;
50
+ S(t.replayed ? "This batch was already applied. No changes were repeated, and later catalog edits were preserved." : i > 0 ? `Applied everything no edit changed. ${i} ${i === 1 ? "object was" : "objects were"} skipped because an edit set ${i === 1 ? "its" : "their"} fields differently: change the batch to agree, remove those fields, or overwrite the edits.` : "Batch applied. Review the current catalog before preparing another batch."), i > 0 ? r.warning(`Catalog batch applied; ${i} skipped`) : r.success(t.replayed ? "Original batch receipt returned" : "Catalog batch applied");
51
+ } catch (e) {
52
+ let n = e instanceof t && e.status >= 400 && e.status < 500 && e.status !== 408;
53
+ w(n), S(n ? "Batch refused. Review the error and edit the document before trying again." : "The outcome could not be confirmed. Retry this exact document to retrieve its receipt without repeating changes."), o(e, "Apply catalog");
54
+ }
55
+ };
56
+ return /* @__PURE__ */ q(z, {
57
+ open: d,
58
+ onOpenChange: (e) => {
59
+ D.isPending || (f(e), e && !p && O());
60
+ },
61
+ children: [/* @__PURE__ */ K(R, { render: /* @__PURE__ */ K(a, {
62
+ variant: "outline",
63
+ size: "sm",
64
+ children: /* @__PURE__ */ K(i, { id: "Apply catalog" })
65
+ }) }), /* @__PURE__ */ q(F, {
66
+ className: ie,
67
+ children: [
68
+ /* @__PURE__ */ q(N, { children: [/* @__PURE__ */ K(I, { children: /* @__PURE__ */ K(i, { id: "Apply catalog changes" }) }), /* @__PURE__ */ K(L, { children: /* @__PURE__ */ K(i, { id: "Paste a JSON or YAML catalog batch; products, prices and meters are maps keyed by their key. Each product, price and meter applies whole, unless a field it names was set differently by an edit: it is skipped and listed, and the rest applies. A batch that applied whole is remembered; retries preserve later catalog edits. Omitted records stay unchanged unless prune is true, which archives the omitted ones only batches set." }) })] }),
69
+ /* @__PURE__ */ q("div", {
70
+ className: "grid gap-3",
71
+ children: [
72
+ /* @__PURE__ */ K(B, {
73
+ htmlFor: l("catalog-application"),
74
+ children: /* @__PURE__ */ K(i, { id: "Catalog document" })
75
+ }),
76
+ /* @__PURE__ */ K(ce, {
77
+ id: l("catalog-application"),
78
+ className: "max-h-80 min-h-48 font-mono text-xs",
79
+ spellCheck: !1,
80
+ value: p,
81
+ disabled: _ !== void 0,
82
+ onChange: (e) => {
83
+ m(e.target.value), g(!1);
84
+ }
85
+ }),
86
+ h && !_ && /* @__PURE__ */ K("p", {
87
+ className: "text-sm",
88
+ children: /* @__PURE__ */ K(i, { id: "Review complete. Applying sends this exact document; this is not a database diff." })
89
+ }),
90
+ x && /* @__PURE__ */ K("p", {
91
+ role: "status",
92
+ className: "text-sm",
93
+ children: x
94
+ }),
95
+ y && y.conflicts.length > 0 && /* @__PURE__ */ K(be, { conflicts: y.conflicts }),
96
+ y && /* @__PURE__ */ K("pre", {
97
+ "aria-label": u("Batch receipt"),
98
+ className: "max-h-48 overflow-auto rounded-md border p-3 text-xs",
99
+ children: JSON.stringify(y, null, 2)
100
+ })
101
+ ]
102
+ }),
103
+ /* @__PURE__ */ q(P, { children: [
104
+ C && /* @__PURE__ */ K(a, {
105
+ variant: "outline",
106
+ onClick: () => {
107
+ v(void 0), g(!1), w(!1), S("");
108
+ },
109
+ children: /* @__PURE__ */ K(i, { id: "Edit batch" })
110
+ }),
111
+ y && y.conflicts.length > 0 && /* @__PURE__ */ K(a, {
112
+ variant: "destructive",
113
+ disabled: D.isPending,
114
+ onClick: () => void k(!0),
115
+ children: /* @__PURE__ */ K(i, { id: "Overwrite edits" })
116
+ }),
117
+ y ? /* @__PURE__ */ K(a, {
118
+ onClick: () => O(),
119
+ children: /* @__PURE__ */ K(i, { id: "New batch" })
120
+ }) : _ === void 0 ? h ? /* @__PURE__ */ K(a, {
121
+ disabled: !p.trim(),
122
+ onClick: () => void k(),
123
+ children: /* @__PURE__ */ K(i, { id: "Apply reviewed batch" })
124
+ }) : /* @__PURE__ */ K(a, {
125
+ disabled: !p.trim(),
126
+ onClick: () => g(!0),
127
+ children: /* @__PURE__ */ K(i, { id: "Review batch" })
128
+ }) : /* @__PURE__ */ K(a, {
129
+ disabled: D.isPending || C,
130
+ onClick: () => void k(),
131
+ children: D.isPending ? "Applying…" : "Retry exact batch"
132
+ })
133
+ ] })
134
+ ]
135
+ })]
136
+ });
137
+ }
138
+ function be({ conflicts: t }) {
139
+ let { text: n } = e();
140
+ return /* @__PURE__ */ K("ul", {
141
+ "aria-label": n("Skipped objects"),
142
+ className: "grid gap-2 text-sm",
143
+ children: t.map((e) => /* @__PURE__ */ q("li", {
144
+ className: "rounded-md border p-2",
145
+ children: [/* @__PURE__ */ q("p", {
146
+ className: "font-medium",
147
+ children: [
148
+ e.product_key ? `Price ${e.key} of product ${e.product_key}` : `${e.object === "meter" ? "Meter" : "Product"} ${e.key}`,
149
+ " ",
150
+ /* @__PURE__ */ K(i, { id: "skipped" })
151
+ ]
152
+ }), /* @__PURE__ */ K("ul", {
153
+ className: "mt-1 grid gap-1 text-xs text-muted-foreground",
154
+ children: e.fields.map((t) => /* @__PURE__ */ q("li", { children: [
155
+ t.field,
156
+ /* @__PURE__ */ K(i, { id: ": the batch says" }),
157
+ " ",
158
+ xe(t, t.file_value, e.currency),
159
+ /* @__PURE__ */ K(i, { id: ", an edit set" }),
160
+ " ",
161
+ xe(t, t.live_value, e.currency),
162
+ " (",
163
+ t.set_by,
164
+ ", ",
165
+ h(t.set_at),
166
+ ")"
167
+ ] }, t.field))
168
+ })]
169
+ }, `${e.object}:${e.product_key ?? ""}:${e.key}`))
170
+ });
171
+ }
172
+ function xe(e, t, n) {
173
+ return t == null ? "none" : (e.field === "unit_amount" || e.field === "trial_unit_amount") && typeof t == "string" && n ? g(t, n) : e.field.endsWith("_hours") && typeof t == "number" ? oe(t) : JSON.stringify(t);
174
+ }
175
+ //#endregion
176
+ //#region src/admin/pages/catalog/copilot-panel.tsx
177
+ function Se({ enabled: r, draftingEnabled: s }) {
178
+ let { text: c } = e(), { adminMutations: l } = n(), u = U(l.askCatalogCopilot()), d = Y({
179
+ defaultValues: { question: "" },
180
+ onSubmit: async ({ value: e }) => {
181
+ let t = e.question.trim();
182
+ if (t) {
183
+ u.reset();
184
+ try {
185
+ await u.mutateAsync(t);
186
+ } catch {}
187
+ }
188
+ }
189
+ }), f = u.data, p = u.error ? u.error instanceof t ? u.error.message : "ask failed" : null;
190
+ return r ? /* @__PURE__ */ K(ue, { children: /* @__PURE__ */ q(le, {
191
+ className: "flex flex-col gap-3",
192
+ children: [
193
+ /* @__PURE__ */ q("form", {
194
+ className: "flex items-center gap-2",
195
+ onSubmit: (e) => {
196
+ e.preventDefault(), e.stopPropagation(), d.handleSubmit();
197
+ },
198
+ children: [
199
+ /* @__PURE__ */ K(J, {
200
+ icon: me,
201
+ className: "size-4 shrink-0 text-muted-foreground"
202
+ }),
203
+ /* @__PURE__ */ K(d.Field, {
204
+ name: "question",
205
+ children: (e) => /* @__PURE__ */ K(o, {
206
+ value: e.state.value,
207
+ onBlur: e.handleBlur,
208
+ onChange: (t) => e.handleChange(t.target.value),
209
+ placeholder: s ? "Ask about your catalog, or ask for a change — e.g. \"who is still on the old premium price?\" or \"raise premium to $12\"" : "Ask about your catalog — e.g. \"what do we sell?\" or \"who is still on the old premium price?\"",
210
+ className: "flex-1"
211
+ })
212
+ }),
213
+ /* @__PURE__ */ K(d.Subscribe, {
214
+ selector: (e) => [e.values.question, e.isSubmitting],
215
+ children: ([e, t]) => /* @__PURE__ */ q(a, {
216
+ type: "submit",
217
+ size: "sm",
218
+ disabled: t || !e.trim(),
219
+ children: [t ? /* @__PURE__ */ K(J, {
220
+ icon: ge,
221
+ className: "size-3.5 animate-spin"
222
+ }) : null, /* @__PURE__ */ K(i, { id: "Ask" })]
223
+ })
224
+ })
225
+ ]
226
+ }),
227
+ u.isPending ? /* @__PURE__ */ K("p", {
228
+ className: "text-xs text-muted-foreground",
229
+ children: /* @__PURE__ */ K(i, { id: "Checking your catalog…" })
230
+ }) : null,
231
+ p ? /* @__PURE__ */ K("p", {
232
+ className: "text-xs whitespace-pre-wrap text-destructive",
233
+ role: "alert",
234
+ children: p
235
+ }) : null,
236
+ f ? /* @__PURE__ */ q("div", {
237
+ className: "flex flex-col gap-3",
238
+ children: [
239
+ /* @__PURE__ */ q("div", {
240
+ className: "flex items-start justify-between gap-2",
241
+ children: [/* @__PURE__ */ K("p", {
242
+ className: "text-sm whitespace-pre-wrap",
243
+ children: f.answer
244
+ }), /* @__PURE__ */ K(a, {
245
+ variant: "ghost",
246
+ size: "icon",
247
+ className: "size-6 shrink-0",
248
+ "aria-label": c("Dismiss answer"),
249
+ onClick: () => {
250
+ u.reset();
251
+ },
252
+ children: /* @__PURE__ */ K(J, {
253
+ icon: he,
254
+ className: "size-3.5"
255
+ })
256
+ })]
257
+ }),
258
+ f.evidence.length > 0 && /* @__PURE__ */ K("div", {
259
+ className: "flex flex-col gap-2",
260
+ children: f.evidence.map((e, t) => /* @__PURE__ */ q("div", {
261
+ className: "rounded-lg border bg-muted/30 p-2",
262
+ children: [/* @__PURE__ */ K("span", {
263
+ className: "mb-1 block text-xs font-medium text-muted-foreground uppercase",
264
+ children: e.tool
265
+ }), /* @__PURE__ */ K("pre", {
266
+ className: "max-h-48 overflow-auto text-xs whitespace-pre-wrap",
267
+ children: e.summary
268
+ })]
269
+ }, t))
270
+ }),
271
+ f.drafts?.map((e, t) => /* @__PURE__ */ K(Ce, {
272
+ draft: e,
273
+ draftingEnabled: s
274
+ }, t))
275
+ ]
276
+ }) : null
277
+ ]
278
+ }) }) : null;
279
+ }
280
+ function Ce({ draft: e, draftingEnabled: t }) {
281
+ let n = d() && t;
282
+ return e.kind === "refused" && e.refusal ? /* @__PURE__ */ q("div", {
283
+ className: "rounded-lg border border-dashed p-3 text-xs",
284
+ children: [
285
+ /* @__PURE__ */ K("p", {
286
+ className: "mb-1 flex items-center gap-2 font-medium",
287
+ children: /* @__PURE__ */ q(M, {
288
+ variant: "secondary",
289
+ children: [/* @__PURE__ */ K(i, { id: "refused: " }), e.refusal.code]
290
+ })
291
+ }),
292
+ /* @__PURE__ */ K("p", {
293
+ className: "text-muted-foreground",
294
+ children: e.refusal.reason
295
+ }),
296
+ /* @__PURE__ */ K("p", {
297
+ className: "mt-1",
298
+ children: e.refusal.workaround
299
+ })
300
+ ]
301
+ }) : e.kind === "price_change" && e.price_change ? /* @__PURE__ */ K(we, {
302
+ draft: e.price_change,
303
+ canApply: n
304
+ }) : e.kind === "new_price" && e.new_price ? /* @__PURE__ */ K(Te, {
305
+ draft: e.new_price,
306
+ canApply: n
307
+ }) : null;
308
+ }
309
+ function we({ draft: e, canApply: t }) {
310
+ let { toastApiError: r, adminMutations: o } = n(), s = U(o.loadCatalogPriceDraft());
311
+ return /* @__PURE__ */ q("div", {
312
+ className: "rounded-lg border bg-muted/30 p-3 text-sm",
313
+ children: [
314
+ /* @__PURE__ */ q("div", {
315
+ className: "mb-1 flex items-center gap-2",
316
+ children: [
317
+ /* @__PURE__ */ K(J, {
318
+ icon: ve,
319
+ className: "size-3.5 text-muted-foreground"
320
+ }),
321
+ /* @__PURE__ */ K("span", {
322
+ className: "text-xs font-medium text-muted-foreground uppercase",
323
+ children: /* @__PURE__ */ K(i, { id: "Draft: price change" })
324
+ }),
325
+ /* @__PURE__ */ K(M, {
326
+ variant: "secondary",
327
+ children: BigInt(e.new_amount) > BigInt(e.current_amount) ? "increase" : "decrease"
328
+ })
329
+ ]
330
+ }),
331
+ /* @__PURE__ */ K("p", { children: e.review_text }),
332
+ /* @__PURE__ */ q("p", {
333
+ className: "mt-1 text-xs text-muted-foreground",
334
+ children: [
335
+ g(e.current_amount, e.currency),
336
+ " →",
337
+ " ",
338
+ g(e.new_amount, e.currency),
339
+ " ·",
340
+ " ",
341
+ e.affected_count.toLocaleString(),
342
+ /* @__PURE__ */ K(i, { id: " affected · requires human confirm" })
343
+ ]
344
+ }),
345
+ t && (s.data ? /* @__PURE__ */ K(de, {
346
+ price: s.data.price,
347
+ productName: s.data.productName,
348
+ productKey: s.data.productKey,
349
+ draft: e,
350
+ onDone: () => s.reset()
351
+ }) : /* @__PURE__ */ K(a, {
352
+ size: "sm",
353
+ className: "mt-2",
354
+ disabled: s.isPending,
355
+ onClick: async () => {
356
+ if (t) try {
357
+ await s.mutateAsync({
358
+ productKey: e.product_key,
359
+ priceKey: e.price_key
360
+ });
361
+ } catch (e) {
362
+ r(e, "Load draft for review");
363
+ }
364
+ },
365
+ children: s.isPending ? "Loading…" : "Review in wizard"
366
+ }))
367
+ ]
368
+ });
369
+ }
370
+ function Te({ draft: e, canApply: t }) {
371
+ let { toastApiError: r, adminMutations: o } = n(), s = G(), c = U(o.createCatalogDraftPrice(s));
372
+ return /* @__PURE__ */ q("div", {
373
+ className: "rounded-lg border bg-muted/30 p-3 text-sm",
374
+ children: [
375
+ /* @__PURE__ */ q("div", {
376
+ className: "mb-1 flex items-center gap-2",
377
+ children: [/* @__PURE__ */ K(J, {
378
+ icon: ve,
379
+ className: "size-3.5 text-muted-foreground"
380
+ }), /* @__PURE__ */ K("span", {
381
+ className: "text-xs font-medium text-muted-foreground uppercase",
382
+ children: /* @__PURE__ */ K(i, { id: "Draft: new price" })
383
+ })]
384
+ }),
385
+ /* @__PURE__ */ K("p", { children: e.review_text }),
386
+ /* @__PURE__ */ q("p", {
387
+ className: "mt-1 text-xs text-muted-foreground",
388
+ children: [
389
+ /* @__PURE__ */ K(i, { id: "key: " }),
390
+ e.create_price.key,
391
+ " ·",
392
+ " ",
393
+ g(e.create_price.unit_amount, e.create_price.currency)
394
+ ]
395
+ }),
396
+ t && /* @__PURE__ */ K(a, {
397
+ size: "sm",
398
+ className: "mt-2",
399
+ disabled: c.isPending || c.isSuccess,
400
+ onClick: async () => {
401
+ if (t) try {
402
+ await c.mutateAsync(e.create_price);
403
+ } catch (e) {
404
+ r(e, "Create drafted price");
405
+ }
406
+ },
407
+ children: c.isSuccess ? "Created" : c.isPending ? "Creating…" : "Create this price"
408
+ })
409
+ ]
410
+ });
411
+ }
412
+ //#endregion
413
+ //#region src/admin/pages/catalog/index.tsx
414
+ var X = H.createContext(!1);
415
+ function Ee({ title: e, children: t }) {
416
+ let n = u()?.assistants, r = d();
417
+ return /* @__PURE__ */ K(X.Provider, {
418
+ value: r,
419
+ children: /* @__PURE__ */ q("div", {
420
+ className: "flex flex-col gap-4",
421
+ children: [
422
+ /* @__PURE__ */ K("h1", {
423
+ className: "text-2xl font-semibold tracking-tight",
424
+ children: e
425
+ }),
426
+ /* @__PURE__ */ K(Se, {
427
+ enabled: n?.catalog_copilot ?? !1,
428
+ draftingEnabled: r && (n?.catalog_drafting ?? !1)
429
+ }),
430
+ !r && /* @__PURE__ */ K("p", {
431
+ className: "text-sm text-muted-foreground",
432
+ children: /* @__PURE__ */ K(i, { id: "Catalog updates are unavailable. You can still browse products and prices." })
433
+ }),
434
+ t
435
+ ]
436
+ })
437
+ });
438
+ }
439
+ function De() {
440
+ let { text: t } = e();
441
+ return /* @__PURE__ */ K(Ee, {
442
+ title: t("Products"),
443
+ children: /* @__PURE__ */ K(Ae, {})
444
+ });
445
+ }
446
+ function Oe() {
447
+ let { text: t } = e();
448
+ return /* @__PURE__ */ K(Ee, {
449
+ title: t("Prices"),
450
+ children: /* @__PURE__ */ K(Pe, {})
451
+ });
452
+ }
453
+ function ke() {
454
+ let { text: t } = e();
455
+ return l() ? /* @__PURE__ */ q("div", {
456
+ className: "flex flex-col gap-4",
457
+ children: [/* @__PURE__ */ K("h1", {
458
+ className: "text-2xl font-semibold tracking-tight",
459
+ children: t("Drift")
460
+ }), /* @__PURE__ */ K(Le, {})]
461
+ }) : null;
462
+ }
463
+ var Z = 100;
464
+ function Ae() {
465
+ let { adminQueries: e } = n(), t = H.useContext(X), r = T("", Z), { data: a, isPending: o, isFetching: c } = W(e.products({
466
+ limit: r.size,
467
+ cursor: r.cursor,
468
+ errorAction: "Load products"
469
+ }));
470
+ return /* @__PURE__ */ q("div", {
471
+ className: "flex flex-col gap-3",
472
+ children: [
473
+ /* @__PURE__ */ K("div", {
474
+ className: "flex justify-end gap-2",
475
+ children: t && /* @__PURE__ */ q(fe, { children: [/* @__PURE__ */ K(ye, {}), /* @__PURE__ */ K(Ne, {})] })
476
+ }),
477
+ o ? /* @__PURE__ */ K("div", {
478
+ className: "flex flex-col gap-3 py-2",
479
+ children: Array.from({ length: 4 }).map((e, t) => /* @__PURE__ */ K(s, { className: "h-6 w-full" }, t))
480
+ }) : /* @__PURE__ */ K("div", {
481
+ className: "overflow-x-auto",
482
+ children: /* @__PURE__ */ q(j, { children: [/* @__PURE__ */ K(O, { children: /* @__PURE__ */ q(A, {
483
+ className: "hover:bg-transparent",
484
+ children: [
485
+ /* @__PURE__ */ K(E, {
486
+ className: "text-muted-foreground",
487
+ children: /* @__PURE__ */ K(i, { id: "Product" })
488
+ }),
489
+ /* @__PURE__ */ K(E, {
490
+ className: "text-muted-foreground",
491
+ children: /* @__PURE__ */ K(i, { id: "Key" })
492
+ }),
493
+ /* @__PURE__ */ K(E, {
494
+ className: "text-muted-foreground",
495
+ children: /* @__PURE__ */ K(i, { id: "Tier" })
496
+ }),
497
+ /* @__PURE__ */ K(E, {
498
+ className: "text-muted-foreground",
499
+ children: /* @__PURE__ */ K(i, { id: "Entitlements" })
500
+ }),
501
+ /* @__PURE__ */ K(E, {
502
+ className: "text-muted-foreground",
503
+ children: /* @__PURE__ */ K(i, { id: "State" })
504
+ }),
505
+ /* @__PURE__ */ K(E, {})
506
+ ]
507
+ }) }), /* @__PURE__ */ q(D, { children: [(a?.data ?? []).map((e) => /* @__PURE__ */ K(je, { product: e }, e.id)), !a?.data?.length && /* @__PURE__ */ K(A, { children: /* @__PURE__ */ K(k, {
508
+ colSpan: 6,
509
+ className: "h-24 text-center text-muted-foreground",
510
+ children: /* @__PURE__ */ K(i, { id: "No products yet." })
511
+ }) })] })] })
512
+ }),
513
+ /* @__PURE__ */ K(w, {
514
+ pages: r,
515
+ rows: a?.data?.length ?? 0,
516
+ nextCursor: a?.next_cursor,
517
+ busy: c,
518
+ sizes: [
519
+ 50,
520
+ 100,
521
+ 200
522
+ ]
523
+ })
524
+ ]
525
+ });
526
+ }
527
+ function je({ product: e }) {
528
+ let { toast: t, toastApiError: r, adminMutations: o } = n(), s = H.useContext(X), c = G(), l = U(o.setProductActive(c));
529
+ return /* @__PURE__ */ q(A, {
530
+ className: e.archived ? "opacity-60" : void 0,
531
+ children: [
532
+ /* @__PURE__ */ K(k, {
533
+ className: "font-medium",
534
+ children: e.display_name
535
+ }),
536
+ /* @__PURE__ */ K(k, {
537
+ className: "text-xs text-muted-foreground",
538
+ children: e.key
539
+ }),
540
+ /* @__PURE__ */ K(k, { children: e.tier_group ? `${e.tier_group} #${e.tier_rank}` : "—" }),
541
+ /* @__PURE__ */ K(k, { children: /* @__PURE__ */ K("span", {
542
+ className: "flex flex-wrap gap-1",
543
+ children: e.entitlements.map((e) => /* @__PURE__ */ K(M, {
544
+ variant: "secondary",
545
+ className: "text-[10px]",
546
+ children: e
547
+ }, e))
548
+ }) }),
549
+ /* @__PURE__ */ K(k, { children: e.archived ? /* @__PURE__ */ K(M, {
550
+ variant: "secondary",
551
+ children: /* @__PURE__ */ K(i, { id: "archived" })
552
+ }) : /* @__PURE__ */ K(te, { status: "active" }) }),
553
+ /* @__PURE__ */ K(k, {
554
+ className: "text-right",
555
+ children: s && /* @__PURE__ */ q("div", {
556
+ className: "flex justify-end gap-2",
557
+ children: [s && /* @__PURE__ */ K(Ne, { product: e }), /* @__PURE__ */ K(a, {
558
+ variant: "outline",
559
+ size: "sm",
560
+ disabled: !s || l.isPending,
561
+ onClick: async () => {
562
+ try {
563
+ await l.mutateAsync({
564
+ id: e.id,
565
+ active: e.archived,
566
+ revision: e.revision
567
+ }), t.success(e.archived ? "Product activated" : "Product deactivated");
568
+ } catch (e) {
569
+ r(e, "Toggle product");
570
+ }
571
+ },
572
+ children: e.archived ? "Activate" : "Deactivate"
573
+ })]
574
+ })
575
+ })
576
+ ]
577
+ });
578
+ }
579
+ function Me(e) {
580
+ return {
581
+ key: e?.key ?? "",
582
+ name: e?.display_name ?? "",
583
+ description: e?.description ?? "",
584
+ tierGroup: e?.tier_group ?? "",
585
+ tierRank: String(e?.tier_rank ?? 0),
586
+ entitlements: (e?.entitlements ?? []).join(",")
587
+ };
588
+ }
589
+ function Ne({ product: t }) {
590
+ let { toast: r, toastApiError: s, adminMutations: c } = n(), { text: l, id: u } = e(), [d, f] = H.useState(!1), p = G(), m = U(c.createProduct(p)), h = U(c.updateProduct(p)), g = Y({
591
+ defaultValues: Me(t),
592
+ onSubmit: async ({ value: e }) => {
593
+ let n = e.entitlements.split(",").map((e) => e.trim()).filter(Boolean);
594
+ try {
595
+ t ? (await h.mutateAsync({
596
+ id: t.id,
597
+ product: {
598
+ display_name: e.name,
599
+ description: e.description,
600
+ tier_group: e.tierGroup || null,
601
+ tier_rank: Number(e.tierRank) || 0,
602
+ entitlements: n,
603
+ expected_revision: t.revision
604
+ }
605
+ }), r.success("Product updated")) : (await m.mutateAsync({
606
+ key: e.key,
607
+ display_name: e.name,
608
+ description: e.description,
609
+ tier_group: e.tierGroup || void 0,
610
+ tier_rank: Number(e.tierRank) || 0,
611
+ entitlements: n
612
+ }), r.success("Product created")), g.reset(e), f(!1);
613
+ } catch (e) {
614
+ s(e, t ? "Update product" : "Create product");
615
+ }
616
+ }
617
+ });
618
+ return /* @__PURE__ */ q(z, {
619
+ open: d,
620
+ onOpenChange: (e) => {
621
+ e && g.reset(Me(t)), f(e);
622
+ },
623
+ children: [/* @__PURE__ */ K(R, { render: t ? /* @__PURE__ */ K(a, {
624
+ variant: "outline",
625
+ size: "sm",
626
+ children: /* @__PURE__ */ K(i, { id: "Edit" })
627
+ }) : /* @__PURE__ */ q(a, {
628
+ size: "sm",
629
+ children: [/* @__PURE__ */ K(J, {
630
+ icon: pe,
631
+ className: "size-4"
632
+ }), /* @__PURE__ */ K(i, { id: " Product" })]
633
+ }) }), /* @__PURE__ */ q(F, {
634
+ className: re,
635
+ children: [/* @__PURE__ */ q(N, { children: [/* @__PURE__ */ K(I, { children: t ? "Edit product" : "New product" }), /* @__PURE__ */ K(L, { children: /* @__PURE__ */ K(i, { id: "A product is the thing a customer gets. You set what it costs afterwards, by adding a price to it." }) })] }), /* @__PURE__ */ q("form", {
636
+ onSubmit: (e) => {
637
+ e.preventDefault(), e.stopPropagation(), g.handleSubmit();
638
+ },
639
+ className: "grid gap-4",
640
+ children: [/* @__PURE__ */ q("div", {
641
+ className: "grid gap-3",
642
+ children: [
643
+ !t && /* @__PURE__ */ K(g.Field, {
644
+ name: "key",
645
+ validators: { onBlur: ({ value: e }) => e.trim() ? void 0 : "Enter a product key" },
646
+ children: (e) => /* @__PURE__ */ q($, {
647
+ label: l("Key"),
648
+ id: "p-key",
649
+ hint: "A short name you use in your own code. It cannot be changed later.",
650
+ children: [/* @__PURE__ */ K(o, {
651
+ id: u("p-key"),
652
+ value: e.state.value,
653
+ onBlur: e.handleBlur,
654
+ onChange: (t) => e.handleChange(t.target.value),
655
+ placeholder: l("premium-monthly"),
656
+ "aria-invalid": e.state.meta.errors.length > 0
657
+ }), /* @__PURE__ */ K(v, { errors: e.state.meta.errors })]
658
+ })
659
+ }),
660
+ /* @__PURE__ */ K(g.Field, {
661
+ name: "name",
662
+ validators: { onBlur: ({ value: e }) => e.trim() ? void 0 : "Enter a display name" },
663
+ children: (e) => /* @__PURE__ */ q($, {
664
+ label: l("Display name"),
665
+ id: "p-name",
666
+ hint: "What customers see on checkout and invoices.",
667
+ children: [/* @__PURE__ */ K(o, {
668
+ id: u("p-name"),
669
+ value: e.state.value,
670
+ onBlur: e.handleBlur,
671
+ onChange: (t) => e.handleChange(t.target.value),
672
+ "aria-invalid": e.state.meta.errors.length > 0
673
+ }), /* @__PURE__ */ K(v, { errors: e.state.meta.errors })]
674
+ })
675
+ }),
676
+ /* @__PURE__ */ K(g.Field, {
677
+ name: "description",
678
+ children: (e) => /* @__PURE__ */ K($, {
679
+ label: l("Description"),
680
+ id: "p-desc",
681
+ children: /* @__PURE__ */ K(o, {
682
+ id: u("p-desc"),
683
+ value: e.state.value,
684
+ onBlur: e.handleBlur,
685
+ onChange: (t) => e.handleChange(t.target.value)
686
+ })
687
+ })
688
+ }),
689
+ /* @__PURE__ */ q("div", {
690
+ className: "grid grid-cols-2 gap-3",
691
+ children: [/* @__PURE__ */ K(g.Field, {
692
+ name: "tierGroup",
693
+ children: (e) => /* @__PURE__ */ K($, {
694
+ label: l("Tier group"),
695
+ id: "p-tg",
696
+ hint: "Products in one group are upgrades of each other. Leave empty if this stands alone.",
697
+ children: /* @__PURE__ */ K(o, {
698
+ id: u("p-tg"),
699
+ value: e.state.value,
700
+ onBlur: e.handleBlur,
701
+ onChange: (t) => e.handleChange(t.target.value)
702
+ })
703
+ })
704
+ }), /* @__PURE__ */ K(g.Field, {
705
+ name: "tierRank",
706
+ children: (e) => /* @__PURE__ */ K($, {
707
+ label: l("Tier rank"),
708
+ id: "p-tr",
709
+ hint: "Higher rank means a higher tier in the group.",
710
+ children: /* @__PURE__ */ K(o, {
711
+ id: u("p-tr"),
712
+ type: "number",
713
+ value: e.state.value,
714
+ onBlur: e.handleBlur,
715
+ onChange: (t) => e.handleChange(t.target.value)
716
+ })
717
+ })
718
+ })]
719
+ }),
720
+ /* @__PURE__ */ K(g.Field, {
721
+ name: "entitlements",
722
+ children: (e) => /* @__PURE__ */ K($, {
723
+ label: l("Entitlements"),
724
+ id: "p-ents",
725
+ hint: "The access names your product checks. Separate several with commas.",
726
+ children: /* @__PURE__ */ K(o, {
727
+ id: u("p-ents"),
728
+ value: e.state.value,
729
+ onBlur: e.handleBlur,
730
+ onChange: (t) => e.handleChange(t.target.value),
731
+ placeholder: l("premium, downloads")
732
+ })
733
+ })
734
+ })
735
+ ]
736
+ }), /* @__PURE__ */ K(P, { children: /* @__PURE__ */ K(g.Subscribe, {
737
+ selector: (e) => [
738
+ e.values.key,
739
+ e.values.name,
740
+ e.isSubmitting
741
+ ],
742
+ children: ([e, n, r]) => /* @__PURE__ */ q(fe, { children: [/* @__PURE__ */ K(a, {
743
+ type: "button",
744
+ variant: "outline",
745
+ disabled: r,
746
+ onClick: () => f(!1),
747
+ children: /* @__PURE__ */ K(i, { id: "Cancel" })
748
+ }), /* @__PURE__ */ K(a, {
749
+ type: "submit",
750
+ disabled: r || !n.trim() || !t && !e.trim(),
751
+ children: r ? "Saving…" : "Save product"
752
+ })] })
753
+ }) })]
754
+ })]
755
+ })]
756
+ });
757
+ }
758
+ function Pe() {
759
+ let { adminQueries: e } = n(), t = H.useContext(X), r = T("", Z), { data: a } = W(e.allProducts({ errorAction: "Load products" })), { data: o, isPending: c, isFetching: l } = W(e.prices({
760
+ limit: r.size,
761
+ cursor: r.cursor,
762
+ errorAction: "Load prices"
763
+ }));
764
+ return /* @__PURE__ */ q("div", {
765
+ className: "flex flex-col gap-3",
766
+ children: [
767
+ /* @__PURE__ */ K("div", {
768
+ className: "flex justify-end",
769
+ children: t && /* @__PURE__ */ K(Ie, { products: a?.data ?? [] })
770
+ }),
771
+ c ? /* @__PURE__ */ K("div", {
772
+ className: "flex flex-col gap-3 py-2",
773
+ children: Array.from({ length: 4 }).map((e, t) => /* @__PURE__ */ K(s, { className: "h-6 w-full" }, t))
774
+ }) : /* @__PURE__ */ K("div", {
775
+ className: "overflow-x-auto",
776
+ children: /* @__PURE__ */ q(j, { children: [/* @__PURE__ */ K(O, { children: /* @__PURE__ */ q(A, {
777
+ className: "hover:bg-transparent",
778
+ children: [
779
+ /* @__PURE__ */ K(E, {
780
+ className: "text-muted-foreground",
781
+ children: /* @__PURE__ */ K(i, { id: "Price" })
782
+ }),
783
+ /* @__PURE__ */ K(E, {
784
+ className: "text-muted-foreground",
785
+ children: /* @__PURE__ */ K(i, { id: "Product" })
786
+ }),
787
+ /* @__PURE__ */ K(E, {
788
+ className: "text-muted-foreground",
789
+ children: /* @__PURE__ */ K(i, { id: "Amount" })
790
+ }),
791
+ /* @__PURE__ */ K(E, {
792
+ className: "text-muted-foreground",
793
+ children: /* @__PURE__ */ K(i, { id: "Renews" })
794
+ }),
795
+ /* @__PURE__ */ K(E, {
796
+ className: "text-muted-foreground",
797
+ children: /* @__PURE__ */ K(i, { id: "Providers" })
798
+ }),
799
+ /* @__PURE__ */ K(E, {
800
+ className: "text-muted-foreground",
801
+ children: /* @__PURE__ */ K(i, { id: "State" })
802
+ }),
803
+ /* @__PURE__ */ K(E, {})
804
+ ]
805
+ }) }), /* @__PURE__ */ q(D, { children: [(o?.data ?? []).map((e) => /* @__PURE__ */ K(Fe, {
806
+ price: e,
807
+ product: a?.data.find((t) => t.id === e.product_id)
808
+ }, e.id)), !o?.data?.length && /* @__PURE__ */ K(A, { children: /* @__PURE__ */ K(k, {
809
+ colSpan: 7,
810
+ className: "h-24 text-center text-muted-foreground",
811
+ children: /* @__PURE__ */ K(i, { id: "No prices yet." })
812
+ }) })] })] })
813
+ }),
814
+ /* @__PURE__ */ K(w, {
815
+ pages: r,
816
+ rows: o?.data?.length ?? 0,
817
+ nextCursor: o?.next_cursor,
818
+ busy: l,
819
+ sizes: [
820
+ 50,
821
+ 100,
822
+ 200
823
+ ]
824
+ })
825
+ ]
826
+ });
827
+ }
828
+ function Fe({ price: e, product: t }) {
829
+ let { toast: o, toastApiError: s, adminMutations: c } = n(), l = t?.display_name ?? _(e.product_id, 13), u = H.useContext(X), d = G(), f = U(c.setPriceActive(d));
830
+ return /* @__PURE__ */ q(ee, {
831
+ to: `/catalog/prices/${encodeURIComponent(e.id)}`,
832
+ className: e.archived ? "opacity-60" : void 0,
833
+ children: [
834
+ /* @__PURE__ */ K(k, {
835
+ className: "text-xs text-muted-foreground",
836
+ children: /* @__PURE__ */ K(r, {
837
+ className: "underline-offset-2 hover:underline",
838
+ to: `/catalog/prices/${encodeURIComponent(e.id)}`,
839
+ children: e.id
840
+ })
841
+ }),
842
+ /* @__PURE__ */ K(k, {
843
+ className: "font-medium",
844
+ children: l
845
+ }),
846
+ /* @__PURE__ */ K(k, {
847
+ className: "tabular-nums",
848
+ children: se(e)
849
+ }),
850
+ /* @__PURE__ */ K(k, { children: ae(e) }),
851
+ /* @__PURE__ */ K(k, { children: /* @__PURE__ */ K("span", {
852
+ className: "flex flex-wrap gap-1",
853
+ children: Object.entries(e.psps ?? {}).map(([e, t]) => /* @__PURE__ */ q(M, {
854
+ variant: "secondary",
855
+ className: t.status === "linked" ? "" : "bg-held-surface text-held",
856
+ title: t.message || void 0,
857
+ children: [
858
+ e,
859
+ ": ",
860
+ t.status
861
+ ]
862
+ }, e))
863
+ }) }),
864
+ /* @__PURE__ */ K(k, { children: e.archived ? /* @__PURE__ */ K(M, {
865
+ variant: "secondary",
866
+ children: /* @__PURE__ */ K(i, { id: "archived" })
867
+ }) : /* @__PURE__ */ K(te, { status: "active" }) }),
868
+ /* @__PURE__ */ K(k, {
869
+ className: "text-right",
870
+ children: u && /* @__PURE__ */ q("div", {
871
+ className: "flex justify-end gap-2",
872
+ children: [u && /* @__PURE__ */ K(de, {
873
+ price: e,
874
+ productName: l,
875
+ productKey: t?.key
876
+ }), /* @__PURE__ */ K(a, {
877
+ variant: "outline",
878
+ size: "sm",
879
+ disabled: !u || f.isPending,
880
+ onClick: async () => {
881
+ try {
882
+ await f.mutateAsync({
883
+ id: e.id,
884
+ active: e.archived,
885
+ revision: e.revision
886
+ }), o.success(e.archived ? "Price activated" : "Price deactivated");
887
+ } catch (e) {
888
+ s(e, "Toggle price");
889
+ }
890
+ },
891
+ children: e.archived ? "Activate" : "Deactivate"
892
+ })]
893
+ })
894
+ })
895
+ ]
896
+ });
897
+ }
898
+ var Q = ({ value: e }) => !e || V(e) ? void 0 : "Use hours, days or weeks, such as 30 days";
899
+ function Ie({ products: t }) {
900
+ let { toast: r, toastApiError: s, adminMutations: c } = n(), { text: l, id: u } = e(), [d, h] = H.useState(!1), g = G(), _ = U(c.createPrice(g)), w = Y({
901
+ defaultValues: {
902
+ productId: "",
903
+ amount: "",
904
+ currency: "USD",
905
+ accessDuration: "",
906
+ billingInterval: ""
907
+ },
908
+ onSubmit: async ({ value: e }) => {
909
+ let t = f(e.amount, e.currency);
910
+ if (t === null || BigInt(t) <= 0n) return;
911
+ let n = V(e.accessDuration), i = V(e.billingInterval);
912
+ if (!(e.accessDuration && !n || e.billingInterval && !i)) try {
913
+ await _.mutateAsync({
914
+ product_id: e.productId,
915
+ unit_amount: t,
916
+ currency: e.currency,
917
+ ...n ? { access_duration_hours: n } : {},
918
+ ...i ? { billing_interval_hours: i } : {}
919
+ }), w.reset(), r.success("Price created"), h(!1);
920
+ } catch (e) {
921
+ s(e, "Create price");
922
+ }
923
+ }
924
+ }), T = (e) => {
925
+ e && w.reset(), h(e);
926
+ };
927
+ return /* @__PURE__ */ q(z, {
928
+ open: d,
929
+ onOpenChange: T,
930
+ children: [/* @__PURE__ */ K(R, { render: /* @__PURE__ */ q(a, {
931
+ size: "sm",
932
+ children: [/* @__PURE__ */ K(J, {
933
+ icon: pe,
934
+ className: "size-4"
935
+ }), /* @__PURE__ */ K(i, { id: " Price" })]
936
+ }) }), /* @__PURE__ */ q(F, {
937
+ className: re,
938
+ children: [/* @__PURE__ */ q(N, { children: [/* @__PURE__ */ K(I, { children: /* @__PURE__ */ K(i, { id: "New price" }) }), /* @__PURE__ */ K(L, { children: /* @__PURE__ */ K(i, { id: "These terms cannot be changed later. To charge a different amount, create another price and deactivate this one." }) })] }), /* @__PURE__ */ q("form", {
939
+ onSubmit: (e) => {
940
+ e.preventDefault(), e.stopPropagation(), w.handleSubmit();
941
+ },
942
+ className: "grid gap-4",
943
+ children: [/* @__PURE__ */ q("div", {
944
+ className: "grid gap-3",
945
+ children: [
946
+ /* @__PURE__ */ K(w.Field, {
947
+ name: "productId",
948
+ children: (e) => /* @__PURE__ */ K($, {
949
+ label: l("Product"),
950
+ id: "pr-prod",
951
+ children: /* @__PURE__ */ q(C, {
952
+ items: t.map((e) => ({
953
+ value: e.id,
954
+ label: `${e.display_name} (${e.key})`
955
+ })),
956
+ value: e.state.value || null,
957
+ onValueChange: (t) => e.handleChange(t ?? ""),
958
+ children: [/* @__PURE__ */ K(b, {
959
+ id: u("pr-prod"),
960
+ className: "w-full",
961
+ children: /* @__PURE__ */ K(y, { placeholder: l("Pick a product…") })
962
+ }), /* @__PURE__ */ K(x, { children: t.map((e) => /* @__PURE__ */ q(S, {
963
+ value: e.id,
964
+ children: [
965
+ e.display_name,
966
+ " (",
967
+ e.key,
968
+ ")"
969
+ ]
970
+ }, e.id)) })]
971
+ })
972
+ })
973
+ }),
974
+ /* @__PURE__ */ K($, {
975
+ label: l("Amount"),
976
+ id: "pr-amount",
977
+ hint: "Enter it the way you would write it, such as 19.90.",
978
+ children: /* @__PURE__ */ q("div", {
979
+ className: "flex gap-2",
980
+ children: [/* @__PURE__ */ K(w.Field, {
981
+ name: "amount",
982
+ validators: {
983
+ onBlurListenTo: ["currency"],
984
+ onBlur: ({ value: e, fieldApi: t }) => BigInt(f(e, t.form.getFieldValue("currency")) ?? "0") > 0n ? void 0 : "Enter an amount greater than zero"
985
+ },
986
+ children: (e) => /* @__PURE__ */ q("div", {
987
+ className: "flex-1",
988
+ children: [/* @__PURE__ */ K(o, {
989
+ id: u("pr-amount"),
990
+ type: "number",
991
+ step: "any",
992
+ min: "0",
993
+ value: e.state.value,
994
+ onBlur: e.handleBlur,
995
+ onChange: (t) => e.handleChange(t.target.value),
996
+ "aria-invalid": e.state.meta.errors.length > 0
997
+ }), /* @__PURE__ */ K(v, { errors: e.state.meta.errors })]
998
+ })
999
+ }), /* @__PURE__ */ K(w.Field, {
1000
+ name: "currency",
1001
+ validators: { onChange: ({ value: e }) => m(e) === void 0 ? `Use ${p.join(", ")}` : void 0 },
1002
+ children: (e) => /* @__PURE__ */ K(o, {
1003
+ id: u("pr-cur"),
1004
+ "aria-label": l("Currency"),
1005
+ className: "w-24",
1006
+ value: e.state.value,
1007
+ maxLength: Math.max(...p.map((e) => e.length)),
1008
+ autoCapitalize: "characters",
1009
+ spellCheck: !1,
1010
+ placeholder: l("USD"),
1011
+ onBlur: e.handleBlur,
1012
+ onChange: (t) => e.handleChange(t.target.value.toUpperCase())
1013
+ })
1014
+ })]
1015
+ })
1016
+ }),
1017
+ /* @__PURE__ */ K(w.Field, {
1018
+ name: "accessDuration",
1019
+ validators: { onBlur: Q },
1020
+ children: (e) => /* @__PURE__ */ q($, {
1021
+ label: l("Access duration"),
1022
+ id: "pr-dur",
1023
+ hint: "Such as 30 days, 1 week or 12 hours. Leave it empty for access that never expires.",
1024
+ children: [/* @__PURE__ */ K(o, {
1025
+ id: u("pr-dur"),
1026
+ placeholder: l("Never expires"),
1027
+ value: e.state.value,
1028
+ onBlur: e.handleBlur,
1029
+ onChange: (t) => e.handleChange(t.target.value),
1030
+ "aria-invalid": e.state.meta.errors.length > 0
1031
+ }), /* @__PURE__ */ K(v, { errors: e.state.meta.errors })]
1032
+ })
1033
+ }),
1034
+ /* @__PURE__ */ K(w.Field, {
1035
+ name: "billingInterval",
1036
+ validators: { onBlur: Q },
1037
+ children: (e) => /* @__PURE__ */ q("div", {
1038
+ className: "grid gap-3 rounded-md border p-3",
1039
+ children: [/* @__PURE__ */ q("div", {
1040
+ className: "flex items-center justify-between gap-4",
1041
+ children: [/* @__PURE__ */ K(B, {
1042
+ htmlFor: u("pr-renew"),
1043
+ children: /* @__PURE__ */ K(i, { id: "Recurring billing" })
1044
+ }), /* @__PURE__ */ K(ne, {
1045
+ id: u("pr-renew"),
1046
+ checked: !!e.state.value,
1047
+ onCheckedChange: (t) => e.handleChange(t ? "30 days" : "")
1048
+ })]
1049
+ }), e.state.value ? /* @__PURE__ */ q($, {
1050
+ label: l("Billing interval"),
1051
+ id: "pr-billing",
1052
+ hint: "Time between payments, such as 30 days, until the customer cancels.",
1053
+ children: [/* @__PURE__ */ K(o, {
1054
+ id: u("pr-billing"),
1055
+ required: !0,
1056
+ value: e.state.value,
1057
+ onBlur: e.handleBlur,
1058
+ onChange: (t) => e.handleChange(t.target.value),
1059
+ "aria-invalid": e.state.meta.errors.length > 0
1060
+ }), /* @__PURE__ */ K(v, { errors: e.state.meta.errors })]
1061
+ }) : /* @__PURE__ */ K("p", {
1062
+ className: "text-xs text-muted-foreground",
1063
+ children: /* @__PURE__ */ K(i, { id: "One-time payment." })
1064
+ })]
1065
+ })
1066
+ })
1067
+ ]
1068
+ }), /* @__PURE__ */ q(P, { children: [/* @__PURE__ */ K(a, {
1069
+ type: "button",
1070
+ variant: "outline",
1071
+ onClick: () => T(!1),
1072
+ children: /* @__PURE__ */ K(i, { id: "Cancel" })
1073
+ }), /* @__PURE__ */ K(w.Subscribe, {
1074
+ selector: (e) => [
1075
+ e.values.productId,
1076
+ e.values.amount,
1077
+ e.values.currency,
1078
+ e.values.accessDuration,
1079
+ e.values.billingInterval,
1080
+ e.isSubmitting
1081
+ ],
1082
+ children: ([e, t, n, r, i, o]) => /* @__PURE__ */ K(a, {
1083
+ type: "submit",
1084
+ disabled: o || !e || BigInt(f(t, n) ?? "0") <= 0n || Q({ value: r }) !== void 0 || Q({ value: i }) !== void 0,
1085
+ children: o ? "Creating…" : "Create price"
1086
+ })
1087
+ })] })]
1088
+ })]
1089
+ })]
1090
+ });
1091
+ }
1092
+ function Le() {
1093
+ let { toast: e, toastApiError: t, adminMutations: r, adminQueries: o } = n(), u = G(), d = l(), f = c(), { data: p, isPending: m } = W(o.catalogDrift(d)), g = U(r.refreshPSPs(u));
1094
+ return /* @__PURE__ */ q("div", {
1095
+ className: "flex flex-col gap-3",
1096
+ children: [/* @__PURE__ */ K("div", {
1097
+ className: "flex justify-end",
1098
+ children: f && /* @__PURE__ */ q(a, {
1099
+ variant: "outline",
1100
+ size: "sm",
1101
+ disabled: g.isPending,
1102
+ onClick: async () => {
1103
+ try {
1104
+ await g.mutateAsync(), e.success("Re-reading every PSP: new drift appears here as it is found");
1105
+ } catch (e) {
1106
+ t(e, "Refresh drift");
1107
+ }
1108
+ },
1109
+ children: [/* @__PURE__ */ K(J, {
1110
+ icon: _e,
1111
+ className: g.isPending ? "size-4 animate-spin" : "size-4"
1112
+ }), /* @__PURE__ */ K(i, { id: "Refresh scan" })]
1113
+ })
1114
+ }), m ? /* @__PURE__ */ K("div", {
1115
+ className: "flex flex-col gap-3 py-2",
1116
+ children: Array.from({ length: 4 }).map((e, t) => /* @__PURE__ */ K(s, { className: "h-6 w-full" }, t))
1117
+ }) : p?.data?.length ? /* @__PURE__ */ K("div", {
1118
+ className: "overflow-x-auto",
1119
+ children: /* @__PURE__ */ q(j, { children: [/* @__PURE__ */ K(O, { children: /* @__PURE__ */ q(A, {
1120
+ className: "hover:bg-transparent",
1121
+ children: [
1122
+ /* @__PURE__ */ K(E, {
1123
+ className: "text-muted-foreground",
1124
+ children: /* @__PURE__ */ K(i, { id: "Provider" })
1125
+ }),
1126
+ /* @__PURE__ */ K(E, {
1127
+ className: "text-muted-foreground",
1128
+ children: /* @__PURE__ */ K(i, { id: "Kind" })
1129
+ }),
1130
+ /* @__PURE__ */ K(E, {
1131
+ className: "text-muted-foreground",
1132
+ children: /* @__PURE__ */ K(i, { id: "Resource" })
1133
+ }),
1134
+ /* @__PURE__ */ K(E, {
1135
+ className: "text-muted-foreground",
1136
+ children: /* @__PURE__ */ K(i, { id: "Field" })
1137
+ }),
1138
+ /* @__PURE__ */ K(E, {
1139
+ className: "text-muted-foreground",
1140
+ children: /* @__PURE__ */ K(i, { id: "OpenRails" })
1141
+ }),
1142
+ /* @__PURE__ */ K(E, {
1143
+ className: "text-muted-foreground",
1144
+ children: /* @__PURE__ */ K(i, { id: "Remote" })
1145
+ }),
1146
+ /* @__PURE__ */ K(E, {
1147
+ className: "text-muted-foreground",
1148
+ children: /* @__PURE__ */ K(i, { id: "Detected" })
1149
+ })
1150
+ ]
1151
+ }) }), /* @__PURE__ */ K(D, { children: p.data.map((e) => /* @__PURE__ */ q(A, { children: [
1152
+ /* @__PURE__ */ K(k, { children: e.provider ?? "—" }),
1153
+ /* @__PURE__ */ K(k, { children: e.finding_type.replace(/^catalog\./, "") }),
1154
+ /* @__PURE__ */ q(k, {
1155
+ className: "text-xs",
1156
+ children: [
1157
+ e.resource_type,
1158
+ " ",
1159
+ _(e.resource_id || e.external_resource_id || "", 13)
1160
+ ]
1161
+ }),
1162
+ /* @__PURE__ */ K(k, { children: e.field || "—" }),
1163
+ /* @__PURE__ */ K(k, {
1164
+ className: "max-w-40 truncate",
1165
+ children: e.openrails_value || "—"
1166
+ }),
1167
+ /* @__PURE__ */ K(k, {
1168
+ className: "max-w-40 truncate",
1169
+ children: e.external_value || "—"
1170
+ }),
1171
+ /* @__PURE__ */ K(k, { children: h(e.created_at) })
1172
+ ] }, e.id)) })] })
1173
+ }) : /* @__PURE__ */ K("p", {
1174
+ className: "text-sm text-muted-foreground",
1175
+ children: /* @__PURE__ */ K(i, { id: "No open drift events. Catalog is in sync." })
1176
+ })]
1177
+ });
1178
+ }
1179
+ function $({ label: t, id: n, hint: r, children: i }) {
1180
+ let { id: a } = e();
1181
+ return /* @__PURE__ */ q("div", {
1182
+ className: "grid gap-1.5",
1183
+ children: [
1184
+ /* @__PURE__ */ K(B, {
1185
+ htmlFor: a(n),
1186
+ children: t
1187
+ }),
1188
+ r ? /* @__PURE__ */ K("p", {
1189
+ className: "text-[13px] text-muted-foreground",
1190
+ children: r
1191
+ }) : null,
1192
+ i
1193
+ ]
1194
+ });
1195
+ }
1196
+ //#endregion
1197
+ export { ke as CatalogDriftPage, Oe as CatalogPricesPage, De as CatalogProductsPage };
1198
+
1199
+ //# sourceMappingURL=admin-catalog-CK6CM9I2.js.map