@datatechsolutions/ui 3.7.5 → 3.8.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.
Files changed (91) 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-GAN7AKZ2.mjs → chunk-32DHEVOH.mjs} +3 -3
  6. package/dist/{chunk-GAN7AKZ2.mjs.map → chunk-32DHEVOH.mjs.map} +1 -1
  7. package/dist/{chunk-IYDGO7RW.js → chunk-3H5CFLVK.js} +135 -135
  8. package/dist/{chunk-IYDGO7RW.js.map → chunk-3H5CFLVK.js.map} +1 -1
  9. package/dist/{chunk-QL2JYRBN.js → chunk-3X3IYDG6.js} +68 -68
  10. package/dist/{chunk-QL2JYRBN.js.map → chunk-3X3IYDG6.js.map} +1 -1
  11. package/dist/{chunk-N5365CGD.mjs → chunk-57E4TCB2.mjs} +3 -3
  12. package/dist/{chunk-N5365CGD.mjs.map → chunk-57E4TCB2.mjs.map} +1 -1
  13. package/dist/{chunk-4HP7XS5I.mjs → chunk-5W6LMDXV.mjs} +4 -4
  14. package/dist/{chunk-4HP7XS5I.mjs.map → chunk-5W6LMDXV.mjs.map} +1 -1
  15. package/dist/{chunk-EIZM2EQA.mjs → chunk-5YVOLHSW.mjs} +4 -4
  16. package/dist/{chunk-EIZM2EQA.mjs.map → chunk-5YVOLHSW.mjs.map} +1 -1
  17. package/dist/{chunk-KZSL7AXW.mjs → chunk-74BU2EBZ.mjs} +6 -6
  18. package/dist/{chunk-KZSL7AXW.mjs.map → chunk-74BU2EBZ.mjs.map} +1 -1
  19. package/dist/{chunk-7WIWDSF6.js → chunk-7JZFNKJD.js} +36 -36
  20. package/dist/{chunk-7WIWDSF6.js.map → chunk-7JZFNKJD.js.map} +1 -1
  21. package/dist/{chunk-DCBRGVD3.mjs → chunk-A4A3SQTV.mjs} +3 -3
  22. package/dist/{chunk-DCBRGVD3.mjs.map → chunk-A4A3SQTV.mjs.map} +1 -1
  23. package/dist/{chunk-JUDQX6MP.mjs → chunk-CZZOCKEA.mjs} +3 -3
  24. package/dist/{chunk-JUDQX6MP.mjs.map → chunk-CZZOCKEA.mjs.map} +1 -1
  25. package/dist/{chunk-DWIBK7GV.js → chunk-E57RZXOR.js} +25 -25
  26. package/dist/{chunk-DWIBK7GV.js.map → chunk-E57RZXOR.js.map} +1 -1
  27. package/dist/{chunk-Z3BMHKKH.mjs → chunk-E6C7MFHJ.mjs} +3 -3
  28. package/dist/{chunk-Z3BMHKKH.mjs.map → chunk-E6C7MFHJ.mjs.map} +1 -1
  29. package/dist/{chunk-P7GVXI7Y.mjs → chunk-EWYAM4WJ.mjs} +3 -3
  30. package/dist/{chunk-P7GVXI7Y.mjs.map → chunk-EWYAM4WJ.mjs.map} +1 -1
  31. package/dist/{chunk-Y2FR242F.js → chunk-F35GFICG.js} +13 -13
  32. package/dist/{chunk-Y2FR242F.js.map → chunk-F35GFICG.js.map} +1 -1
  33. package/dist/{chunk-BEUPW5WS.js → chunk-FKUIVS6I.js} +28 -28
  34. package/dist/{chunk-BEUPW5WS.js.map → chunk-FKUIVS6I.js.map} +1 -1
  35. package/dist/{chunk-GD6FHRHV.js → chunk-FNA66TT4.js} +3 -3
  36. package/dist/{chunk-GD6FHRHV.js.map → chunk-FNA66TT4.js.map} +1 -1
  37. package/dist/{chunk-RBB5YGWH.js → chunk-H37VDL7Y.js} +4 -4
  38. package/dist/{chunk-RBB5YGWH.js.map → chunk-H37VDL7Y.js.map} +1 -1
  39. package/dist/{chunk-KI4UPW4Z.js → chunk-HBOORO52.js} +4 -4
  40. package/dist/{chunk-KI4UPW4Z.js.map → chunk-HBOORO52.js.map} +1 -1
  41. package/dist/{chunk-MGZTZELL.mjs → chunk-KKXI7CPF.mjs} +3 -3
  42. package/dist/{chunk-MGZTZELL.mjs.map → chunk-KKXI7CPF.mjs.map} +1 -1
  43. package/dist/{chunk-IKH5IRDK.mjs → chunk-PCUINUIC.mjs} +3 -3
  44. package/dist/{chunk-IKH5IRDK.mjs.map → chunk-PCUINUIC.mjs.map} +1 -1
  45. package/dist/{chunk-CTCO2YI5.mjs → chunk-PYNXIDG3.mjs} +3 -3
  46. package/dist/{chunk-CTCO2YI5.mjs.map → chunk-PYNXIDG3.mjs.map} +1 -1
  47. package/dist/{chunk-MFAVWJWE.js → chunk-Q4QORAMH.js} +10 -10
  48. package/dist/{chunk-MFAVWJWE.js.map → chunk-Q4QORAMH.js.map} +1 -1
  49. package/dist/{chunk-ZF7RJNPD.js → chunk-Q7HRCCFT.js} +45 -45
  50. package/dist/{chunk-ZF7RJNPD.js.map → chunk-Q7HRCCFT.js.map} +1 -1
  51. package/dist/{chunk-R2RPRRB4.js → chunk-RCHTRG7R.js} +55 -55
  52. package/dist/{chunk-R2RPRRB4.js.map → chunk-RCHTRG7R.js.map} +1 -1
  53. package/dist/{chunk-FIB2CFJK.js → chunk-TCP45Q4B.js} +9 -9
  54. package/dist/{chunk-FIB2CFJK.js.map → chunk-TCP45Q4B.js.map} +1 -1
  55. package/dist/{chunk-SUU7XPRX.js → chunk-TJPPZU77.js} +34 -34
  56. package/dist/{chunk-SUU7XPRX.js.map → chunk-TJPPZU77.js.map} +1 -1
  57. package/dist/{chunk-XT76DMP5.js → chunk-VPFVW7ZF.js} +35 -35
  58. package/dist/{chunk-XT76DMP5.js.map → chunk-VPFVW7ZF.js.map} +1 -1
  59. package/dist/{chunk-IKHWYYZC.mjs → chunk-VS6PTRQ7.mjs} +3 -3
  60. package/dist/{chunk-IKHWYYZC.mjs.map → chunk-VS6PTRQ7.mjs.map} +1 -1
  61. package/dist/{chunk-YNHQ36UU.mjs → chunk-WDBVIU7W.mjs} +3 -3
  62. package/dist/{chunk-YNHQ36UU.mjs.map → chunk-WDBVIU7W.mjs.map} +1 -1
  63. package/dist/{chunk-MRLEINJN.mjs → chunk-ZP37M2QK.mjs} +7 -7
  64. package/dist/{chunk-MRLEINJN.mjs.map → chunk-ZP37M2QK.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 +78 -78
  80. package/dist/platform/index.mjs +18 -18
  81. package/dist/platform/pages/index.d.mts +36 -0
  82. package/dist/platform/pages/index.d.ts +36 -0
  83. package/dist/platform/pages/index.js +613 -277
  84. package/dist/platform/pages/index.js.map +1 -1
  85. package/dist/platform/pages/index.mjs +382 -46
  86. package/dist/platform/pages/index.mjs.map +1 -1
  87. package/dist/platform/settings/index.js +7 -7
  88. package/dist/platform/settings/index.mjs +6 -6
  89. package/dist/platform/workflow-canvas-shell.js +5 -5
  90. package/dist/platform/workflow-canvas-shell.mjs +4 -4
  91. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkGD6FHRHV_js = require('./chunk-GD6FHRHV.js');
4
+ var chunkFNA66TT4_js = require('./chunk-FNA66TT4.js');
5
5
  var chunkYXN2K77G_js = require('./chunk-YXN2K77G.js');
6
6
  var chunkS7KHTUHA_js = require('./chunk-S7KHTUHA.js');
7
7
  var react = require('react');
@@ -11,7 +11,7 @@ var jsxRuntime = require('react/jsx-runtime');
11
11
 
12
12
  var PlatformStateContext = react.createContext(null);
13
13
  function PlatformStateProvider({ children, normalizeRole }) {
14
- const { user } = chunkGD6FHRHV_js.useAuth();
14
+ const { user } = chunkFNA66TT4_js.useAuth();
15
15
  const state = react.useMemo(() => {
16
16
  const organizationId = user?.organizationId ?? "";
17
17
  const actor = user ? {
@@ -33,7 +33,7 @@ function usePlatformState() {
33
33
  }
34
34
  function resolveFlag(locale) {
35
35
  const code = locale === "pt-BR" ? "br" : locale;
36
- return chunkGD6FHRHV_js.LOCALE_FLAGS?.[code];
36
+ return chunkFNA66TT4_js.LOCALE_FLAGS?.[code];
37
37
  }
38
38
  function PlatformAppShell({
39
39
  appName,
@@ -50,12 +50,12 @@ function PlatformAppShell({
50
50
  children
51
51
  }) {
52
52
  const tCommon = chunkYXN2K77G_js.useTranslations("common");
53
- const { user, status, logout } = chunkGD6FHRHV_js.useAuth();
53
+ const { user, status, logout } = chunkFNA66TT4_js.useAuth();
54
54
  usePlatformState();
55
- const { resolvedTheme, setTheme, dockPosition, dockAutoHide, dockEnabled } = chunkGD6FHRHV_js.usePlatformPreferences();
55
+ const { resolvedTheme, setTheme, dockPosition, dockAutoHide, dockEnabled } = chunkFNA66TT4_js.usePlatformPreferences();
56
56
  const pathname = chunkS7KHTUHA_js.usePathname();
57
57
  const router = chunkS7KHTUHA_js.useRouter();
58
- const { history, openHistory } = chunkGD6FHRHV_js.useNotifications();
58
+ const { history, openHistory } = chunkFNA66TT4_js.useNotifications();
59
59
  const currentLocale = chunkYXN2K77G_js.useLocale();
60
60
  const localeMeta = i18n.LANGUAGE_META[currentLocale];
61
61
  const items = react.useMemo(() => navigationItems.filter((item) => {
@@ -83,7 +83,7 @@ function PlatformAppShell({
83
83
  organizationId: user.organizationId ?? null
84
84
  } : null;
85
85
  return /* @__PURE__ */ jsxRuntime.jsx(
86
- chunkGD6FHRHV_js.PlatformShell,
86
+ chunkFNA66TT4_js.PlatformShell,
87
87
  {
88
88
  items,
89
89
  launchpadPageOrder: pageOrder,
@@ -129,5 +129,5 @@ function PlatformAppShell({
129
129
  exports.PlatformAppShell = PlatformAppShell;
130
130
  exports.PlatformStateProvider = PlatformStateProvider;
131
131
  exports.usePlatformState = usePlatformState;
132
- //# sourceMappingURL=chunk-FIB2CFJK.js.map
133
- //# sourceMappingURL=chunk-FIB2CFJK.js.map
132
+ //# sourceMappingURL=chunk-TCP45Q4B.js.map
133
+ //# sourceMappingURL=chunk-TCP45Q4B.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/platform/platform-state-provider.tsx","../src/platform/app-shell.tsx"],"names":["createContext","useAuth","useMemo","useContext","LOCALE_FLAGS","useTranslations","usePlatformPreferences","usePathname","useRouter","useNotifications","useLocale","LANGUAGE_META","useCallback","jsx","PlatformShell","RectangleStackIcon","HomeIcon"],"mappings":"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","file":"chunk-FIB2CFJK.js","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
+ {"version":3,"sources":["../src/platform/platform-state-provider.tsx","../src/platform/app-shell.tsx"],"names":["createContext","useAuth","useMemo","useContext","LOCALE_FLAGS","useTranslations","usePlatformPreferences","usePathname","useRouter","useNotifications","useLocale","LANGUAGE_META","useCallback","jsx","PlatformShell","RectangleStackIcon","HomeIcon"],"mappings":"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","file":"chunk-TCP45Q4B.js","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,7 +1,7 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkGD6FHRHV_js = require('./chunk-GD6FHRHV.js');
4
+ var chunkFNA66TT4_js = require('./chunk-FNA66TT4.js');
5
5
  var chunkBHOT22QL_js = require('./chunk-BHOT22QL.js');
6
6
  var react = require('react');
7
7
  var outline = require('@heroicons/react/24/outline');
@@ -218,41 +218,41 @@ function ConnectionForm({
218
218
  switch (dialect.formType) {
219
219
  case "standard":
220
220
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
221
- /* @__PURE__ */ jsxRuntime.jsx(chunkGD6FHRHV_js.FormInput, { name: "host", label: labels.fieldHost, placeholder: labels.fieldHostPlaceholder, required: true }),
222
- /* @__PURE__ */ jsxRuntime.jsx(chunkGD6FHRHV_js.FormInput, { name: "port", label: labels.fieldPort, type: "number", defaultValue: dialect.defaultPort }),
223
- /* @__PURE__ */ jsxRuntime.jsx(chunkGD6FHRHV_js.FormInput, { name: "database", label: labels.fieldDatabase, placeholder: labels.fieldDatabasePlaceholder, required: true }),
224
- /* @__PURE__ */ jsxRuntime.jsx(chunkGD6FHRHV_js.FormInput, { name: "username", label: labels.fieldUsername, placeholder: labels.fieldUsernamePlaceholder }),
225
- /* @__PURE__ */ jsxRuntime.jsx(chunkGD6FHRHV_js.FormInput, { name: "password", label: labels.fieldPassword, type: "password", placeholder: labels.fieldPasswordPlaceholder }),
226
- /* @__PURE__ */ jsxRuntime.jsx(chunkGD6FHRHV_js.FormInput, { name: "schema", label: labels.fieldSchema, placeholder: labels.fieldSchemaPlaceholder })
221
+ /* @__PURE__ */ jsxRuntime.jsx(chunkFNA66TT4_js.FormInput, { name: "host", label: labels.fieldHost, placeholder: labels.fieldHostPlaceholder, required: true }),
222
+ /* @__PURE__ */ jsxRuntime.jsx(chunkFNA66TT4_js.FormInput, { name: "port", label: labels.fieldPort, type: "number", defaultValue: dialect.defaultPort }),
223
+ /* @__PURE__ */ jsxRuntime.jsx(chunkFNA66TT4_js.FormInput, { name: "database", label: labels.fieldDatabase, placeholder: labels.fieldDatabasePlaceholder, required: true }),
224
+ /* @__PURE__ */ jsxRuntime.jsx(chunkFNA66TT4_js.FormInput, { name: "username", label: labels.fieldUsername, placeholder: labels.fieldUsernamePlaceholder }),
225
+ /* @__PURE__ */ jsxRuntime.jsx(chunkFNA66TT4_js.FormInput, { name: "password", label: labels.fieldPassword, type: "password", placeholder: labels.fieldPasswordPlaceholder }),
226
+ /* @__PURE__ */ jsxRuntime.jsx(chunkFNA66TT4_js.FormInput, { name: "schema", label: labels.fieldSchema, placeholder: labels.fieldSchemaPlaceholder })
227
227
  ] });
228
228
  case "connection-string":
229
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "col-span-full", children: /* @__PURE__ */ jsxRuntime.jsx(chunkGD6FHRHV_js.FormInput, { name: "connectionString", label: labels.fieldConnectionString, placeholder: labels.fieldConnectionStringPlaceholder, required: true }) });
229
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "col-span-full", children: /* @__PURE__ */ jsxRuntime.jsx(chunkFNA66TT4_js.FormInput, { name: "connectionString", label: labels.fieldConnectionString, placeholder: labels.fieldConnectionStringPlaceholder, required: true }) });
230
230
  case "cloud-bigquery":
231
231
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
232
- /* @__PURE__ */ jsxRuntime.jsx(chunkGD6FHRHV_js.FormInput, { name: "projectId", label: labels.fieldProjectId, placeholder: labels.fieldProjectIdPlaceholder, required: true }),
233
- /* @__PURE__ */ jsxRuntime.jsx(chunkGD6FHRHV_js.FormInput, { name: "dataset", label: labels.fieldDataset, placeholder: labels.fieldDatasetPlaceholder, required: true }),
234
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "col-span-full", children: /* @__PURE__ */ jsxRuntime.jsx(chunkGD6FHRHV_js.FormInput, { name: "keyFile", label: labels.fieldKeyFile, placeholder: labels.fieldKeyFilePlaceholder }) })
232
+ /* @__PURE__ */ jsxRuntime.jsx(chunkFNA66TT4_js.FormInput, { name: "projectId", label: labels.fieldProjectId, placeholder: labels.fieldProjectIdPlaceholder, required: true }),
233
+ /* @__PURE__ */ jsxRuntime.jsx(chunkFNA66TT4_js.FormInput, { name: "dataset", label: labels.fieldDataset, placeholder: labels.fieldDatasetPlaceholder, required: true }),
234
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "col-span-full", children: /* @__PURE__ */ jsxRuntime.jsx(chunkFNA66TT4_js.FormInput, { name: "keyFile", label: labels.fieldKeyFile, placeholder: labels.fieldKeyFilePlaceholder }) })
235
235
  ] });
236
236
  case "cloud-snowflake":
237
237
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
238
- /* @__PURE__ */ jsxRuntime.jsx(chunkGD6FHRHV_js.FormInput, { name: "account", label: labels.fieldAccount, placeholder: labels.fieldAccountPlaceholder, required: true }),
239
- /* @__PURE__ */ jsxRuntime.jsx(chunkGD6FHRHV_js.FormInput, { name: "warehouse", label: labels.fieldWarehouse, placeholder: labels.fieldWarehousePlaceholder, required: true }),
240
- /* @__PURE__ */ jsxRuntime.jsx(chunkGD6FHRHV_js.FormInput, { name: "database", label: labels.fieldDatabase, placeholder: labels.fieldDatabasePlaceholder, required: true }),
241
- /* @__PURE__ */ jsxRuntime.jsx(chunkGD6FHRHV_js.FormInput, { name: "username", label: labels.fieldUsername, placeholder: labels.fieldUsernamePlaceholder, required: true }),
242
- /* @__PURE__ */ jsxRuntime.jsx(chunkGD6FHRHV_js.FormInput, { name: "password", label: labels.fieldPassword, type: "password", placeholder: labels.fieldPasswordPlaceholder }),
243
- /* @__PURE__ */ jsxRuntime.jsx(chunkGD6FHRHV_js.FormInput, { name: "schema", label: labels.fieldSchema, placeholder: labels.fieldSchemaPlaceholder })
238
+ /* @__PURE__ */ jsxRuntime.jsx(chunkFNA66TT4_js.FormInput, { name: "account", label: labels.fieldAccount, placeholder: labels.fieldAccountPlaceholder, required: true }),
239
+ /* @__PURE__ */ jsxRuntime.jsx(chunkFNA66TT4_js.FormInput, { name: "warehouse", label: labels.fieldWarehouse, placeholder: labels.fieldWarehousePlaceholder, required: true }),
240
+ /* @__PURE__ */ jsxRuntime.jsx(chunkFNA66TT4_js.FormInput, { name: "database", label: labels.fieldDatabase, placeholder: labels.fieldDatabasePlaceholder, required: true }),
241
+ /* @__PURE__ */ jsxRuntime.jsx(chunkFNA66TT4_js.FormInput, { name: "username", label: labels.fieldUsername, placeholder: labels.fieldUsernamePlaceholder, required: true }),
242
+ /* @__PURE__ */ jsxRuntime.jsx(chunkFNA66TT4_js.FormInput, { name: "password", label: labels.fieldPassword, type: "password", placeholder: labels.fieldPasswordPlaceholder }),
243
+ /* @__PURE__ */ jsxRuntime.jsx(chunkFNA66TT4_js.FormInput, { name: "schema", label: labels.fieldSchema, placeholder: labels.fieldSchemaPlaceholder })
244
244
  ] });
245
245
  case "cloud-key":
246
246
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
247
- /* @__PURE__ */ jsxRuntime.jsx(chunkGD6FHRHV_js.FormInput, { name: "region", label: labels.fieldRegion, placeholder: labels.fieldRegionPlaceholder, required: true }),
248
- /* @__PURE__ */ jsxRuntime.jsx(chunkGD6FHRHV_js.FormInput, { name: "token", label: labels.fieldToken, type: "password", placeholder: labels.fieldTokenPlaceholder, required: true }),
249
- /* @__PURE__ */ jsxRuntime.jsx(chunkGD6FHRHV_js.FormInput, { name: "bucket", label: labels.fieldBucket, placeholder: labels.fieldBucketPlaceholder })
247
+ /* @__PURE__ */ jsxRuntime.jsx(chunkFNA66TT4_js.FormInput, { name: "region", label: labels.fieldRegion, placeholder: labels.fieldRegionPlaceholder, required: true }),
248
+ /* @__PURE__ */ jsxRuntime.jsx(chunkFNA66TT4_js.FormInput, { name: "token", label: labels.fieldToken, type: "password", placeholder: labels.fieldTokenPlaceholder, required: true }),
249
+ /* @__PURE__ */ jsxRuntime.jsx(chunkFNA66TT4_js.FormInput, { name: "bucket", label: labels.fieldBucket, placeholder: labels.fieldBucketPlaceholder })
250
250
  ] });
