@datatechsolutions/ui 3.6.0 → 3.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/astrlabe/graph-node.js +8 -5
- package/dist/astrlabe/graph-node.mjs +4 -1
- package/dist/astrlabe/index.js +115 -114
- package/dist/astrlabe/index.mjs +7 -6
- package/dist/astrlabe/workflow-canvas.js +7 -6
- package/dist/astrlabe/workflow-canvas.mjs +6 -5
- package/dist/{chunk-I63NFWIA.mjs → chunk-2OPBUVTQ.mjs} +3 -3
- package/dist/{chunk-I63NFWIA.mjs.map → chunk-2OPBUVTQ.mjs.map} +1 -1
- package/dist/{chunk-XTXLRQ3H.mjs → chunk-34XRH2FX.mjs} +28 -28
- package/dist/chunk-34XRH2FX.mjs.map +1 -0
- package/dist/{chunk-QHP2MR2F.js → chunk-3JZGRXSG.js} +4 -4
- package/dist/{chunk-QHP2MR2F.js.map → chunk-3JZGRXSG.js.map} +1 -1
- package/dist/{chunk-JQYDJ75Q.mjs → chunk-3VYD7QL2.mjs} +3 -3
- package/dist/{chunk-JQYDJ75Q.mjs.map → chunk-3VYD7QL2.mjs.map} +1 -1
- package/dist/{chunk-MRRFDIUQ.mjs → chunk-4JRMXHPU.mjs} +5 -4
- package/dist/chunk-4JRMXHPU.mjs.map +1 -0
- package/dist/{chunk-4OFG6POC.mjs → chunk-5LCWQKGQ.mjs} +207 -1128
- package/dist/chunk-5LCWQKGQ.mjs.map +1 -0
- package/dist/{chunk-W5YCZOXO.js → chunk-7YK4WXHO.js} +79 -78
- package/dist/chunk-7YK4WXHO.js.map +1 -0
- package/dist/{chunk-YOJIPZ72.js → chunk-BBLBSDPN.js} +9 -9
- package/dist/{chunk-YOJIPZ72.js.map → chunk-BBLBSDPN.js.map} +1 -1
- package/dist/chunk-BHOT22QL.js +998 -0
- package/dist/chunk-BHOT22QL.js.map +1 -0
- package/dist/{chunk-DYWSG42B.mjs → chunk-C4AJWDFB.mjs} +11 -10
- package/dist/chunk-C4AJWDFB.mjs.map +1 -0
- package/dist/{chunk-UOABOFKO.mjs → chunk-CBFK4W4C.mjs} +3 -3
- package/dist/{chunk-UOABOFKO.mjs.map → chunk-CBFK4W4C.mjs.map} +1 -1
- package/dist/{chunk-P5F257N3.js → chunk-CVZXZK2X.js} +35 -34
- package/dist/chunk-CVZXZK2X.js.map +1 -0
- package/dist/{chunk-IHHGT3LP.mjs → chunk-CYAAL3BY.mjs} +6 -5
- package/dist/chunk-CYAAL3BY.mjs.map +1 -0
- package/dist/{chunk-LVK7VXW7.js → chunk-DMPBNWJB.js} +37 -36
- package/dist/chunk-DMPBNWJB.js.map +1 -0
- package/dist/{chunk-ESLKQJQS.mjs → chunk-DXLATMGD.mjs} +6 -5
- package/dist/chunk-DXLATMGD.mjs.map +1 -0
- package/dist/{chunk-P4YYEM4B.js → chunk-EZQ2D47U.js} +7 -10
- package/dist/chunk-EZQ2D47U.js.map +1 -0
- package/dist/{chunk-UWSMHKOF.js → chunk-FUHNEP3Y.js} +164 -163
- package/dist/chunk-FUHNEP3Y.js.map +1 -0
- package/dist/{chunk-YTE6WCBX.js → chunk-JHN2OUWG.js} +64 -63
- package/dist/chunk-JHN2OUWG.js.map +1 -0
- package/dist/{chunk-AMYQSPQC.js → chunk-JLECJI7S.js} +18 -17
- package/dist/chunk-JLECJI7S.js.map +1 -0
- package/dist/{chunk-VPOIX2DY.js → chunk-KMNWPC64.js} +40 -39
- package/dist/chunk-KMNWPC64.js.map +1 -0
- package/dist/{chunk-VUAGVZJM.mjs → chunk-NJ6HH4QP.mjs} +6 -5
- package/dist/chunk-NJ6HH4QP.mjs.map +1 -0
- package/dist/{chunk-OZNTQROP.mjs → chunk-PLTLRL2V.mjs} +7 -10
- package/dist/chunk-PLTLRL2V.mjs.map +1 -0
- package/dist/{chunk-WEZ722BS.mjs → chunk-PMMP76MV.mjs} +7 -6
- package/dist/chunk-PMMP76MV.mjs.map +1 -0
- package/dist/{chunk-NJZIE4EH.js → chunk-QF6WL7XU.js} +6 -5
- package/dist/chunk-QF6WL7XU.js.map +1 -0
- package/dist/{chunk-QRNFTG6A.js → chunk-QGLGQXJE.js} +4 -4
- package/dist/{chunk-QRNFTG6A.js.map → chunk-QGLGQXJE.js.map} +1 -1
- package/dist/{chunk-GCYYGSHU.js → chunk-R4EKPXX3.js} +564 -1525
- package/dist/chunk-R4EKPXX3.js.map +1 -0
- package/dist/{chunk-S7AV6XEY.js → chunk-RWYG7QHP.js} +128 -138
- package/dist/chunk-RWYG7QHP.js.map +1 -0
- package/dist/{chunk-WBEZATIB.js → chunk-RZ3NDH5S.js} +13 -13
- package/dist/{chunk-WBEZATIB.js.map → chunk-RZ3NDH5S.js.map} +1 -1
- package/dist/{chunk-HGWVJ3VB.mjs → chunk-SJVKID3E.mjs} +4 -3
- package/dist/chunk-SJVKID3E.mjs.map +1 -0
- package/dist/{chunk-7LILNZMR.mjs → chunk-TJEZL72T.mjs} +4 -3
- package/dist/chunk-TJEZL72T.mjs.map +1 -0
- package/dist/{chunk-3WXMBAGN.js → chunk-UDYEUTJC.js} +50 -50
- package/dist/chunk-UDYEUTJC.js.map +1 -0
- package/dist/{chunk-UGJZ3M4Q.js → chunk-VDLMWOQM.js} +55 -54
- package/dist/chunk-VDLMWOQM.js.map +1 -0
- package/dist/{chunk-QTA5I6FC.mjs → chunk-VZIUQE7B.mjs} +54 -64
- package/dist/chunk-VZIUQE7B.mjs.map +1 -0
- package/dist/chunk-WR55H7DH.mjs +934 -0
- package/dist/chunk-WR55H7DH.mjs.map +1 -0
- package/dist/{chunk-ZYVDDSAC.mjs → chunk-YRXDETBK.mjs} +6 -6
- package/dist/{chunk-ZYVDDSAC.mjs.map → chunk-YRXDETBK.mjs.map} +1 -1
- package/dist/{chunk-VDLAZR7S.mjs → chunk-ZYRL3WER.mjs} +5 -4
- package/dist/chunk-ZYRL3WER.mjs.map +1 -0
- package/dist/index.js +826 -825
- package/dist/index.mjs +4 -3
- package/dist/platform/admin/index.js +13 -12
- package/dist/platform/admin/index.mjs +7 -6
- package/dist/platform/agents-workspace.js +10 -9
- package/dist/platform/agents-workspace.mjs +9 -8
- package/dist/platform/app-shell.js +6 -5
- package/dist/platform/app-shell.mjs +5 -4
- package/dist/platform/auth/index.js +30 -29
- package/dist/platform/auth/index.mjs +7 -6
- package/dist/platform/billing/index.js +6 -5
- package/dist/platform/billing/index.mjs +5 -4
- package/dist/platform/impersonation/index.js +6 -5
- package/dist/platform/impersonation/index.mjs +5 -4
- package/dist/platform/index.js +87 -93
- package/dist/platform/index.js.map +1 -1
- package/dist/platform/index.mjs +23 -29
- package/dist/platform/index.mjs.map +1 -1
- package/dist/platform/pages/index.js +476 -470
- package/dist/platform/pages/index.js.map +1 -1
- package/dist/platform/pages/index.mjs +326 -320
- package/dist/platform/pages/index.mjs.map +1 -1
- package/dist/platform/settings/index.js +10 -9
- package/dist/platform/settings/index.mjs +9 -8
- package/dist/platform/workflow-canvas-shell.js +8 -7
- package/dist/platform/workflow-canvas-shell.mjs +7 -6
- package/package.json +1 -1
- package/dist/chunk-3WXMBAGN.js.map +0 -1
- package/dist/chunk-4OFG6POC.mjs.map +0 -1
- package/dist/chunk-7LILNZMR.mjs.map +0 -1
- package/dist/chunk-AMYQSPQC.js.map +0 -1
- package/dist/chunk-DYWSG42B.mjs.map +0 -1
- package/dist/chunk-ESLKQJQS.mjs.map +0 -1
- package/dist/chunk-GCYYGSHU.js.map +0 -1
- package/dist/chunk-HGWVJ3VB.mjs.map +0 -1
- package/dist/chunk-IHHGT3LP.mjs.map +0 -1
- package/dist/chunk-LVK7VXW7.js.map +0 -1
- package/dist/chunk-MRRFDIUQ.mjs.map +0 -1
- package/dist/chunk-NJZIE4EH.js.map +0 -1
- package/dist/chunk-OZNTQROP.mjs.map +0 -1
- package/dist/chunk-P4YYEM4B.js.map +0 -1
- package/dist/chunk-P5F257N3.js.map +0 -1
- package/dist/chunk-QTA5I6FC.mjs.map +0 -1
- package/dist/chunk-S7AV6XEY.js.map +0 -1
- package/dist/chunk-UGJZ3M4Q.js.map +0 -1
- package/dist/chunk-UWSMHKOF.js.map +0 -1
- package/dist/chunk-VDLAZR7S.mjs.map +0 -1
- package/dist/chunk-VPOIX2DY.js.map +0 -1
- package/dist/chunk-VUAGVZJM.mjs.map +0 -1
- package/dist/chunk-W5YCZOXO.js.map +0 -1
- package/dist/chunk-WEZ722BS.mjs.map +0 -1
- package/dist/chunk-XTXLRQ3H.mjs.map +0 -1
- package/dist/chunk-YTE6WCBX.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/platform/auth/mfa-setup.tsx","../src/platform/auth/mfa-manage.tsx","../src/platform/auth/user-profile.tsx"],"names":["useState","useCallback","jsxs","Fragment","jsx","ShieldCheckIcon"],"mappings":"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","file":"chunk-CYAAL3BY.mjs","sourcesContent":["import { useState, useCallback } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport {\n StepFormPage,\n OptionGrid,\n FormCheckbox,\n Spinner,\n triggerHaptic,\n type FormStep,\n} from '@ui/index'\nimport { OtpInput, BackupCodeGrid } from './components'\nimport { ShieldCheckIcon } from '@heroicons/react/24/outline'\nimport { useAuth } from '../../_auth'\n\nexport type { MfaSetupProps } from '@datatechsolutions/shared-domain'\nimport type { MfaSetupProps } from '@datatechsolutions/shared-domain'\n\nexport function MfaSetup({\n onSuccess,\n onCancel,\n enforcement = 'optional',\n onGenerateSecret,\n onVerifySetup,\n}: MfaSetupProps) {\n const t = useTranslations('windsock')\n const { client } = useAuth()\n\n const setupSteps: FormStep[] = [\n {\n id: 'method',\n title: t('mfa.setup.stepMethodTitle'),\n description: t('mfa.setup.stepMethodDescription'),\n },\n {\n id: 'scan',\n title: t('mfa.setup.stepScanTitle'),\n description: t('mfa.setup.stepScanDescription'),\n },\n {\n id: 'verify',\n title: t('mfa.setup.stepVerifyTitle'),\n description: t('mfa.setup.stepVerifyDescription'),\n },\n {\n id: 'backup',\n title: t('mfa.setup.stepBackupTitle'),\n description: t('mfa.setup.stepBackupDescription'),\n },\n ]\n\n const [currentStep, setCurrentStep] = useState(0)\n const [selectedMethod, setSelectedMethod] = useState('totp')\n const [qrCodeUri, setQrCodeUri] = useState('')\n const [secret, setSecret] = useState('')\n const [verifyCode, setVerifyCode] = useState('')\n const [verifyError, setVerifyError] = useState<string | null>(null)\n const [backupCodes, setBackupCodes] = useState<string[]>([])\n const [savedBackupCodes, setSavedBackupCodes] = useState(false)\n const [isLoading, setIsLoading] = useState(false)\n\n const handleStepChange = useCallback(\n async (step: number) => {\n // Moving from method -> scan: generate secret\n if (step === 1 && currentStep === 0) {\n setIsLoading(true)\n try {\n if (onGenerateSecret) {\n const result = await onGenerateSecret()\n setSecret(result.secret)\n setQrCodeUri(result.qrCodeUri)\n } else {\n const result = await client.generateMfaSecret()\n setSecret(result.secret)\n setQrCodeUri(result.qrCode)\n setBackupCodes(result.backupCodes)\n }\n } catch {\n // Stay on current step if generation fails\n return\n } finally {\n setIsLoading(false)\n }\n }\n triggerHaptic('light')\n setCurrentStep(step)\n },\n [currentStep, onGenerateSecret, client],\n )\n\n const handleMethodSelect = useCallback((method: string) => {\n triggerHaptic('light')\n setSelectedMethod(method)\n }, [])\n\n const handleVerifyComplete = useCallback(\n async (code: string) => {\n setVerifyError(null)\n setIsLoading(true)\n\n try {\n if (onVerifySetup) {\n const result = await onVerifySetup(code)\n if (result.success) {\n triggerHaptic('success')\n if (result.backupCodes?.length) {\n setBackupCodes(result.backupCodes)\n }\n setCurrentStep(3)\n } else {\n triggerHaptic('error')\n setVerifyError(t('mfa.setup.errorInvalidCode'))\n }\n } else {\n const result = await client.verifyMfaSetup(code)\n if (result.success) {\n triggerHaptic('success')\n setCurrentStep(3)\n } else {\n triggerHaptic('error')\n setVerifyError(t('mfa.setup.errorInvalidCode'))\n }\n }\n } catch {\n triggerHaptic('error')\n setVerifyError(t('mfa.setup.errorVerificationFailed'))\n } finally {\n setIsLoading(false)\n }\n },\n [onVerifySetup, client, t],\n )\n\n const handleSubmit = useCallback(() => {\n triggerHaptic('success')\n onSuccess?.()\n }, [onSuccess])\n\n const handleCancel = useCallback(() => {\n triggerHaptic('light')\n onCancel?.()\n }, [onCancel])\n\n const canAdvance = (() => {\n switch (currentStep) {\n case 0: return !!selectedMethod\n case 1: return !!qrCodeUri\n case 2: return false // Advance via OTP complete callback\n case 3: return savedBackupCodes\n default: return false\n }\n })()\n\n return (\n <StepFormPage\n title={t('mfa.setup.title')}\n subtitle={\n enforcement === 'required'\n ? t('mfa.setup.subtitleRequired')\n : t('mfa.setup.subtitleOptional')\n }\n label={t('mfa.setup.label')}\n icon={<ShieldCheckIcon className=\"h-5 w-5\" />}\n gradient=\"from-emerald-500 via-teal-500 to-cyan-500\"\n steps={setupSteps}\n currentStep={currentStep}\n onStepChange={handleStepChange}\n onSubmit={handleSubmit}\n onCancel={handleCancel}\n isSubmitting={isLoading}\n submitLabel={t('mfa.setup.submitLabel')}\n canAdvance={canAdvance}\n >\n {/* Step 0: Choose method */}\n {currentStep === 0 && (\n <OptionGrid\n icon={<ShieldCheckIcon className=\"h-4 w-4\" />}\n title={t('mfa.setup.methodGridTitle')}\n options={[\n {\n code: 'totp',\n flag: '\\u{1F4F1}',\n label: t('mfa.setup.methodAuthenticatorApp'),\n },\n ]}\n selected={selectedMethod}\n onSelect={handleMethodSelect}\n columns={2}\n />\n )}\n\n {/* Step 1: Scan QR code */}\n {currentStep === 1 && (\n <div className=\"space-y-4\">\n {isLoading ? (\n <div className=\"flex justify-center py-8\">\n <Spinner />\n </div>\n ) : (\n <>\n {qrCodeUri && (\n <div className=\"flex justify-center\">\n <div className=\"rounded-xl bg-white p-4\">\n <img\n src={qrCodeUri}\n alt={t('mfa.setup.qrCodeAlt')}\n className=\"h-48 w-48\"\n />\n </div>\n </div>\n )}\n\n {secret && (\n <div className=\"text-center\">\n <p className=\"text-xs text-gray-500 dark:text-gray-400 mb-1\">\n {t('mfa.setup.manualSecretLabel')}\n </p>\n <code className=\"font-mono text-sm font-medium text-gray-900 dark:text-white tracking-widest\">\n {secret}\n </code>\n </div>\n )}\n </>\n )}\n </div>\n )}\n\n {/* Step 2: Verify code */}\n {currentStep === 2 && (\n <div className=\"space-y-4\">\n <OtpInput\n value={verifyCode}\n onChange={setVerifyCode}\n onComplete={handleVerifyComplete}\n error={verifyError ?? undefined}\n disabled={isLoading}\n autoFocus\n />\n {isLoading && (\n <div className=\"flex justify-center\">\n <Spinner />\n </div>\n )}\n </div>\n )}\n\n {/* Step 3: Save backup codes */}\n {currentStep === 3 && (\n <div className=\"space-y-4\">\n <BackupCodeGrid\n codes={backupCodes}\n revealed\n />\n <FormCheckbox\n label={t('mfa.setup.backupCodesSavedConfirm')}\n checked={savedBackupCodes}\n onChange={setSavedBackupCodes}\n />\n </div>\n )}\n </StepFormPage>\n )\n}\n","import { useState, useCallback } from 'react'\nimport { useTranslations, useFormatter } from '@ui/lib/i18n-context'\nimport { toBusinessDate } from '@datatechsolutions/shared-domain'\nimport {\n SectionCard,\n ListCard,\n ListCardItem,\n StatusBadge,\n EmptyState,\n Button,\n PasswordInput,\n Sheet,\n DynamicIslandConfirm,\n triggerHaptic,\n} from '@ui/index'\nimport { BackupCodeGrid } from './components'\nimport {\n ShieldCheckIcon,\n PlusIcon,\n ArrowPathIcon,\n} from '@heroicons/react/24/outline'\nimport { ShieldExclamationIcon } from '@heroicons/react/20/solid'\nimport { useAuth } from '../../_auth'\n\nexport type { EnrolledMethod, MfaManageProps } from '@datatechsolutions/shared-domain'\nimport type { EnrolledMethod, MfaManageProps } from '@datatechsolutions/shared-domain'\n\nexport function MfaManage({\n mfaEnabled,\n enrolledMethods = [],\n onEnroll,\n onDisable,\n onRegenerateBackupCodes,\n}: MfaManageProps) {\n const t = useTranslations('windsock')\n const format = useFormatter()\n const { client } = useAuth()\n\n const [isBackupSheetOpen, setIsBackupSheetOpen] = useState(false)\n const [newBackupCodes, setNewBackupCodes] = useState<string[]>([])\n const [isRegenerating, setIsRegenerating] = useState(false)\n const [isConfirmDisableOpen, setIsConfirmDisableOpen] = useState(false)\n const [disablePassword, setDisablePassword] = useState('')\n const [disableError, setDisableError] = useState<string | null>(null)\n const [isDisabling, setIsDisabling] = useState(false)\n\n const handleOpenBackupSheet = useCallback(async () => {\n triggerHaptic('medium')\n setIsRegenerating(true)\n try {\n const codes = onRegenerateBackupCodes\n ? await onRegenerateBackupCodes()\n : await client.regenerateBackupCodes()\n setNewBackupCodes(codes)\n setIsBackupSheetOpen(true)\n } catch {\n // Fail silently — caller is responsible for error surfacing\n } finally {\n setIsRegenerating(false)\n }\n }, [onRegenerateBackupCodes, client])\n\n const handleCloseBackupSheet = useCallback(() => {\n triggerHaptic('light')\n setIsBackupSheetOpen(false)\n setNewBackupCodes([])\n }, [])\n\n const handleRequestDisable = useCallback(() => {\n triggerHaptic('warning')\n setDisablePassword('')\n setDisableError(null)\n setIsConfirmDisableOpen(true)\n }, [])\n\n const handleConfirmDisable = useCallback(async () => {\n if (!disablePassword.trim()) {\n setDisableError(t('mfa.manage.disablePasswordRequired'))\n triggerHaptic('error')\n return\n }\n\n setDisableError(null)\n setIsDisabling(true)\n triggerHaptic('medium')\n\n try {\n if (onDisable) {\n onDisable()\n } else {\n const result = await client.disableMfa(disablePassword)\n if (!result.success) {\n setDisableError(result.error ?? t('mfa.manage.disableError'))\n triggerHaptic('error')\n return\n }\n }\n setIsConfirmDisableOpen(false)\n triggerHaptic('success')\n } catch {\n setDisableError(t('mfa.manage.disableError'))\n triggerHaptic('error')\n } finally {\n setIsDisabling(false)\n }\n }, [disablePassword, onDisable, client, t])\n\n const handleCancelDisable = useCallback(() => {\n triggerHaptic('light')\n setIsConfirmDisableOpen(false)\n setDisablePassword('')\n setDisableError(null)\n }, [])\n\n const handleEnroll = useCallback(() => {\n triggerHaptic('light')\n onEnroll?.()\n }, [onEnroll])\n\n return (\n <>\n <SectionCard\n header={{\n icon: <ShieldCheckIcon className=\"h-5 w-5 text-white\" />,\n title: t('mfa.manage.title'),\n subtitle: t('mfa.manage.subtitle'),\n gradient: 'from-emerald-500 via-teal-500 to-cyan-500',\n rightContent: mfaEnabled ? (\n <StatusBadge status=\"active\" label={t('mfa.manage.statusEnabled')} size=\"sm\" />\n ) : (\n <StatusBadge status=\"inactive\" label={t('mfa.manage.statusDisabled')} size=\"sm\" />\n ),\n }}\n padded={false}\n >\n {!mfaEnabled ? (\n /* MFA not enabled — show empty state with enable CTA */\n <div className=\"p-4 sm:p-6\">\n <EmptyState\n message={t('mfa.manage.emptyStateMessage')}\n description={t('mfa.manage.emptyStateDescription')}\n icon={ShieldExclamationIcon}\n action={{\n label: t('mfa.manage.enableButton'),\n onClick: handleEnroll,\n }}\n variant=\"card\"\n />\n </div>\n ) : (\n /* MFA enabled — show enrolled methods list + action buttons */\n <div className=\"space-y-4 p-4 sm:p-6\">\n {enrolledMethods.length > 0 && (\n <ListCard>\n {enrolledMethods.map((method, index) => (\n <ListCardItem\n key={`${method.type}-${index}`}\n leading={\n <div className=\"h-9 w-9 rounded-xl bg-gradient-to-br from-emerald-500 to-teal-600 flex items-center justify-center shadow-sm\">\n <ShieldCheckIcon className=\"h-5 w-5 text-white\" />\n </div>\n }\n trailing={\n <StatusBadge status=\"active\" label={t('mfa.manage.methodStatusActive')} size=\"sm\" />\n }\n >\n <p className=\"text-sm font-medium text-gray-900 dark:text-white\">\n {method.label}\n </p>\n {method.createdAt && (\n <p className=\"text-xs text-gray-500 dark:text-gray-400 mt-0.5\">\n {t('mfa.manage.methodEnrolledAt', {\n date: format.dateTime(new Date(method.createdAt), {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n }),\n })}\n </p>\n )}\n </ListCardItem>\n ))}\n </ListCard>\n )}\n\n {/* Action buttons */}\n <div className=\"flex flex-col gap-2 sm:flex-row sm:gap-3\">\n {onEnroll && (\n <Button\n color=\"ios-glass-blue\"\n onClick={handleEnroll}\n className=\"flex-1\"\n >\n <PlusIcon className=\"h-4 w-4 mr-1.5\" />\n {t('mfa.manage.addMethodButton')}\n </Button>\n )}\n\n <Button\n outline\n onClick={handleOpenBackupSheet}\n loading={isRegenerating}\n disabled={isRegenerating}\n className=\"flex-1\"\n >\n <ArrowPathIcon className=\"h-4 w-4 mr-1.5\" />\n {t('mfa.manage.regenerateBackupCodesButton')}\n </Button>\n\n <Button\n color=\"ios-glass-red\"\n onClick={handleRequestDisable}\n className=\"flex-1\"\n >\n {t('mfa.manage.disableMfaButton')}\n </Button>\n </div>\n </div>\n )}\n </SectionCard>\n\n {/* Backup codes sheet */}\n <Sheet\n open={isBackupSheetOpen}\n onClose={handleCloseBackupSheet}\n title={t('mfa.manage.backupCodesSheetTitle')}\n side=\"bottom\"\n size=\"md\"\n >\n <div className=\"space-y-4 p-4 sm:p-6\">\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n {t('mfa.manage.backupCodesSheetDescription')}\n </p>\n <BackupCodeGrid\n codes={newBackupCodes}\n revealed\n />\n <Button\n color=\"ios-glass-blue\"\n fullWidth\n onClick={handleCloseBackupSheet}\n >\n {t('mfa.manage.backupCodesDoneButton')}\n </Button>\n </div>\n </Sheet>\n\n {/* Disable MFA — requires password confirmation */}\n <Sheet\n open={isConfirmDisableOpen}\n onClose={handleCancelDisable}\n title={t('mfa.manage.confirmDisableTitle')}\n side=\"bottom\"\n size=\"md\"\n >\n <div className=\"space-y-4 p-4 sm:p-6\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-xl bg-ios-red shadow-sm\">\n <ShieldExclamationIcon className=\"h-5 w-5 text-white\" />\n </div>\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n {t('mfa.manage.confirmDisableDescription')}\n </p>\n </div>\n\n <PasswordInput\n label={t('mfa.manage.disablePasswordLabel')}\n value={disablePassword}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setDisablePassword(event.target.value)}\n placeholder={t('mfa.manage.disablePasswordPlaceholder')}\n disabled={isDisabling}\n autoFocus\n autoComplete=\"current-password\"\n />\n\n {disableError && (\n <p className=\"text-sm text-red-600 dark:text-red-400\" role=\"alert\">{disableError}</p>\n )}\n\n <div className=\"flex gap-3\">\n <Button\n outline\n onClick={handleCancelDisable}\n disabled={isDisabling}\n className=\"flex-1\"\n >\n {t('mfa.manage.confirmDisableCancelLabel')}\n </Button>\n <Button\n color=\"ios-glass-red\"\n onClick={handleConfirmDisable}\n loading={isDisabling}\n disabled={isDisabling || !disablePassword.trim()}\n className=\"flex-1\"\n >\n {t('mfa.manage.confirmDisableConfirmLabel')}\n </Button>\n </div>\n </div>\n </Sheet>\n </>\n )\n}\n","import React, { useState, useEffect, useCallback, useRef } from 'react'\nimport { useTranslations, useFormatter, useLocale } from '@ui/lib/i18n-context'\nimport {\n SegmentedControl,\n SectionCard,\n BaseForm,\n Input,\n PasswordInput,\n Button,\n ListCard,\n ListCardItem,\n Avatar,\n Badge,\n InlineSpinner,\n triggerHaptic,\n} from '@ui/index'\nimport { PasswordStrengthMeter } from './components'\nimport {\n UserIcon,\n ComputerDesktopIcon,\n LinkIcon,\n CheckCircleIcon,\n GlobeAltIcon,\n CameraIcon,\n} from '@heroicons/react/24/outline'\nimport { useAuth } from '../../_auth'\nimport { MfaManage } from './mfa-manage'\nimport { MfaSetup } from './mfa-setup'\nimport * as sharedI18n from '@datatechsolutions/shared-domain/i18n'\nimport type { LocaleCode } from '@datatechsolutions/shared-domain/i18n'\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\nexport type { ProfileTab, UserProfileProps } from '@datatechsolutions/shared-domain'\nimport type {\n UserSession,\n LinkedAccount,\n ProfileTab,\n ProfileTabContentProps,\n UserProfileProps,\n} from '@datatechsolutions/shared-domain'\n\nconst ALL_TABS: ProfileTab[] = ['profile', 'security', 'sessions', 'linked-accounts']\n\nexport function ProfileTabContent({ onProfileUpdate }: ProfileTabContentProps) {\n const t = useTranslations('windsock')\n const currentLocale = useLocale() as LocaleCode\n const { user, client } = useAuth()\n\n const [name, setName] = useState(user?.name ?? '')\n const [avatarPreview, setAvatarPreview] = useState<string | null>(user?.image ?? null)\n const [isUploadingAvatar, setIsUploadingAvatar] = useState(false)\n const fileInputRef = useRef<HTMLInputElement>(null)\n const [selectedLocale, setSelectedLocale] = useState<LocaleCode>(currentLocale)\n const [isSaving, setIsSaving] = useState(false)\n const [saveError, setSaveError] = useState<string | null>(null)\n const [saveSuccess, setSaveSuccess] = useState(false)\n\n const handleAvatarChange = useCallback(async (event: React.ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0]\n if (!file) return\n\n // Validate client-side\n if (!['image/jpeg', 'image/png', 'image/webp'].includes(file.type)) {\n setSaveError(t('userProfile.profile.avatarInvalidType'))\n return\n }\n if (file.size > 5 * 1024 * 1024) {\n setSaveError(t('userProfile.profile.avatarTooLarge'))\n return\n }\n\n // Show preview immediately\n const previewUrl = URL.createObjectURL(file)\n setAvatarPreview(previewUrl)\n setSaveError(null)\n setIsUploadingAvatar(true)\n triggerHaptic('light')\n\n try {\n // Upload to S3 via presigned URL\n const uploadResult = await client.uploadFile(file, 'avatars')\n if (!uploadResult.success || !uploadResult.key) {\n throw new Error(uploadResult.error ?? 'Upload failed')\n }\n\n // Save the S3 key to user profile\n const updateResult = await client.updateProfile({ image: uploadResult.key })\n if (!updateResult.success) {\n throw new Error(updateResult.error ?? 'Profile update failed')\n }\n\n triggerHaptic('success')\n } catch (error) {\n setSaveError(error instanceof Error ? error.message : 'Upload failed')\n setAvatarPreview(user?.image ?? null)\n triggerHaptic('error')\n } finally {\n setIsUploadingAvatar(false)\n // Reset file input so same file can be re-selected\n if (fileInputRef.current) fileInputRef.current.value = ''\n }\n }, [client, user, t])\n\n const handleSave = useCallback(async () => {\n setSaveError(null)\n setSaveSuccess(false)\n setIsSaving(true)\n triggerHaptic('light')\n try {\n if (onProfileUpdate) {\n await onProfileUpdate({ name, email: user?.email ?? '', locale: selectedLocale })\n } else {\n const result = await client.updateProfile({ name, locale: selectedLocale })\n if (!result.success) {\n throw new Error(result.error)\n }\n }\n setSaveSuccess(true)\n triggerHaptic('success')\n // Persist locale to cookie and reload if changed\n if (selectedLocale !== currentLocale) {\n sharedI18n.setLocaleCookie(selectedLocale)\n window.location.reload()\n }\n } catch {\n setSaveError(t('userProfile.profile.saveError'))\n triggerHaptic('error')\n } finally {\n setIsSaving(false)\n }\n }, [name, selectedLocale, currentLocale, user, onProfileUpdate, client, t])\n\n return (\n <div className=\"space-y-6\">\n <SectionCard\n header={{\n icon: <UserIcon className=\"h-5 w-5 text-white\" />,\n title: t('userProfile.profile.title'),\n subtitle: t('userProfile.profile.subtitle'),\n gradient: 'from-blue-500 via-indigo-500 to-violet-500',\n }}\n >\n <BaseForm onSubmit={handleSave} submitLabel={t('userProfile.profile.saveButton')} showFooter={false}>\n {/* Avatar Upload */}\n <div className=\"flex flex-col items-center gap-3 pb-4\">\n <button\n type=\"button\"\n onClick={() => fileInputRef.current?.click()}\n disabled={isUploadingAvatar}\n className=\"group relative\"\n >\n <Avatar\n src={avatarPreview ?? undefined}\n initials={user?.name?.slice(0, 2).toUpperCase() ?? user?.email?.slice(0, 2).toUpperCase()}\n alt={user?.name ?? 'Profile'}\n className=\"h-20 w-20 text-2xl\"\n />\n <div className=\"absolute inset-0 flex items-center justify-center rounded-full bg-black/0 transition group-hover:bg-black/40\">\n {isUploadingAvatar ? (\n <InlineSpinner />\n ) : (\n <CameraIcon className=\"h-6 w-6 text-white opacity-0 transition group-hover:opacity-100\" />\n )}\n </div>\n </button>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/jpeg,image/png,image/webp\"\n onChange={handleAvatarChange}\n className=\"hidden\"\n />\n <p className=\"text-xs text-slate-500 dark:text-slate-400\">\n {t('userProfile.profile.avatarHint')}\n </p>\n </div>\n\n <Input\n label={t('userProfile.profile.nameLabel')}\n value={name}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setName(event.target.value)}\n disabled={isSaving}\n autoComplete=\"name\"\n />\n <Input\n label={t('userProfile.profile.emailLabel')}\n type=\"email\"\n value={user?.email ?? ''}\n readOnly\n disabled\n autoComplete=\"email\"\n />\n\n {saveError && (\n <p className=\"text-sm text-red-600 dark:text-red-400\">{saveError}</p>\n )}\n\n {saveSuccess && (\n <p className=\"text-sm text-green-600 dark:text-green-400\">\n {t('userProfile.profile.saveSuccess')}\n </p>\n )}\n\n <Button\n type=\"submit\"\n color=\"ios-glass-blue\"\n fullWidth\n loading={isSaving}\n disabled={isSaving}\n >\n {t('userProfile.profile.saveButton')}\n </Button>\n </BaseForm>\n </SectionCard>\n\n <SectionCard\n header={{\n icon: <GlobeAltIcon className=\"h-5 w-5 text-white\" />,\n title: t('userProfile.profile.languageTitle'),\n subtitle: t('userProfile.profile.languageSubtitle'),\n gradient: 'from-lime-400 via-emerald-500 to-green-600',\n }}\n >\n <div className=\"grid grid-cols-3 gap-2\">\n {sharedI18n.SUPPORTED_LOCALES.map((code) => {\n const meta = sharedI18n.LANGUAGE_META[code]\n const checked = selectedLocale === code\n return (\n <button\n key={code}\n type=\"button\"\n onClick={() => {\n setSelectedLocale(code)\n triggerHaptic('light')\n }}\n className={`group relative flex flex-col items-center justify-center rounded-xl border px-2 py-2.5 backdrop-blur-xl shadow-[inset_0_1px_0_rgba(255,255,255,0.9),0_10px_22px_-16px_rgba(15,23,42,0.45)] dark:shadow-[inset_0_1px_0_rgba(255,255,255,0.18),0_10px_22px_-16px_rgba(0,0,0,0.75)] transition ${\n checked\n ? 'border-indigo-400/80 bg-gradient-to-br from-indigo-100/85 via-white/80 to-sky-100/75 dark:border-indigo-300/70 dark:bg-[linear-gradient(140deg,rgba(99,102,241,0.32)_0%,rgba(30,41,59,0.72)_100%)]'\n : 'border-white/55 bg-gradient-to-br from-white/82 via-white/66 to-slate-100/62 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:hover:bg-[linear-gradient(140deg,rgba(51,65,85,0.76)_0%,rgba(30,41,59,0.68)_100%)]'\n }`}\n >\n <span className=\"text-lg leading-5\">{meta.flag}</span>\n <span className={`mt-1.5 text-xs font-semibold ${\n checked ? 'text-slate-900 dark:text-indigo-100' : 'text-slate-700 dark:text-slate-100'\n }`}>\n {meta.nativeName}\n </span>\n {checked && (\n <CheckCircleIcon className=\"absolute right-1 top-1 h-3.5 w-3.5 text-indigo-600 dark:text-indigo-300\" />\n )}\n </button>\n )\n })}\n </div>\n {selectedLocale !== currentLocale && (\n <div className=\"mt-4\">\n <Button\n type=\"button\"\n color=\"ios-glass-blue\"\n fullWidth\n loading={isSaving}\n disabled={isSaving}\n onClick={handleSave}\n >\n {t('userProfile.profile.saveButton')}\n </Button>\n </div>\n )}\n </SectionCard>\n </div>\n )\n}\n\n// ── Security Tab ─────────────────────────────────────────────────────────────\n\nexport function SecurityTabContent() {\n const t = useTranslations('windsock')\n const { client, user, refresh } = useAuth()\n\n const [showMfaSetup, setShowMfaSetup] = useState(false)\n const [currentPassword, setCurrentPassword] = useState('')\n const [newPassword, setNewPassword] = useState('')\n const [confirmPassword, setConfirmPassword] = useState('')\n const [passwordError, setPasswordError] = useState<string | null>(null)\n const [passwordSuccess, setPasswordSuccess] = useState(false)\n const [isSavingPassword, setIsSavingPassword] = useState(false)\n\n const handleMfaSetupSuccess = useCallback(() => {\n setShowMfaSetup(false)\n // Refresh user state so mfaEnabled reflects the new status\n refresh()\n }, [refresh])\n\n const handleChangePassword = useCallback(async () => {\n setPasswordError(null)\n setPasswordSuccess(false)\n\n if (!currentPassword) {\n setPasswordError(t('userProfile.security.errorCurrentRequired'))\n return\n }\n if (!newPassword) {\n setPasswordError(t('userProfile.security.errorNewRequired'))\n return\n }\n if (newPassword !== confirmPassword) {\n setPasswordError(t('userProfile.security.errorPasswordMismatch'))\n return\n }\n\n setIsSavingPassword(true)\n triggerHaptic('light')\n\n try {\n const result = await client.changePassword(currentPassword, newPassword)\n if (!result.success) {\n setPasswordError(result.error ?? t('userProfile.security.errorSaveFailed'))\n triggerHaptic('error')\n return\n }\n setCurrentPassword('')\n setNewPassword('')\n setConfirmPassword('')\n setPasswordSuccess(true)\n triggerHaptic('success')\n } catch {\n setPasswordError(t('userProfile.security.errorSaveFailed'))\n triggerHaptic('error')\n } finally {\n setIsSavingPassword(false)\n }\n }, [currentPassword, newPassword, confirmPassword, client, t])\n\n return (\n <div className=\"space-y-6\">\n {showMfaSetup ? (\n <MfaSetup\n onSuccess={handleMfaSetupSuccess}\n onCancel={() => setShowMfaSetup(false)}\n />\n ) : (\n <MfaManage\n mfaEnabled={user?.mfaEnabled ?? false}\n enrolledMethods={user?.mfaEnabled ? [{ type: 'totp', label: t('userProfile.security.mfaTotpLabel') }] : []}\n onEnroll={() => setShowMfaSetup(true)}\n />\n )}\n\n <SectionCard\n header={{\n icon: <UserIcon className=\"h-5 w-5 text-white\" />,\n title: t('userProfile.security.changePasswordTitle'),\n subtitle: t('userProfile.security.changePasswordSubtitle'),\n gradient: 'from-blue-500 via-sky-500 to-cyan-500',\n }}\n >\n <BaseForm onSubmit={handleChangePassword} submitLabel={t('userProfile.security.changePasswordButton')} showFooter={false}>\n <PasswordInput\n label={t('userProfile.security.currentPasswordLabel')}\n value={currentPassword}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setCurrentPassword(event.target.value)}\n disabled={isSavingPassword}\n autoComplete=\"current-password\"\n />\n <PasswordInput\n label={t('userProfile.security.newPasswordLabel')}\n value={newPassword}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setNewPassword(event.target.value)}\n disabled={isSavingPassword}\n autoComplete=\"new-password\"\n />\n <PasswordStrengthMeter password={newPassword} />\n <PasswordInput\n label={t('userProfile.security.confirmPasswordLabel')}\n value={confirmPassword}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setConfirmPassword(event.target.value)}\n disabled={isSavingPassword}\n autoComplete=\"new-password\"\n />\n\n {passwordError && (\n <p className=\"text-sm text-red-600 dark:text-red-400\">{passwordError}</p>\n )}\n\n {passwordSuccess && (\n <p className=\"text-sm text-green-600 dark:text-green-400\">\n {t('userProfile.security.changePasswordSuccess')}\n </p>\n )}\n\n <Button\n type=\"submit\"\n color=\"ios-glass-blue\"\n fullWidth\n loading={isSavingPassword}\n disabled={isSavingPassword}\n >\n {t('userProfile.security.changePasswordButton')}\n </Button>\n </BaseForm>\n </SectionCard>\n </div>\n )\n}\n\n// ── Sessions Tab ─────────────────────────────────────────────────────────────\n\nexport function SessionsTabContent() {\n const t = useTranslations('windsock')\n const format = useFormatter()\n const { client } = useAuth()\n\n const [sessions, setSessions] = useState<UserSession[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [revokingId, setRevokingId] = useState<string | null>(null)\n\n useEffect(() => {\n let cancelled = false\n\n const fetchSessions = async () => {\n setIsLoading(true)\n try {\n const rawSessions = await client.getSessions()\n if (!cancelled) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n setSessions(rawSessions.map((session: any) => ({\n id: session.id,\n device: session.userAgent ?? 'Unknown',\n location: session.ipAddress ?? 'Unknown',\n lastActive: typeof session.createdAt === 'string' ? session.createdAt : (session.createdAt as Date).toISOString(),\n current: false,\n })))\n }\n } catch {\n // Non-critical — render empty list\n } finally {\n if (!cancelled) setIsLoading(false)\n }\n }\n\n fetchSessions()\n return () => { cancelled = true }\n }, [client])\n\n const handleRevoke = useCallback(async (sessionId: string) => {\n setRevokingId(sessionId)\n triggerHaptic('medium')\n try {\n await client.revokeSession(sessionId)\n setSessions((previous) => previous.filter((s) => s.id !== sessionId))\n triggerHaptic('success')\n } catch {\n triggerHaptic('error')\n } finally {\n setRevokingId(null)\n }\n }, [client])\n\n return (\n <SectionCard\n header={{\n icon: <ComputerDesktopIcon className=\"h-5 w-5 text-white\" />,\n title: t('userProfile.sessions.title'),\n subtitle: t('userProfile.sessions.subtitle'),\n gradient: 'from-teal-500 via-cyan-500 to-sky-500',\n }}\n padded={false}\n >\n {isLoading ? (\n <div className=\"flex items-center justify-center gap-2 p-8 text-sm text-slate-500 dark:text-slate-400\">\n <InlineSpinner />\n <span>{t('userProfile.sessions.loading')}</span>\n </div>\n ) : sessions.length === 0 ? (\n <p className=\"p-6 text-center text-sm text-slate-500 dark:text-slate-400\">\n {t('userProfile.sessions.empty')}\n </p>\n ) : (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b liquid-divider\">\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-slate-500 dark:text-slate-400\">\n {t('userProfile.sessions.columnDevice')}\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-slate-500 dark:text-slate-400\">\n {t('userProfile.sessions.columnLocation')}\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-slate-500 dark:text-slate-400\">\n {t('userProfile.sessions.columnLastActive')}\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium uppercase tracking-wide text-slate-500 dark:text-slate-400\">\n {t('userProfile.sessions.columnAction')}\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-gray-200/60 dark:divide-white/10\">\n {sessions.map((session) => (\n <tr key={session.id}>\n <td className=\"px-4 py-3 text-slate-900 dark:text-white\">\n <div className=\"flex items-center gap-2\">\n {session.device}\n {session.current && (\n <Badge color=\"green\">{t('userProfile.sessions.currentBadge')}</Badge>\n )}\n </div>\n </td>\n <td className=\"px-4 py-3 text-slate-500 dark:text-slate-400\">\n {session.location}\n </td>\n <td className=\"px-4 py-3 text-slate-500 dark:text-slate-400\">\n {format.relativeTime(new Date(session.lastActive))}\n </td>\n <td className=\"px-4 py-3 text-right\">\n {!session.current && (\n <Button\n size=\"sm\"\n color=\"ios-glass-red\"\n onClick={() => handleRevoke(session.id)}\n loading={revokingId === session.id}\n disabled={revokingId !== null}\n >\n {t('userProfile.sessions.revokeButton')}\n </Button>\n )}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </SectionCard>\n )\n}\n\n// ── Linked Accounts Tab ──────────────────────────────────────────────────────\n\nexport function LinkedAccountsTabContent() {\n const t = useTranslations('windsock')\n const { client } = useAuth()\n\n const [accounts, setAccounts] = useState<LinkedAccount[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [actioningProvider, setActioningProvider] = useState<string | null>(null)\n\n useEffect(() => {\n let cancelled = false\n\n const fetchAccounts = async () => {\n setIsLoading(true)\n try {\n const rawAccounts = await client.getLinkedAccounts()\n if (!cancelled) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n setAccounts(rawAccounts.map((account: any) => ({\n provider: account.provider,\n providerUserId: account.providerAccountId,\n connected: true,\n })))\n }\n } catch {\n // Non-critical — render empty list\n } finally {\n if (!cancelled) setIsLoading(false)\n }\n }\n\n fetchAccounts()\n return () => { cancelled = true }\n }, [client])\n\n const handleDisconnect = useCallback(async (provider: string) => {\n setActioningProvider(provider)\n triggerHaptic('medium')\n try {\n await client.disconnectProvider(provider)\n setAccounts((previous) => previous.filter((a) => a.provider !== provider))\n triggerHaptic('success')\n } catch {\n triggerHaptic('error')\n } finally {\n setActioningProvider(null)\n }\n }, [client])\n\n const providerInitials = (provider: string) =>\n provider.slice(0, 2).toUpperCase()\n\n return (\n <SectionCard\n header={{\n icon: <LinkIcon className=\"h-5 w-5 text-white\" />,\n title: t('userProfile.linkedAccounts.title'),\n subtitle: t('userProfile.linkedAccounts.subtitle'),\n gradient: 'from-violet-500 via-purple-500 to-pink-500',\n }}\n padded={false}\n >\n {isLoading ? (\n <div className=\"flex items-center justify-center gap-2 p-8 text-sm text-slate-500 dark:text-slate-400\">\n <InlineSpinner />\n <span>{t('userProfile.linkedAccounts.loading')}</span>\n </div>\n ) : accounts.length === 0 ? (\n <p className=\"p-6 text-center text-sm text-slate-500 dark:text-slate-400\">\n {t('userProfile.linkedAccounts.empty')}\n </p>\n ) : (\n <ListCard>\n {accounts.map((account) => (\n <ListCardItem\n key={account.provider}\n leading={\n <Avatar\n src={account.logoUrl}\n initials={providerInitials(account.provider)}\n alt={account.provider}\n />\n }\n trailing={\n <Button\n size=\"sm\"\n color=\"ios-glass-red\"\n onClick={() => handleDisconnect(account.provider)}\n loading={actioningProvider === account.provider}\n disabled={actioningProvider !== null}\n >\n {t('userProfile.linkedAccounts.disconnectButton')}\n </Button>\n }\n >\n <div>\n <p className=\"text-sm font-medium capitalize text-slate-900 dark:text-white\">\n {account.provider}\n </p>\n <p className=\"text-xs text-slate-500 dark:text-slate-400\">\n {t('userProfile.linkedAccounts.connectedLabel')}\n </p>\n </div>\n </ListCardItem>\n ))}\n </ListCard>\n )}\n </SectionCard>\n )\n}\n\n// ── UserProfile ──────────────────────────────────────────────────────────────\n\nexport function UserProfile({\n defaultTab = 'profile',\n tabs = ALL_TABS,\n onSignOut: _onSignOut,\n onProfileUpdate,\n}: UserProfileProps) {\n const t = useTranslations('windsock')\n const { status } = useAuth()\n\n const [activeTab, setActiveTab] = useState<ProfileTab>(\n tabs.includes(defaultTab) ? defaultTab : (tabs[0] ?? 'profile'),\n )\n\n if (status === 'loading') {\n return (\n <div className=\"flex items-center justify-center py-12\">\n <InlineSpinner />\n </div>\n )\n }\n\n if (status !== 'authenticated') {\n return null\n }\n\n const segments = tabs.map((tab) => ({\n value: tab,\n label: t(`userProfile.tabs.${tab}`),\n }))\n\n return (\n <div className=\"space-y-6\">\n {tabs.length > 1 && (\n <SegmentedControl\n segments={segments}\n value={activeTab}\n onChange={(value: string) => setActiveTab(value as ProfileTab)}\n fullWidth\n />\n )}\n\n {activeTab === 'profile' && (\n <ProfileTabContent onProfileUpdate={onProfileUpdate} />\n )}\n\n {activeTab === 'security' && (\n <SecurityTabContent />\n )}\n\n {activeTab === 'sessions' && (\n <SessionsTabContent />\n )}\n\n {activeTab === 'linked-accounts' && (\n <LinkedAccountsTabContent />\n )}\n </div>\n )\n}\n"]}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var chunkR4EKPXX3_js = require('./chunk-R4EKPXX3.js');
|
|
5
|
+
var chunkBHOT22QL_js = require('./chunk-BHOT22QL.js');
|
|
5
6
|
var react = require('react');
|
|
6
7
|
var outline = require('@heroicons/react/24/outline');
|
|
7
8
|
var jsxRuntime = require('react/jsx-runtime');
|
|
@@ -182,41 +183,41 @@ function ConnectionForm({
|
|
|
182
183
|
switch (dialect.formType) {
|
|
183
184
|
case "standard":
|
|
184
185
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
185
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
186
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
187
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
188
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
189
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
190
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
186
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkR4EKPXX3_js.FormInput, { name: "host", label: labels.fieldHost, placeholder: labels.fieldHostPlaceholder, required: true }),
|
|
187
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkR4EKPXX3_js.FormInput, { name: "port", label: labels.fieldPort, type: "number", defaultValue: dialect.defaultPort }),
|
|
188
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkR4EKPXX3_js.FormInput, { name: "database", label: labels.fieldDatabase, placeholder: labels.fieldDatabasePlaceholder, required: true }),
|
|
189
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkR4EKPXX3_js.FormInput, { name: "username", label: labels.fieldUsername, placeholder: labels.fieldUsernamePlaceholder }),
|
|
190
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkR4EKPXX3_js.FormInput, { name: "password", label: labels.fieldPassword, type: "password", placeholder: labels.fieldPasswordPlaceholder }),
|
|
191
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkR4EKPXX3_js.FormInput, { name: "schema", label: labels.fieldSchema, placeholder: labels.fieldSchemaPlaceholder })
|
|
191
192
|
] });
|
|
192
193
|
case "connection-string":
|
|
193
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "col-span-full", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
194
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "col-span-full", children: /* @__PURE__ */ jsxRuntime.jsx(chunkR4EKPXX3_js.FormInput, { name: "connectionString", label: labels.fieldConnectionString, placeholder: labels.fieldConnectionStringPlaceholder, required: true }) });
|
|
194
195
|
case "cloud-bigquery":
|
|
195
196
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
196
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
197
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
198
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "col-span-full", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
197
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkR4EKPXX3_js.FormInput, { name: "projectId", label: labels.fieldProjectId, placeholder: labels.fieldProjectIdPlaceholder, required: true }),
|
|
198
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkR4EKPXX3_js.FormInput, { name: "dataset", label: labels.fieldDataset, placeholder: labels.fieldDatasetPlaceholder, required: true }),
|
|
199
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "col-span-full", children: /* @__PURE__ */ jsxRuntime.jsx(chunkR4EKPXX3_js.FormInput, { name: "keyFile", label: labels.fieldKeyFile, placeholder: labels.fieldKeyFilePlaceholder }) })
|
|
199
200
|
] });
|
|
200
201
|
case "cloud-snowflake":
|
|
201
202
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
202
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
203
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
204
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
205
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
206
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
207
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
203
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkR4EKPXX3_js.FormInput, { name: "account", label: labels.fieldAccount, placeholder: labels.fieldAccountPlaceholder, required: true }),
|
|
204
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkR4EKPXX3_js.FormInput, { name: "warehouse", label: labels.fieldWarehouse, placeholder: labels.fieldWarehousePlaceholder, required: true }),
|
|
205
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkR4EKPXX3_js.FormInput, { name: "database", label: labels.fieldDatabase, placeholder: labels.fieldDatabasePlaceholder, required: true }),
|
|
206
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkR4EKPXX3_js.FormInput, { name: "username", label: labels.fieldUsername, placeholder: labels.fieldUsernamePlaceholder, required: true }),
|
|
207
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkR4EKPXX3_js.FormInput, { name: "password", label: labels.fieldPassword, type: "password", placeholder: labels.fieldPasswordPlaceholder }),
|
|
208
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkR4EKPXX3_js.FormInput, { name: "schema", label: labels.fieldSchema, placeholder: labels.fieldSchemaPlaceholder })
|
|
208
209
|
] });
|
|
209
210
|
case "cloud-key":
|
|
210
211
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
211
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
212
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
213
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
212
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkR4EKPXX3_js.FormInput, { name: "region", label: labels.fieldRegion, placeholder: labels.fieldRegionPlaceholder, required: true }),
|
|
213
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkR4EKPXX3_js.FormInput, { name: "token", label: labels.fieldToken, type: "password", placeholder: labels.fieldTokenPlaceholder, required: true }),
|
|
214
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkR4EKPXX3_js.FormInput, { name: "bucket", label: labels.fieldBucket, placeholder: labels.fieldBucketPlaceholder })
|
|
214
215
|
] });
|
|
215
216
|
case "vector-key":
|
|
216
217
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
217
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
218
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
219
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
218
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkR4EKPXX3_js.FormInput, { name: "apiKey", label: labels.fieldApiKey, type: "password", placeholder: labels.fieldApiKeyPlaceholder, required: true }),
|
|
219
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkR4EKPXX3_js.FormInput, { name: "environment", label: labels.fieldEnvironment, placeholder: labels.fieldEnvironmentPlaceholder, required: true }),
|
|
220
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkR4EKPXX3_js.FormInput, { name: "index", label: labels.fieldIndex, placeholder: labels.fieldIndexPlaceholder })
|
|
220
221
|
] });
|
|
221
222
|
}
|
|
222
223
|
}
|
|
@@ -239,8 +240,8 @@ function ConnectionForm({
|
|
|
239
240
|
] })
|
|
240
241
|
] })
|
|
241
242
|
] }),
|
|
242
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
243
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
243
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkR4EKPXX3_js.FormInput, { name: "name", label: labels.fieldName, placeholder: labels.fieldNamePlaceholder, required: true }),
|
|
244
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkR4EKPXX3_js.FormGrid, { children: renderFields() }),
|
|
244
245
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-6 pt-2", children: [
|
|
245
246
|
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-2 text-sm text-slate-700 dark:text-slate-300", children: [
|
|
246
247
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -271,9 +272,9 @@ function ConnectionForm({
|
|
|
271
272
|
/* @__PURE__ */ jsxRuntime.jsxs("details", { className: "liquid-surface rounded-xl p-3", children: [
|
|
272
273
|
/* @__PURE__ */ jsxRuntime.jsx("summary", { className: "cursor-pointer text-sm font-medium text-slate-700 dark:text-slate-300", children: labels.advancedToggle ?? "Governance & performance" }),
|
|
273
274
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-3 space-y-3", children: [
|
|
274
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
275
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkR4EKPXX3_js.FormGrid, { children: [
|
|
275
276
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
276
|
-
|
|
277
|
+
chunkR4EKPXX3_js.FormInput,
|
|
277
278
|
{
|
|
278
279
|
name: "maxPoolSize",
|
|
279
280
|
label: labels.fieldMaxPoolSize ?? "Max pool size",
|
|
@@ -284,7 +285,7 @@ function ConnectionForm({
|
|
|
284
285
|
}
|
|
285
286
|
),
|
|
286
287
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
287
|
-
|
|
288
|
+
chunkR4EKPXX3_js.FormInput,
|
|
288
289
|
{
|
|
289
290
|
name: "timeoutMs",
|
|
290
291
|
label: labels.fieldTimeoutMs ?? "Timeout (ms)",
|
|
@@ -295,7 +296,7 @@ function ConnectionForm({
|
|
|
295
296
|
)
|
|
296
297
|
] }),
|
|
297
298
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
298
|
-
|
|
299
|
+
chunkR4EKPXX3_js.FormInput,
|
|
299
300
|
{
|
|
300
301
|
name: "allowedTables",
|
|
301
302
|
label: labels.fieldAllowedTables ?? "Allowed tables (comma-separated)",
|
|
@@ -304,7 +305,7 @@ function ConnectionForm({
|
|
|
304
305
|
),
|
|
305
306
|
/* @__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." }),
|
|
306
307
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
307
|
-
|
|
308
|
+
chunkR4EKPXX3_js.FormInput,
|
|
308
309
|
{
|
|
309
310
|
name: "blockedColumns",
|
|
310
311
|
label: labels.fieldBlockedColumns ?? "Blocked columns (comma-separated)",
|
|
@@ -316,7 +317,7 @@ function ConnectionForm({
|
|
|
316
317
|
] }),
|
|
317
318
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3 border-t liquid-divider pt-5", children: [
|
|
318
319
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
319
|
-
|
|
320
|
+
chunkBHOT22QL_js.Button,
|
|
320
321
|
{
|
|
321
322
|
type: "button",
|
|
322
323
|
size: "sm",
|
|
@@ -335,7 +336,7 @@ function ConnectionForm({
|
|
|
335
336
|
labels.connectionFailed
|
|
336
337
|
] }),
|
|
337
338
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1" }),
|
|
338
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
339
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkBHOT22QL_js.Button, { type: "submit", size: "sm", color: "amber", children: labels.save })
|
|
339
340
|
] })
|
|
340
341
|
] });
|
|
341
342
|
}
|
|
@@ -351,7 +352,7 @@ function DatasourceFormModal({ open, onClose, labels, onSave }) {
|
|
|
351
352
|
handleClose();
|
|
352
353
|
}
|
|
353
354
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
354
|
-
|
|
355
|
+
chunkR4EKPXX3_js.GlassModal,
|
|
355
356
|
{
|
|
356
357
|
open,
|
|
357
358
|
onClose: handleClose,
|
|
@@ -384,7 +385,7 @@ function DatasourceModal({ open, onClose, labels, onSave }) {
|
|
|
384
385
|
handleClose();
|
|
385
386
|
}
|
|
386
387
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
387
|
-
|
|
388
|
+
chunkR4EKPXX3_js.GlassModal,
|
|
388
389
|
{
|
|
389
390
|
open,
|
|
390
391
|
onClose: handleClose,
|
|
@@ -414,5 +415,5 @@ exports.DatasourceFormModal = DatasourceFormModal;
|
|
|
414
415
|
exports.DatasourceModal = DatasourceModal;
|
|
415
416
|
exports.findCategory = findCategory;
|
|
416
417
|
exports.findDialect = findDialect;
|
|
417
|
-
//# sourceMappingURL=chunk-
|
|
418
|
-
//# sourceMappingURL=chunk-
|
|
418
|
+
//# sourceMappingURL=chunk-DMPBNWJB.js.map
|
|
419
|
+
//# sourceMappingURL=chunk-DMPBNWJB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/platform/pages/datasource-modal.tsx"],"names":["CircleStackIcon","ServerStackIcon","CloudIcon","ClockIcon","ShareIcon","KeyIcon","MagnifyingGlassIcon","jsxs","jsx","useState","Fragment","FormInput","ArrowLeftIcon","FormGrid","Button","CheckCircleIcon","XCircleIcon","GlassModal"],"mappings":"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","file":"chunk-DMPBNWJB.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\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 <p className=\"text-sm text-slate-500 dark:text-slate-400\">{labels.stepSelectType}</p>\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 <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 <CircleStackIcon className=\"h-4 w-4 shrink-0 text-slate-400 transition-colors group-hover:text-amber-500 dark:text-slate-500\" />\n {dialect.label}\n </button>\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,8 +1,9 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { PasswordStrengthMeter } from './chunk-
|
|
3
|
-
import { SectionCard, SearchInput, InlineSpinner, EmptyState, Avatar,
|
|
4
|
-
import { triggerHaptic } from './chunk-D2JF6C3E.mjs';
|
|
2
|
+
import { PasswordStrengthMeter } from './chunk-3VYD7QL2.mjs';
|
|
3
|
+
import { SectionCard, SearchInput, InlineSpinner, EmptyState, Avatar, StatusBadge, DynamicIslandConfirm, GlassModal, Input, PasswordInput, Sheet } from './chunk-5LCWQKGQ.mjs';
|
|
5
4
|
import { useTranslations, useFormatter } from './chunk-7VJ7CMMT.mjs';
|
|
5
|
+
import { Badge, Button } from './chunk-WR55H7DH.mjs';
|
|
6
|
+
import { triggerHaptic } from './chunk-D2JF6C3E.mjs';
|
|
6
7
|
import { useState, useCallback, useEffect } from 'react';
|
|
7
8
|
import { UsersIcon, ShieldCheckIcon, KeyIcon, TrashIcon, UserPlusIcon, BuildingOffice2Icon, PencilSquareIcon, PlusIcon } from '@heroicons/react/24/outline';
|
|
8
9
|
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
@@ -1005,5 +1006,5 @@ function AdminPermissionList({ client }) {
|
|
|
1005
1006
|
}
|
|
1006
1007
|
|
|
1007
1008
|
export { AdminOrganizationForm, AdminOrganizationList, AdminPermissionList, AdminUserForm, AdminUserList };
|
|
1008
|
-
//# sourceMappingURL=chunk-
|
|
1009
|
-
//# sourceMappingURL=chunk-
|
|
1009
|
+
//# sourceMappingURL=chunk-DXLATMGD.mjs.map
|
|
1010
|
+
//# sourceMappingURL=chunk-DXLATMGD.mjs.map
|