@datatechsolutions/ui 3.7.2 → 3.7.4

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 (163) hide show
  1. package/dist/astrlabe/index.js +108 -108
  2. package/dist/astrlabe/index.mjs +4 -4
  3. package/dist/astrlabe/workflow-canvas.js +4 -4
  4. package/dist/astrlabe/workflow-canvas.mjs +3 -3
  5. package/dist/{chunk-34XRH2FX.mjs → chunk-4HP7XS5I.mjs} +4 -4
  6. package/dist/{chunk-34XRH2FX.mjs.map → chunk-4HP7XS5I.mjs.map} +1 -1
  7. package/dist/{chunk-JGK2VFCX.js → chunk-7WIWDSF6.js} +36 -36
  8. package/dist/{chunk-JGK2VFCX.js.map → chunk-7WIWDSF6.js.map} +1 -1
  9. package/dist/{chunk-UDYEUTJC.js → chunk-BEUPW5WS.js} +28 -28
  10. package/dist/{chunk-UDYEUTJC.js.map → chunk-BEUPW5WS.js.map} +1 -1
  11. package/dist/{chunk-CYAAL3BY.mjs → chunk-CTCO2YI5.mjs} +3 -3
  12. package/dist/{chunk-CYAAL3BY.mjs.map → chunk-CTCO2YI5.mjs.map} +1 -1
  13. package/dist/{chunk-NVQVZ4U4.mjs → chunk-DCBRGVD3.mjs} +3 -3
  14. package/dist/{chunk-NVQVZ4U4.mjs.map → chunk-DCBRGVD3.mjs.map} +1 -1
  15. package/dist/{chunk-CVZXZK2X.js → chunk-DWIBK7GV.js} +25 -25
  16. package/dist/{chunk-CVZXZK2X.js.map → chunk-DWIBK7GV.js.map} +1 -1
  17. package/dist/{chunk-C4AJWDFB.mjs → chunk-EIZM2EQA.mjs} +4 -4
  18. package/dist/{chunk-C4AJWDFB.mjs.map → chunk-EIZM2EQA.mjs.map} +1 -1
  19. package/dist/{chunk-BBLBSDPN.js → chunk-FIB2CFJK.js} +11 -9
  20. package/dist/chunk-FIB2CFJK.js.map +1 -0
  21. package/dist/{chunk-2OPBUVTQ.mjs → chunk-GAN7AKZ2.mjs} +3 -3
  22. package/dist/{chunk-2OPBUVTQ.mjs.map → chunk-GAN7AKZ2.mjs.map} +1 -1
  23. package/dist/{chunk-R4EKPXX3.js → chunk-GD6FHRHV.js} +6 -3
  24. package/dist/chunk-GD6FHRHV.js.map +1 -0
  25. package/dist/{chunk-DXLATMGD.mjs → chunk-IKH5IRDK.mjs} +3 -3
  26. package/dist/{chunk-DXLATMGD.mjs.map → chunk-IKH5IRDK.mjs.map} +1 -1
  27. package/dist/{chunk-TJEZL72T.mjs → chunk-IKHWYYZC.mjs} +3 -3
  28. package/dist/{chunk-TJEZL72T.mjs.map → chunk-IKHWYYZC.mjs.map} +1 -1
  29. package/dist/{chunk-FUHNEP3Y.js → chunk-IYDGO7RW.js} +135 -135
  30. package/dist/{chunk-FUHNEP3Y.js.map → chunk-IYDGO7RW.js.map} +1 -1
  31. package/dist/{chunk-CBFK4W4C.mjs → chunk-JUDQX6MP.mjs} +5 -3
  32. package/dist/chunk-JUDQX6MP.mjs.map +1 -0
  33. package/dist/{chunk-3JZGRXSG.js → chunk-KI4UPW4Z.js} +4 -4
  34. package/dist/{chunk-3JZGRXSG.js.map → chunk-KI4UPW4Z.js.map} +1 -1
  35. package/dist/{chunk-JLECJI7S.js → chunk-MFAVWJWE.js} +10 -10
  36. package/dist/{chunk-JLECJI7S.js.map → chunk-MFAVWJWE.js.map} +1 -1
  37. package/dist/{chunk-4JRMXHPU.mjs → chunk-MGZTZELL.mjs} +3 -3
  38. package/dist/{chunk-4JRMXHPU.mjs.map → chunk-MGZTZELL.mjs.map} +1 -1
  39. package/dist/{chunk-37JQVQJS.mjs → chunk-MRLEINJN.mjs} +7 -7
  40. package/dist/{chunk-37JQVQJS.mjs.map → chunk-MRLEINJN.mjs.map} +1 -1
  41. package/dist/{chunk-VZIUQE7B.mjs → chunk-N5365CGD.mjs} +3 -3
  42. package/dist/{chunk-VZIUQE7B.mjs.map → chunk-N5365CGD.mjs.map} +1 -1
  43. package/dist/{chunk-NJ6HH4QP.mjs → chunk-P7GVXI7Y.mjs} +3 -3
  44. package/dist/{chunk-NJ6HH4QP.mjs.map → chunk-P7GVXI7Y.mjs.map} +1 -1
  45. package/dist/{chunk-RWYG7QHP.js → chunk-QL2JYRBN.js} +68 -68
  46. package/dist/{chunk-RWYG7QHP.js.map → chunk-QL2JYRBN.js.map} +1 -1
  47. package/dist/{chunk-7YK4WXHO.js → chunk-R2RPRRB4.js} +55 -55
  48. package/dist/{chunk-7YK4WXHO.js.map → chunk-R2RPRRB4.js.map} +1 -1
  49. package/dist/{chunk-QF6WL7XU.js → chunk-RBB5YGWH.js} +4 -4
  50. package/dist/{chunk-QF6WL7XU.js.map → chunk-RBB5YGWH.js.map} +1 -1
  51. package/dist/{chunk-VCAVH2VM.js → chunk-SUU7XPRX.js} +34 -34
  52. package/dist/{chunk-VCAVH2VM.js.map → chunk-SUU7XPRX.js.map} +1 -1
  53. package/dist/{chunk-RZ3NDH5S.js → chunk-VDO6MDQW.js} +13 -13
  54. package/dist/{chunk-RZ3NDH5S.js.map → chunk-VDO6MDQW.js.map} +1 -1
  55. package/dist/{chunk-VDLMWOQM.js → chunk-XT76DMP5.js} +35 -35
  56. package/dist/{chunk-VDLMWOQM.js.map → chunk-XT76DMP5.js.map} +1 -1
  57. package/dist/{chunk-ZYRL3WER.mjs → chunk-YNHQ36UU.mjs} +3 -3
  58. package/dist/{chunk-ZYRL3WER.mjs.map → chunk-YNHQ36UU.mjs.map} +1 -1
  59. package/dist/{chunk-5LCWQKGQ.mjs → chunk-Z3BMHKKH.mjs} +6 -3
  60. package/dist/chunk-Z3BMHKKH.mjs.map +1 -0
  61. package/dist/{chunk-JHN2OUWG.js → chunk-ZF7RJNPD.js} +45 -45
  62. package/dist/{chunk-JHN2OUWG.js.map → chunk-ZF7RJNPD.js.map} +1 -1
  63. package/dist/{chunk-YRXDETBK.mjs → chunk-ZWLMKOHZ.mjs} +6 -6
  64. package/dist/{chunk-YRXDETBK.mjs.map → chunk-ZWLMKOHZ.mjs.map} +1 -1
  65. package/dist/index.js +665 -665
  66. package/dist/index.mjs +2 -2
  67. package/dist/platform/admin/index.js +10 -10
  68. package/dist/platform/admin/index.mjs +4 -4
  69. package/dist/platform/agents-workspace.js +7 -7
  70. package/dist/platform/agents-workspace.mjs +6 -6
  71. package/dist/platform/app-shell.js +4 -4
  72. package/dist/platform/app-shell.mjs +3 -3
  73. package/dist/platform/auth/index.js +22 -22
  74. package/dist/platform/auth/index.mjs +4 -4
  75. package/dist/platform/billing/index.js +4 -4
  76. package/dist/platform/billing/index.mjs +3 -3
  77. package/dist/platform/impersonation/index.js +4 -4
  78. package/dist/platform/impersonation/index.mjs +3 -3
  79. package/dist/platform/index.js +86 -86
  80. package/dist/platform/index.mjs +18 -18
  81. package/dist/platform/pages/index.js +416 -254
  82. package/dist/platform/pages/index.js.map +1 -1
  83. package/dist/platform/pages/index.mjs +193 -31
  84. package/dist/platform/pages/index.mjs.map +1 -1
  85. package/dist/platform/settings/index.js +7 -7
  86. package/dist/platform/settings/index.mjs +6 -6
  87. package/dist/platform/workflow-canvas-shell.js +5 -5
  88. package/dist/platform/workflow-canvas-shell.mjs +4 -4
  89. package/package.json +1 -1
  90. package/dist/astrlabe/contracts.d.mts +0 -517
  91. package/dist/astrlabe/contracts.d.ts +0 -517
  92. package/dist/astrlabe/graph-node.d.mts +0 -28
  93. package/dist/astrlabe/graph-node.d.ts +0 -28
  94. package/dist/astrlabe/index.d.mts +0 -743
  95. package/dist/astrlabe/index.d.ts +0 -743
  96. package/dist/astrlabe/utils.d.mts +0 -60
  97. package/dist/astrlabe/utils.d.ts +0 -60
  98. package/dist/astrlabe/workflow-canvas.d.mts +0 -6
  99. package/dist/astrlabe/workflow-canvas.d.ts +0 -6
  100. package/dist/astrlabe/workflow-preview-canvas.d.mts +0 -10
  101. package/dist/astrlabe/workflow-preview-canvas.d.ts +0 -10
  102. package/dist/billing-panel-DsHhhJqG.d.mts +0 -18
  103. package/dist/billing-panel-DsHhhJqG.d.ts +0 -18
  104. package/dist/brand/index.d.mts +0 -71
  105. package/dist/brand/index.d.ts +0 -71
  106. package/dist/chunk-5LCWQKGQ.mjs.map +0 -1
  107. package/dist/chunk-BBLBSDPN.js.map +0 -1
  108. package/dist/chunk-CBFK4W4C.mjs.map +0 -1
  109. package/dist/chunk-R4EKPXX3.js.map +0 -1
  110. package/dist/dynamic-island-confirm-BKsZkAEP.d.mts +0 -17
  111. package/dist/dynamic-island-confirm-BKsZkAEP.d.ts +0 -17
  112. package/dist/index-BNRGVAS5.d.mts +0 -222
  113. package/dist/index-BoebbJ44.d.mts +0 -49
  114. package/dist/index-BoebbJ44.d.ts +0 -49
  115. package/dist/index-CnCY-b5V.d.ts +0 -222
  116. package/dist/index.d.mts +0 -5310
  117. package/dist/index.d.ts +0 -5310
  118. package/dist/layout-engine-YZcVr20M.d.mts +0 -19
  119. package/dist/layout-engine-YZcVr20M.d.ts +0 -19
  120. package/dist/lib/i18n-context.d.mts +0 -36
  121. package/dist/lib/i18n-context.d.ts +0 -36
  122. package/dist/lib/router-context.d.mts +0 -35
  123. package/dist/lib/router-context.d.ts +0 -35
  124. package/dist/navigation-BiWVffAN.d.mts +0 -49
  125. package/dist/navigation-BiWVffAN.d.ts +0 -49
  126. package/dist/platform/admin/index.d.mts +0 -17
  127. package/dist/platform/admin/index.d.ts +0 -17
  128. package/dist/platform/agents-workspace.d.mts +0 -19
  129. package/dist/platform/agents-workspace.d.ts +0 -19
  130. package/dist/platform/app-shell.d.mts +0 -58
  131. package/dist/platform/app-shell.d.ts +0 -58
  132. package/dist/platform/auth/index.d.mts +0 -73
  133. package/dist/platform/auth/index.d.ts +0 -73
  134. package/dist/platform/billing/index.d.mts +0 -29
  135. package/dist/platform/billing/index.d.ts +0 -29
  136. package/dist/platform/impersonation/index.d.mts +0 -19
  137. package/dist/platform/impersonation/index.d.ts +0 -19
  138. package/dist/platform/index.d.mts +0 -188
  139. package/dist/platform/index.d.ts +0 -188
  140. package/dist/platform/pages/index.d.mts +0 -526
  141. package/dist/platform/pages/index.d.ts +0 -526
  142. package/dist/platform/rbac.d.mts +0 -42
  143. package/dist/platform/rbac.d.ts +0 -42
  144. package/dist/platform/settings/index.d.mts +0 -31
  145. package/dist/platform/settings/index.d.ts +0 -31
  146. package/dist/platform/telemetry/index.d.mts +0 -51
  147. package/dist/platform/telemetry/index.d.ts +0 -51
  148. package/dist/platform/utils/index.d.mts +0 -32
  149. package/dist/platform/utils/index.d.ts +0 -32
  150. package/dist/platform/windsock-admin-client.d.mts +0 -57
  151. package/dist/platform/windsock-admin-client.d.ts +0 -57
  152. package/dist/platform/workflow-api-client.d.mts +0 -6
  153. package/dist/platform/workflow-api-client.d.ts +0 -6
  154. package/dist/platform/workflow-canvas-shell.d.mts +0 -18
  155. package/dist/platform/workflow-canvas-shell.d.ts +0 -18
  156. package/dist/rule-form-BYJzyork.d.mts +0 -128
  157. package/dist/rule-form-BYJzyork.d.ts +0 -128
  158. package/dist/workflow-api-client-CpFl3WcG.d.mts +0 -468
  159. package/dist/workflow-api-client-uLICOanv.d.ts +0 -468
  160. package/dist/workflow-canvas--qaYKuMm.d.ts +0 -113
  161. package/dist/workflow-canvas-B80fmD_n.d.mts +0 -113
  162. package/dist/workflow-store-o17I6L6A.d.ts +0 -79
  163. package/dist/workflow-store-ppVHdMZi.d.mts +0 -79
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { useAuth, usePlatformPreferences, useNotifications, PlatformShell, LOCALE_FLAGS } from './chunk-5LCWQKGQ.mjs';
2
+ import { useAuth, usePlatformPreferences, useNotifications, PlatformShell, LOCALE_FLAGS } from './chunk-Z3BMHKKH.mjs';
3
3
  import { useTranslations, useLocale } from './chunk-7VJ7CMMT.mjs';
