@datatechsolutions/ui 3.5.1 → 3.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/astrlabe/index.js +107 -107
- package/dist/astrlabe/index.mjs +3 -3
- package/dist/astrlabe/workflow-canvas.js +3 -3
- package/dist/astrlabe/workflow-canvas.mjs +2 -2
- package/dist/{chunk-R3Q5RXXO.mjs → chunk-3Z66NXEB.mjs} +3 -3
- package/dist/{chunk-R3Q5RXXO.mjs.map → chunk-3Z66NXEB.mjs.map} +1 -1
- package/dist/{chunk-CDYNTHUE.mjs → chunk-4JDJRGAB.mjs} +9 -8
- package/dist/chunk-4JDJRGAB.mjs.map +1 -0
- package/dist/{chunk-EUXHJMGC.mjs → chunk-4OFG6POC.mjs} +9 -5
- package/dist/chunk-4OFG6POC.mjs.map +1 -0
- package/dist/{chunk-37ZLBCJF.mjs → chunk-5ZAZ2C7A.mjs} +6 -6
- package/dist/{chunk-37ZLBCJF.mjs.map → chunk-5ZAZ2C7A.mjs.map} +1 -1
- package/dist/{chunk-PYQLY2RH.js → chunk-6ZMTJSQF.js} +161 -161
- package/dist/chunk-6ZMTJSQF.js.map +1 -0
- package/dist/{chunk-PI2C3S6A.mjs → chunk-7LILNZMR.mjs} +3 -3
- package/dist/{chunk-PI2C3S6A.mjs.map → chunk-7LILNZMR.mjs.map} +1 -1
- package/dist/{chunk-EI6FIA45.js → chunk-AMYQSPQC.js} +16 -16
- package/dist/{chunk-EI6FIA45.js.map → chunk-AMYQSPQC.js.map} +1 -1
- package/dist/{chunk-VMIAMBCP.js → chunk-DRORQGN2.js} +39 -39
- package/dist/{chunk-VMIAMBCP.js.map → chunk-DRORQGN2.js.map} +1 -1
- package/dist/{chunk-CP5QXRXA.mjs → chunk-ESLKQJQS.mjs} +4 -4
- package/dist/{chunk-CP5QXRXA.mjs.map → chunk-ESLKQJQS.mjs.map} +1 -1
- package/dist/{chunk-K4M4B6ME.js → chunk-GCYYGSHU.js} +9 -5
- package/dist/chunk-GCYYGSHU.js.map +1 -0
- package/dist/{chunk-2TBNOQ7M.mjs → chunk-HGWVJ3VB.mjs} +21 -21
- package/dist/{chunk-2TBNOQ7M.mjs.map → chunk-HGWVJ3VB.mjs.map} +1 -1
- package/dist/{chunk-7OZ4MVEF.mjs → chunk-IHHGT3LP.mjs} +19 -19
- package/dist/{chunk-7OZ4MVEF.mjs.map → chunk-IHHGT3LP.mjs.map} +1 -1
- package/dist/{chunk-YV2SE5LS.mjs → chunk-JQYDJ75Q.mjs} +3 -3
- package/dist/{chunk-YV2SE5LS.mjs.map → chunk-JQYDJ75Q.mjs.map} +1 -1
- package/dist/{chunk-WKCR4KVQ.mjs → chunk-KDFBN2L2.mjs} +34 -31
- package/dist/chunk-KDFBN2L2.mjs.map +1 -0
- package/dist/{chunk-MT4FJRMD.js → chunk-KEWRLEYV.js} +4 -4
- package/dist/{chunk-MT4FJRMD.js.map → chunk-KEWRLEYV.js.map} +1 -1
- package/dist/{chunk-SFFSXC5E.js → chunk-LVK7VXW7.js} +54 -54
- package/dist/{chunk-SFFSXC5E.js.map → chunk-LVK7VXW7.js.map} +1 -1
- package/dist/{chunk-EGXB3WXT.mjs → chunk-MQNXKBFP.mjs} +8 -8
- package/dist/chunk-MQNXKBFP.mjs.map +1 -0
- package/dist/{chunk-ULEPJXTN.mjs → chunk-MRRFDIUQ.mjs} +3 -3
- package/dist/{chunk-ULEPJXTN.mjs.map → chunk-MRRFDIUQ.mjs.map} +1 -1
- package/dist/{chunk-U6XA2OYE.js → chunk-MUOTTGCX.js} +33 -32
- package/dist/chunk-MUOTTGCX.js.map +1 -0
- package/dist/{chunk-RQBTLFYH.js → chunk-NJZIE4EH.js} +5 -5
- package/dist/{chunk-RQBTLFYH.js.map → chunk-NJZIE4EH.js.map} +1 -1
- package/dist/{chunk-HVDDCBQ2.js → chunk-P5F257N3.js} +33 -33
- package/dist/{chunk-HVDDCBQ2.js.map → chunk-P5F257N3.js.map} +1 -1
- package/dist/{chunk-2UMDWOUY.js → chunk-QRNFTG6A.js} +4 -4
- package/dist/{chunk-2UMDWOUY.js.map → chunk-QRNFTG6A.js.map} +1 -1
- package/dist/{chunk-F5UDX6JA.js → chunk-SQZGQOKU.js} +104 -101
- package/dist/chunk-SQZGQOKU.js.map +1 -0
- package/dist/{chunk-KIBOX3UQ.js → chunk-UGJZ3M4Q.js} +53 -53
- package/dist/{chunk-KIBOX3UQ.js.map → chunk-UGJZ3M4Q.js.map} +1 -1
- package/dist/{chunk-PFHXKWFT.mjs → chunk-UOABOFKO.mjs} +3 -3
- package/dist/{chunk-PFHXKWFT.mjs.map → chunk-UOABOFKO.mjs.map} +1 -1
- package/dist/{chunk-L5O4NWQO.mjs → chunk-VDLAZR7S.mjs} +3 -3
- package/dist/{chunk-L5O4NWQO.mjs.map → chunk-VDLAZR7S.mjs.map} +1 -1
- package/dist/{chunk-CJGNEALB.mjs → chunk-VUAGVZJM.mjs} +4 -4
- package/dist/{chunk-CJGNEALB.mjs.map → chunk-VUAGVZJM.mjs.map} +1 -1
- package/dist/{chunk-QIUVK4BI.js → chunk-W5YCZOXO.js} +77 -77
- package/dist/{chunk-QIUVK4BI.js.map → chunk-W5YCZOXO.js.map} +1 -1
- package/dist/{chunk-OWJIKCR2.js → chunk-WBEZATIB.js} +13 -13
- package/dist/{chunk-OWJIKCR2.js.map → chunk-WBEZATIB.js.map} +1 -1
- package/dist/{chunk-KRPSTXN5.js → chunk-YOJIPZ72.js} +9 -9
- package/dist/{chunk-KRPSTXN5.js.map → chunk-YOJIPZ72.js.map} +1 -1
- package/dist/{chunk-5AVO5DJO.js → chunk-YTE6WCBX.js} +76 -76
- package/dist/{chunk-5AVO5DJO.js.map → chunk-YTE6WCBX.js.map} +1 -1
- package/dist/{chunk-R6O57NTJ.mjs → chunk-ZYVDDSAC.mjs} +6 -6
- package/dist/{chunk-R6O57NTJ.mjs.map → chunk-ZYVDDSAC.mjs.map} +1 -1
- package/dist/index.js +704 -704
- package/dist/index.mjs +1 -1
- package/dist/platform/admin/index.js +10 -10
- package/dist/platform/admin/index.mjs +4 -4
- package/dist/platform/agents-workspace.js +6 -6
- package/dist/platform/agents-workspace.mjs +5 -5
- package/dist/platform/app-shell.js +3 -3
- package/dist/platform/app-shell.mjs +2 -2
- package/dist/platform/auth/index.js +27 -27
- package/dist/platform/auth/index.mjs +4 -4
- package/dist/platform/billing/index.js +3 -3
- package/dist/platform/billing/index.mjs +2 -2
- package/dist/platform/impersonation/index.js +3 -3
- package/dist/platform/impersonation/index.mjs +2 -2
- package/dist/platform/index.js +82 -82
- package/dist/platform/index.mjs +18 -18
- package/dist/platform/pages/index.d.mts +1 -0
- package/dist/platform/pages/index.d.ts +1 -0
- package/dist/platform/pages/index.js +477 -448
- package/dist/platform/pages/index.js.map +1 -1
- package/dist/platform/pages/index.mjs +335 -306
- package/dist/platform/pages/index.mjs.map +1 -1
- package/dist/platform/settings/index.js +7 -7
- package/dist/platform/settings/index.mjs +6 -6
- package/dist/platform/workflow-canvas-shell.js +4 -4
- package/dist/platform/workflow-canvas-shell.mjs +3 -3
- package/package.json +1 -1
- package/dist/chunk-CDYNTHUE.mjs.map +0 -1
- package/dist/chunk-EGXB3WXT.mjs.map +0 -1
- package/dist/chunk-EUXHJMGC.mjs.map +0 -1
- package/dist/chunk-F5UDX6JA.js.map +0 -1
- package/dist/chunk-K4M4B6ME.js.map +0 -1
- package/dist/chunk-PYQLY2RH.js.map +0 -1
- package/dist/chunk-U6XA2OYE.js.map +0 -1
- package/dist/chunk-WKCR4KVQ.mjs.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { useImpersonation, Button } from './chunk-
|
|
2
|
+
import { useImpersonation, Button } from './chunk-4OFG6POC.mjs';
|
|
3
3
|
import { useState } from 'react';
|
|
4
4
|
import { EyeIcon, XMarkIcon } from '@heroicons/react/24/outline';
|
|
5
5
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
@@ -56,5 +56,5 @@ function ImpersonationBanner({ onExit, className }) {
|
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
export { ImpersonationBanner };
|
|
59
|
-
//# sourceMappingURL=chunk-
|
|
60
|
-
//# sourceMappingURL=chunk-
|
|
59
|
+
//# sourceMappingURL=chunk-7LILNZMR.mjs.map
|
|
60
|
+
//# sourceMappingURL=chunk-7LILNZMR.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/platform/impersonation/impersonation-banner.tsx"],"names":[],"mappings":";;;;;AAoBO,SAAS,mBAAA,CAAoB,EAAE,MAAA,EAAQ,SAAA,EAAU,EAA6B;AACnF,EAAA,MAAM,EAAE,eAAA,EAAiB,KAAA,EAAO,IAAA,KAAS,gBAAA,EAAiB;AAC1D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAEhD,EAAA,IAAI,CAAC,eAAA,IAAmB,CAAC,KAAA,EAAO,OAAO,IAAA;AAEvC,EAAA,MAAM,aAAa,YAAY;AAC7B,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,EAAK;AACX,MAAA,MAAA,IAAS;AAAA,IACX,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA;AAEA,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,WAAA,EAAU,QAAA;AAAA,MACV,SAAA,EACE,kJAEC,SAAA,IAAa,EAAA,CAAA;AAAA,MAGhB,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,OAAA,EAAA,EAAQ,aAAA,EAAY,MAAA,EAAO,SAAA,EAAU,kBAAA,EAAmB,CAAA;AAAA,+BACxD,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,YAAA,8DAAA;AAAA,YACoD,GAAA;AAAA,4BACxD,GAAA,CAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,KAAA,CAAM,KAAA,IAAS,MAAM,GAAA,EAAI,CAAA;AAAA,YACjC,KAAA,CAAM,yBACL,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,cAAA,QAAA;AAAA,8BACD,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAU,gBAAM,MAAA,EAAO;AAAA,aAAA,EACzC,CAAA,GACE;AAAA,WAAA,EACN;AAAA,SAAA,EACF,CAAA;AAAA,wBACA,IAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,IAAA;AAAA,YACL,KAAA,EAAM,eAAA;AAAA,YACN,OAAA,EAAS,UAAA;AAAA,YACT,QAAA,EAAU,SAAA;AAAA,YACV,YAAA,EAAW,oBAAA;AAAA,YAEX,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,SAAA,EAAA,EAAU,aAAA,EAAY,MAAA,EAAO,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,cACjD,YAAY,eAAA,GAAa;AAAA;AAAA;AAAA;AAC5B;AAAA;AAAA,GACF;AAEJ","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/platform/impersonation/impersonation-banner.tsx"],"names":[],"mappings":";;;;;AAoBO,SAAS,mBAAA,CAAoB,EAAE,MAAA,EAAQ,SAAA,EAAU,EAA6B;AACnF,EAAA,MAAM,EAAE,eAAA,EAAiB,KAAA,EAAO,IAAA,KAAS,gBAAA,EAAiB;AAC1D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAEhD,EAAA,IAAI,CAAC,eAAA,IAAmB,CAAC,KAAA,EAAO,OAAO,IAAA;AAEvC,EAAA,MAAM,aAAa,YAAY;AAC7B,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,EAAK;AACX,MAAA,MAAA,IAAS;AAAA,IACX,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA;AAEA,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,WAAA,EAAU,QAAA;AAAA,MACV,SAAA,EACE,kJAEC,SAAA,IAAa,EAAA,CAAA;AAAA,MAGhB,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,OAAA,EAAA,EAAQ,aAAA,EAAY,MAAA,EAAO,SAAA,EAAU,kBAAA,EAAmB,CAAA;AAAA,+BACxD,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,YAAA,8DAAA;AAAA,YACoD,GAAA;AAAA,4BACxD,GAAA,CAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,KAAA,CAAM,KAAA,IAAS,MAAM,GAAA,EAAI,CAAA;AAAA,YACjC,KAAA,CAAM,yBACL,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,cAAA,QAAA;AAAA,8BACD,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAU,gBAAM,MAAA,EAAO;AAAA,aAAA,EACzC,CAAA,GACE;AAAA,WAAA,EACN;AAAA,SAAA,EACF,CAAA;AAAA,wBACA,IAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,IAAA;AAAA,YACL,KAAA,EAAM,eAAA;AAAA,YACN,OAAA,EAAS,UAAA;AAAA,YACT,QAAA,EAAU,SAAA;AAAA,YACV,YAAA,EAAW,oBAAA;AAAA,YAEX,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,SAAA,EAAA,EAAU,aAAA,EAAY,MAAA,EAAO,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,cACjD,YAAY,eAAA,GAAa;AAAA;AAAA;AAAA;AAC5B;AAAA;AAAA,GACF;AAEJ","file":"chunk-7LILNZMR.mjs","sourcesContent":["import { useState } from 'react'\nimport { useImpersonation } from '../../_auth'\nimport { Button } from '@ui/index'\nimport { EyeIcon, XMarkIcon } from '@heroicons/react/24/outline'\n\nexport interface ImpersonationBannerProps {\n /**\n * Callback fired after the impersonation session ends (after the admin\n * token is restored). Useful for refreshing the UI or navigating home.\n */\n onExit?: () => void\n /** Optional extra classes on the outer bar. */\n className?: string\n}\n\n/**\n * Persistent banner shown while the current session is an impersonation\n * session. Shows the admin's identity + target, and an Exit button that\n * terminates the session. Invisible when not impersonating.\n */\nexport function ImpersonationBanner({ onExit, className }: ImpersonationBannerProps) {\n const { isImpersonating, claim, exit } = useImpersonation()\n const [isExiting, setIsExiting] = useState(false)\n\n if (!isImpersonating || !claim) return null\n\n const handleExit = async () => {\n setIsExiting(true)\n try {\n await exit()\n onExit?.()\n } finally {\n setIsExiting(false)\n }\n }\n\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className={\n 'sticky top-0 z-50 flex items-center justify-between gap-3 border-b border-amber-300 ' +\n 'bg-amber-100 px-4 py-2 text-sm text-amber-900 shadow-sm ' +\n (className ?? '')\n }\n >\n <div className=\"flex items-center gap-2\">\n <EyeIcon aria-hidden=\"true\" className=\"h-5 w-5 shrink-0\" />\n <span>\n Impersonating session — signed in as the target user by{' '}\n <strong>{claim.email ?? claim.sub}</strong>\n {claim.reason ? (\n <>\n {' · '}\n <span className=\"italic\">{claim.reason}</span>\n </>\n ) : null}\n </span>\n </div>\n <Button\n size=\"sm\"\n color=\"ios-glass-red\"\n onClick={handleExit}\n disabled={isExiting}\n aria-label=\"Exit impersonation\"\n >\n <XMarkIcon aria-hidden=\"true\" className=\"h-4 w-4\" />\n {isExiting ? 'Exiting…' : 'Exit impersonation'}\n </Button>\n </div>\n )\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var chunkGCYYGSHU_js = require('./chunk-GCYYGSHU.js');
|
|
5
5
|
var chunkUZ3CMNUJ_js = require('./chunk-UZ3CMNUJ.js');
|
|
6
6
|
var chunkYXN2K77G_js = require('./chunk-YXN2K77G.js');
|
|
7
7
|
var react = require('react');
|
|
@@ -19,7 +19,7 @@ function BillingPanel({
|
|
|
19
19
|
}) {
|
|
20
20
|
const t = chunkYXN2K77G_js.useTranslations("windsock");
|
|
21
21
|
const format = chunkYXN2K77G_js.useFormatter();
|
|
22
|
-
const { client } =
|
|
22
|
+
const { client } = chunkGCYYGSHU_js.useAuth();
|
|
23
23
|
const [subscription, setSubscription] = react.useState(null);
|
|
24
24
|
const [plans, setPlans] = react.useState([]);
|
|
25
25
|
const [isLoading, setIsLoading] = react.useState(true);
|
|
@@ -103,7 +103,7 @@ function BillingPanel({
|
|
|
103
103
|
}
|
|
104
104
|
}, [client, load, t]);
|
|
105
105
|
if (isLoading) {
|
|
106
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center py-12", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
106
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center py-12", children: /* @__PURE__ */ jsxRuntime.jsx(chunkGCYYGSHU_js.InlineSpinner, {}) });
|
|
107
107
|
}
|
|
108
108
|
const currentPlan = subscription?.plan ?? plans.find((plan) => plan.id === subscription?.planId) ?? null;
|
|
109
109
|
const currentTier = subscription?.tier ?? currentPlan?.tier ?? null;
|
|
@@ -117,7 +117,7 @@ function BillingPanel({
|
|
|
117
117
|
}
|
|
118
118
|
),
|
|
119
119
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
120
|
-
|
|
120
|
+
chunkGCYYGSHU_js.SectionCard,
|
|
121
121
|
{
|
|
122
122
|
header: {
|
|
123
123
|
title: t("billing.currentPlan.title"),
|
|
@@ -127,13 +127,13 @@ function BillingPanel({
|
|
|
127
127
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-3", children: [
|
|
128
128
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-lg font-semibold text-gray-900 dark:text-white", children: currentPlan.name }),
|
|
129
129
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
130
|
-
|
|
130
|
+
chunkGCYYGSHU_js.StatusBadge,
|
|
131
131
|
{
|
|
132
132
|
status: subscription.status === "active" ? "success" : subscription.status === "past_due" ? "pending" : "error",
|
|
133
133
|
label: t(`billing.status.${subscription.status}`)
|
|
134
134
|
}
|
|
135
135
|
),
|
|
136
|
-
subscription.cancelAtPeriodEnd && /* @__PURE__ */ jsxRuntime.jsx(
|
|
136
|
+
subscription.cancelAtPeriodEnd && /* @__PURE__ */ jsxRuntime.jsx(chunkGCYYGSHU_js.Badge, { color: "amber", children: t("billing.currentPlan.cancelAtPeriodEnd") })
|
|
137
137
|
] }),
|
|
138
138
|
/* @__PURE__ */ jsxRuntime.jsxs("dl", { className: "grid grid-cols-1 gap-3 text-sm sm:grid-cols-2", children: [
|
|
139
139
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
@@ -153,7 +153,7 @@ function BillingPanel({
|
|
|
153
153
|
] }),
|
|
154
154
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap gap-2 pt-2", children: [
|
|
155
155
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
156
|
-
|
|
156
|
+
chunkGCYYGSHU_js.Button,
|
|
157
157
|
{
|
|
158
158
|
size: "sm",
|
|
159
159
|
color: "ios-glass-blue",
|
|
@@ -164,7 +164,7 @@ function BillingPanel({
|
|
|
164
164
|
}
|
|
165
165
|
),
|
|
166
166
|
subscription.status === "active" && !subscription.cancelAtPeriodEnd && /* @__PURE__ */ jsxRuntime.jsx(
|
|
167
|
-
|
|
167
|
+
chunkGCYYGSHU_js.Button,
|
|
168
168
|
{
|
|
169
169
|
size: "sm",
|
|
170
170
|
color: "ios-glass-red",
|
|
@@ -179,21 +179,21 @@ function BillingPanel({
|
|
|
179
179
|
}
|
|
180
180
|
),
|
|
181
181
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
182
|
-
|
|
182
|
+
chunkGCYYGSHU_js.SectionCard,
|
|
183
183
|
{
|
|
184
184
|
header: {
|
|
185
185
|
title: t("billing.plans.title"),
|
|
186
186
|
subtitle: t("billing.plans.description")
|
|
187
187
|
},
|
|
188
|
-
children: plans.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-gray-500 dark:text-gray-400", children: t("billing.plans.empty") }) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
188
|
+
children: plans.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-gray-500 dark:text-gray-400", children: t("billing.plans.empty") }) : /* @__PURE__ */ jsxRuntime.jsx(chunkGCYYGSHU_js.ListCard, { children: plans.map((plan) => {
|
|
189
189
|
const isCurrent = currentPlan?.id === plan.id;
|
|
190
190
|
const isDowngrade = currentTier != null && (TIER_ORDER[plan.tier] ?? 0) < (TIER_ORDER[currentTier] ?? 0);
|
|
191
191
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
192
|
-
|
|
192
|
+
chunkGCYYGSHU_js.ListCardItem,
|
|
193
193
|
{
|
|
194
194
|
leading: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-10 w-10 items-center justify-center rounded-xl bg-gradient-to-br from-violet-500/20 to-blue-500/20 text-violet-600 dark:text-violet-300", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold uppercase", children: plan.tier.charAt(0) }) }),
|
|
195
|
-
trailing: isCurrent ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
196
|
-
|
|
195
|
+
trailing: isCurrent ? /* @__PURE__ */ jsxRuntime.jsx(chunkGCYYGSHU_js.Badge, { color: "green", children: t("billing.plans.currentBadge") }) : isDowngrade ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
196
|
+
chunkGCYYGSHU_js.Button,
|
|
197
197
|
{
|
|
198
198
|
size: "sm",
|
|
199
199
|
plain: true,
|
|
@@ -203,7 +203,7 @@ function BillingPanel({
|
|
|
203
203
|
children: t("billing.plans.downgradeAction")
|
|
204
204
|
}
|
|
205
205
|
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
206
|
-
|
|
206
|
+
chunkGCYYGSHU_js.Button,
|
|
207
207
|
{
|
|
208
208
|
size: "sm",
|
|
209
209
|
color: "ios-glass-blue",
|
|
@@ -236,5 +236,5 @@ function BillingPanel({
|
|
|
236
236
|
}
|
|
237
237
|
|
|
238
238
|
exports.BillingPanel = BillingPanel;
|
|
239
|
-
//# sourceMappingURL=chunk-
|
|
240
|
-
//# sourceMappingURL=chunk-
|
|
239
|
+
//# sourceMappingURL=chunk-AMYQSPQC.js.map
|
|
240
|
+
//# sourceMappingURL=chunk-AMYQSPQC.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/platform/billing/billing-panel.tsx"],"names":["useTranslations","useFormatter","useAuth","useState","useCallback","useEffect","triggerHaptic","jsx","InlineSpinner","jsxs","SectionCard","StatusBadge","Badge","Button","ListCard","ListCardItem"],"mappings":"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","file":"chunk-EI6FIA45.js","sourcesContent":["// =============================================================================\n// @datatechsolutions/windsock/ui — BillingPanel\n// Shows the current organization subscription plus the plan catalogue, with\n// actions for opening the Stripe portal, starting checkout, or cancelling.\n// Backed by `AuthClient.getSubscription / getPlans / createPortalSession /\n// createCheckoutSession / cancelSubscription`.\n// =============================================================================\n\nimport { useEffect, useState, useCallback } from 'react'\nimport { useTranslations, useFormatter } from '@ui/lib/i18n-context'\nimport {\n SectionCard,\n Button,\n Badge,\n StatusBadge,\n InlineSpinner,\n ListCard,\n ListCardItem,\n triggerHaptic,\n} from '@ui/index'\nimport type {\n SubscriptionDetails,\n PlanDefinition,\n SubscriptionTier,\n} from '@datatechsolutions/shared-domain'\nimport { useAuth } from '../../_auth'\n\nexport interface BillingPanelProps {\n /**\n * Which billing interval to prefer when starting checkout. Defaults to\n * `'monthly'`. Surface a toggle in the host app if both matter.\n */\n defaultBillingInterval?: 'monthly' | 'yearly'\n /**\n * Called after the portal/checkout URL is resolved. Defaults to\n * `window.location.assign(url)`. Override to open in a new tab, use a\n * router, etc.\n */\n onRedirect?: (url: string) => void\n}\n\nconst TIER_ORDER: Record<SubscriptionTier, number> = {\n free_trial: 0,\n starter: 1,\n professional: 2,\n enterprise: 3,\n}\n\nexport function BillingPanel({\n defaultBillingInterval = 'monthly',\n onRedirect,\n}: BillingPanelProps) {\n const t = useTranslations('windsock')\n const format = useFormatter()\n const { client } = useAuth()\n\n const [subscription, setSubscription] = useState<SubscriptionDetails | null>(null)\n const [plans, setPlans] = useState<PlanDefinition[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n const [busyAction, setBusyAction] = useState<string | null>(null)\n\n const redirect = useCallback((url: string) => {\n if (onRedirect) {\n onRedirect(url)\n } else if (typeof window !== 'undefined') {\n window.location.assign(url)\n }\n }, [onRedirect])\n\n const load = useCallback(async () => {\n setIsLoading(true)\n setError(null)\n try {\n const [sub, availablePlans] = await Promise.all([\n client.getSubscription(),\n client.getPlans(),\n ])\n setSubscription(sub)\n setPlans(\n [...availablePlans]\n .filter((plan: { active: boolean }) => plan.active)\n .sort(\n (a: { tier: SubscriptionTier }, b: { tier: SubscriptionTier }) =>\n (TIER_ORDER[a.tier] ?? 0) - (TIER_ORDER[b.tier] ?? 0),\n ),\n )\n } catch (loadError) {\n setError(loadError instanceof Error ? loadError.message : String(loadError))\n } finally {\n setIsLoading(false)\n }\n }, [client])\n\n useEffect(() => {\n void load()\n }, [load])\n\n const handleOpenPortal = useCallback(async () => {\n setBusyAction('portal')\n triggerHaptic('light')\n try {\n const { url } = await client.createPortalSession()\n redirect(url)\n } catch (portalError) {\n setError(portalError instanceof Error ? portalError.message : String(portalError))\n triggerHaptic('error')\n } finally {\n setBusyAction(null)\n }\n }, [client, redirect])\n\n const handleStartCheckout = useCallback(async (planCode: string) => {\n setBusyAction(`checkout:${planCode}`)\n triggerHaptic('light')\n try {\n const { url } = await client.createCheckoutSession(planCode, defaultBillingInterval)\n redirect(url)\n } catch (checkoutError) {\n setError(checkoutError instanceof Error ? checkoutError.message : String(checkoutError))\n triggerHaptic('error')\n } finally {\n setBusyAction(null)\n }\n }, [client, defaultBillingInterval, redirect])\n\n const handleCancel = useCallback(async () => {\n if (typeof window !== 'undefined') {\n const confirmed = window.confirm(t('billing.cancelConfirm'))\n if (!confirmed) return\n }\n setBusyAction('cancel')\n triggerHaptic('warning')\n try {\n const result = await client.cancelSubscription()\n if (!result.success) {\n throw new Error(result.error ?? 'Subscription cancellation failed')\n }\n triggerHaptic('success')\n await load()\n } catch (cancelError) {\n setError(cancelError instanceof Error ? cancelError.message : String(cancelError))\n triggerHaptic('error')\n } finally {\n setBusyAction(null)\n }\n }, [client, load, t])\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center py-12\">\n <InlineSpinner />\n </div>\n )\n }\n\n const currentPlan = subscription?.plan ?? plans.find((plan) => plan.id === subscription?.planId) ?? null\n const currentTier = subscription?.tier ?? currentPlan?.tier ?? null\n\n return (\n <div className=\"space-y-6\">\n {error && (\n <div\n role=\"alert\"\n className=\"rounded-xl border border-red-300/40 bg-red-50/80 px-4 py-3 text-sm text-red-700 dark:border-red-500/30 dark:bg-red-500/10 dark:text-red-300\"\n >\n {error}\n </div>\n )}\n\n <SectionCard\n header={{\n title: t('billing.currentPlan.title'),\n subtitle: t('billing.currentPlan.description'),\n }}\n >\n {subscription && currentPlan ? (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <span className=\"text-lg font-semibold text-gray-900 dark:text-white\">\n {currentPlan.name}\n </span>\n <StatusBadge\n status={\n subscription.status === 'active' ? 'success'\n : subscription.status === 'past_due' ? 'pending'\n : 'error'\n }\n label={t(`billing.status.${subscription.status}`)}\n />\n {subscription.cancelAtPeriodEnd && (\n <Badge color=\"amber\">{t('billing.currentPlan.cancelAtPeriodEnd')}</Badge>\n )}\n </div>\n\n <dl className=\"grid grid-cols-1 gap-3 text-sm sm:grid-cols-2\">\n <div>\n <dt className=\"text-gray-500 dark:text-gray-400\">\n {t('billing.currentPlan.price')}\n </dt>\n <dd className=\"font-medium text-gray-900 dark:text-white\">\n {format.number(currentPlan.price, { style: 'currency', currency: currentPlan.currency })}\n {' '}/{' '}\n {t(`billing.interval.${currentPlan.interval}`)}\n </dd>\n </div>\n {subscription.currentPeriodEnd && (\n <div>\n <dt className=\"text-gray-500 dark:text-gray-400\">\n {t('billing.currentPlan.renewsOn')}\n </dt>\n <dd className=\"font-medium text-gray-900 dark:text-white\">\n {format.dateTime(new Date(subscription.currentPeriodEnd), { dateStyle: 'medium' })}\n </dd>\n </div>\n )}\n </dl>\n\n <div className=\"flex flex-wrap gap-2 pt-2\">\n <Button\n size=\"sm\"\n color=\"ios-glass-blue\"\n onClick={handleOpenPortal}\n loading={busyAction === 'portal'}\n disabled={busyAction !== null}\n >\n {t('billing.currentPlan.manageInPortal')}\n </Button>\n {subscription.status === 'active' && !subscription.cancelAtPeriodEnd && (\n <Button\n size=\"sm\"\n color=\"ios-glass-red\"\n onClick={handleCancel}\n loading={busyAction === 'cancel'}\n disabled={busyAction !== null}\n >\n {t('billing.currentPlan.cancel')}\n </Button>\n )}\n </div>\n </div>\n ) : (\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n {t('billing.currentPlan.noSubscription')}\n </p>\n )}\n </SectionCard>\n\n <SectionCard\n header={{\n title: t('billing.plans.title'),\n subtitle: t('billing.plans.description'),\n }}\n >\n {plans.length === 0 ? (\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n {t('billing.plans.empty')}\n </p>\n ) : (\n <ListCard>\n {plans.map((plan) => {\n const isCurrent = currentPlan?.id === plan.id\n const isDowngrade = currentTier != null\n && (TIER_ORDER[plan.tier] ?? 0) < (TIER_ORDER[currentTier] ?? 0)\n return (\n <ListCardItem\n key={plan.id}\n leading={\n <div className=\"flex h-10 w-10 items-center justify-center rounded-xl bg-gradient-to-br from-violet-500/20 to-blue-500/20 text-violet-600 dark:text-violet-300\">\n <span className=\"text-sm font-bold uppercase\">{plan.tier.charAt(0)}</span>\n </div>\n }\n trailing={\n isCurrent ? (\n <Badge color=\"green\">{t('billing.plans.currentBadge')}</Badge>\n ) : (\n isDowngrade ? (\n <Button\n size=\"sm\"\n plain\n onClick={() => handleStartCheckout(plan.code)}\n loading={busyAction === `checkout:${plan.code}`}\n disabled={busyAction !== null}\n >\n {t('billing.plans.downgradeAction')}\n </Button>\n ) : (\n <Button\n size=\"sm\"\n color=\"ios-glass-blue\"\n onClick={() => handleStartCheckout(plan.code)}\n loading={busyAction === `checkout:${plan.code}`}\n disabled={busyAction !== null}\n >\n {t('billing.plans.selectAction')}\n </Button>\n )\n )\n }\n >\n <div className=\"flex flex-col gap-1\">\n <div className=\"flex items-center gap-2\">\n <p className=\"text-sm font-medium text-gray-900 dark:text-white\">\n {plan.name}\n </p>\n <span className=\"text-xs text-gray-500 dark:text-gray-400\">\n {format.number(plan.price, { style: 'currency', currency: plan.currency })}\n {' '}/{' '}\n {t(`billing.interval.${plan.interval}`)}\n </span>\n </div>\n {plan.description && (\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">\n {plan.description}\n </p>\n )}\n </div>\n </ListCardItem>\n )\n })}\n </ListCard>\n )}\n </SectionCard>\n </div>\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/platform/billing/billing-panel.tsx"],"names":["useTranslations","useFormatter","useAuth","useState","useCallback","useEffect","triggerHaptic","jsx","InlineSpinner","jsxs","SectionCard","StatusBadge","Badge","Button","ListCard","ListCardItem"],"mappings":"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","file":"chunk-AMYQSPQC.js","sourcesContent":["// =============================================================================\n// @datatechsolutions/windsock/ui — BillingPanel\n// Shows the current organization subscription plus the plan catalogue, with\n// actions for opening the Stripe portal, starting checkout, or cancelling.\n// Backed by `AuthClient.getSubscription / getPlans / createPortalSession /\n// createCheckoutSession / cancelSubscription`.\n// =============================================================================\n\nimport { useEffect, useState, useCallback } from 'react'\nimport { useTranslations, useFormatter } from '@ui/lib/i18n-context'\nimport {\n SectionCard,\n Button,\n Badge,\n StatusBadge,\n InlineSpinner,\n ListCard,\n ListCardItem,\n triggerHaptic,\n} from '@ui/index'\nimport type {\n SubscriptionDetails,\n PlanDefinition,\n SubscriptionTier,\n} from '@datatechsolutions/shared-domain'\nimport { useAuth } from '../../_auth'\n\nexport interface BillingPanelProps {\n /**\n * Which billing interval to prefer when starting checkout. Defaults to\n * `'monthly'`. Surface a toggle in the host app if both matter.\n */\n defaultBillingInterval?: 'monthly' | 'yearly'\n /**\n * Called after the portal/checkout URL is resolved. Defaults to\n * `window.location.assign(url)`. Override to open in a new tab, use a\n * router, etc.\n */\n onRedirect?: (url: string) => void\n}\n\nconst TIER_ORDER: Record<SubscriptionTier, number> = {\n free_trial: 0,\n starter: 1,\n professional: 2,\n enterprise: 3,\n}\n\nexport function BillingPanel({\n defaultBillingInterval = 'monthly',\n onRedirect,\n}: BillingPanelProps) {\n const t = useTranslations('windsock')\n const format = useFormatter()\n const { client } = useAuth()\n\n const [subscription, setSubscription] = useState<SubscriptionDetails | null>(null)\n const [plans, setPlans] = useState<PlanDefinition[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n const [busyAction, setBusyAction] = useState<string | null>(null)\n\n const redirect = useCallback((url: string) => {\n if (onRedirect) {\n onRedirect(url)\n } else if (typeof window !== 'undefined') {\n window.location.assign(url)\n }\n }, [onRedirect])\n\n const load = useCallback(async () => {\n setIsLoading(true)\n setError(null)\n try {\n const [sub, availablePlans] = await Promise.all([\n client.getSubscription(),\n client.getPlans(),\n ])\n setSubscription(sub)\n setPlans(\n [...availablePlans]\n .filter((plan: { active: boolean }) => plan.active)\n .sort(\n (a: { tier: SubscriptionTier }, b: { tier: SubscriptionTier }) =>\n (TIER_ORDER[a.tier] ?? 0) - (TIER_ORDER[b.tier] ?? 0),\n ),\n )\n } catch (loadError) {\n setError(loadError instanceof Error ? loadError.message : String(loadError))\n } finally {\n setIsLoading(false)\n }\n }, [client])\n\n useEffect(() => {\n void load()\n }, [load])\n\n const handleOpenPortal = useCallback(async () => {\n setBusyAction('portal')\n triggerHaptic('light')\n try {\n const { url } = await client.createPortalSession()\n redirect(url)\n } catch (portalError) {\n setError(portalError instanceof Error ? portalError.message : String(portalError))\n triggerHaptic('error')\n } finally {\n setBusyAction(null)\n }\n }, [client, redirect])\n\n const handleStartCheckout = useCallback(async (planCode: string) => {\n setBusyAction(`checkout:${planCode}`)\n triggerHaptic('light')\n try {\n const { url } = await client.createCheckoutSession(planCode, defaultBillingInterval)\n redirect(url)\n } catch (checkoutError) {\n setError(checkoutError instanceof Error ? checkoutError.message : String(checkoutError))\n triggerHaptic('error')\n } finally {\n setBusyAction(null)\n }\n }, [client, defaultBillingInterval, redirect])\n\n const handleCancel = useCallback(async () => {\n if (typeof window !== 'undefined') {\n const confirmed = window.confirm(t('billing.cancelConfirm'))\n if (!confirmed) return\n }\n setBusyAction('cancel')\n triggerHaptic('warning')\n try {\n const result = await client.cancelSubscription()\n if (!result.success) {\n throw new Error(result.error ?? 'Subscription cancellation failed')\n }\n triggerHaptic('success')\n await load()\n } catch (cancelError) {\n setError(cancelError instanceof Error ? cancelError.message : String(cancelError))\n triggerHaptic('error')\n } finally {\n setBusyAction(null)\n }\n }, [client, load, t])\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center py-12\">\n <InlineSpinner />\n </div>\n )\n }\n\n const currentPlan = subscription?.plan ?? plans.find((plan) => plan.id === subscription?.planId) ?? null\n const currentTier = subscription?.tier ?? currentPlan?.tier ?? null\n\n return (\n <div className=\"space-y-6\">\n {error && (\n <div\n role=\"alert\"\n className=\"rounded-xl border border-red-300/40 bg-red-50/80 px-4 py-3 text-sm text-red-700 dark:border-red-500/30 dark:bg-red-500/10 dark:text-red-300\"\n >\n {error}\n </div>\n )}\n\n <SectionCard\n header={{\n title: t('billing.currentPlan.title'),\n subtitle: t('billing.currentPlan.description'),\n }}\n >\n {subscription && currentPlan ? (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <span className=\"text-lg font-semibold text-gray-900 dark:text-white\">\n {currentPlan.name}\n </span>\n <StatusBadge\n status={\n subscription.status === 'active' ? 'success'\n : subscription.status === 'past_due' ? 'pending'\n : 'error'\n }\n label={t(`billing.status.${subscription.status}`)}\n />\n {subscription.cancelAtPeriodEnd && (\n <Badge color=\"amber\">{t('billing.currentPlan.cancelAtPeriodEnd')}</Badge>\n )}\n </div>\n\n <dl className=\"grid grid-cols-1 gap-3 text-sm sm:grid-cols-2\">\n <div>\n <dt className=\"text-gray-500 dark:text-gray-400\">\n {t('billing.currentPlan.price')}\n </dt>\n <dd className=\"font-medium text-gray-900 dark:text-white\">\n {format.number(currentPlan.price, { style: 'currency', currency: currentPlan.currency })}\n {' '}/{' '}\n {t(`billing.interval.${currentPlan.interval}`)}\n </dd>\n </div>\n {subscription.currentPeriodEnd && (\n <div>\n <dt className=\"text-gray-500 dark:text-gray-400\">\n {t('billing.currentPlan.renewsOn')}\n </dt>\n <dd className=\"font-medium text-gray-900 dark:text-white\">\n {format.dateTime(new Date(subscription.currentPeriodEnd), { dateStyle: 'medium' })}\n </dd>\n </div>\n )}\n </dl>\n\n <div className=\"flex flex-wrap gap-2 pt-2\">\n <Button\n size=\"sm\"\n color=\"ios-glass-blue\"\n onClick={handleOpenPortal}\n loading={busyAction === 'portal'}\n disabled={busyAction !== null}\n >\n {t('billing.currentPlan.manageInPortal')}\n </Button>\n {subscription.status === 'active' && !subscription.cancelAtPeriodEnd && (\n <Button\n size=\"sm\"\n color=\"ios-glass-red\"\n onClick={handleCancel}\n loading={busyAction === 'cancel'}\n disabled={busyAction !== null}\n >\n {t('billing.currentPlan.cancel')}\n </Button>\n )}\n </div>\n </div>\n ) : (\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n {t('billing.currentPlan.noSubscription')}\n </p>\n )}\n </SectionCard>\n\n <SectionCard\n header={{\n title: t('billing.plans.title'),\n subtitle: t('billing.plans.description'),\n }}\n >\n {plans.length === 0 ? (\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n {t('billing.plans.empty')}\n </p>\n ) : (\n <ListCard>\n {plans.map((plan) => {\n const isCurrent = currentPlan?.id === plan.id\n const isDowngrade = currentTier != null\n && (TIER_ORDER[plan.tier] ?? 0) < (TIER_ORDER[currentTier] ?? 0)\n return (\n <ListCardItem\n key={plan.id}\n leading={\n <div className=\"flex h-10 w-10 items-center justify-center rounded-xl bg-gradient-to-br from-violet-500/20 to-blue-500/20 text-violet-600 dark:text-violet-300\">\n <span className=\"text-sm font-bold uppercase\">{plan.tier.charAt(0)}</span>\n </div>\n }\n trailing={\n isCurrent ? (\n <Badge color=\"green\">{t('billing.plans.currentBadge')}</Badge>\n ) : (\n isDowngrade ? (\n <Button\n size=\"sm\"\n plain\n onClick={() => handleStartCheckout(plan.code)}\n loading={busyAction === `checkout:${plan.code}`}\n disabled={busyAction !== null}\n >\n {t('billing.plans.downgradeAction')}\n </Button>\n ) : (\n <Button\n size=\"sm\"\n color=\"ios-glass-blue\"\n onClick={() => handleStartCheckout(plan.code)}\n loading={busyAction === `checkout:${plan.code}`}\n disabled={busyAction !== null}\n >\n {t('billing.plans.selectAction')}\n </Button>\n )\n )\n }\n >\n <div className=\"flex flex-col gap-1\">\n <div className=\"flex items-center gap-2\">\n <p className=\"text-sm font-medium text-gray-900 dark:text-white\">\n {plan.name}\n </p>\n <span className=\"text-xs text-gray-500 dark:text-gray-400\">\n {format.number(plan.price, { style: 'currency', currency: plan.currency })}\n {' '}/{' '}\n {t(`billing.interval.${plan.interval}`)}\n </span>\n </div>\n {plan.description && (\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">\n {plan.description}\n </p>\n )}\n </div>\n </ListCardItem>\n )\n })}\n </ListCard>\n )}\n </SectionCard>\n </div>\n )\n}\n"]}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
5
|
-
var
|
|
4
|
+
var chunkLVK7VXW7_js = require('./chunk-LVK7VXW7.js');
|
|
5
|
+
var chunk6ZMTJSQF_js = require('./chunk-6ZMTJSQF.js');
|
|
6
6
|
var chunkDJDZIRM6_js = require('./chunk-DJDZIRM6.js');
|
|
7
|
-
var
|
|
8
|
-
var
|
|
7
|
+
var chunkSQZGQOKU_js = require('./chunk-SQZGQOKU.js');
|
|
8
|
+
var chunkGCYYGSHU_js = require('./chunk-GCYYGSHU.js');
|
|
9
9
|
var chunkYXN2K77G_js = require('./chunk-YXN2K77G.js');
|
|
10
10
|
var chunkSY4MUT5V_js = require('./chunk-SY4MUT5V.js');
|
|
11
11
|
var react = require('react');
|
|
@@ -180,9 +180,9 @@ function applyWorkflowExecutionEventToStore(actions, event) {
|
|
|
180
180
|
}
|
|
181
181
|
}
|
|
182
182
|
function useWorkflowRunPresentation(events, status) {
|
|
183
|
-
const clearNodeResults =
|
|
184
|
-
const setIsRunning =
|
|
185
|
-
const setNodeResult =
|
|
183
|
+
const clearNodeResults = chunkSQZGQOKU_js.useWorkflowStore((state) => state.clearNodeResults);
|
|
184
|
+
const setIsRunning = chunkSQZGQOKU_js.useWorkflowStore((state) => state.setIsRunning);
|
|
185
|
+
const setNodeResult = chunkSQZGQOKU_js.useWorkflowStore((state) => state.setNodeResult);
|
|
186
186
|
react.useEffect(() => {
|
|
187
187
|
if (status === "idle") {
|
|
188
188
|
resetWorkflowRunPresentation({ clearNodeResults, setIsRunning, setNodeResult });
|
|
@@ -205,9 +205,9 @@ function useWorkflowExecution(workflowId) {
|
|
|
205
205
|
const [activeRunId, setActiveRunId] = react.useState(null);
|
|
206
206
|
const [isLaunching, setIsLaunching] = react.useState(false);
|
|
207
207
|
const stream = useRunEvents(workflowId || null, activeRunId);
|
|
208
|
-
const clearNodeResults =
|
|
209
|
-
const setIsRunning =
|
|
210
|
-
const setNodeResult =
|
|
208
|
+
const clearNodeResults = chunkSQZGQOKU_js.useWorkflowStore((state) => state.clearNodeResults);
|
|
209
|
+
const setIsRunning = chunkSQZGQOKU_js.useWorkflowStore((state) => state.setIsRunning);
|
|
210
|
+
const setNodeResult = chunkSQZGQOKU_js.useWorkflowStore((state) => state.setNodeResult);
|
|
211
211
|
useWorkflowRunPresentation(stream.events, activeRunId ? stream.status : "idle");
|
|
212
212
|
react.useEffect(() => {
|
|
213
213
|
if (stream.status === "completed" || stream.status === "failed" || stream.status === "error") {
|
|
@@ -332,7 +332,7 @@ function AgentsWorkspace({ workflowId, messages }) {
|
|
|
332
332
|
const tWorkflow = chunkYXN2K77G_js.useTranslations("agents.workflow");
|
|
333
333
|
const tCommon = chunkYXN2K77G_js.useTranslations("common");
|
|
334
334
|
const datasourceLabels = useDatasourceLabels();
|
|
335
|
-
const { error: notifyError, success: notifySuccess } =
|
|
335
|
+
const { error: notifyError, success: notifySuccess } = chunkGCYYGSHU_js.useNotifications();
|
|
336
336
|
const showSuccess = react.useCallback((title, message) => {
|
|
337
337
|
notifySuccess(title, message);
|
|
338
338
|
}, [notifySuccess]);
|
|
@@ -356,20 +356,20 @@ function AgentsWorkspace({ workflowId, messages }) {
|
|
|
356
356
|
const [datasources, setDatasources] = react.useState([]);
|
|
357
357
|
const [modelConnections, setModelConnections] = react.useState([]);
|
|
358
358
|
const [showDatasourceModal, setShowDatasourceModal] = react.useState(false);
|
|
359
|
-
const openPipelineSettingsModal =
|
|
359
|
+
const openPipelineSettingsModal = chunkSQZGQOKU_js.useModalStore((s) => s.openPipelineSettingsModal);
|
|
360
360
|
const [showRunInputDialog, setShowRunInputDialog] = react.useState(false);
|
|
361
361
|
const [showPreviewPanel, setShowPreviewPanel] = react.useState(false);
|
|
362
362
|
const [isCreatingAgent, setIsCreatingAgent] = react.useState(false);
|
|
363
|
-
const openSubworkflowModal =
|
|
364
|
-
const closeSubworkflowModal =
|
|
363
|
+
const openSubworkflowModal = chunk6ZMTJSQF_js.useSubworkflowStore((s) => s.openModal);
|
|
364
|
+
const closeSubworkflowModal = chunk6ZMTJSQF_js.useSubworkflowStore((s) => s.closeModal);
|
|
365
365
|
const [deleteTarget, setDeleteTarget] = react.useState(null);
|
|
366
366
|
const [saveStatus, setSaveStatus] = react.useState("idle");
|
|
367
367
|
const latestGraphRef = react.useRef(null);
|
|
368
368
|
const saveTimerRef = react.useRef(null);
|
|
369
369
|
const skipInitialAutoSaveRef = react.useRef(true);
|
|
370
|
-
const showRunPanel =
|
|
371
|
-
const toggleRunPanel =
|
|
372
|
-
const workflowNodes =
|
|
370
|
+
const showRunPanel = chunkSQZGQOKU_js.useWorkflowStore((state) => state.showRunPanel);
|
|
371
|
+
const toggleRunPanel = chunkSQZGQOKU_js.useWorkflowStore((state) => state.toggleRunPanel);
|
|
372
|
+
const workflowNodes = chunkSQZGQOKU_js.useWorkflowStore((state) => state.nodes);
|
|
373
373
|
const { execute: executeWorkflowRun, stop: stopWorkflowRun, isRunning } = useWorkflowExecution(workflowId);
|
|
374
374
|
const loadWorkspaceData = react.useCallback(async () => {
|
|
375
375
|
setIsLoading(true);
|
|
@@ -652,7 +652,7 @@ function AgentsWorkspace({ workflowId, messages }) {
|
|
|
652
652
|
}
|
|
653
653
|
if (!workflow) {
|
|
654
654
|
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-[calc(100vh-120px)] items-center justify-center", children: loadError ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
655
|
-
|
|
655
|
+
chunkGCYYGSHU_js.PageErrorState,
|
|
656
656
|
{
|
|
657
657
|
statusCode: 500,
|
|
658
658
|
title: tCommon("serverError"),
|
|
@@ -663,7 +663,7 @@ function AgentsWorkspace({ workflowId, messages }) {
|
|
|
663
663
|
retryLabel: tCommon("retry")
|
|
664
664
|
}
|
|
665
665
|
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
666
|
-
|
|
666
|
+
chunkGCYYGSHU_js.PageEmptyState,
|
|
667
667
|
{
|
|
668
668
|
title: tWorkflow("emptyTitle"),
|
|
669
669
|
message: tWorkflow("emptyDescription"),
|
|
@@ -671,7 +671,7 @@ function AgentsWorkspace({ workflowId, messages }) {
|
|
|
671
671
|
}
|
|
672
672
|
) });
|
|
673
673
|
}
|
|
674
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
674
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunkSQZGQOKU_js.WorkflowBuilderProvider, { publishableKey: getPublishableKey(), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-[calc(100vh-120px)] flex-col", "data-testid": "agents-workspace", children: [
|
|
675
675
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "liquid-surface flex h-full flex-col overflow-hidden rounded-2xl", children: [
|
|
676
676
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-shrink-0 items-center justify-between px-5 py-3", children: [
|
|
677
677
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [
|
|
@@ -693,13 +693,13 @@ function AgentsWorkspace({ workflowId, messages }) {
|
|
|
693
693
|
children: workflow.name || tWorkflow("title")
|
|
694
694
|
}
|
|
695
695
|
),
|
|
696
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
696
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkGCYYGSHU_js.CopyableId, { id: workflowId, className: "text-[10px]" }),
|
|
697
697
|
workflow.isDraft ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex items-center rounded-full bg-amber-100 px-2.5 py-0.5 text-[10px] font-semibold text-amber-800 dark:bg-amber-900/30 dark:text-amber-300", children: tWorkflow("draftBadge") }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex items-center rounded-full bg-green-100 px-2.5 py-0.5 text-[10px] font-semibold text-green-800 dark:bg-green-900/30 dark:text-green-300", children: tWorkflow("published") }),
|
|
698
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
698
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunk6ZMTJSQF_js.SaveStatusBadge, { status: saveStatus })
|
|
699
699
|
] }),
|
|
700
700
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
701
701
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
702
|
-
|
|
702
|
+
chunkGCYYGSHU_js.Button,
|
|
703
703
|
{
|
|
704
704
|
size: "xs",
|
|
705
705
|
plain: true,
|
|
@@ -708,11 +708,11 @@ function AgentsWorkspace({ workflowId, messages }) {
|
|
|
708
708
|
children: /* @__PURE__ */ jsxRuntime.jsx(outline.ChartBarIcon, { className: "h-3.5 w-3.5", "data-slot": "icon" })
|
|
709
709
|
}
|
|
710
710
|
),
|
|
711
|
-
isRunning ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
711
|
+
isRunning ? /* @__PURE__ */ jsxRuntime.jsxs(chunkGCYYGSHU_js.Button, { size: "xs", outline: true, onClick: stopWorkflowRun, children: [
|
|
712
712
|
/* @__PURE__ */ jsxRuntime.jsx(outline.StopIcon, { className: "h-3.5 w-3.5", "data-slot": "icon" }),
|
|
713
713
|
tWorkflow("runPanel.stop")
|
|
714
714
|
] }) : /* @__PURE__ */ jsxRuntime.jsxs(
|
|
715
|
-
|
|
715
|
+
chunkGCYYGSHU_js.Button,
|
|
716
716
|
{
|
|
717
717
|
size: "xs",
|
|
718
718
|
outline: true,
|
|
@@ -725,7 +725,7 @@ function AgentsWorkspace({ workflowId, messages }) {
|
|
|
725
725
|
]
|
|
726
726
|
}
|
|
727
727
|
),
|
|
728
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
728
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkGCYYGSHU_js.Button, { gradient: true, size: "xs", onClick: () => {
|
|
729
729
|
void handlePublish();
|
|
730
730
|
}, disabled: isPublishing, children: [
|
|
731
731
|
/* @__PURE__ */ jsxRuntime.jsx(outline.DocumentCheckIcon, { className: "h-3.5 w-3.5", "data-slot": "icon" }),
|
|
@@ -735,7 +735,7 @@ function AgentsWorkspace({ workflowId, messages }) {
|
|
|
735
735
|
] }),
|
|
736
736
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "liquid-divider border-t" }),
|
|
737
737
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-4 pt-3", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
738
|
-
|
|
738
|
+
chunk6ZMTJSQF_js.WorkflowListBar,
|
|
739
739
|
{
|
|
740
740
|
workflows,
|
|
741
741
|
activeWorkflowId: workflowId,
|
|
@@ -751,7 +751,7 @@ function AgentsWorkspace({ workflowId, messages }) {
|
|
|
751
751
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "liquid-divider border-t" }),
|
|
752
752
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-h-0 flex-1 overflow-hidden", children: [
|
|
753
753
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
754
|
-
|
|
754
|
+
chunk6ZMTJSQF_js.NodePalette,
|
|
755
755
|
{
|
|
756
756
|
agents,
|
|
757
757
|
tools,
|
|
@@ -773,7 +773,7 @@ function AgentsWorkspace({ workflowId, messages }) {
|
|
|
773
773
|
}
|
|
774
774
|
),
|
|
775
775
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
776
|
-
|
|
776
|
+
chunk6ZMTJSQF_js.AutoSaveWorkspace,
|
|
777
777
|
{
|
|
778
778
|
workflowId,
|
|
779
779
|
className: "h-full w-full",
|
|
@@ -801,7 +801,7 @@ function AgentsWorkspace({ workflowId, messages }) {
|
|
|
801
801
|
latestGraphRef.current = graph;
|
|
802
802
|
},
|
|
803
803
|
renderAgentModal: (props) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
804
|
-
|
|
804
|
+
chunk6ZMTJSQF_js.AgentModal,
|
|
805
805
|
{
|
|
806
806
|
...props,
|
|
807
807
|
onSaved: () => {
|
|
@@ -842,7 +842,7 @@ function AgentsWorkspace({ workflowId, messages }) {
|
|
|
842
842
|
] })
|
|
843
843
|
] }),
|
|
844
844
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
845
|
-
|
|
845
|
+
chunk6ZMTJSQF_js.PipelineSettingsModal,
|
|
846
846
|
{
|
|
847
847
|
onSave: async (changes) => {
|
|
848
848
|
const metadata = {
|
|
@@ -859,7 +859,7 @@ function AgentsWorkspace({ workflowId, messages }) {
|
|
|
859
859
|
}
|
|
860
860
|
),
|
|
861
861
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
862
|
-
|
|
862
|
+
chunk6ZMTJSQF_js.SubworkflowModal,
|
|
863
863
|
{
|
|
864
864
|
onMaximize: (subworkflowId) => {
|
|
865
865
|
closeSubworkflowModal();
|
|
@@ -883,7 +883,7 @@ function AgentsWorkspace({ workflowId, messages }) {
|
|
|
883
883
|
}
|
|
884
884
|
),
|
|
885
885
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
886
|
-
|
|
886
|
+
chunk6ZMTJSQF_js.RunPanel,
|
|
887
887
|
{
|
|
888
888
|
open: showRunPanel,
|
|
889
889
|
onClose: toggleRunPanel,
|
|
@@ -892,7 +892,7 @@ function AgentsWorkspace({ workflowId, messages }) {
|
|
|
892
892
|
}
|
|
893
893
|
),
|
|
894
894
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
895
|
-
|
|
895
|
+
chunk6ZMTJSQF_js.RunInputDialog,
|
|
896
896
|
{
|
|
897
897
|
open: showRunInputDialog,
|
|
898
898
|
onClose: () => setShowRunInputDialog(false),
|
|
@@ -905,7 +905,7 @@ function AgentsWorkspace({ workflowId, messages }) {
|
|
|
905
905
|
}
|
|
906
906
|
),
|
|
907
907
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
908
|
-
|
|
908
|
+
chunk6ZMTJSQF_js.PreviewPanel,
|
|
909
909
|
{
|
|
910
910
|
open: showPreviewPanel,
|
|
911
911
|
onClose: () => setShowPreviewPanel(false),
|
|
@@ -914,7 +914,7 @@ function AgentsWorkspace({ workflowId, messages }) {
|
|
|
914
914
|
}
|
|
915
915
|
),
|
|
916
916
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
917
|
-
|
|
917
|
+
chunkLVK7VXW7_js.DatasourceFormModal,
|
|
918
918
|
{
|
|
919
919
|
open: showDatasourceModal,
|
|
920
920
|
onClose: () => setShowDatasourceModal(false),
|
|
@@ -925,7 +925,7 @@ function AgentsWorkspace({ workflowId, messages }) {
|
|
|
925
925
|
}
|
|
926
926
|
),
|
|
927
927
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
928
|
-
|
|
928
|
+
chunkGCYYGSHU_js.DynamicIslandConfirm,
|
|
929
929
|
{
|
|
930
930
|
open: deleteTarget !== null,
|
|
931
931
|
onClose: () => setDeleteTarget(null),
|
|
@@ -944,5 +944,5 @@ exports.resetWorkflowRunPresentation = resetWorkflowRunPresentation;
|
|
|
944
944
|
exports.useRunEvents = useRunEvents;
|
|
945
945
|
exports.useWorkflowExecution = useWorkflowExecution;
|
|
946
946
|
exports.useWorkflowRunPresentation = useWorkflowRunPresentation;
|
|
947
|
-
//# sourceMappingURL=chunk-
|
|
948
|
-
//# sourceMappingURL=chunk-
|
|
947
|
+
//# sourceMappingURL=chunk-DRORQGN2.js.map
|
|
948
|
+
//# sourceMappingURL=chunk-DRORQGN2.js.map
|