251
251
  case "vector-key":
252
252
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
253
- /* @__PURE__ */ jsxRuntime.jsx(chunkGD6FHRHV_js.FormInput, { name: "apiKey", label: labels.fieldApiKey, type: "password", placeholder: labels.fieldApiKeyPlaceholder, required: true }),
254
- /* @__PURE__ */ jsxRuntime.jsx(chunkGD6FHRHV_js.FormInput, { name: "environment", label: labels.fieldEnvironment, placeholder: labels.fieldEnvironmentPlaceholder, required: true }),
255
- /* @__PURE__ */ jsxRuntime.jsx(chunkGD6FHRHV_js.FormInput, { name: "index", label: labels.fieldIndex, placeholder: labels.fieldIndexPlaceholder })
253
+ /* @__PURE__ */ jsxRuntime.jsx(chunkFNA66TT4_js.FormInput, { name: "apiKey", label: labels.fieldApiKey, type: "password", placeholder: labels.fieldApiKeyPlaceholder, required: true }),
254
+ /* @__PURE__ */ jsxRuntime.jsx(chunkFNA66TT4_js.FormInput, { name: "environment", label: labels.fieldEnvironment, placeholder: labels.fieldEnvironmentPlaceholder, required: true }),
255
+ /* @__PURE__ */ jsxRuntime.jsx(chunkFNA66TT4_js.FormInput, { name: "index", label: labels.fieldIndex, placeholder: labels.fieldIndexPlaceholder })
256
256
  ] });