4
4
  import { usePathname, useRouter } from './chunk-QWG2FMUN.mjs';
5
5
  import { createContext, useMemo, useContext, useCallback } from 'react';
@@ -38,6 +38,7 @@ function PlatformAppShell({
38
38
  appGradient,
39
39
  appLogo,
40
40
  appIcon,
41
+ appIconRaw,
41
42
  dashboardIcon,
42
43
  navigationItems,
43
44
  pageOrder,
@@ -97,6 +98,7 @@ function PlatformAppShell({
97
98
  onPrefetch: handlePrefetch,
98
99
  appName,
99
100
  appIcon: appIcon ?? /* @__PURE__ */ jsx(RectangleStackIcon, { className: "h-full w-full" }),
101
+ appIconRaw,
100
102
  appLogo,
101
103
  appGradient,
102
104
  dashboardIcon: dashboardIcon ?? HomeIcon,
@@ -123,5 +125,5 @@ function PlatformAppShell({
123
125
  }
124
126
 
125
127
  export { PlatformAppShell, PlatformStateProvider, usePlatformState };
126
- //# sourceMappingURL=chunk-CBFK4W4C.mjs.map
127
- //# sourceMappingURL=chunk-CBFK4W4C.mjs.map
128
+ //# sourceMappingURL=chunk-JUDQX6MP.mjs.map
129
+ //# sourceMappingURL=chunk-JUDQX6MP.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/platform/platform-state-provider.tsx","../src/platform/app-shell.tsx"],"names":["useMemo","jsx"],"mappings":"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","file":"chunk-JUDQX6MP.mjs","sourcesContent":["import { createContext, useContext, useMemo, type ReactNode } from 'react'\nimport { useAuth, type AuthUser } from '../_auth'\n\ntype PlatformState = {\n currentOrganizationId: string\n actor: AuthUser | null\n}\n\nconst PlatformStateContext = createContext<PlatformState | null>(null)\n\nexport type PlatformStateProviderProps = {\n children: ReactNode\n /**\n * Function that converts a JWT role claim to the app's canonical role\n * union (the same `normalizePlatformRole` produced by\n * `createPlatformRbac()` in this app). Lifted out as a prop because\n * each consuming app uses its own role enum.\n */\n normalizeRole: (input: unknown) => string\n}\n\nexport function PlatformStateProvider({ children, normalizeRole }: PlatformStateProviderProps) {\n const { user } = useAuth()\n\n const state = useMemo<PlatformState>(() => {\n const organizationId = user?.organizationId ?? ''\n\n const actor: AuthUser | null = user\n ? {\n ...user,\n role: normalizeRole(user.role),\n organizationId,\n }\n : null\n\n return {\n currentOrganizationId: organizationId,\n actor,\n }\n }, [user, normalizeRole])\n\n return (\n <PlatformStateContext.Provider value={state}>\n {children}\n </PlatformStateContext.Provider>\n )\n}\n\nexport function usePlatformState() {\n const context = useContext(PlatformStateContext)\n if (!context) throw new Error('usePlatformState must be used inside PlatformStateProvider')\n return context\n}\n","import { useCallback, useMemo, type ComponentType, type ReactNode } from 'react'\nimport { RectangleStackIcon, HomeIcon } from '@heroicons/react/24/outline'\nimport { useAuth, usePlatformPreferences } from '../_auth'\nimport { LANGUAGE_META } from '@datatechsolutions/shared-domain/i18n'\nimport {\n PlatformShell,\n type NavigationItem,\n} from '@ui/index'\nimport { useNotifications } from '@ui/components/notifications'\nimport { useLocale, useTranslations } from '@ui/lib/i18n-context'\nimport { usePathname, useRouter } from '@ui/lib/router-context'\nimport { LOCALE_FLAGS } from '@ui/lib/locale-flags'\nimport { usePlatformState } from './platform-state-provider'\n\nfunction resolveFlag(locale: string): string | undefined {\n const code = locale === 'pt-BR' ? 'br' : locale\n return LOCALE_FLAGS?.[code as keyof typeof LOCALE_FLAGS]\n}\n\nexport type PlatformAppShellProps = {\n /** App display name (e.g. \"Astrlabe\"). */\n appName: string\n /** Tailwind gradient classes for the shell branding (e.g. \"from-sky-500 to-indigo-600\"). */\n appGradient: string\n /** Branded logo node rendered inside the flyout trigger. */\n appLogo: ReactNode\n /**\n * Optional app icon for the branded loader (defaults to the platform's\n * RectangleStackIcon if omitted).\n */\n appIcon?: ReactNode\n /**\n * When the appIcon is a brand SVG that has its own background\n * (gradient, fill, etc), set this to true so the BrandedLoader\n * doesn't wrap it in a second gradient container.\n */\n appIconRaw?: boolean\n /**\n * Optional override for the dock dashboard icon (defaults to HomeIcon).\n */\n dashboardIcon?: ComponentType<{ className?: string }>\n\n /** App-specific navigation items already pre-translated. */\n navigationItems: NavigationItem[]\n /** Custom ordering of launchpad page tiles. */\n pageOrder: string[]\n /**\n * Map of navigation/module ID → required permission name. The shell\n * filters `navigationItems` so that any item whose ID has an entry here\n * is hidden unless `hasPermission` returns true for the listed permission.\n */\n modulePermissions: Record<string, string>\n /**\n * Permission predicate, typically `(p) => can(actor, p)` from each app's\n * `createPlatformRbac()` factory.\n */\n hasPermission: (permission: string) => boolean\n\n /**\n * Optional settings/profile drawer content (e.g. an app-specific\n * `<SettingsModal>`). Receives the open state + close handler the shell\n * manages internally so the drawer renders inside the shell chrome.\n */\n settingsModal?: (props: { open: boolean; onClose: () => void }) => ReactNode\n\n children: ReactNode\n}\n\n/**\n * Cross-app platform shell — wires `<PlatformShell>` from ui to windsock's\n * auth + preferences hooks and to ui's i18n/router contexts. Each app\n * passes its own logo, gradient, navigation, and permission predicate; the\n * rest of the chrome (header, dock, flyout, sign-out confirm modal) is\n * shared.\n */\nexport function PlatformAppShell({\n appName,\n appGradient,\n appLogo,\n appIcon,\n appIconRaw,\n dashboardIcon,\n navigationItems,\n pageOrder,\n modulePermissions,\n hasPermission,\n settingsModal,\n children,\n}: PlatformAppShellProps) {\n const tCommon = useTranslations('common')\n const { user, status, logout } = useAuth()\n // Validate the platform-state provider is mounted above this shell;\n // the actor itself isn't read here, but the same provider feeds children.\n usePlatformState()\n const { resolvedTheme, setTheme, dockPosition, dockAutoHide, dockEnabled } = usePlatformPreferences()\n const pathname = usePathname()\n const router = useRouter()\n const { history, openHistory } = useNotifications()\n const currentLocale = useLocale()\n const localeMeta = LANGUAGE_META[currentLocale as keyof typeof LANGUAGE_META]\n\n const items = useMemo(() => navigationItems.filter((item) => {\n const permission = modulePermissions[item.id]\n if (!permission) return true\n return hasPermission(permission)\n }), [navigationItems, modulePermissions, hasPermission])\n\n const handleSignOut = useCallback(() => { void logout('/login') }, [logout])\n const handleToggleTheme = useCallback(\n () => { setTheme(resolvedTheme === 'dark' ? 'light' : 'dark') },\n [resolvedTheme, setTheme],\n )\n const handleNavigate = useCallback((href: string) => router.push(href), [router])\n const handlePrefetch = useCallback((href: string) => router.prefetch(href), [router])\n\n const shellUser = user\n ? {\n name: user.name ?? null,\n email: user.email ?? null,\n image: user.image ?? null,\n role: user.role ?? null,\n permissions: user.permissions as string[] | undefined,\n organizationId: user.organizationId ?? null,\n }\n : null\n\n return (\n <PlatformShell\n items={items}\n launchpadPageOrder={pageOrder}\n user={shellUser}\n authStatus={status}\n onSignOut={handleSignOut}\n dockPosition={dockPosition}\n dockAutoHide={dockAutoHide}\n dockEnabled={dockEnabled}\n resolvedTheme={resolvedTheme}\n onToggleTheme={handleToggleTheme}\n pathname={pathname}\n onNavigate={handleNavigate}\n onPrefetch={handlePrefetch}\n appName={appName}\n appIcon={appIcon ?? <RectangleStackIcon className=\"h-full w-full\" />}\n appIconRaw={appIconRaw}\n appLogo={appLogo}\n appGradient={appGradient}\n dashboardIcon={dashboardIcon ?? HomeIcon}\n notificationCount={history.length}\n onNotifications={openHistory}\n labels={{\n home: tCommon('home'),\n profile: tCommon('profile'),\n signOut: tCommon('signOut'),\n signOutConfirmTitle: tCommon('signOutConfirmTitle'),\n cancel: tCommon('cancel'),\n notifications: tCommon('notifications'),\n theme: tCommon('theme'),\n currentTheme: resolvedTheme === 'dark' ? tCommon('darkMode') : tCommon('lightMode'),\n language: tCommon('language'),\n currentLocale: localeMeta?.nativeName ?? currentLocale,\n localeFlag: resolveFlag(currentLocale),\n actions: tCommon('actions'),\n }}\n {...(settingsModal ? { profileDrawer: settingsModal } : {})}\n >\n {children}\n </PlatformShell>\n )\n}\n"]}
@@ -1,14 +1,14 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkRWYG7QHP_js = require('./chunk-RWYG7QHP.js');
4
+ var chunkQL2JYRBN_js = require('./chunk-QL2JYRBN.js');
5
5
  var chunkYXN2K77G_js = require('./chunk-YXN2K77G.js');
6
6
  var jsxRuntime = require('react/jsx-runtime');
7
7
 
8
8
  function WorkflowCanvasShell({ graph, messages }) {
9
9
  const locale = chunkYXN2K77G_js.useLocale();
10
10
  return /* @__PURE__ */ jsxRuntime.jsx(
11
- chunkRWYG7QHP_js.Workspace,
11
+ chunkQL2JYRBN_js.Workspace,
12
12
  {
13
13
  initialGraph: graph,
14
14
  locale,
@@ -18,5 +18,5 @@ function WorkflowCanvasShell({ graph, messages }) {
18
18
  }
19
19
 
20
20
  exports.WorkflowCanvasShell = WorkflowCanvasShell;
21
- //# sourceMappingURL=chunk-3JZGRXSG.js.map
22
- //# sourceMappingURL=chunk-3JZGRXSG.js.map
21
+ //# sourceMappingURL=chunk-KI4UPW4Z.js.map
22
+ //# sourceMappingURL=chunk-KI4UPW4Z.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/platform/workflow-canvas-shell.tsx"],"names":["useLocale","jsx","Workspace"],"mappings":";;;;;;AAkBO,SAAS,mBAAA,CAAoB,EAAE,KAAA,EAAO,QAAA,EAAS,EAAU;AAC9D,EAAA,MAAM,SAASA,0BAAA,EAAU;AACzB,EAAA,uBACEC,cAAA;AAAA,IAACC,0BAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAc,KAAA;AAAA,MACd,MAAA;AAAA,MACC,GAAI,QAAA,GAAW,EAAE,QAAA,KAAa;AAAC;AAAA,GAClC;AAEJ","file":"chunk-3JZGRXSG.js","sourcesContent":["import { useLocale } from '@ui/lib/i18n-context'\nimport { Workspace } from '@ui/astrlabe/workflow-canvas'\nimport type { WorkflowGraph as UiWorkflowGraph } from '@ui/astrlabe'\nimport type { WorkflowCanvasShellProps } from '@datatechsolutions/shared-domain/common'\n\n/**\n * Workflow canvas shell with optional message bundle override.\n *\n * Most apps wrap their tree in `<I18nProvider>` and let the canvas read\n * messages from context — in that case `messages` can be omitted. Apps\n * that need to inject a precomputed bundle (e.g. for tests or app-specific\n * overrides not shipped with shared-domain) can pass it explicitly.\n */\ntype Props = WorkflowCanvasShellProps & {\n /** Optional override for the messages catalog passed into the canvas. */\n messages?: Record<string, unknown>\n}\n\nexport function WorkflowCanvasShell({ graph, messages }: Props) {\n const locale = useLocale()\n return (\n <Workspace\n initialGraph={graph as unknown as UiWorkflowGraph}\n locale={locale}\n {...(messages ? { messages } : {})}\n />\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/platform/workflow-canvas-shell.tsx"],"names":["useLocale","jsx","Workspace"],"mappings":";;;;;;AAkBO,SAAS,mBAAA,CAAoB,EAAE,KAAA,EAAO,QAAA,EAAS,EAAU;AAC9D,EAAA,MAAM,SAASA,0BAAA,EAAU;AACzB,EAAA,uBACEC,cAAA;AAAA,IAACC,0BAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAc,KAAA;AAAA,MACd,MAAA;AAAA,MACC,GAAI,QAAA,GAAW,EAAE,QAAA,KAAa;AAAC;AAAA,GAClC;AAEJ","file":"chunk-KI4UPW4Z.js","sourcesContent":["import { useLocale } from '@ui/lib/i18n-context'\nimport { Workspace } from '@ui/astrlabe/workflow-canvas'\nimport type { WorkflowGraph as UiWorkflowGraph } from '@ui/astrlabe'\nimport type { WorkflowCanvasShellProps } from '@datatechsolutions/shared-domain/common'\n\n/**\n * Workflow canvas shell with optional message bundle override.\n *\n * Most apps wrap their tree in `<I18nProvider>` and let the canvas read\n * messages from context — in that case `messages` can be omitted. Apps\n * that need to inject a precomputed bundle (e.g. for tests or app-specific\n * overrides not shipped with shared-domain) can pass it explicitly.\n */\ntype Props = WorkflowCanvasShellProps & {\n /** Optional override for the messages catalog passed into the canvas. */\n messages?: Record<string, unknown>\n}\n\nexport function WorkflowCanvasShell({ graph, messages }: Props) {\n const locale = useLocale()\n return (\n <Workspace\n initialGraph={graph as unknown as UiWorkflowGraph}\n locale={locale}\n {...(messages ? { messages } : {})}\n />\n )\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkR4EKPXX3_js = require('./chunk-R4EKPXX3.js');
4
+ var chunkGD6FHRHV_js = require('./chunk-GD6FHRHV.js');
5
5
  var chunkYXN2K77G_js = require('./chunk-YXN2K77G.js');
6
6
  var chunkBHOT22QL_js = require('./chunk-BHOT22QL.js');
7
7
  var chunkUZ3CMNUJ_js = require('./chunk-UZ3CMNUJ.js');
@@ -20,7 +20,7 @@ function BillingPanel({
20
20
  }) {
21
21
  const t = chunkYXN2K77G_js.useTranslations("windsock");
22
22
  const format = chunkYXN2K77G_js.useFormatter();
23
- const { client } = chunkR4EKPXX3_js.useAuth();
23
+ const { client } = chunkGD6FHRHV_js.useAuth();
24
24
  const [subscription, setSubscription] = react.useState(null);
25
25
  const [plans, setPlans] = react.useState([]);
26
26
  const [isLoading, setIsLoading] = react.useState(true);
@@ -104,7 +104,7 @@ function BillingPanel({
104
104
  }
105
105
  }, [client, load, t]);
106
106
  if (isLoading) {
107
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center py-12", children: /* @__PURE__ */ jsxRuntime.jsx(chunkR4EKPXX3_js.InlineSpinner, {}) });
107
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center py-12", children: /* @__PURE__ */ jsxRuntime.jsx(chunkGD6FHRHV_js.InlineSpinner, {}) });
108
108
  }
109
109
  const currentPlan = subscription?.plan ?? plans.find((plan) => plan.id === subscription?.planId) ?? null;
110
110
  const currentTier = subscription?.tier ?? currentPlan?.tier ?? null;
@@ -118,7 +118,7 @@ function BillingPanel({
118
118
  }
119
119
  ),
120
120
  /* @__PURE__ */ jsxRuntime.jsx(
121
- chunkR4EKPXX3_js.SectionCard,
121
+ chunkGD6FHRHV_js.SectionCard,
122
122
  {
123
123
  header: {
124
124
  title: t("billing.currentPlan.title"),
@@ -128,7 +128,7 @@ function BillingPanel({
128
128
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-3", children: [
129
129
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-lg font-semibold text-gray-900 dark:text-white", children: currentPlan.name }),
130
130
  /* @__PURE__ */ jsxRuntime.jsx(
131
- chunkR4EKPXX3_js.StatusBadge,
131
+ chunkGD6FHRHV_js.StatusBadge,
132
132
  {
133
133
  status: subscription.status === "active" ? "success" : subscription.status === "past_due" ? "pending" : "error",
134
134
  label: t(`billing.status.${subscription.status}`)
@@ -180,17 +180,17 @@ function BillingPanel({
180
180
  }
181
181
  ),
182
182
  /* @__PURE__ */ jsxRuntime.jsx(
183
- chunkR4EKPXX3_js.SectionCard,
183
+ chunkGD6FHRHV_js.SectionCard,
184
184
  {
185
185
  header: {
186
186
  title: t("billing.plans.title"),
187
187
  subtitle: t("billing.plans.description")
188
188
  },
189
- 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(chunkR4EKPXX3_js.ListCard, { children: plans.map((plan) => {
189
+ 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(chunkGD6FHRHV_js.ListCard, { children: plans.map((plan) => {
190
190
  const isCurrent = currentPlan?.id === plan.id;
191
191
  const isDowngrade = currentTier != null && (TIER_ORDER[plan.tier] ?? 0) < (TIER_ORDER[currentTier] ?? 0);
192
192
  return /* @__PURE__ */ jsxRuntime.jsx(
193
- chunkR4EKPXX3_js.ListCardItem,
193
+ chunkGD6FHRHV_js.ListCardItem,
194
194
  {
195
195
  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) }) }),
196
196
  trailing: isCurrent ? /* @__PURE__ */ jsxRuntime.jsx(chunkBHOT22QL_js.Badge, { color: "green", children: t("billing.plans.currentBadge") }) : isDowngrade ? /* @__PURE__ */ jsxRuntime.jsx(
@@ -237,5 +237,5 @@ function BillingPanel({
237
237
  }
238
238
 
239
239
  exports.BillingPanel = BillingPanel;
240
- //# sourceMappingURL=chunk-JLECJI7S.js.map
241
- //# sourceMappingURL=chunk-JLECJI7S.js.map
240
+ //# sourceMappingURL=chunk-MFAVWJWE.js.map
241
+ //# sourceMappingURL=chunk-MFAVWJWE.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-JLECJI7S.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-MFAVWJWE.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,5 +1,5 @@
1
1
  "use client";
2
- import { SectionCard, SegmentedControl, StatusBadge, InlineSpinner, EmptyState, ListCard, ListCardItem, Avatar, DynamicIslandConfirm, Sheet, Input } from './chunk-5LCWQKGQ.mjs';
2
+ import { SectionCard, SegmentedControl, StatusBadge, InlineSpinner, EmptyState, ListCard, ListCardItem, Avatar, DynamicIslandConfirm, Sheet, Input } from './chunk-Z3BMHKKH.mjs';
3
3
  import { useTranslations, useFormatter } from './chunk-7VJ7CMMT.mjs';
4
4
  import { Badge, Button } from './chunk-WR55H7DH.mjs';
5
5
  import { triggerHaptic } from './chunk-D2JF6C3E.mjs';
@@ -500,5 +500,5 @@ function AdminOrganizationDetail({
500
500
  }
501
501
 
502
502
  export { AdminOrganizationDetail };
503
- //# sourceMappingURL=chunk-4JRMXHPU.mjs.map
504
- //# sourceMappingURL=chunk-4JRMXHPU.mjs.map
503
+ //# sourceMappingURL=chunk-MGZTZELL.mjs.map
504
+ //# sourceMappingURL=chunk-MGZTZELL.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/platform/admin/admin-organization-detail.tsx"],"names":[],"mappings":"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","file":"chunk-4JRMXHPU.mjs","sourcesContent":["import { useState, useEffect, useCallback } from 'react'\nimport { useTranslations, useFormatter } from '@ui/lib/i18n-context'\nimport {\n SectionCard,\n SegmentedControl,\n ListCard,\n ListCardItem,\n Button,\n Input,\n Badge,\n StatusBadge,\n EmptyState,\n InlineSpinner,\n Sheet,\n DynamicIslandConfirm,\n Avatar,\n triggerHaptic,\n} from '@ui/index'\nimport {\n UsersIcon,\n EnvelopeIcon,\n GlobeAltIcon,\n PlusIcon,\n TrashIcon,\n CheckCircleIcon,\n ArrowPathIcon,\n} from '@heroicons/react/24/outline'\nimport type {\n AuthOrganizationDomain,\n AuthOrganizationInvitation,\n} from '@datatechsolutions/shared-domain'\n\nexport type { AdminOrganizationDetailProps } from '@datatechsolutions/shared-domain'\nimport type {\n AdminOrganizationDetailProps,\n AdminOrganizationDetailTab,\n AdminOrganizationMember,\n AdminCreateInvitationInput,\n} from '@datatechsolutions/shared-domain'\nimport type { AuthOrganizationRole } from '@datatechsolutions/shared-domain'\n\nconst ALL_TABS: AdminOrganizationDetailTab[] = ['members', 'invitations', 'domains']\n\n// ── Members Tab ─────────────────────────────────────────────────────────────\n\nfunction MembersTabContent({\n organizationId,\n client,\n}: {\n organizationId: string\n client: AdminOrganizationDetailProps['client']\n}) {\n const t = useTranslations('windsock')\n\n const [members, setMembers] = useState<AdminOrganizationMember[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [removingId, setRemovingId] = useState<string | null>(null)\n const [removeTarget, setRemoveTarget] = useState<AdminOrganizationMember | null>(null)\n\n const fetchMembers = useCallback(async () => {\n setIsLoading(true)\n try {\n const result = await client.listOrganizationMembers(organizationId)\n setMembers(result)\n } catch {\n // Fail gracefully\n } finally {\n setIsLoading(false)\n }\n }, [client, organizationId])\n\n useEffect(() => {\n fetchMembers()\n }, [fetchMembers])\n\n const handleRemoveRequest = useCallback((member: AdminOrganizationMember) => {\n triggerHaptic('warning')\n setRemoveTarget(member)\n }, [])\n\n const handleRemoveConfirm = useCallback(async () => {\n if (!removeTarget) return\n setRemovingId(removeTarget.id)\n triggerHaptic('medium')\n try {\n await client.removeOrganizationMember(organizationId, removeTarget.id)\n setRemoveTarget(null)\n triggerHaptic('success')\n fetchMembers()\n } catch {\n triggerHaptic('error')\n } finally {\n setRemovingId(null)\n }\n }, [removeTarget, client, organizationId, fetchMembers])\n\n const handleRemoveCancel = useCallback(() => {\n triggerHaptic('light')\n setRemoveTarget(null)\n }, [])\n\n const roleBadgeColor = (role: string) => {\n if (role === 'owner') return 'purple' as const\n if (role === 'admin') return 'blue' as const\n return 'zinc' as const\n }\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center gap-2 p-8 text-sm text-gray-500 dark:text-gray-400\">\n <InlineSpinner />\n <span>{t('admin.organizationDetail.members.loading')}</span>\n </div>\n )\n }\n\n if (members.length === 0) {\n return (\n <EmptyState\n message={t('admin.organizationDetail.members.emptyMessage')}\n description={t('admin.organizationDetail.members.emptyDescription')}\n icon={UsersIcon}\n variant=\"card\"\n />\n )\n }\n\n return (\n <>\n <ListCard>\n {members.map((member) => (\n <ListCardItem\n key={member.id}\n leading={\n <Avatar\n src={(member as unknown as { image?: string }).image}\n initials={(member.name ?? member.email).slice(0, 2).toUpperCase()}\n alt={member.name ?? member.email}\n />\n }\n trailing={\n member.role !== 'owner' ? (\n <Button\n size=\"sm\"\n color=\"ios-glass-red\"\n onClick={() => handleRemoveRequest(member)}\n loading={removingId === member.id}\n disabled={removingId !== null}\n >\n <TrashIcon className=\"h-3.5 w-3.5\" />\n </Button>\n ) : undefined\n }\n >\n <div className=\"flex items-center gap-2\">\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-medium text-gray-900 dark:text-white\">\n {member.name ?? member.email}\n </p>\n <p className=\"truncate text-xs text-gray-500 dark:text-gray-400\">\n {member.email}\n </p>\n </div>\n <Badge color={roleBadgeColor(member.role)}>{member.role}</Badge>\n </div>\n </ListCardItem>\n ))}\n </ListCard>\n\n <DynamicIslandConfirm\n open={removeTarget !== null}\n onClose={handleRemoveCancel}\n onConfirm={handleRemoveConfirm}\n title={t('admin.organizationDetail.members.removeConfirmTitle', { name: removeTarget?.name ?? removeTarget?.email ?? '' })}\n icon={<TrashIcon className=\"h-5 w-5 text-white\" />}\n iconBackground=\"bg-ios-red\"\n confirmLabel={t('admin.organizationDetail.members.removeConfirmButton')}\n cancelLabel={t('admin.organizationDetail.members.removeCancelButton')}\n />\n </>\n )\n}\n\n// ── Invitations Tab ─────────────────────────────────────────────────────────\n\nfunction InvitationsTabContent({\n organizationId,\n client,\n}: {\n organizationId: string\n client: AdminOrganizationDetailProps['client']\n}) {\n const t = useTranslations('windsock')\n const format = useFormatter()\n\n const [invitations, setInvitations] = useState<AuthOrganizationInvitation[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [isInviteSheetOpen, setIsInviteSheetOpen] = useState(false)\n const [inviteEmail, setInviteEmail] = useState('')\n const [inviteRole, setInviteRole] = useState<AuthOrganizationRole>('member')\n const [isInviting, setIsInviting] = useState(false)\n const [inviteError, setInviteError] = useState<string | null>(null)\n\n const fetchInvitations = useCallback(async () => {\n setIsLoading(true)\n try {\n const result = await client.listOrganizationInvitations(organizationId)\n setInvitations(result)\n } catch {\n // Fail gracefully\n } finally {\n setIsLoading(false)\n }\n }, [client, organizationId])\n\n useEffect(() => {\n fetchInvitations()\n }, [fetchInvitations])\n\n const handleOpenInviteSheet = useCallback(() => {\n triggerHaptic('light')\n setInviteEmail('')\n setInviteRole('member')\n setInviteError(null)\n setIsInviteSheetOpen(true)\n }, [])\n\n const handleCloseInviteSheet = useCallback(() => {\n triggerHaptic('light')\n setIsInviteSheetOpen(false)\n }, [])\n\n const handleSendInvitation = useCallback(async () => {\n if (!inviteEmail.trim()) {\n setInviteError(t('admin.organizationDetail.invitations.errorEmailRequired'))\n triggerHaptic('error')\n return\n }\n\n setInviteError(null)\n setIsInviting(true)\n triggerHaptic('light')\n\n try {\n const data: AdminCreateInvitationInput = {\n email: inviteEmail.trim().toLowerCase(),\n role: inviteRole,\n }\n await client.createOrganizationInvitation(organizationId, data)\n triggerHaptic('success')\n setIsInviteSheetOpen(false)\n fetchInvitations()\n } catch {\n setInviteError(t('admin.organizationDetail.invitations.errorSendFailed'))\n triggerHaptic('error')\n } finally {\n setIsInviting(false)\n }\n }, [inviteEmail, inviteRole, client, organizationId, fetchInvitations, t])\n\n const statusBadgeColor = (status: string) => {\n if (status === 'accepted') return 'green' as const\n if (status === 'pending') return 'amber' as const\n if (status === 'revoked' || status === 'expired') return 'red' as const\n return 'zinc' as const\n }\n\n const roleOptions: AuthOrganizationRole[] = ['viewer', 'member', 'admin', 'owner']\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center gap-2 p-8 text-sm text-gray-500 dark:text-gray-400\">\n <InlineSpinner />\n <span>{t('admin.organizationDetail.invitations.loading')}</span>\n </div>\n )\n }\n\n return (\n <>\n <div className=\"space-y-4\">\n <Button\n color=\"ios-glass-blue\"\n onClick={handleOpenInviteSheet}\n fullWidth\n >\n <PlusIcon className=\"mr-1.5 h-4 w-4\" />\n {t('admin.organizationDetail.invitations.inviteButton')}\n </Button>\n\n {invitations.length === 0 ? (\n <EmptyState\n message={t('admin.organizationDetail.invitations.emptyMessage')}\n description={t('admin.organizationDetail.invitations.emptyDescription')}\n icon={EnvelopeIcon}\n variant=\"card\"\n />\n ) : (\n <ListCard>\n {invitations.map((invitation) => (\n <ListCardItem\n key={invitation.id}\n leading={\n <div className=\"flex h-9 w-9 items-center justify-center rounded-xl bg-gradient-to-br from-amber-500 to-orange-600 shadow-sm\">\n <EnvelopeIcon className=\"h-5 w-5 text-white\" />\n </div>\n }\n trailing={\n <Badge color={statusBadgeColor(invitation.status)}>{invitation.status}</Badge>\n }\n >\n <div>\n <p className=\"text-sm font-medium text-gray-900 dark:text-white\">\n {invitation.email}\n </p>\n <p className=\"mt-0.5 text-xs text-gray-500 dark:text-gray-400\">\n {t('admin.organizationDetail.invitations.roleLabel', { role: invitation.role })}\n {' · '}\n {format.dateTime(new Date(invitation.createdAt), {\n month: 'short',\n day: 'numeric',\n })}\n </p>\n </div>\n </ListCardItem>\n ))}\n </ListCard>\n )}\n </div>\n\n {/* Invite sheet */}\n <Sheet\n open={isInviteSheetOpen}\n onClose={handleCloseInviteSheet}\n title={t('admin.organizationDetail.invitations.sheetTitle')}\n side=\"bottom\"\n size=\"md\"\n >\n <div className=\"space-y-4 p-4 sm:p-6\">\n <Input\n label={t('admin.organizationDetail.invitations.emailLabel')}\n type=\"email\"\n value={inviteEmail}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setInviteEmail(event.target.value)}\n placeholder={t('admin.organizationDetail.invitations.emailPlaceholder')}\n disabled={isInviting}\n autoFocus\n />\n\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-gray-900 dark:text-white\">\n {t('admin.organizationDetail.invitations.roleSelectLabel')}\n </label>\n <div className=\"grid grid-cols-4 gap-2\">\n {roleOptions.map((role) => (\n <button\n key={role}\n type=\"button\"\n onClick={() => {\n setInviteRole(role)\n triggerHaptic('light')\n }}\n className={`rounded-xl border px-2 py-2 text-xs font-semibold backdrop-blur-xl transition ${\n inviteRole === role\n ? 'border-indigo-400/80 bg-gradient-to-br from-indigo-100/85 via-white/80 to-sky-100/75 text-slate-900 dark:border-indigo-300/70 dark:bg-[linear-gradient(140deg,rgba(99,102,241,0.32)_0%,rgba(30,41,59,0.72)_100%)] dark:text-indigo-100'\n : 'border-white/55 bg-gradient-to-br from-white/82 via-white/66 to-slate-100/62 text-slate-700 hover:from-white/92 hover:to-sky-100/72 dark:border-white/15 dark:bg-[linear-gradient(140deg,rgba(30,41,59,0.72)_0%,rgba(15,23,42,0.62)_100%)] dark:text-slate-100 dark:hover:bg-[linear-gradient(140deg,rgba(51,65,85,0.76)_0%,rgba(30,41,59,0.68)_100%)]'\n }`}\n >\n {role}\n </button>\n ))}\n </div>\n </div>\n\n {inviteError && (\n <p className=\"text-sm text-red-600 dark:text-red-400\" role=\"alert\">{inviteError}</p>\n )}\n\n <Button\n color=\"ios-glass-blue\"\n fullWidth\n onClick={handleSendInvitation}\n loading={isInviting}\n disabled={isInviting || !inviteEmail.trim()}\n >\n {t('admin.organizationDetail.invitations.sendButton')}\n </Button>\n </div>\n </Sheet>\n </>\n )\n}\n\n// ── Domains Tab ─────────────────────────────────────────────────────────────\n\nfunction DomainsTabContent({\n organizationId,\n client,\n}: {\n organizationId: string\n client: AdminOrganizationDetailProps['client']\n}) {\n const t = useTranslations('windsock')\n\n const [domains, setDomains] = useState<AuthOrganizationDomain[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [isAddSheetOpen, setIsAddSheetOpen] = useState(false)\n const [newDomain, setNewDomain] = useState('')\n const [isAdding, setIsAdding] = useState(false)\n const [addError, setAddError] = useState<string | null>(null)\n const [verifyingDomain, setVerifyingDomain] = useState<string | null>(null)\n\n const fetchDomains = useCallback(async () => {\n setIsLoading(true)\n try {\n const result = await client.listOrganizationDomains(organizationId)\n setDomains(result)\n } catch {\n // Fail gracefully\n } finally {\n setIsLoading(false)\n }\n }, [client, organizationId])\n\n useEffect(() => {\n fetchDomains()\n }, [fetchDomains])\n\n const handleOpenAddSheet = useCallback(() => {\n triggerHaptic('light')\n setNewDomain('')\n setAddError(null)\n setIsAddSheetOpen(true)\n }, [])\n\n const handleCloseAddSheet = useCallback(() => {\n triggerHaptic('light')\n setIsAddSheetOpen(false)\n }, [])\n\n const handleAddDomain = useCallback(async () => {\n if (!newDomain.trim()) {\n setAddError(t('admin.organizationDetail.domains.errorDomainRequired'))\n triggerHaptic('error')\n return\n }\n\n setAddError(null)\n setIsAdding(true)\n triggerHaptic('light')\n\n try {\n await client.addOrganizationDomain(organizationId, newDomain.trim().toLowerCase())\n triggerHaptic('success')\n setIsAddSheetOpen(false)\n fetchDomains()\n } catch {\n setAddError(t('admin.organizationDetail.domains.errorAddFailed'))\n triggerHaptic('error')\n } finally {\n setIsAdding(false)\n }\n }, [newDomain, client, organizationId, fetchDomains, t])\n\n const handleVerifyDomain = useCallback(async (domain: string) => {\n setVerifyingDomain(domain)\n triggerHaptic('light')\n try {\n await client.verifyOrganizationDomain(organizationId, domain)\n triggerHaptic('success')\n fetchDomains()\n } catch {\n triggerHaptic('error')\n } finally {\n setVerifyingDomain(null)\n }\n }, [client, organizationId, fetchDomains])\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center gap-2 p-8 text-sm text-gray-500 dark:text-gray-400\">\n <InlineSpinner />\n <span>{t('admin.organizationDetail.domains.loading')}</span>\n </div>\n )\n }\n\n return (\n <>\n <div className=\"space-y-4\">\n <Button\n color=\"ios-glass-blue\"\n onClick={handleOpenAddSheet}\n fullWidth\n >\n <PlusIcon className=\"mr-1.5 h-4 w-4\" />\n {t('admin.organizationDetail.domains.addButton')}\n </Button>\n\n {domains.length === 0 ? (\n <EmptyState\n message={t('admin.organizationDetail.domains.emptyMessage')}\n description={t('admin.organizationDetail.domains.emptyDescription')}\n icon={GlobeAltIcon}\n variant=\"card\"\n />\n ) : (\n <ListCard>\n {domains.map((domain) => (\n <ListCardItem\n key={domain.id}\n leading={\n <div className={`flex h-9 w-9 items-center justify-center rounded-xl shadow-sm ${\n domain.verified\n ? 'bg-gradient-to-br from-emerald-500 to-green-600'\n : 'bg-gradient-to-br from-amber-500 to-orange-600'\n }`}>\n {domain.verified\n ? <CheckCircleIcon className=\"h-5 w-5 text-white\" />\n : <GlobeAltIcon className=\"h-5 w-5 text-white\" />\n }\n </div>\n }\n trailing={\n !domain.verified ? (\n <Button\n size=\"sm\"\n color=\"ios-glass-blue\"\n onClick={() => handleVerifyDomain(domain.domain)}\n loading={verifyingDomain === domain.domain}\n disabled={verifyingDomain !== null}\n >\n <ArrowPathIcon className=\"mr-1 h-3.5 w-3.5\" />\n {t('admin.organizationDetail.domains.verifyButton')}\n </Button>\n ) : (\n <StatusBadge status=\"active\" label={t('admin.organizationDetail.domains.verifiedLabel')} size=\"sm\" />\n )\n }\n >\n <div>\n <p className=\"text-sm font-medium text-gray-900 dark:text-white\">\n {domain.domain}\n </p>\n {domain.autoJoinEnabled && (\n <p className=\"mt-0.5 text-xs text-gray-500 dark:text-gray-400\">\n {t('admin.organizationDetail.domains.autoJoinEnabled')}\n </p>\n )}\n </div>\n </ListCardItem>\n ))}\n </ListCard>\n )}\n </div>\n\n {/* Add domain sheet */}\n <Sheet\n open={isAddSheetOpen}\n onClose={handleCloseAddSheet}\n title={t('admin.organizationDetail.domains.sheetTitle')}\n side=\"bottom\"\n size=\"md\"\n >\n <div className=\"space-y-4 p-4 sm:p-6\">\n <Input\n label={t('admin.organizationDetail.domains.domainLabel')}\n value={newDomain}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setNewDomain(event.target.value)}\n placeholder={t('admin.organizationDetail.domains.domainPlaceholder')}\n disabled={isAdding}\n autoFocus\n />\n\n {addError && (\n <p className=\"text-sm text-red-600 dark:text-red-400\" role=\"alert\">{addError}</p>\n )}\n\n <Button\n color=\"ios-glass-blue\"\n fullWidth\n onClick={handleAddDomain}\n loading={isAdding}\n disabled={isAdding || !newDomain.trim()}\n >\n {t('admin.organizationDetail.domains.addDomainButton')}\n </Button>\n </div>\n </Sheet>\n </>\n )\n}\n\n// ── AdminOrganizationDetail ─────────────────────────────────────────────────\n\nexport function AdminOrganizationDetail({\n organization,\n client,\n}: AdminOrganizationDetailProps) {\n const t = useTranslations('windsock')\n\n const [activeTab, setActiveTab] = useState<AdminOrganizationDetailTab>('members')\n\n const segments = ALL_TABS.map((tab) => ({\n value: tab,\n label: t(`admin.organizationDetail.tabs.${tab}`),\n }))\n\n return (\n <div className=\"space-y-6\">\n {/* Organization header */}\n <SectionCard\n header={{\n icon: <UsersIcon className=\"h-5 w-5 text-white\" />,\n title: organization.displayName ?? organization.name,\n subtitle: organization.description ?? t('admin.organizationDetail.defaultSubtitle'),\n gradient: 'from-emerald-500 via-teal-500 to-cyan-500',\n rightContent: (\n <StatusBadge\n status={organization.enabled ? 'active' : 'inactive'}\n label={organization.enabled\n ? t('admin.organizationDetail.statusEnabled')\n : t('admin.organizationDetail.statusDisabled')}\n size=\"sm\"\n />\n ),\n }}\n >\n <div className=\"space-y-4\">\n <SegmentedControl\n segments={segments}\n value={activeTab}\n onChange={(value: string) => setActiveTab(value as AdminOrganizationDetailTab)}\n fullWidth\n />\n\n {activeTab === 'members' && (\n <MembersTabContent organizationId={organization.id} client={client} />\n )}\n\n {activeTab === 'invitations' && (\n <InvitationsTabContent organizationId={organization.id} client={client} />\n )}\n\n {activeTab === 'domains' && (\n <DomainsTabContent organizationId={organization.id} client={client} />\n )}\n </div>\n </SectionCard>\n </div>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/platform/admin/admin-organization-detail.tsx"],"names":[],"mappings":"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","file":"chunk-MGZTZELL.mjs","sourcesContent":["import { useState, useEffect, useCallback } from 'react'\nimport { useTranslations, useFormatter } from '@ui/lib/i18n-context'\nimport {\n SectionCard,\n SegmentedControl,\n ListCard,\n ListCardItem,\n Button,\n Input,\n Badge,\n StatusBadge,\n EmptyState,\n InlineSpinner,\n Sheet,\n DynamicIslandConfirm,\n Avatar,\n triggerHaptic,\n} from '@ui/index'\nimport {\n UsersIcon,\n EnvelopeIcon,\n GlobeAltIcon,\n PlusIcon,\n TrashIcon,\n CheckCircleIcon,\n ArrowPathIcon,\n} from '@heroicons/react/24/outline'\nimport type {\n AuthOrganizationDomain,\n AuthOrganizationInvitation,\n} from '@datatechsolutions/shared-domain'\n\nexport type { AdminOrganizationDetailProps } from '@datatechsolutions/shared-domain'\nimport type {\n AdminOrganizationDetailProps,\n AdminOrganizationDetailTab,\n AdminOrganizationMember,\n AdminCreateInvitationInput,\n} from '@datatechsolutions/shared-domain'\nimport type { AuthOrganizationRole } from '@datatechsolutions/shared-domain'\n\nconst ALL_TABS: AdminOrganizationDetailTab[] = ['members', 'invitations', 'domains']\n\n// ── Members Tab ─────────────────────────────────────────────────────────────\n\nfunction MembersTabContent({\n organizationId,\n client,\n}: {\n organizationId: string\n client: AdminOrganizationDetailProps['client']\n}) {\n const t = useTranslations('windsock')\n\n const [members, setMembers] = useState<AdminOrganizationMember[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [removingId, setRemovingId] = useState<string | null>(null)\n const [removeTarget, setRemoveTarget] = useState<AdminOrganizationMember | null>(null)\n\n const fetchMembers = useCallback(async () => {\n setIsLoading(true)\n try {\n const result = await client.listOrganizationMembers(organizationId)\n setMembers(result)\n } catch {\n // Fail gracefully\n } finally {\n setIsLoading(false)\n }\n }, [client, organizationId])\n\n useEffect(() => {\n fetchMembers()\n }, [fetchMembers])\n\n const handleRemoveRequest = useCallback((member: AdminOrganizationMember) => {\n triggerHaptic('warning')\n setRemoveTarget(member)\n }, [])\n\n const handleRemoveConfirm = useCallback(async () => {\n if (!removeTarget) return\n setRemovingId(removeTarget.id)\n triggerHaptic('medium')\n try {\n await client.removeOrganizationMember(organizationId, removeTarget.id)\n setRemoveTarget(null)\n triggerHaptic('success')\n fetchMembers()\n } catch {\n triggerHaptic('error')\n } finally {\n setRemovingId(null)\n }\n }, [removeTarget, client, organizationId, fetchMembers])\n\n const handleRemoveCancel = useCallback(() => {\n triggerHaptic('light')\n setRemoveTarget(null)\n }, [])\n\n const roleBadgeColor = (role: string) => {\n if (role === 'owner') return 'purple' as const\n if (role === 'admin') return 'blue' as const\n return 'zinc' as const\n }\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center gap-2 p-8 text-sm text-gray-500 dark:text-gray-400\">\n <InlineSpinner />\n <span>{t('admin.organizationDetail.members.loading')}</span>\n </div>\n )\n }\n\n if (members.length === 0) {\n return (\n <EmptyState\n message={t('admin.organizationDetail.members.emptyMessage')}\n description={t('admin.organizationDetail.members.emptyDescription')}\n icon={UsersIcon}\n variant=\"card\"\n />\n )\n }\n\n return (\n <>\n <ListCard>\n {members.map((member) => (\n <ListCardItem\n key={member.id}\n leading={\n <Avatar\n src={(member as unknown as { image?: string }).image}\n initials={(member.name ?? member.email).slice(0, 2).toUpperCase()}\n alt={member.name ?? member.email}\n />\n }\n trailing={\n member.role !== 'owner' ? (\n <Button\n size=\"sm\"\n color=\"ios-glass-red\"\n onClick={() => handleRemoveRequest(member)}\n loading={removingId === member.id}\n disabled={removingId !== null}\n >\n <TrashIcon className=\"h-3.5 w-3.5\" />\n </Button>\n ) : undefined\n }\n >\n <div className=\"flex items-center gap-2\">\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-medium text-gray-900 dark:text-white\">\n {member.name ?? member.email}\n </p>\n <p className=\"truncate text-xs text-gray-500 dark:text-gray-400\">\n {member.email}\n </p>\n </div>\n <Badge color={roleBadgeColor(member.role)}>{member.role}</Badge>\n </div>\n </ListCardItem>\n ))}\n </ListCard>\n\n <DynamicIslandConfirm\n open={removeTarget !== null}\n onClose={handleRemoveCancel}\n onConfirm={handleRemoveConfirm}\n title={t('admin.organizationDetail.members.removeConfirmTitle', { name: removeTarget?.name ?? removeTarget?.email ?? '' })}\n icon={<TrashIcon className=\"h-5 w-5 text-white\" />}\n iconBackground=\"bg-ios-red\"\n confirmLabel={t('admin.organizationDetail.members.removeConfirmButton')}\n cancelLabel={t('admin.organizationDetail.members.removeCancelButton')}\n />\n </>\n )\n}\n\n// ── Invitations Tab ─────────────────────────────────────────────────────────\n\nfunction InvitationsTabContent({\n organizationId,\n client,\n}: {\n organizationId: string\n client: AdminOrganizationDetailProps['client']\n}) {\n const t = useTranslations('windsock')\n const format = useFormatter()\n\n const [invitations, setInvitations] = useState<AuthOrganizationInvitation[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [isInviteSheetOpen, setIsInviteSheetOpen] = useState(false)\n const [inviteEmail, setInviteEmail] = useState('')\n const [inviteRole, setInviteRole] = useState<AuthOrganizationRole>('member')\n const [isInviting, setIsInviting] = useState(false)\n const [inviteError, setInviteError] = useState<string | null>(null)\n\n const fetchInvitations = useCallback(async () => {\n setIsLoading(true)\n try {\n const result = await client.listOrganizationInvitations(organizationId)\n setInvitations(result)\n } catch {\n // Fail gracefully\n } finally {\n setIsLoading(false)\n }\n }, [client, organizationId])\n\n useEffect(() => {\n fetchInvitations()\n }, [fetchInvitations])\n\n const handleOpenInviteSheet = useCallback(() => {\n triggerHaptic('light')\n setInviteEmail('')\n setInviteRole('member')\n setInviteError(null)\n setIsInviteSheetOpen(true)\n }, [])\n\n const handleCloseInviteSheet = useCallback(() => {\n triggerHaptic('light')\n setIsInviteSheetOpen(false)\n }, [])\n\n const handleSendInvitation = useCallback(async () => {\n if (!inviteEmail.trim()) {\n setInviteError(t('admin.organizationDetail.invitations.errorEmailRequired'))\n triggerHaptic('error')\n return\n }\n\n setInviteError(null)\n setIsInviting(true)\n triggerHaptic('light')\n\n try {\n const data: AdminCreateInvitationInput = {\n email: inviteEmail.trim().toLowerCase(),\n role: inviteRole,\n }\n await client.createOrganizationInvitation(organizationId, data)\n triggerHaptic('success')\n setIsInviteSheetOpen(false)\n fetchInvitations()\n } catch {\n setInviteError(t('admin.organizationDetail.invitations.errorSendFailed'))\n triggerHaptic('error')\n } finally {\n setIsInviting(false)\n }\n }, [inviteEmail, inviteRole, client, organizationId, fetchInvitations, t])\n\n const statusBadgeColor = (status: string) => {\n if (status === 'accepted') return 'green' as const\n if (status === 'pending') return 'amber' as const\n if (status === 'revoked' || status === 'expired') return 'red' as const\n return 'zinc' as const\n }\n\n const roleOptions: AuthOrganizationRole[] = ['viewer', 'member', 'admin', 'owner']\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center gap-2 p-8 text-sm text-gray-500 dark:text-gray-400\">\n <InlineSpinner />\n <span>{t('admin.organizationDetail.invitations.loading')}</span>\n </div>\n )\n }\n\n return (\n <>\n <div className=\"space-y-4\">\n <Button\n color=\"ios-glass-blue\"\n onClick={handleOpenInviteSheet}\n fullWidth\n >\n <PlusIcon className=\"mr-1.5 h-4 w-4\" />\n {t('admin.organizationDetail.invitations.inviteButton')}\n </Button>\n\n {invitations.length === 0 ? (\n <EmptyState\n message={t('admin.organizationDetail.invitations.emptyMessage')}\n description={t('admin.organizationDetail.invitations.emptyDescription')}\n icon={EnvelopeIcon}\n variant=\"card\"\n />\n ) : (\n <ListCard>\n {invitations.map((invitation) => (\n <ListCardItem\n key={invitation.id}\n leading={\n <div className=\"flex h-9 w-9 items-center justify-center rounded-xl bg-gradient-to-br from-amber-500 to-orange-600 shadow-sm\">\n <EnvelopeIcon className=\"h-5 w-5 text-white\" />\n </div>\n }\n trailing={\n <Badge color={statusBadgeColor(invitation.status)}>{invitation.status}</Badge>\n }\n >\n <div>\n <p className=\"text-sm font-medium text-gray-900 dark:text-white\">\n {invitation.email}\n </p>\n <p className=\"mt-0.5 text-xs text-gray-500 dark:text-gray-400\">\n {t('admin.organizationDetail.invitations.roleLabel', { role: invitation.role })}\n {' · '}\n {format.dateTime(new Date(invitation.createdAt), {\n month: 'short',\n day: 'numeric',\n })}\n </p>\n </div>\n </ListCardItem>\n ))}\n </ListCard>\n )}\n </div>\n\n {/* Invite sheet */}\n <Sheet\n open={isInviteSheetOpen}\n onClose={handleCloseInviteSheet}\n title={t('admin.organizationDetail.invitations.sheetTitle')}\n side=\"bottom\"\n size=\"md\"\n >\n <div className=\"space-y-4 p-4 sm:p-6\">\n <Input\n label={t('admin.organizationDetail.invitations.emailLabel')}\n type=\"email\"\n value={inviteEmail}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setInviteEmail(event.target.value)}\n placeholder={t('admin.organizationDetail.invitations.emailPlaceholder')}\n disabled={isInviting}\n autoFocus\n />\n\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-gray-900 dark:text-white\">\n {t('admin.organizationDetail.invitations.roleSelectLabel')}\n </label>\n <div className=\"grid grid-cols-4 gap-2\">\n {roleOptions.map((role) => (\n <button\n key={role}\n type=\"button\"\n onClick={() => {\n setInviteRole(role)\n triggerHaptic('light')\n }}\n className={`rounded-xl border px-2 py-2 text-xs font-semibold backdrop-blur-xl transition ${\n inviteRole === role\n ? 'border-indigo-400/80 bg-gradient-to-br from-indigo-100/85 via-white/80 to-sky-100/75 text-slate-900 dark:border-indigo-300/70 dark:bg-[linear-gradient(140deg,rgba(99,102,241,0.32)_0%,rgba(30,41,59,0.72)_100%)] dark:text-indigo-100'\n : 'border-white/55 bg-gradient-to-br from-white/82 via-white/66 to-slate-100/62 text-slate-700 hover:from-white/92 hover:to-sky-100/72 dark:border-white/15 dark:bg-[linear-gradient(140deg,rgba(30,41,59,0.72)_0%,rgba(15,23,42,0.62)_100%)] dark:text-slate-100 dark:hover:bg-[linear-gradient(140deg,rgba(51,65,85,0.76)_0%,rgba(30,41,59,0.68)_100%)]'\n }`}\n >\n {role}\n </button>\n ))}\n </div>\n </div>\n\n {inviteError && (\n <p className=\"text-sm text-red-600 dark:text-red-400\" role=\"alert\">{inviteError}</p>\n )}\n\n <Button\n color=\"ios-glass-blue\"\n fullWidth\n onClick={handleSendInvitation}\n loading={isInviting}\n disabled={isInviting || !inviteEmail.trim()}\n >\n {t('admin.organizationDetail.invitations.sendButton')}\n </Button>\n </div>\n </Sheet>\n </>\n )\n}\n\n// ── Domains Tab ─────────────────────────────────────────────────────────────\n\nfunction DomainsTabContent({\n organizationId,\n client,\n}: {\n organizationId: string\n client: AdminOrganizationDetailProps['client']\n}) {\n const t = useTranslations('windsock')\n\n const [domains, setDomains] = useState<AuthOrganizationDomain[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [isAddSheetOpen, setIsAddSheetOpen] = useState(false)\n const [newDomain, setNewDomain] = useState('')\n const [isAdding, setIsAdding] = useState(false)\n const [addError, setAddError] = useState<string | null>(null)\n const [verifyingDomain, setVerifyingDomain] = useState<string | null>(null)\n\n const fetchDomains = useCallback(async () => {\n setIsLoading(true)\n try {\n const result = await client.listOrganizationDomains(organizationId)\n setDomains(result)\n } catch {\n // Fail gracefully\n } finally {\n setIsLoading(false)\n }\n }, [client, organizationId])\n\n useEffect(() => {\n fetchDomains()\n }, [fetchDomains])\n\n const handleOpenAddSheet = useCallback(() => {\n triggerHaptic('light')\n setNewDomain('')\n setAddError(null)\n setIsAddSheetOpen(true)\n }, [])\n\n const handleCloseAddSheet = useCallback(() => {\n triggerHaptic('light')\n setIsAddSheetOpen(false)\n }, [])\n\n const handleAddDomain = useCallback(async () => {\n if (!newDomain.trim()) {\n setAddError(t('admin.organizationDetail.domains.errorDomainRequired'))\n triggerHaptic('error')\n return\n }\n\n setAddError(null)\n setIsAdding(true)\n triggerHaptic('light')\n\n try {\n await client.addOrganizationDomain(organizationId, newDomain.trim().toLowerCase())\n triggerHaptic('success')\n setIsAddSheetOpen(false)\n fetchDomains()\n } catch {\n setAddError(t('admin.organizationDetail.domains.errorAddFailed'))\n triggerHaptic('error')\n } finally {\n setIsAdding(false)\n }\n }, [newDomain, client, organizationId, fetchDomains, t])\n\n const handleVerifyDomain = useCallback(async (domain: string) => {\n setVerifyingDomain(domain)\n triggerHaptic('light')\n try {\n await client.verifyOrganizationDomain(organizationId, domain)\n triggerHaptic('success')\n fetchDomains()\n } catch {\n triggerHaptic('error')\n } finally {\n setVerifyingDomain(null)\n }\n }, [client, organizationId, fetchDomains])\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center gap-2 p-8 text-sm text-gray-500 dark:text-gray-400\">\n <InlineSpinner />\n <span>{t('admin.organizationDetail.domains.loading')}</span>\n </div>\n )\n }\n\n return (\n <>\n <div className=\"space-y-4\">\n <Button\n color=\"ios-glass-blue\"\n onClick={handleOpenAddSheet}\n fullWidth\n >\n <PlusIcon className=\"mr-1.5 h-4 w-4\" />\n {t('admin.organizationDetail.domains.addButton')}\n </Button>\n\n {domains.length === 0 ? (\n <EmptyState\n message={t('admin.organizationDetail.domains.emptyMessage')}\n description={t('admin.organizationDetail.domains.emptyDescription')}\n icon={GlobeAltIcon}\n variant=\"card\"\n />\n ) : (\n <ListCard>\n {domains.map((domain) => (\n <ListCardItem\n key={domain.id}\n leading={\n <div className={`flex h-9 w-9 items-center justify-center rounded-xl shadow-sm ${\n domain.verified\n ? 'bg-gradient-to-br from-emerald-500 to-green-600'\n : 'bg-gradient-to-br from-amber-500 to-orange-600'\n }`}>\n {domain.verified\n ? <CheckCircleIcon className=\"h-5 w-5 text-white\" />\n : <GlobeAltIcon className=\"h-5 w-5 text-white\" />\n }\n </div>\n }\n trailing={\n !domain.verified ? (\n <Button\n size=\"sm\"\n color=\"ios-glass-blue\"\n onClick={() => handleVerifyDomain(domain.domain)}\n loading={verifyingDomain === domain.domain}\n disabled={verifyingDomain !== null}\n >\n <ArrowPathIcon className=\"mr-1 h-3.5 w-3.5\" />\n {t('admin.organizationDetail.domains.verifyButton')}\n </Button>\n ) : (\n <StatusBadge status=\"active\" label={t('admin.organizationDetail.domains.verifiedLabel')} size=\"sm\" />\n )\n }\n >\n <div>\n <p className=\"text-sm font-medium text-gray-900 dark:text-white\">\n {domain.domain}\n </p>\n {domain.autoJoinEnabled && (\n <p className=\"mt-0.5 text-xs text-gray-500 dark:text-gray-400\">\n {t('admin.organizationDetail.domains.autoJoinEnabled')}\n </p>\n )}\n </div>\n </ListCardItem>\n ))}\n </ListCard>\n )}\n </div>\n\n {/* Add domain sheet */}\n <Sheet\n open={isAddSheetOpen}\n onClose={handleCloseAddSheet}\n title={t('admin.organizationDetail.domains.sheetTitle')}\n side=\"bottom\"\n size=\"md\"\n >\n <div className=\"space-y-4 p-4 sm:p-6\">\n <Input\n label={t('admin.organizationDetail.domains.domainLabel')}\n value={newDomain}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setNewDomain(event.target.value)}\n placeholder={t('admin.organizationDetail.domains.domainPlaceholder')}\n disabled={isAdding}\n autoFocus\n />\n\n {addError && (\n <p className=\"text-sm text-red-600 dark:text-red-400\" role=\"alert\">{addError}</p>\n )}\n\n <Button\n color=\"ios-glass-blue\"\n fullWidth\n onClick={handleAddDomain}\n loading={isAdding}\n disabled={isAdding || !newDomain.trim()}\n >\n {t('admin.organizationDetail.domains.addDomainButton')}\n </Button>\n </div>\n </Sheet>\n </>\n )\n}\n\n// ── AdminOrganizationDetail ─────────────────────────────────────────────────\n\nexport function AdminOrganizationDetail({\n organization,\n client,\n}: AdminOrganizationDetailProps) {\n const t = useTranslations('windsock')\n\n const [activeTab, setActiveTab] = useState<AdminOrganizationDetailTab>('members')\n\n const segments = ALL_TABS.map((tab) => ({\n value: tab,\n label: t(`admin.organizationDetail.tabs.${tab}`),\n }))\n\n return (\n <div className=\"space-y-6\">\n {/* Organization header */}\n <SectionCard\n header={{\n icon: <UsersIcon className=\"h-5 w-5 text-white\" />,\n title: organization.displayName ?? organization.name,\n subtitle: organization.description ?? t('admin.organizationDetail.defaultSubtitle'),\n gradient: 'from-emerald-500 via-teal-500 to-cyan-500',\n rightContent: (\n <StatusBadge\n status={organization.enabled ? 'active' : 'inactive'}\n label={organization.enabled\n ? t('admin.organizationDetail.statusEnabled')\n : t('admin.organizationDetail.statusDisabled')}\n size=\"sm\"\n />\n ),\n }}\n >\n <div className=\"space-y-4\">\n <SegmentedControl\n segments={segments}\n value={activeTab}\n onChange={(value: string) => setActiveTab(value as AdminOrganizationDetailTab)}\n fullWidth\n />\n\n {activeTab === 'members' && (\n <MembersTabContent organizationId={organization.id} client={client} />\n )}\n\n {activeTab === 'invitations' && (\n <InvitationsTabContent organizationId={organization.id} client={client} />\n )}\n\n {activeTab === 'domains' && (\n <DomainsTabContent organizationId={organization.id} client={client} />\n )}\n </div>\n </SectionCard>\n </div>\n )\n}\n"]}
@@ -1,11 +1,11 @@
1
1
  "use client";
2
- import { DatasourceFormModal } from './chunk-NVQVZ4U4.mjs';
3
- import { useSubworkflowStore, SaveStatusBadge, WorkflowListBar, NodePalette, AutoSaveWorkspace, AgentModal, PipelineSettingsModal, SubworkflowModal, RunPanel, RunInputDialog, PreviewPanel } from './chunk-C4AJWDFB.mjs';
2
+ import { DatasourceFormModal } from './chunk-DCBRGVD3.mjs';
3
+ import { useSubworkflowStore, SaveStatusBadge, WorkflowListBar, NodePalette, AutoSaveWorkspace, AgentModal, PipelineSettingsModal, SubworkflowModal, RunPanel, RunInputDialog, PreviewPanel } from './chunk-EIZM2EQA.mjs';
4
4
  import { validateWorkflowGraph } from './chunk-LEXBTVGM.mjs';
5
- import { useWorkflowStore, useModalStore, WorkflowBuilderProvider } from './chunk-VZIUQE7B.mjs';
6
- import { useNotifications, PageErrorState, PageEmptyState, CopyableId, DynamicIslandConfirm } from './chunk-5LCWQKGQ.mjs';
7
- import { useLocale, useTranslations } from './chunk-7VJ7CMMT.mjs';
5
+ import { useWorkflowStore, useModalStore, WorkflowBuilderProvider } from './chunk-N5365CGD.mjs';
6
+ import { useNotifications, PageErrorState, PageEmptyState, CopyableId, DynamicIslandConfirm } from './chunk-Z3BMHKKH.mjs';
8
7
  import { executeWorkflow, getWorkflowById, getAgentConfigsWithPrompts, getAgentModels, getAgentToolDefinitions, getAgentRules, getDatasources, listModelProviderConnections, getAgentTools, getWorkflows, saveWorkflowDraft, publishWorkflow, createWorkflow, deleteWorkflow, updateAgentTool, updateAgentRule, createDatasource, getDatasourceSchema, getDatasourceTables, updateAgentConfig, createAgentConfig, updateWorkflowSettings, getWorkflowRuns, buildAuthenticatedApiUrl } from './chunk-RHRJXK5R.mjs';
8
+ import { useLocale, useTranslations } from './chunk-7VJ7CMMT.mjs';
9
9
  import { Button } from './chunk-WR55H7DH.mjs';
10
10
  import { useState, useRef, useCallback, useEffect, useMemo } from 'react';
11
11
  import { useNavigate } from 'react-router';
@@ -938,5 +938,5 @@ function AgentsWorkspace({ workflowId, messages }) {
938
938
  }
939
939
 
940
940
  export { AgentsWorkspace, applyWorkflowExecutionEventToStore, resetWorkflowRunPresentation, useRunEvents, useWorkflowExecution, useWorkflowRunPresentation };
941
- //# sourceMappingURL=chunk-37JQVQJS.mjs.map
942
- //# sourceMappingURL=chunk-37JQVQJS.mjs.map
941
+ //# sourceMappingURL=chunk-MRLEINJN.mjs.map
942
+ //# sourceMappingURL=chunk-MRLEINJN.mjs.map