257
257
  }
258
258
  }
@@ -275,8 +275,8 @@ function ConnectionForm({
275
275
  ] })
276
276
  ] })
277
277
  ] }),
278
- /* @__PURE__ */ jsxRuntime.jsx(chunkGD6FHRHV_js.FormInput, { name: "name", label: labels.fieldName, placeholder: labels.fieldNamePlaceholder, required: true }),
279
- /* @__PURE__ */ jsxRuntime.jsx(chunkGD6FHRHV_js.FormGrid, { children: renderFields() }),
278
+ /* @__PURE__ */ jsxRuntime.jsx(chunkFNA66TT4_js.FormInput, { name: "name", label: labels.fieldName, placeholder: labels.fieldNamePlaceholder, required: true }),
279
+ /* @__PURE__ */ jsxRuntime.jsx(chunkFNA66TT4_js.FormGrid, { children: renderFields() }),
280
280
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-6 pt-2", children: [
281
281
  /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-2 text-sm text-slate-700 dark:text-slate-300", children: [
282
282
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -307,9 +307,9 @@ function ConnectionForm({
307
307
  /* @__PURE__ */ jsxRuntime.jsxs("details", { className: "liquid-surface rounded-xl p-3", children: [
308
308
  /* @__PURE__ */ jsxRuntime.jsx("summary", { className: "cursor-pointer text-sm font-medium text-slate-700 dark:text-slate-300", children: labels.advancedToggle ?? "Governance & performance" }),
309
309
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-3 space-y-3", children: [
310
- /* @__PURE__ */ jsxRuntime.jsxs(chunkGD6FHRHV_js.FormGrid, { children: [
310
+ /* @__PURE__ */ jsxRuntime.jsxs(chunkFNA66TT4_js.FormGrid, { children: [
311
311
  /* @__PURE__ */ jsxRuntime.jsx(
312
- chunkGD6FHRHV_js.FormInput,
312
+ chunkFNA66TT4_js.FormInput,
313
313
  {
314
314
  name: "maxPoolSize",
315
315
  label: labels.fieldMaxPoolSize ?? "Max pool size",
@@ -320,7 +320,7 @@ function ConnectionForm({
320
320
  }
321
321
  ),
322
322
  /* @__PURE__ */ jsxRuntime.jsx(
323
- chunkGD6FHRHV_js.FormInput,
323
+ chunkFNA66TT4_js.FormInput,
324
324
  {
325
325
  name: "timeoutMs",
326
326
  label: labels.fieldTimeoutMs ?? "Timeout (ms)",
@@ -331,7 +331,7 @@ function ConnectionForm({
331
331
  )
332
332
  ] }),
333
333
  /* @__PURE__ */ jsxRuntime.jsx(
334
- chunkGD6FHRHV_js.FormInput,
334
+ chunkFNA66TT4_js.FormInput,
335
335
  {
336
336
  name: "allowedTables",
337
337
  label: labels.fieldAllowedTables ?? "Allowed tables (comma-separated)",
@@ -340,7 +340,7 @@ function ConnectionForm({
340
340
  ),
341
341
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-slate-500 dark:text-slate-400", children: labels.fieldAllowedTablesHelp ?? "Leave blank to allow every table the credential can see. Otherwise only the listed tables are queryable from workflows." }),
342
342
  /* @__PURE__ */ jsxRuntime.jsx(
343
- chunkGD6FHRHV_js.FormInput,
343
+ chunkFNA66TT4_js.FormInput,
344
344
  {
345
345
  name: "blockedColumns",
346
346
  label: labels.fieldBlockedColumns ?? "Blocked columns (comma-separated)",
@@ -387,7 +387,7 @@ function DatasourceFormModal({ open, onClose, labels, onSave }) {
387
387
  handleClose();
388
388
  }
389
389
  return /* @__PURE__ */ jsxRuntime.jsx(
390
- chunkGD6FHRHV_js.GlassModal,
390
+ chunkFNA66TT4_js.GlassModal,
391
391
  {
392
392
  open,
393
393
  onClose: handleClose,
@@ -420,7 +420,7 @@ function DatasourceModal({ open, onClose, labels, onSave }) {
420
420
  handleClose();
421
421
  }
422
422
  return /* @__PURE__ */ jsxRuntime.jsx(
423
- chunkGD6FHRHV_js.GlassModal,
423
+ chunkFNA66TT4_js.GlassModal,
424
424
  {
425
425
  open,
426
426
  onClose: handleClose,
@@ -450,5 +450,5 @@ exports.DatasourceFormModal = DatasourceFormModal;
450
450
  exports.DatasourceModal = DatasourceModal;
451
451
  exports.findCategory = findCategory;
452
452
  exports.findDialect = findDialect;
453
- //# sourceMappingURL=chunk-SUU7XPRX.js.map
454
- //# sourceMappingURL=chunk-SUU7XPRX.js.map
453
+ //# sourceMappingURL=chunk-TJPPZU77.js.map
454
+ //# sourceMappingURL=chunk-TJPPZU77.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/platform/pages/datasource-modal.tsx"],"names":["CircleStackIcon","ServerStackIcon","CloudIcon","ClockIcon","ShareIcon","KeyIcon","MagnifyingGlassIcon","jsx","jsxs","useState","Fragment","FormInput","ArrowLeftIcon","FormGrid","Button","CheckCircleIcon","XCircleIcon","GlassModal"],"mappings":"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","file":"chunk-SUU7XPRX.js","sourcesContent":["import { useState, type FormEvent, type ReactNode } from 'react'\nimport {\n CircleStackIcon,\n ServerStackIcon,\n CloudIcon,\n ClockIcon,\n ShareIcon,\n KeyIcon,\n MagnifyingGlassIcon,\n ArrowLeftIcon,\n CheckCircleIcon,\n XCircleIcon,\n} from '@heroicons/react/24/outline'\nimport {\n GlassModal,\n FormGrid,\n FormInput,\n FormSelect,\n Button,\n} from '@ui/index'\n\n/* ─── Dialect catalog ─── */\n\ntype DialectCategory = {\n id: string\n labelKey: string\n icon: React.ComponentType<{ className?: string }>\n gradient: string\n dialects: DialectOption[]\n}\n\ntype DialectOption = {\n value: string\n label: string\n defaultPort?: number\n /** 'standard' = host/port/db, 'connection-string' = single URL, 'cloud' = project/dataset/key */\n formType: 'standard' | 'connection-string' | 'cloud-bigquery' | 'cloud-snowflake' | 'cloud-key' | 'vector-key'\n}\n\nconst DIALECT_CATEGORIES: DialectCategory[] = [\n {\n id: 'relational',\n labelKey: 'categoryRelational',\n icon: CircleStackIcon,\n gradient: 'from-blue-500 to-indigo-600',\n dialects: [\n { value: 'postgres', label: 'PostgreSQL', defaultPort: 5432, formType: 'standard' },\n { value: 'mysql', label: 'MySQL', defaultPort: 3306, formType: 'standard' },\n { value: 'mariadb', label: 'MariaDB', defaultPort: 3306, formType: 'standard' },\n { value: 'mssql', label: 'SQL Server', defaultPort: 1433, formType: 'standard' },\n { value: 'oracle', label: 'Oracle', defaultPort: 1521, formType: 'standard' },\n { value: 'db2', label: 'IBM Db2', defaultPort: 50000, formType: 'standard' },\n { value: 'cockroachdb', label: 'CockroachDB', defaultPort: 26257, formType: 'standard' },\n { value: 'timescaledb', label: 'TimescaleDB', defaultPort: 5432, formType: 'standard' },\n { value: 'sqlite', label: 'SQLite', formType: 'connection-string' },\n { value: 'duckdb', label: 'DuckDB', formType: 'connection-string' },\n ],\n },\n {\n id: 'nosql',\n labelKey: 'categoryNoSql',\n icon: ServerStackIcon,\n gradient: 'from-emerald-500 to-teal-600',\n dialects: [\n { value: 'mongodb', label: 'MongoDB', defaultPort: 27017, formType: 'connection-string' },\n { value: 'cassandra', label: 'Cassandra', defaultPort: 9042, formType: 'standard' },\n { value: 'scylladb', label: 'ScyllaDB', defaultPort: 9042, formType: 'standard' },\n { value: 'dynamodb', label: 'DynamoDB', formType: 'cloud-key' },\n { value: 'cosmosdb', label: 'CosmosDB', formType: 'connection-string' },\n { value: 'arangodb', label: 'ArangoDB', defaultPort: 8529, formType: 'standard' },\n ],\n },\n {\n id: 'warehouse',\n labelKey: 'categoryWarehouse',\n icon: CloudIcon,\n gradient: 'from-purple-500 to-violet-600',\n dialects: [\n { value: 'bigquery', label: 'BigQuery', formType: 'cloud-bigquery' },\n { value: 'snowflake', label: 'Snowflake', formType: 'cloud-snowflake' },\n { value: 'clickhouse', label: 'ClickHouse', defaultPort: 8123, formType: 'standard' },\n ],\n },\n {\n id: 'timeseries',\n labelKey: 'categoryTimeSeries',\n icon: ClockIcon,\n gradient: 'from-sky-500 to-cyan-600',\n dialects: [\n { value: 'influxdb', label: 'InfluxDB', formType: 'cloud-key' },\n { value: 'timestream', label: 'Timestream', formType: 'cloud-key' },\n ],\n },\n {\n id: 'graph',\n labelKey: 'categoryGraph',\n icon: ShareIcon,\n gradient: 'from-pink-500 to-rose-600',\n dialects: [\n { value: 'neo4j', label: 'Neo4j', defaultPort: 7687, formType: 'standard' },\n { value: 'neptune', label: 'Neptune', formType: 'connection-string' },\n ],\n },\n {\n id: 'keyvalue',\n labelKey: 'categoryKeyValue',\n icon: KeyIcon,\n gradient: 'from-red-500 to-orange-600',\n dialects: [\n { value: 'redis', label: 'Redis', defaultPort: 6379, formType: 'standard' },\n ],\n },\n {\n id: 'search',\n labelKey: 'categorySearch',\n icon: MagnifyingGlassIcon,\n gradient: 'from-amber-500 to-yellow-600',\n dialects: [\n { value: 'elasticsearch', label: 'Elasticsearch', defaultPort: 9200, formType: 'standard' },\n { value: 'opensearch', label: 'OpenSearch', defaultPort: 9200, formType: 'standard' },\n { value: 'pinecone', label: 'Pinecone', formType: 'vector-key' },\n { value: 'qdrant', label: 'Qdrant', defaultPort: 6333, formType: 'standard' },\n { value: 'weaviate', label: 'Weaviate', defaultPort: 8080, formType: 'standard' },\n { value: 'milvus', label: 'Milvus', defaultPort: 19530, formType: 'standard' },\n { value: 'chromadb', label: 'ChromaDB', defaultPort: 8000, formType: 'standard' },\n ],\n },\n]\n\nfunction findDialect(value: string): DialectOption | undefined {\n for (const category of DIALECT_CATEGORIES) {\n const found = category.dialects.find((d) => d.value === value)\n if (found) return found\n }\n return undefined\n}\n\nfunction findCategory(dialectValue: string): DialectCategory | undefined {\n return DIALECT_CATEGORIES.find((c) => c.dialects.some((d) => d.value === dialectValue))\n}\n\n/* ─── Types ─── */\n\nexport type DatasourceFormData = {\n name: string\n dialect: string\n host?: string\n port?: number\n database?: string\n username?: string\n password?: string\n schema?: string\n ssl?: boolean\n readOnly?: boolean\n connectionString?: string\n projectId?: string\n dataset?: string\n keyFile?: string\n account?: string\n warehouse?: string\n region?: string\n bucket?: string\n token?: string\n apiKey?: string\n environment?: string\n index?: string\n url?: string\n /** Whitelist of tables the engine is allowed to query. Empty/undef =\n * allow every table the credential can see. */\n allowedTables?: string[]\n /** Columns the engine MUST NOT surface to workflows. Applied at the\n * driver layer — trying to SELECT a blocked column still fails. */\n blockedColumns?: string[]\n /** Max concurrent connections in the org's cached pool (default 5). */\n maxPoolSize?: number\n /** Query/connect timeout in ms (default 5000). */\n timeoutMs?: number\n}\n\ntype Labels = Record<string, string>\n\nexport type DatasourceFormModalProps = {\n open: boolean\n onClose: () => void\n labels: Labels\n onSave: (data: DatasourceFormData) => void\n}\n\n/* ─── Step 1: Category + dialect picker ─── */\n\n// Brand SVG lookup — must stay in sync with the same map in\n// `datasources-page-view.tsx`. When the dialect has a brand SVG the chip\n// shows it; otherwise we fall back to the generic stacked-disks Heroicon.\n// Same source folder (`/public/logos/datasources/`) as the cards on\n// `/datasources` so a user sees the same logo here and in the list.\nconst DIALECT_LOGO_SRC: Record<string, string> = {\n bigquery: '/logos/datasources/bigquery.svg',\n postgres: '/logos/datasources/postgres.svg',\n postgresql: '/logos/datasources/postgres.svg',\n mysql: '/logos/datasources/mysql.svg',\n mariadb: '/logos/datasources/mariadb.svg',\n snowflake: '/logos/datasources/snowflake.svg',\n mongodb: '/logos/datasources/mongodb.svg',\n redis: '/logos/datasources/redis.svg',\n clickhouse: '/logos/datasources/clickhouse.svg',\n elasticsearch: '/logos/datasources/elasticsearch.svg',\n duckdb: '/logos/datasources/duckdb.svg',\n sqlite: '/logos/datasources/sqlite.svg',\n oracle: '/logos/datasources/oracle.svg',\n mssql: '/logos/datasources/mssql.svg',\n sqlserver: '/logos/datasources/mssql.svg',\n cassandra: '/logos/datasources/cassandra.svg',\n dynamodb: '/logos/datasources/dynamodb.svg',\n cockroach: '/logos/datasources/cockroachdb.svg',\n cockroachdb: '/logos/datasources/cockroachdb.svg',\n supabase: '/logos/datasources/supabase.svg',\n firebase: '/logos/datasources/firebase.svg',\n neo4j: '/logos/datasources/neo4j.svg',\n // AWS managed services (icepanel.io / official AWS Architecture Icons)\n neptune: '/logos/datasources/neptune.svg',\n timestream: '/logos/datasources/timestream.svg',\n opensearch: '/logos/datasources/opensearch.svg',\n}\n\nfunction DialectPicker({\n labels,\n onSelect,\n}: {\n labels: Labels\n onSelect: (dialect: string) => void\n}) {\n return (\n <div className=\"space-y-6\">\n {DIALECT_CATEGORIES.map((category) => (\n <div key={category.id}>\n <div className=\"mb-2 flex items-center gap-2\">\n <div className={`flex h-7 w-7 items-center justify-center rounded-lg bg-gradient-to-br ${category.gradient}`}>\n <category.icon className=\"h-4 w-4 text-white\" />\n </div>\n <span className=\"text-sm font-semibold text-slate-700 dark:text-slate-200\">\n {labels[category.labelKey] ?? category.id}\n </span>\n </div>\n <div className=\"grid grid-cols-2 gap-2 sm:grid-cols-3\">\n {category.dialects.map((dialect) => {\n const logoSrc = DIALECT_LOGO_SRC[dialect.value.toLowerCase()]\n return (\n <button\n key={dialect.value}\n type=\"button\"\n onClick={() => onSelect(dialect.value)}\n className=\"liquid-surface group flex items-center gap-2 rounded-xl px-3 py-2.5 text-left text-sm font-medium text-slate-700 transition-all hover:border-amber-400/60 hover:bg-amber-50/50 hover:text-amber-700 active:scale-[0.97] focus:outline-none focus-visible:ring-2 focus-visible:ring-indigo-500/70 focus-visible:ring-offset-1 dark:text-slate-300 dark:hover:border-amber-400/40 dark:hover:bg-amber-500/10 dark:hover:text-amber-300\"\n >\n {logoSrc ? (\n <img\n src={logoSrc}\n alt={dialect.label}\n className=\"h-4 w-4 shrink-0 object-contain\"\n />\n ) : (\n <CircleStackIcon className=\"h-4 w-4 shrink-0 text-slate-400 transition-colors group-hover:text-amber-500 dark:text-slate-500\" />\n )}\n {dialect.label}\n </button>\n )\n })}\n </div>\n </div>\n ))}\n </div>\n )\n}\n\n/* ─── Step 2: Connection form ─── */\n\nfunction ConnectionForm({\n dialect,\n labels,\n onBack,\n onSubmit,\n}: {\n dialect: DialectOption\n labels: Labels\n onBack: () => void\n onSubmit: (data: DatasourceFormData) => void\n}) {\n const [testStatus, setTestStatus] = useState<'idle' | 'testing' | 'success' | 'failed'>('idle')\n const category = findCategory(dialect.value)\n\n function handleSubmit(event: FormEvent) {\n event.preventDefault()\n const formData = new FormData(event.currentTarget as HTMLFormElement)\n const data: DatasourceFormData = {\n name: String(formData.get('name') ?? '').trim(),\n dialect: dialect.value,\n }\n\n // Collect all possible fields\n for (const key of ['host', 'database', 'username', 'password', 'schema', 'connectionString', 'projectId', 'dataset', 'keyFile', 'account', 'warehouse', 'region', 'bucket', 'token', 'apiKey', 'environment', 'index', 'url'] as const) {\n const val = String(formData.get(key) ?? '').trim()\n if (val) (data as Record<string, unknown>)[key] = val\n }\n\n const port = String(formData.get('port') ?? '').trim()\n if (port) data.port = Number(port)\n\n data.ssl = formData.get('ssl') === 'on'\n data.readOnly = formData.get('readOnly') === 'on'\n\n // Advanced — pool size, timeout, allowlist/blocklist\n const maxPoolSize = String(formData.get('maxPoolSize') ?? '').trim()\n if (maxPoolSize) {\n const parsed = Number(maxPoolSize)\n if (Number.isFinite(parsed) && parsed > 0) data.maxPoolSize = parsed\n }\n const timeoutMs = String(formData.get('timeoutMs') ?? '').trim()\n if (timeoutMs) {\n const parsed = Number(timeoutMs)\n if (Number.isFinite(parsed) && parsed > 0) data.timeoutMs = parsed\n }\n const allowedTables = splitList(String(formData.get('allowedTables') ?? ''))\n if (allowedTables.length > 0) data.allowedTables = allowedTables\n const blockedColumns = splitList(String(formData.get('blockedColumns') ?? ''))\n if (blockedColumns.length > 0) data.blockedColumns = blockedColumns\n\n onSubmit(data)\n }\n\n function handleTestConnection() {\n setTestStatus('testing')\n // Simulate test connection — real implementation would call API\n setTimeout(() => {\n setTestStatus('success')\n setTimeout(() => setTestStatus('idle'), 3000)\n }, 1500)\n }\n\n function renderFields(): ReactNode {\n switch (dialect.formType) {\n case 'standard':\n return (\n <>\n <FormInput name=\"host\" label={labels.fieldHost} placeholder={labels.fieldHostPlaceholder} required />\n <FormInput name=\"port\" label={labels.fieldPort} type=\"number\" defaultValue={dialect.defaultPort} />\n <FormInput name=\"database\" label={labels.fieldDatabase} placeholder={labels.fieldDatabasePlaceholder} required />\n <FormInput name=\"username\" label={labels.fieldUsername} placeholder={labels.fieldUsernamePlaceholder} />\n <FormInput name=\"password\" label={labels.fieldPassword} type=\"password\" placeholder={labels.fieldPasswordPlaceholder} />\n <FormInput name=\"schema\" label={labels.fieldSchema} placeholder={labels.fieldSchemaPlaceholder} />\n </>\n )\n\n case 'connection-string':\n return (\n <div className=\"col-span-full\">\n <FormInput name=\"connectionString\" label={labels.fieldConnectionString} placeholder={labels.fieldConnectionStringPlaceholder} required />\n </div>\n )\n\n case 'cloud-bigquery':\n return (\n <>\n <FormInput name=\"projectId\" label={labels.fieldProjectId} placeholder={labels.fieldProjectIdPlaceholder} required />\n <FormInput name=\"dataset\" label={labels.fieldDataset} placeholder={labels.fieldDatasetPlaceholder} required />\n <div className=\"col-span-full\">\n <FormInput name=\"keyFile\" label={labels.fieldKeyFile} placeholder={labels.fieldKeyFilePlaceholder} />\n </div>\n </>\n )\n\n case 'cloud-snowflake':\n return (\n <>\n <FormInput name=\"account\" label={labels.fieldAccount} placeholder={labels.fieldAccountPlaceholder} required />\n <FormInput name=\"warehouse\" label={labels.fieldWarehouse} placeholder={labels.fieldWarehousePlaceholder} required />\n <FormInput name=\"database\" label={labels.fieldDatabase} placeholder={labels.fieldDatabasePlaceholder} required />\n <FormInput name=\"username\" label={labels.fieldUsername} placeholder={labels.fieldUsernamePlaceholder} required />\n <FormInput name=\"password\" label={labels.fieldPassword} type=\"password\" placeholder={labels.fieldPasswordPlaceholder} />\n <FormInput name=\"schema\" label={labels.fieldSchema} placeholder={labels.fieldSchemaPlaceholder} />\n </>\n )\n\n case 'cloud-key':\n return (\n <>\n <FormInput name=\"region\" label={labels.fieldRegion} placeholder={labels.fieldRegionPlaceholder} required />\n <FormInput name=\"token\" label={labels.fieldToken} type=\"password\" placeholder={labels.fieldTokenPlaceholder} required />\n <FormInput name=\"bucket\" label={labels.fieldBucket} placeholder={labels.fieldBucketPlaceholder} />\n </>\n )\n\n case 'vector-key':\n return (\n <>\n <FormInput name=\"apiKey\" label={labels.fieldApiKey} type=\"password\" placeholder={labels.fieldApiKeyPlaceholder} required />\n <FormInput name=\"environment\" label={labels.fieldEnvironment} placeholder={labels.fieldEnvironmentPlaceholder} required />\n <FormInput name=\"index\" label={labels.fieldIndex} placeholder={labels.fieldIndexPlaceholder} />\n </>\n )\n }\n }\n\n return (\n <form onSubmit={handleSubmit} className=\"space-y-6\">\n {/* Back button + dialect badge */}\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={onBack}\n className=\"flex h-8 w-8 items-center justify-center rounded-lg text-slate-400 transition-colors hover:bg-white/45 hover:text-slate-700 dark:hover:bg-white/10 dark:hover:text-slate-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-indigo-500/70 focus-visible:ring-offset-1\"\n >\n <ArrowLeftIcon className=\"h-4 w-4\" />\n </button>\n <div className=\"flex items-center gap-2\">\n <div className={`flex h-8 w-8 items-center justify-center rounded-lg bg-gradient-to-br ${category?.gradient ?? 'from-slate-400 to-slate-500'}`}>\n {category ? <category.icon className=\"h-4 w-4 text-white\" /> : <CircleStackIcon className=\"h-4 w-4 text-white\" />}\n </div>\n <div>\n <span className=\"text-sm font-semibold text-slate-900 dark:text-white\">{dialect.label}</span>\n <span className=\"ml-2 text-xs text-slate-500 dark:text-slate-400\">{labels[category?.labelKey ?? ''] ?? ''}</span>\n </div>\n </div>\n </div>\n\n {/* Name field — always present */}\n <FormInput name=\"name\" label={labels.fieldName} placeholder={labels.fieldNamePlaceholder} required />\n\n {/* Dynamic fields per dialect form type */}\n <FormGrid>\n {renderFields()}\n </FormGrid>\n\n {/* Toggles */}\n <div className=\"flex flex-wrap items-center gap-6 pt-2\">\n <label className=\"flex items-center gap-2 text-sm text-slate-700 dark:text-slate-300\">\n <input\n type=\"checkbox\"\n name=\"ssl\"\n defaultChecked\n className=\"h-4 w-4 rounded border-slate-300 text-amber-600 focus:ring-2 focus:ring-amber-500/70 focus:ring-offset-1 dark:border-white/15 dark:bg-white/[0.08]\"\n />\n {labels.fieldSsl}\n </label>\n <label className=\"flex items-center gap-2 text-sm text-slate-700 dark:text-slate-300\">\n <input\n type=\"checkbox\"\n name=\"readOnly\"\n defaultChecked\n className=\"h-4 w-4 rounded border-slate-300 text-amber-600 focus:ring-2 focus:ring-amber-500/70 focus:ring-offset-1 dark:border-white/15 dark:bg-white/[0.08]\"\n />\n {labels.fieldReadOnly}\n </label>\n </div>\n <p className=\"text-xs text-slate-500 dark:text-slate-400\">{labels.fieldReadOnlyHelp}</p>\n\n {/* Advanced — pool, timeout, table/column governance. Collapsed by\n default because the defaults (pool=5, timeout=5s, no allow/block)\n are correct for almost every datasource. Shown when an admin\n needs to lock down a specific table or raise the timeout for\n a slow analytic warehouse. */}\n <details className=\"liquid-surface rounded-xl p-3\">\n <summary className=\"cursor-pointer text-sm font-medium text-slate-700 dark:text-slate-300\">\n {labels.advancedToggle ?? 'Governance & performance'}\n </summary>\n <div className=\"mt-3 space-y-3\">\n <FormGrid>\n <FormInput\n name=\"maxPoolSize\"\n label={labels.fieldMaxPoolSize ?? 'Max pool size'}\n type=\"number\"\n min={1}\n max={100}\n placeholder=\"5\"\n />\n <FormInput\n name=\"timeoutMs\"\n label={labels.fieldTimeoutMs ?? 'Timeout (ms)'}\n type=\"number\"\n min={100}\n placeholder=\"5000\"\n />\n </FormGrid>\n <FormInput\n name=\"allowedTables\"\n label={labels.fieldAllowedTables ?? 'Allowed tables (comma-separated)'}\n placeholder=\"stations, current_prices, competitor_prices\"\n />\n <p className=\"text-xs text-slate-500 dark:text-slate-400\">\n {labels.fieldAllowedTablesHelp\n ?? 'Leave blank to allow every table the credential can see. Otherwise only the listed tables are queryable from workflows.'}\n </p>\n <FormInput\n name=\"blockedColumns\"\n label={labels.fieldBlockedColumns ?? 'Blocked columns (comma-separated)'}\n placeholder=\"customers.ssn, employees.salary\"\n />\n <p className=\"text-xs text-slate-500 dark:text-slate-400\">\n {labels.fieldBlockedColumnsHelp\n ?? 'Columns the driver must never surface, even if referenced by a workflow. Use table.column notation for specificity.'}\n </p>\n </div>\n </details>\n\n {/* Actions */}\n <div className=\"flex items-center gap-3 border-t liquid-divider pt-5\">\n <Button\n type=\"button\"\n size=\"sm\"\n color=\"zinc\"\n onClick={handleTestConnection}\n disabled={testStatus === 'testing'}\n >\n {testStatus === 'testing' ? labels.testing : labels.testConnection}\n </Button>\n\n {testStatus === 'success' && (\n <span className=\"flex items-center gap-1 text-xs font-medium text-emerald-600 dark:text-emerald-400\">\n <CheckCircleIcon className=\"h-4 w-4\" />\n {labels.connectionSuccess}\n </span>\n )}\n {testStatus === 'failed' && (\n <span className=\"flex items-center gap-1 text-xs font-medium text-red-600 dark:text-red-400\">\n <XCircleIcon className=\"h-4 w-4\" />\n {labels.connectionFailed}\n </span>\n )}\n\n <div className=\"flex-1\" />\n\n <Button type=\"submit\" size=\"sm\" color=\"amber\">\n {labels.save}\n </Button>\n </div>\n </form>\n )\n}\n\n/* ─── Form Modal ─── */\n\nexport function DatasourceFormModal({ open, onClose, labels, onSave }: DatasourceFormModalProps) {\n const [selectedDialect, setSelectedDialect] = useState<string | null>(null)\n const dialect = selectedDialect ? findDialect(selectedDialect) : null\n\n function handleClose() {\n setSelectedDialect(null)\n onClose()\n }\n\n function handleSave(data: DatasourceFormData) {\n onSave(data)\n handleClose()\n }\n\n return (\n <GlassModal\n open={open}\n onClose={handleClose}\n title={labels.createTitle}\n subtitle={dialect ? labels.stepConfigure : labels.stepSelectType}\n icon={<CircleStackIcon className=\"h-5 w-5\" />}\n gradient=\"from-amber-500 to-orange-600\"\n maxWidth=\"3xl\"\n >\n {dialect ? (\n <ConnectionForm\n dialect={dialect}\n labels={labels}\n onBack={() => setSelectedDialect(null)}\n onSubmit={handleSave}\n />\n ) : (\n <DialectPicker labels={labels} onSelect={setSelectedDialect} />\n )}\n </GlassModal>\n )\n}\n\n/* ─── Modal (for /datasources page) ─── */\n\nexport type DatasourceModalProps = {\n open: boolean\n onClose: () => void\n labels: Labels\n onSave: (data: DatasourceFormData) => void\n}\n\nexport function DatasourceModal({ open, onClose, labels, onSave }: DatasourceModalProps) {\n const [selectedDialect, setSelectedDialect] = useState<string | null>(null)\n const dialect = selectedDialect ? findDialect(selectedDialect) : null\n\n function handleClose() {\n setSelectedDialect(null)\n onClose()\n }\n\n function handleSave(data: DatasourceFormData) {\n onSave(data)\n handleClose()\n }\n\n return (\n <GlassModal\n open={open}\n onClose={handleClose}\n title={labels.createTitle}\n subtitle={dialect ? labels.stepConfigure : labels.stepSelectType}\n icon={<CircleStackIcon className=\"h-5 w-5\" />}\n gradient=\"from-amber-500 to-orange-600\"\n maxWidth=\"3xl\"\n >\n {dialect ? (\n <ConnectionForm\n dialect={dialect}\n labels={labels}\n onBack={() => setSelectedDialect(null)}\n onSubmit={handleSave}\n />\n ) : (\n <DialectPicker labels={labels} onSelect={setSelectedDialect} />\n )}\n </GlassModal>\n )\n}\n\nexport { DIALECT_CATEGORIES, findDialect, findCategory }\n\nfunction splitList(raw: string): string[] {\n return raw\n .split(',')\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0)\n}\n"]}
1
+ {"version":3,"sources":["../src/platform/pages/datasource-modal.tsx"],"names":["CircleStackIcon","ServerStackIcon","CloudIcon","ClockIcon","ShareIcon","KeyIcon","MagnifyingGlassIcon","jsx","jsxs","useState","Fragment","FormInput","ArrowLeftIcon","FormGrid","Button","CheckCircleIcon","XCircleIcon","GlassModal"],"mappings":"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","file":"chunk-TJPPZU77.js","sourcesContent":["import { useState, type FormEvent, type ReactNode } from 'react'\nimport {\n CircleStackIcon,\n ServerStackIcon,\n CloudIcon,\n ClockIcon,\n ShareIcon,\n KeyIcon,\n MagnifyingGlassIcon,\n ArrowLeftIcon,\n CheckCircleIcon,\n XCircleIcon,\n} from '@heroicons/react/24/outline'\nimport {\n GlassModal,\n FormGrid,\n FormInput,\n FormSelect,\n Button,\n} from '@ui/index'\n\n/* ─── Dialect catalog ─── */\n\ntype DialectCategory = {\n id: string\n labelKey: string\n icon: React.ComponentType<{ className?: string }>\n gradient: string\n dialects: DialectOption[]\n}\n\ntype DialectOption = {\n value: string\n label: string\n defaultPort?: number\n /** 'standard' = host/port/db, 'connection-string' = single URL, 'cloud' = project/dataset/key */\n formType: 'standard' | 'connection-string' | 'cloud-bigquery' | 'cloud-snowflake' | 'cloud-key' | 'vector-key'\n}\n\nconst DIALECT_CATEGORIES: DialectCategory[] = [\n {\n id: 'relational',\n labelKey: 'categoryRelational',\n icon: CircleStackIcon,\n gradient: 'from-blue-500 to-indigo-600',\n dialects: [\n { value: 'postgres', label: 'PostgreSQL', defaultPort: 5432, formType: 'standard' },\n { value: 'mysql', label: 'MySQL', defaultPort: 3306, formType: 'standard' },\n { value: 'mariadb', label: 'MariaDB', defaultPort: 3306, formType: 'standard' },\n { value: 'mssql', label: 'SQL Server', defaultPort: 1433, formType: 'standard' },\n { value: 'oracle', label: 'Oracle', defaultPort: 1521, formType: 'standard' },\n { value: 'db2', label: 'IBM Db2', defaultPort: 50000, formType: 'standard' },\n { value: 'cockroachdb', label: 'CockroachDB', defaultPort: 26257, formType: 'standard' },\n { value: 'timescaledb', label: 'TimescaleDB', defaultPort: 5432, formType: 'standard' },\n { value: 'sqlite', label: 'SQLite', formType: 'connection-string' },\n { value: 'duckdb', label: 'DuckDB', formType: 'connection-string' },\n ],\n },\n {\n id: 'nosql',\n labelKey: 'categoryNoSql',\n icon: ServerStackIcon,\n gradient: 'from-emerald-500 to-teal-600',\n dialects: [\n { value: 'mongodb', label: 'MongoDB', defaultPort: 27017, formType: 'connection-string' },\n { value: 'cassandra', label: 'Cassandra', defaultPort: 9042, formType: 'standard' },\n { value: 'scylladb', label: 'ScyllaDB', defaultPort: 9042, formType: 'standard' },\n { value: 'dynamodb', label: 'DynamoDB', formType: 'cloud-key' },\n { value: 'cosmosdb', label: 'CosmosDB', formType: 'connection-string' },\n { value: 'arangodb', label: 'ArangoDB', defaultPort: 8529, formType: 'standard' },\n ],\n },\n {\n id: 'warehouse',\n labelKey: 'categoryWarehouse',\n icon: CloudIcon,\n gradient: 'from-purple-500 to-violet-600',\n dialects: [\n { value: 'bigquery', label: 'BigQuery', formType: 'cloud-bigquery' },\n { value: 'snowflake', label: 'Snowflake', formType: 'cloud-snowflake' },\n { value: 'clickhouse', label: 'ClickHouse', defaultPort: 8123, formType: 'standard' },\n ],\n },\n {\n id: 'timeseries',\n labelKey: 'categoryTimeSeries',\n icon: ClockIcon,\n gradient: 'from-sky-500 to-cyan-600',\n dialects: [\n { value: 'influxdb', label: 'InfluxDB', formType: 'cloud-key' },\n { value: 'timestream', label: 'Timestream', formType: 'cloud-key' },\n ],\n },\n {\n id: 'graph',\n labelKey: 'categoryGraph',\n icon: ShareIcon,\n gradient: 'from-pink-500 to-rose-600',\n dialects: [\n { value: 'neo4j', label: 'Neo4j', defaultPort: 7687, formType: 'standard' },\n { value: 'neptune', label: 'Neptune', formType: 'connection-string' },\n ],\n },\n {\n id: 'keyvalue',\n labelKey: 'categoryKeyValue',\n icon: KeyIcon,\n gradient: 'from-red-500 to-orange-600',\n dialects: [\n { value: 'redis', label: 'Redis', defaultPort: 6379, formType: 'standard' },\n ],\n },\n {\n id: 'search',\n labelKey: 'categorySearch',\n icon: MagnifyingGlassIcon,\n gradient: 'from-amber-500 to-yellow-600',\n dialects: [\n { value: 'elasticsearch', label: 'Elasticsearch', defaultPort: 9200, formType: 'standard' },\n { value: 'opensearch', label: 'OpenSearch', defaultPort: 9200, formType: 'standard' },\n { value: 'pinecone', label: 'Pinecone', formType: 'vector-key' },\n { value: 'qdrant', label: 'Qdrant', defaultPort: 6333, formType: 'standard' },\n { value: 'weaviate', label: 'Weaviate', defaultPort: 8080, formType: 'standard' },\n { value: 'milvus', label: 'Milvus', defaultPort: 19530, formType: 'standard' },\n { value: 'chromadb', label: 'ChromaDB', defaultPort: 8000, formType: 'standard' },\n ],\n },\n]\n\nfunction findDialect(value: string): DialectOption | undefined {\n for (const category of DIALECT_CATEGORIES) {\n const found = category.dialects.find((d) => d.value === value)\n if (found) return found\n }\n return undefined\n}\n\nfunction findCategory(dialectValue: string): DialectCategory | undefined {\n return DIALECT_CATEGORIES.find((c) => c.dialects.some((d) => d.value === dialectValue))\n}\n\n/* ─── Types ─── */\n\nexport type DatasourceFormData = {\n name: string\n dialect: string\n host?: string\n port?: number\n database?: string\n username?: string\n password?: string\n schema?: string\n ssl?: boolean\n readOnly?: boolean\n connectionString?: string\n projectId?: string\n dataset?: string\n keyFile?: string\n account?: string\n warehouse?: string\n region?: string\n bucket?: string\n token?: string\n apiKey?: string\n environment?: string\n index?: string\n url?: string\n /** Whitelist of tables the engine is allowed to query. Empty/undef =\n * allow every table the credential can see. */\n allowedTables?: string[]\n /** Columns the engine MUST NOT surface to workflows. Applied at the\n * driver layer — trying to SELECT a blocked column still fails. */\n blockedColumns?: string[]\n /** Max concurrent connections in the org's cached pool (default 5). */\n maxPoolSize?: number\n /** Query/connect timeout in ms (default 5000). */\n timeoutMs?: number\n}\n\ntype Labels = Record<string, string>\n\nexport type DatasourceFormModalProps = {\n open: boolean\n onClose: () => void\n labels: Labels\n onSave: (data: DatasourceFormData) => void\n}\n\n/* ─── Step 1: Category + dialect picker ─── */\n\n// Brand SVG lookup — must stay in sync with the same map in\n// `datasources-page-view.tsx`. When the dialect has a brand SVG the chip\n// shows it; otherwise we fall back to the generic stacked-disks Heroicon.\n// Same source folder (`/public/logos/datasources/`) as the cards on\n// `/datasources` so a user sees the same logo here and in the list.\nconst DIALECT_LOGO_SRC: Record<string, string> = {\n bigquery: '/logos/datasources/bigquery.svg',\n postgres: '/logos/datasources/postgres.svg',\n postgresql: '/logos/datasources/postgres.svg',\n mysql: '/logos/datasources/mysql.svg',\n mariadb: '/logos/datasources/mariadb.svg',\n snowflake: '/logos/datasources/snowflake.svg',\n mongodb: '/logos/datasources/mongodb.svg',\n redis: '/logos/datasources/redis.svg',\n clickhouse: '/logos/datasources/clickhouse.svg',\n elasticsearch: '/logos/datasources/elasticsearch.svg',\n duckdb: '/logos/datasources/duckdb.svg',\n sqlite: '/logos/datasources/sqlite.svg',\n oracle: '/logos/datasources/oracle.svg',\n mssql: '/logos/datasources/mssql.svg',\n sqlserver: '/logos/datasources/mssql.svg',\n cassandra: '/logos/datasources/cassandra.svg',\n dynamodb: '/logos/datasources/dynamodb.svg',\n cockroach: '/logos/datasources/cockroachdb.svg',\n cockroachdb: '/logos/datasources/cockroachdb.svg',\n supabase: '/logos/datasources/supabase.svg',\n firebase: '/logos/datasources/firebase.svg',\n neo4j: '/logos/datasources/neo4j.svg',\n // AWS managed services (icepanel.io / official AWS Architecture Icons)\n neptune: '/logos/datasources/neptune.svg',\n timestream: '/logos/datasources/timestream.svg',\n opensearch: '/logos/datasources/opensearch.svg',\n}\n\nfunction DialectPicker({\n labels,\n onSelect,\n}: {\n labels: Labels\n onSelect: (dialect: string) => void\n}) {\n return (\n <div className=\"space-y-6\">\n {DIALECT_CATEGORIES.map((category) => (\n <div key={category.id}>\n <div className=\"mb-2 flex items-center gap-2\">\n <div className={`flex h-7 w-7 items-center justify-center rounded-lg bg-gradient-to-br ${category.gradient}`}>\n <category.icon className=\"h-4 w-4 text-white\" />\n </div>\n <span className=\"text-sm font-semibold text-slate-700 dark:text-slate-200\">\n {labels[category.labelKey] ?? category.id}\n </span>\n </div>\n <div className=\"grid grid-cols-2 gap-2 sm:grid-cols-3\">\n {category.dialects.map((dialect) => {\n const logoSrc = DIALECT_LOGO_SRC[dialect.value.toLowerCase()]\n return (\n <button\n key={dialect.value}\n type=\"button\"\n onClick={() => onSelect(dialect.value)}\n className=\"liquid-surface group flex items-center gap-2 rounded-xl px-3 py-2.5 text-left text-sm font-medium text-slate-700 transition-all hover:border-amber-400/60 hover:bg-amber-50/50 hover:text-amber-700 active:scale-[0.97] focus:outline-none focus-visible:ring-2 focus-visible:ring-indigo-500/70 focus-visible:ring-offset-1 dark:text-slate-300 dark:hover:border-amber-400/40 dark:hover:bg-amber-500/10 dark:hover:text-amber-300\"\n >\n {logoSrc ? (\n <img\n src={logoSrc}\n alt={dialect.label}\n className=\"h-4 w-4 shrink-0 object-contain\"\n />\n ) : (\n <CircleStackIcon className=\"h-4 w-4 shrink-0 text-slate-400 transition-colors group-hover:text-amber-500 dark:text-slate-500\" />\n )}\n {dialect.label}\n </button>\n )\n })}\n </div>\n </div>\n ))}\n </div>\n )\n}\n\n/* ─── Step 2: Connection form ─── */\n\nfunction ConnectionForm({\n dialect,\n labels,\n onBack,\n onSubmit,\n}: {\n dialect: DialectOption\n labels: Labels\n onBack: () => void\n onSubmit: (data: DatasourceFormData) => void\n}) {\n const [testStatus, setTestStatus] = useState<'idle' | 'testing' | 'success' | 'failed'>('idle')\n const category = findCategory(dialect.value)\n\n function handleSubmit(event: FormEvent) {\n event.preventDefault()\n const formData = new FormData(event.currentTarget as HTMLFormElement)\n const data: DatasourceFormData = {\n name: String(formData.get('name') ?? '').trim(),\n dialect: dialect.value,\n }\n\n // Collect all possible fields\n for (const key of ['host', 'database', 'username', 'password', 'schema', 'connectionString', 'projectId', 'dataset', 'keyFile', 'account', 'warehouse', 'region', 'bucket', 'token', 'apiKey', 'environment', 'index', 'url'] as const) {\n const val = String(formData.get(key) ?? '').trim()\n if (val) (data as Record<string, unknown>)[key] = val\n }\n\n const port = String(formData.get('port') ?? '').trim()\n if (port) data.port = Number(port)\n\n data.ssl = formData.get('ssl') === 'on'\n data.readOnly = formData.get('readOnly') === 'on'\n\n // Advanced — pool size, timeout, allowlist/blocklist\n const maxPoolSize = String(formData.get('maxPoolSize') ?? '').trim()\n if (maxPoolSize) {\n const parsed = Number(maxPoolSize)\n if (Number.isFinite(parsed) && parsed > 0) data.maxPoolSize = parsed\n }\n const timeoutMs = String(formData.get('timeoutMs') ?? '').trim()\n if (timeoutMs) {\n const parsed = Number(timeoutMs)\n if (Number.isFinite(parsed) && parsed > 0) data.timeoutMs = parsed\n }\n const allowedTables = splitList(String(formData.get('allowedTables') ?? ''))\n if (allowedTables.length > 0) data.allowedTables = allowedTables\n const blockedColumns = splitList(String(formData.get('blockedColumns') ?? ''))\n if (blockedColumns.length > 0) data.blockedColumns = blockedColumns\n\n onSubmit(data)\n }\n\n function handleTestConnection() {\n setTestStatus('testing')\n // Simulate test connection — real implementation would call API\n setTimeout(() => {\n setTestStatus('success')\n setTimeout(() => setTestStatus('idle'), 3000)\n }, 1500)\n }\n\n function renderFields(): ReactNode {\n switch (dialect.formType) {\n case 'standard':\n return (\n <>\n <FormInput name=\"host\" label={labels.fieldHost} placeholder={labels.fieldHostPlaceholder} required />\n <FormInput name=\"port\" label={labels.fieldPort} type=\"number\" defaultValue={dialect.defaultPort} />\n <FormInput name=\"database\" label={labels.fieldDatabase} placeholder={labels.fieldDatabasePlaceholder} required />\n <FormInput name=\"username\" label={labels.fieldUsername} placeholder={labels.fieldUsernamePlaceholder} />\n <FormInput name=\"password\" label={labels.fieldPassword} type=\"password\" placeholder={labels.fieldPasswordPlaceholder} />\n <FormInput name=\"schema\" label={labels.fieldSchema} placeholder={labels.fieldSchemaPlaceholder} />\n </>\n )\n\n case 'connection-string':\n return (\n <div className=\"col-span-full\">\n <FormInput name=\"connectionString\" label={labels.fieldConnectionString} placeholder={labels.fieldConnectionStringPlaceholder} required />\n </div>\n )\n\n case 'cloud-bigquery':\n return (\n <>\n <FormInput name=\"projectId\" label={labels.fieldProjectId} placeholder={labels.fieldProjectIdPlaceholder} required />\n <FormInput name=\"dataset\" label={labels.fieldDataset} placeholder={labels.fieldDatasetPlaceholder} required />\n <div className=\"col-span-full\">\n <FormInput name=\"keyFile\" label={labels.fieldKeyFile} placeholder={labels.fieldKeyFilePlaceholder} />\n </div>\n </>\n )\n\n case 'cloud-snowflake':\n return (\n <>\n <FormInput name=\"account\" label={labels.fieldAccount} placeholder={labels.fieldAccountPlaceholder} required />\n <FormInput name=\"warehouse\" label={labels.fieldWarehouse} placeholder={labels.fieldWarehousePlaceholder} required />\n <FormInput name=\"database\" label={labels.fieldDatabase} placeholder={labels.fieldDatabasePlaceholder} required />\n <FormInput name=\"username\" label={labels.fieldUsername} placeholder={labels.fieldUsernamePlaceholder} required />\n <FormInput name=\"password\" label={labels.fieldPassword} type=\"password\" placeholder={labels.fieldPasswordPlaceholder} />\n <FormInput name=\"schema\" label={labels.fieldSchema} placeholder={labels.fieldSchemaPlaceholder} />\n </>\n )\n\n case 'cloud-key':\n return (\n <>\n <FormInput name=\"region\" label={labels.fieldRegion} placeholder={labels.fieldRegionPlaceholder} required />\n <FormInput name=\"token\" label={labels.fieldToken} type=\"password\" placeholder={labels.fieldTokenPlaceholder} required />\n <FormInput name=\"bucket\" label={labels.fieldBucket} placeholder={labels.fieldBucketPlaceholder} />\n </>\n )\n\n case 'vector-key':\n return (\n <>\n <FormInput name=\"apiKey\" label={labels.fieldApiKey} type=\"password\" placeholder={labels.fieldApiKeyPlaceholder} required />\n <FormInput name=\"environment\" label={labels.fieldEnvironment} placeholder={labels.fieldEnvironmentPlaceholder} required />\n <FormInput name=\"index\" label={labels.fieldIndex} placeholder={labels.fieldIndexPlaceholder} />\n </>\n )\n }\n }\n\n return (\n <form onSubmit={handleSubmit} className=\"space-y-6\">\n {/* Back button + dialect badge */}\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={onBack}\n className=\"flex h-8 w-8 items-center justify-center rounded-lg text-slate-400 transition-colors hover:bg-white/45 hover:text-slate-700 dark:hover:bg-white/10 dark:hover:text-slate-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-indigo-500/70 focus-visible:ring-offset-1\"\n >\n <ArrowLeftIcon className=\"h-4 w-4\" />\n </button>\n <div className=\"flex items-center gap-2\">\n <div className={`flex h-8 w-8 items-center justify-center rounded-lg bg-gradient-to-br ${category?.gradient ?? 'from-slate-400 to-slate-500'}`}>\n {category ? <category.icon className=\"h-4 w-4 text-white\" /> : <CircleStackIcon className=\"h-4 w-4 text-white\" />}\n </div>\n <div>\n <span className=\"text-sm font-semibold text-slate-900 dark:text-white\">{dialect.label}</span>\n <span className=\"ml-2 text-xs text-slate-500 dark:text-slate-400\">{labels[category?.labelKey ?? ''] ?? ''}</span>\n </div>\n </div>\n </div>\n\n {/* Name field — always present */}\n <FormInput name=\"name\" label={labels.fieldName} placeholder={labels.fieldNamePlaceholder} required />\n\n {/* Dynamic fields per dialect form type */}\n <FormGrid>\n {renderFields()}\n </FormGrid>\n\n {/* Toggles */}\n <div className=\"flex flex-wrap items-center gap-6 pt-2\">\n <label className=\"flex items-center gap-2 text-sm text-slate-700 dark:text-slate-300\">\n <input\n type=\"checkbox\"\n name=\"ssl\"\n defaultChecked\n className=\"h-4 w-4 rounded border-slate-300 text-amber-600 focus:ring-2 focus:ring-amber-500/70 focus:ring-offset-1 dark:border-white/15 dark:bg-white/[0.08]\"\n />\n {labels.fieldSsl}\n </label>\n <label className=\"flex items-center gap-2 text-sm text-slate-700 dark:text-slate-300\">\n <input\n type=\"checkbox\"\n name=\"readOnly\"\n defaultChecked\n className=\"h-4 w-4 rounded border-slate-300 text-amber-600 focus:ring-2 focus:ring-amber-500/70 focus:ring-offset-1 dark:border-white/15 dark:bg-white/[0.08]\"\n />\n {labels.fieldReadOnly}\n </label>\n </div>\n <p className=\"text-xs text-slate-500 dark:text-slate-400\">{labels.fieldReadOnlyHelp}</p>\n\n {/* Advanced — pool, timeout, table/column governance. Collapsed by\n default because the defaults (pool=5, timeout=5s, no allow/block)\n are correct for almost every datasource. Shown when an admin\n needs to lock down a specific table or raise the timeout for\n a slow analytic warehouse. */}\n <details className=\"liquid-surface rounded-xl p-3\">\n <summary className=\"cursor-pointer text-sm font-medium text-slate-700 dark:text-slate-300\">\n {labels.advancedToggle ?? 'Governance & performance'}\n </summary>\n <div className=\"mt-3 space-y-3\">\n <FormGrid>\n <FormInput\n name=\"maxPoolSize\"\n label={labels.fieldMaxPoolSize ?? 'Max pool size'}\n type=\"number\"\n min={1}\n max={100}\n placeholder=\"5\"\n />\n <FormInput\n name=\"timeoutMs\"\n label={labels.fieldTimeoutMs ?? 'Timeout (ms)'}\n type=\"number\"\n min={100}\n placeholder=\"5000\"\n />\n </FormGrid>\n <FormInput\n name=\"allowedTables\"\n label={labels.fieldAllowedTables ?? 'Allowed tables (comma-separated)'}\n placeholder=\"stations, current_prices, competitor_prices\"\n />\n <p className=\"text-xs text-slate-500 dark:text-slate-400\">\n {labels.fieldAllowedTablesHelp\n ?? 'Leave blank to allow every table the credential can see. Otherwise only the listed tables are queryable from workflows.'}\n </p>\n <FormInput\n name=\"blockedColumns\"\n label={labels.fieldBlockedColumns ?? 'Blocked columns (comma-separated)'}\n placeholder=\"customers.ssn, employees.salary\"\n />\n <p className=\"text-xs text-slate-500 dark:text-slate-400\">\n {labels.fieldBlockedColumnsHelp\n ?? 'Columns the driver must never surface, even if referenced by a workflow. Use table.column notation for specificity.'}\n </p>\n </div>\n </details>\n\n {/* Actions */}\n <div className=\"flex items-center gap-3 border-t liquid-divider pt-5\">\n <Button\n type=\"button\"\n size=\"sm\"\n color=\"zinc\"\n onClick={handleTestConnection}\n disabled={testStatus === 'testing'}\n >\n {testStatus === 'testing' ? labels.testing : labels.testConnection}\n </Button>\n\n {testStatus === 'success' && (\n <span className=\"flex items-center gap-1 text-xs font-medium text-emerald-600 dark:text-emerald-400\">\n <CheckCircleIcon className=\"h-4 w-4\" />\n {labels.connectionSuccess}\n </span>\n )}\n {testStatus === 'failed' && (\n <span className=\"flex items-center gap-1 text-xs font-medium text-red-600 dark:text-red-400\">\n <XCircleIcon className=\"h-4 w-4\" />\n {labels.connectionFailed}\n </span>\n )}\n\n <div className=\"flex-1\" />\n\n <Button type=\"submit\" size=\"sm\" color=\"amber\">\n {labels.save}\n </Button>\n </div>\n </form>\n )\n}\n\n/* ─── Form Modal ─── */\n\nexport function DatasourceFormModal({ open, onClose, labels, onSave }: DatasourceFormModalProps) {\n const [selectedDialect, setSelectedDialect] = useState<string | null>(null)\n const dialect = selectedDialect ? findDialect(selectedDialect) : null\n\n function handleClose() {\n setSelectedDialect(null)\n onClose()\n }\n\n function handleSave(data: DatasourceFormData) {\n onSave(data)\n handleClose()\n }\n\n return (\n <GlassModal\n open={open}\n onClose={handleClose}\n title={labels.createTitle}\n subtitle={dialect ? labels.stepConfigure : labels.stepSelectType}\n icon={<CircleStackIcon className=\"h-5 w-5\" />}\n gradient=\"from-amber-500 to-orange-600\"\n maxWidth=\"3xl\"\n >\n {dialect ? (\n <ConnectionForm\n dialect={dialect}\n labels={labels}\n onBack={() => setSelectedDialect(null)}\n onSubmit={handleSave}\n />\n ) : (\n <DialectPicker labels={labels} onSelect={setSelectedDialect} />\n )}\n </GlassModal>\n )\n}\n\n/* ─── Modal (for /datasources page) ─── */\n\nexport type DatasourceModalProps = {\n open: boolean\n onClose: () => void\n labels: Labels\n onSave: (data: DatasourceFormData) => void\n}\n\nexport function DatasourceModal({ open, onClose, labels, onSave }: DatasourceModalProps) {\n const [selectedDialect, setSelectedDialect] = useState<string | null>(null)\n const dialect = selectedDialect ? findDialect(selectedDialect) : null\n\n function handleClose() {\n setSelectedDialect(null)\n onClose()\n }\n\n function handleSave(data: DatasourceFormData) {\n onSave(data)\n handleClose()\n }\n\n return (\n <GlassModal\n open={open}\n onClose={handleClose}\n title={labels.createTitle}\n subtitle={dialect ? labels.stepConfigure : labels.stepSelectType}\n icon={<CircleStackIcon className=\"h-5 w-5\" />}\n gradient=\"from-amber-500 to-orange-600\"\n maxWidth=\"3xl\"\n >\n {dialect ? (\n <ConnectionForm\n dialect={dialect}\n labels={labels}\n onBack={() => setSelectedDialect(null)}\n onSubmit={handleSave}\n />\n ) : (\n <DialectPicker labels={labels} onSelect={setSelectedDialect} />\n )}\n </GlassModal>\n )\n}\n\nexport { DIALECT_CATEGORIES, findDialect, findCategory }\n\nfunction splitList(raw: string): string[] {\n return raw\n .split(',')\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0)\n}\n"]}