@fayz-ai/admin 0.61.0 → 0.63.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{CommandPalette-B5PMQFDG.js → CommandPalette-XDJJ5E3O.js} +3 -3
- package/dist/{CommandPalette-B5PMQFDG.js.map → CommandPalette-XDJJ5E3O.js.map} +1 -1
- package/dist/ConnectedBrandingSettings-43ZM3HCI.js +680 -0
- package/dist/ConnectedBrandingSettings-43ZM3HCI.js.map +1 -0
- package/dist/ConnectedCompanySettings-I4MALI2Q.js +197 -0
- package/dist/ConnectedCompanySettings-I4MALI2Q.js.map +1 -0
- package/dist/ConnectedModulesSettings-A2VJ5BMJ.js +563 -0
- package/dist/ConnectedModulesSettings-A2VJ5BMJ.js.map +1 -0
- package/dist/ConnectedSecuritySettings-25AHA4HJ.js +189 -0
- package/dist/ConnectedSecuritySettings-25AHA4HJ.js.map +1 -0
- package/dist/ConnectedUserProfile-E7USJRUE.js +424 -0
- package/dist/ConnectedUserProfile-E7USJRUE.js.map +1 -0
- package/dist/FieldRulesEditor-YGIPKI5T.js +129 -0
- package/dist/FieldRulesEditor-YGIPKI5T.js.map +1 -0
- package/dist/GettingStartedWidget-HMIJ3Y24.js +12 -0
- package/dist/GettingStartedWidget-HMIJ3Y24.js.map +1 -0
- package/dist/PermissionProfilesTab-3ZPRCHMZ.js +548 -0
- package/dist/PermissionProfilesTab-3ZPRCHMZ.js.map +1 -0
- package/dist/PersonTimeline-HQZT527S.js +3 -0
- package/dist/{PersonTimeline-X7JTPUWJ.js.map → PersonTimeline-HQZT527S.js.map} +1 -1
- package/dist/ProjectsSettings-7O2F27MD.js +5 -0
- package/dist/ProjectsSettings-7O2F27MD.js.map +1 -0
- package/dist/ScheduleEditor-54ELWR45.js +8 -0
- package/dist/{ScheduleEditor-L2UJXKMY.js.map → ScheduleEditor-54ELWR45.js.map} +1 -1
- package/dist/SeuSiteWidget-QLSUVC63.js +6 -0
- package/dist/SeuSiteWidget-QLSUVC63.js.map +1 -0
- package/dist/SubscriptionPage-5GE5HFJK.js +17 -0
- package/dist/{SubscriptionPage-IDVEFLZ5.js.map → SubscriptionPage-5GE5HFJK.js.map} +1 -1
- package/dist/TeamTab-6RAULFLW.js +502 -0
- package/dist/TeamTab-6RAULFLW.js.map +1 -0
- package/dist/TrialWidget-Z6CLUCU3.js +7 -0
- package/dist/TrialWidget-Z6CLUCU3.js.map +1 -0
- package/dist/app/AdminShell.d.ts.map +1 -1
- package/dist/app/admin-app.d.ts.map +1 -1
- package/dist/app/config.d.ts +14 -0
- package/dist/app/config.d.ts.map +1 -1
- package/dist/app/routing.d.ts +6 -0
- package/dist/app/routing.d.ts.map +1 -1
- package/dist/app/scaffold.d.ts.map +1 -1
- package/dist/billing/index.js +9 -4
- package/dist/chunk-2H46WDG5.js +53 -0
- package/dist/chunk-2H46WDG5.js.map +1 -0
- package/dist/chunk-3HLX7YB2.js +94 -0
- package/dist/chunk-3HLX7YB2.js.map +1 -0
- package/dist/chunk-3OUD4XBK.js +3 -0
- package/dist/chunk-3OUD4XBK.js.map +1 -0
- package/dist/{chunk-IXSY4GPK.js → chunk-5D5QLMOQ.js} +5 -3
- package/dist/chunk-5D5QLMOQ.js.map +1 -0
- package/dist/chunk-5WR62X2R.js +1081 -0
- package/dist/chunk-5WR62X2R.js.map +1 -0
- package/dist/{chunk-KPYRTOCK.js → chunk-6CQFGMEO.js} +4 -140
- package/dist/chunk-6CQFGMEO.js.map +1 -0
- package/dist/chunk-6MMSYC2I.js +116 -0
- package/dist/chunk-6MMSYC2I.js.map +1 -0
- package/dist/chunk-6QFOE3UD.js +1466 -0
- package/dist/chunk-6QFOE3UD.js.map +1 -0
- package/dist/chunk-6UUFVQ2E.js +283 -0
- package/dist/chunk-6UUFVQ2E.js.map +1 -0
- package/dist/chunk-7WNLL3F6.js +7889 -0
- package/dist/chunk-7WNLL3F6.js.map +1 -0
- package/dist/chunk-A74IHAQE.js +439 -0
- package/dist/chunk-A74IHAQE.js.map +1 -0
- package/dist/{chunk-JOBRLBIQ.js → chunk-AFA6IO23.js} +4 -3
- package/dist/chunk-AFA6IO23.js.map +1 -0
- package/dist/{chunk-P5UIGQFY.js → chunk-ALCSIN3Z.js} +5 -5
- package/dist/chunk-ALCSIN3Z.js.map +1 -0
- package/dist/chunk-AWM4AMBS.js +39 -0
- package/dist/chunk-AWM4AMBS.js.map +1 -0
- package/dist/{chunk-OQARLKZN.js → chunk-BG5Z6KLN.js} +6 -18
- package/dist/chunk-BG5Z6KLN.js.map +1 -0
- package/dist/chunk-DPNFZONC.js +19 -0
- package/dist/chunk-DPNFZONC.js.map +1 -0
- package/dist/chunk-DRCV643L.js +193 -0
- package/dist/chunk-DRCV643L.js.map +1 -0
- package/dist/chunk-E6DF3VR6.js +206 -0
- package/dist/chunk-E6DF3VR6.js.map +1 -0
- package/dist/chunk-ENHCVGXZ.js +120 -0
- package/dist/chunk-ENHCVGXZ.js.map +1 -0
- package/dist/chunk-FK6RHGI7.js +56 -0
- package/dist/chunk-FK6RHGI7.js.map +1 -0
- package/dist/chunk-G5HNA5QK.js +233 -0
- package/dist/chunk-G5HNA5QK.js.map +1 -0
- package/dist/chunk-HCFO4Z6A.js +53 -0
- package/dist/chunk-HCFO4Z6A.js.map +1 -0
- package/dist/chunk-JFIU6NQP.js +51 -0
- package/dist/chunk-JFIU6NQP.js.map +1 -0
- package/dist/chunk-JRZJBMOY.js +3 -0
- package/dist/chunk-JRZJBMOY.js.map +1 -0
- package/dist/{chunk-3YP7KW47.js → chunk-JVVOL4BB.js} +41 -512
- package/dist/chunk-JVVOL4BB.js.map +1 -0
- package/dist/chunk-KAQ3UIAA.js +415 -0
- package/dist/chunk-KAQ3UIAA.js.map +1 -0
- package/dist/{chunk-P6XUDT2P.js → chunk-KJELMULA.js} +4 -51
- package/dist/chunk-KJELMULA.js.map +1 -0
- package/dist/chunk-KLO7DKXX.js +1651 -0
- package/dist/chunk-KLO7DKXX.js.map +1 -0
- package/dist/chunk-M2CMDWUI.js +75 -0
- package/dist/chunk-M2CMDWUI.js.map +1 -0
- package/dist/chunk-PQ47MLTH.js +255 -0
- package/dist/chunk-PQ47MLTH.js.map +1 -0
- package/dist/{chunk-VX3WJLKK.js → chunk-QD7BMUDF.js} +17 -8
- package/dist/chunk-QD7BMUDF.js.map +1 -0
- package/dist/{chunk-E4MESMNR.js → chunk-QTSKCPSW.js} +7 -10
- package/dist/chunk-QTSKCPSW.js.map +1 -0
- package/dist/chunk-S56FQKPL.js +186 -0
- package/dist/chunk-S56FQKPL.js.map +1 -0
- package/dist/chunk-SGAFPNMA.js +75 -0
- package/dist/chunk-SGAFPNMA.js.map +1 -0
- package/dist/{chunk-OD7P4L3D.js → chunk-SOKCLVM4.js} +3 -3
- package/dist/{chunk-OD7P4L3D.js.map → chunk-SOKCLVM4.js.map} +1 -1
- package/dist/chunk-TL42NKTH.js +3 -0
- package/dist/chunk-TL42NKTH.js.map +1 -0
- package/dist/chunk-U6ZCO2PS.js +2964 -0
- package/dist/chunk-U6ZCO2PS.js.map +1 -0
- package/dist/chunk-VSXNROYH.js +16 -0
- package/dist/chunk-VSXNROYH.js.map +1 -0
- package/dist/chunk-WPFZCYZL.js +619 -0
- package/dist/chunk-WPFZCYZL.js.map +1 -0
- package/dist/chunk-XFTNIBDW.js +23 -0
- package/dist/chunk-XFTNIBDW.js.map +1 -0
- package/dist/chunk-Y66JDL6I.js +1020 -0
- package/dist/chunk-Y66JDL6I.js.map +1 -0
- package/dist/chunk-YEHIBPIX.js +137 -0
- package/dist/chunk-YEHIBPIX.js.map +1 -0
- package/dist/chunk-YKPPCV2Z.js +53 -0
- package/dist/chunk-YKPPCV2Z.js.map +1 -0
- package/dist/components/chat/markdown.d.ts.map +1 -1
- package/dist/components/plugins/PluginSettingsPanel.d.ts.map +1 -1
- package/dist/components/settings/SettingsPage.d.ts.map +1 -1
- package/dist/components/shared/ConnectionIndicator.d.ts.map +1 -1
- package/dist/connect-XKQJOWR7.js +18 -0
- package/dist/connect-XKQJOWR7.js.map +1 -0
- package/dist/crud/CrudDetailPage.d.ts.map +1 -1
- package/dist/crud/CrudListView.d.ts.map +1 -1
- package/dist/crud/CrudPage.d.ts.map +1 -1
- package/dist/crud/RelatedListTab.d.ts.map +1 -1
- package/dist/crud/archetypes/EntityLink.d.ts +1 -1
- package/dist/crud/archetypes/EntityLink.d.ts.map +1 -1
- package/dist/crud/record-chrome.d.ts.map +1 -1
- package/dist/entity-routes-PGU7EHAD.js +4 -0
- package/dist/{entity-routes-LXOBW5IB.js.map → entity-routes-PGU7EHAD.js.map} +1 -1
- package/dist/hooks/useModuleNavigation.d.ts.map +1 -1
- package/dist/impersonation/ImpersonateDialog.d.ts.map +1 -1
- package/dist/impersonation/session.d.ts.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11922 -33564
- package/dist/index.js.map +1 -1
- package/dist/lib/connection.d.ts +14 -0
- package/dist/lib/connection.d.ts.map +1 -1
- package/dist/lib/entity-routes.d.ts.map +1 -1
- package/dist/org/index.js +4 -2
- package/dist/plugins/PluginRegistryManager.d.ts.map +1 -1
- package/dist/settings/MessageTemplateRow.d.ts.map +1 -1
- package/dist/timeline/PersonTimeline.d.ts.map +1 -1
- package/dist/timeline/TimelineList.d.ts.map +1 -1
- package/dist/units/UnitRailPage.d.ts.map +1 -1
- package/dist/units/useUnitFilter.d.ts.map +1 -1
- package/package.json +5 -5
- package/dist/PersonTimeline-X7JTPUWJ.js +0 -3
- package/dist/ScheduleEditor-L2UJXKMY.js +0 -6
- package/dist/SubscriptionPage-IDVEFLZ5.js +0 -8
- package/dist/chunk-3YP7KW47.js.map +0 -1
- package/dist/chunk-E4MESMNR.js.map +0 -1
- package/dist/chunk-IXSY4GPK.js.map +0 -1
- package/dist/chunk-JOBRLBIQ.js.map +0 -1
- package/dist/chunk-KPYRTOCK.js.map +0 -1
- package/dist/chunk-OQARLKZN.js.map +0 -1
- package/dist/chunk-P5UIGQFY.js.map +0 -1
- package/dist/chunk-P6XUDT2P.js.map +0 -1
- package/dist/chunk-VX3WJLKK.js.map +0 -1
- package/dist/entity-routes-LXOBW5IB.js +0 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/settings/module-links.ts","../src/components/settings/module-scope.ts","../src/components/settings/ModuleFamilyBits.tsx","../src/components/settings/ModuleCard.tsx","../src/components/settings/AddModulesPanel.tsx","../src/components/settings/ModulesPreview.tsx","../src/components/settings/ModulesSettings.tsx","../src/components/settings/ConnectedModulesSettings.tsx"],"names":["tl","jsx","jsxs","Badge","React","Fragment","Button","React2","getLucideIcon","ChevronRight","usePluginRuntime","React4"],"mappings":"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","file":"ConnectedModulesSettings-A2VJ5BMJ.js","sourcesContent":["import { tl } from '@fayz-ai/core'\nimport type { PluginSettingsTab } from '@fayz-ai/core'\nimport { PRICE_BOOK, includedIn, type BasePackage } from '../../billing/module-pricing'\n\n/** \"R$ 99 por unidade\" / \"R$ 39 por mês, grupo todo\", \"Incluído no ChefControl\"\n * when the account's package covers it, or nothing for a module that comes\n * with the platform. */\nexport function modulePriceLabel(plugin: string, facet?: string, pkg?: BasePackage | null): string | undefined {\n const key = facet ? `${plugin}.${facet}` : plugin\n const entry = PRICE_BOOK[key]\n if (!entry) return undefined\n if (includedIn(pkg, key)) return tl(`Included in ${pkg!.name}`, `Incluído no ${pkg!.name}`)\n const price = `R$ ${entry.price.toLocaleString('pt-BR')}`\n return entry.per === 'unit'\n ? tl(`${price} per unit`, `${price} por unidade`)\n : tl(`${price} a month, whole group`, `${price}/mês, grupo todo`)\n}\n\n/** Where a module's settings live: its first settings screen, the facet's own\n * screen when there is one. */\nexport function moduleSettingsHref(tabs: readonly PluginSettingsTab[], plugin: string, facet?: string): string | undefined {\n const own = tabs.filter((t) => t.pluginId === plugin)\n // The module's own screen (id = plugin id) beats the V1 extras it also files.\n const tab = facet\n ? (own.find((t) => t.requiresFacet === facet) ?? own.find((t) => t.id === `${plugin}-${facet}`))\n : (own.find((t) => t.id === plugin) ?? own.find((t) => !t.requiresFacet && !t.parent) ?? own[0])\n return tab ? `/settings/${tab.id}` : undefined\n}\n","import { TRADE_BY_APP, moduleFitsTrades, type Trade } from '../../billing/module-pricing'\nimport type { ModuleRow } from './ModuleCard'\n\n/** The trades this account sells in, from the apps it runs. */\nexport function accountTrades(apps: ReadonlyArray<{ id: string; vertical_id?: string | null; house?: boolean }>): Trade[] {\n const out = new Set<Trade>()\n for (const app of apps) {\n if (app.house) continue\n const trade = TRADE_BY_APP[app.id] ?? (app.vertical_id as Trade | undefined)\n if (trade) out.add(trade)\n }\n return [...out]\n}\n\n/**\n * Which on-modules the account HAS, as opposed to what merely runs. The trade\n * offers, the account disposes: a module on only because another needs it\n * (Cardápio under Pedidos), or on by a manifest default outside the account's\n * trade (Pedidos in a beauty salon), is not a module this account bought — it\n * is listed at most as \"usado por …\", and never priced.\n */\nexport function splitAccountModules(\n rows: ModuleRow[],\n opts: {\n /** The account's trades. Empty: no filter. */\n trades: readonly Trade[]\n /** Modules the account itself switched on (a tenant_plugins row it wrote). */\n chosen: ReadonlySet<string>\n },\n): { has: ModuleRow[]; usedByOthers: Array<{ row: ModuleRow; by: string[] }> } {\n const has: ModuleRow[] = []\n const usedByOthers: Array<{ row: ModuleRow; by: string[] }> = []\n for (const row of rows) {\n if (!row.plugin.isActive) continue\n if (row.plugin.activationReason === 'dependency') {\n usedByOthers.push({ row, by: row.neededBy })\n continue\n }\n const inTrade = opts.trades.length === 0 || moduleFitsTrades(row.plugin.id, opts.trades) || opts.chosen.has(row.plugin.id)\n if (inTrade) has.push(row)\n }\n return { has, usedByOthers }\n}\n","import { tl } from '@fayz-ai/core'\nimport { Badge } from '@fayz-ai/ui'\nimport { PRICE_BOOK } from '../../billing/module-pricing'\nimport { UPCOMING_MODULE_INFO } from '../../billing/module-families'\nimport { modulePriceLabel } from './module-links'\n\nexport function UpcomingModuleRow({ moduleKey }: { moduleKey: string }) {\n const entry = PRICE_BOOK[moduleKey]\n const info = UPCOMING_MODULE_INFO[moduleKey]\n if (!entry) return null\n const price = modulePriceLabel(moduleKey.includes('.') ? moduleKey.split('.')[0]! : moduleKey, moduleKey.includes('.') ? moduleKey.split('.')[1] : undefined)\n return (\n <div className=\"flex flex-col gap-2 rounded-card border border-dashed bg-muted/20 p-4 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"min-w-0\">\n <p className=\"flex flex-wrap items-center gap-2 font-medium\">\n {tl(...entry.label)}\n <Badge variant=\"secondary\">{tl('Coming soon', 'Em breve')}</Badge>\n </p>\n {info && <p className=\"mt-0.5 text-sm text-muted-foreground\">{tl(...info.line)}</p>}\n {info?.v1 && <p className=\"mt-0.5 text-xs text-muted-foreground\">{tl('From V1', 'Vem do V1')}: {info.v1}</p>}\n </div>\n <span className=\"shrink-0 text-sm tabular-nums text-muted-foreground\">{price ?? tl('Price coming soon', 'Preço em breve')}</span>\n </div>\n )\n}\n","import { Building2, Crown, Lock, Puzzle, Settings } from 'lucide-react'\nimport { Button, Badge, Card, CardContent, CardHeader, CardTitle, Separator, Switch, getLucideIcon } from '@fayz-ai/ui'\nimport type { ResolvedPluginManifest } from '@fayz-ai/core'\nimport { cn } from '../../lib/cn'\n\n/**\n * Um módulo, como card — o mesmo no inventário e no marketplace.\n *\n * Mora à parte das duas telas que o usam porque as duas o usam: a lista de\n * Módulos importa o painel de adicionar, e o painel precisa do card. Num\n * arquivo só, isso seria um ciclo.\n */\n\n/** `tenant_plugin_set` — injetado para a tela não conhecer o transporte. */\nexport type ModuleToggle = (plugin: string, status: 'active' | 'disabled', facet?: string) => Promise<void>\n\n/** One unit being edited: its own switches over what the account has. */\nexport interface ModuleUnitScope {\n unitName: string\n /** `plugin` / `plugin.facet` keys this unit switched off. */\n disabled: ReadonlySet<string>\n /** `unit_plugin_set` — 'disabled' switches off here, 'active' goes back to the account's. */\n onToggle: ModuleToggle\n}\n\nexport interface ModuleRow {\n plugin: ResolvedPluginManifest\n /** Linhas do rail que este módulo serve — a consequência de desligá-lo. */\n screens: string[]\n /** Outros módulos ligados que dependem deste. */\n neededBy: string[]\n permitted: boolean\n addons: Array<{\n plugin: ResolvedPluginManifest\n screens: string[]\n permitted: boolean\n }>\n}\n\nfunction pluginScreens(plugin: ResolvedPluginManifest): string[] {\n return plugin.navigation?.length\n ? plugin.navigation.map((n) => n.label)\n : (plugin.routes ?? []).map((r) => r.path).filter((p) => !p.endsWith('/*'))\n}\n\nexport function buildRows(\n plugins: ResolvedPluginManifest[],\n hidden: Set<string>,\n permits?: (plugin: string, facet?: string) => boolean,\n): ModuleRow[] {\n const visible = plugins.filter((p) => !hidden.has(p.id) && p.scope !== 'core')\n const hosted = new Set(visible.filter((p) => p.hostPluginId).map((p) => p.id))\n return visible\n .filter((plugin) => !hosted.has(plugin.id))\n .map((plugin) => ({\n plugin,\n // O que o plugin oferece de menu. Um módulo sem entrada própria (o app\n // desenhou o rail) cai nas rotas, que é o que some de verdade.\n screens: pluginScreens(plugin),\n neededBy: visible\n .filter((other) => other.isActive && other.id !== plugin.id && (other.dependencies ?? []).includes(plugin.id))\n .map((other) => other.name),\n permitted: permits ? permits(plugin.id) : true,\n addons: visible\n .filter((candidate) => candidate.hostPluginId === plugin.id)\n .map((addon) => ({\n plugin: addon,\n screens: pluginScreens(addon),\n permitted: permits ? permits(addon.id) : true,\n }))\n .sort((a, b) => a.plugin.name.localeCompare(b.plugin.name)),\n }))\n .sort((a, b) => a.plugin.name.localeCompare(b.plugin.name))\n}\n\nexport function ModuleCard({\n row,\n onToggle,\n busy,\n appLabel,\n unit,\n price,\n facetPrice,\n settingsHref,\n onOpenSettings,\n}: {\n row: ModuleRow\n onToggle: ModuleToggle\n busy?: boolean\n /** Editing one unit: the switches answer for that unit only. */\n unit?: ModuleUnitScope\n /** \"R$ 99 por unidade\" — what this module adds to the bill. */\n price?: string\n facetPrice?: (facet: string) => string | undefined\n /** Where its settings live; draws the cog. */\n settingsHref?: (facet?: string) => string | undefined\n onOpenSettings?: (href: string) => void\n /** \"Estende: ChefControl, FullControl\" ou \"Todos os negócios\" — ver `pluginAppNames`/`isCrossCutting`. */\n appLabel?: string\n}) {\n const { plugin, screens, neededBy, permitted, addons } = row\n const Icon = getLucideIcon(plugin.icon) ?? Puzzle\n const blocked = !permitted && !plugin.isActive\n const locked = plugin.isActive && neededBy.length > 0\n\n // Uma facet só aparece quando ela é vendável — `includedWithPlugin` é a\n // metade que vem junto e não é uma decisão de ninguém.\n const facets = (plugin.facets ?? []).filter((f) => !f.includedWithPlugin)\n const facetState = (plugin.config?.facets ?? {}) as Record<string, boolean>\n const offHere = !!unit?.disabled.has(plugin.id)\n const moduleOn = unit ? !offHere : plugin.isActive\n const href = settingsHref?.()\n const cog = (target: string | undefined, label: string) => target && onOpenSettings ? (\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => onOpenSettings(target)}\n aria-label={`Configurar ${label}`}\n title={`Configurar ${label}`}\n className=\"font-normal whitespace-normal flex h-11 w-11 shrink-0 items-center justify-center rounded-button text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Settings className=\"h-4 w-4\" />\n </Button>\n ) : null\n\n return (\n <Card className={cn(blocked && 'opacity-60', unit && offHere && 'border-dashed')}>\n <CardHeader className=\"flex-row items-start justify-between gap-4 space-y-0\">\n <div className=\"flex items-start gap-3\">\n <Icon className=\"mt-0.5 h-5 w-5 shrink-0 text-muted-foreground\" />\n <div>\n <div className=\"flex flex-wrap items-center gap-2\">\n <CardTitle className=\"text-base\">{plugin.name}</CardTitle>\n {appLabel ? (\n <Badge variant=\"secondary\" className=\"shrink-0 font-normal\">\n {appLabel}\n </Badge>\n ) : null}\n </div>\n {plugin.description ? (\n <p className=\"mt-1 text-sm text-muted-foreground\">{plugin.description}</p>\n ) : null}\n {price || unit ? (\n <p className=\"mt-1.5 flex flex-wrap items-center gap-x-3 gap-y-1 text-sm\">\n {price ? <span className=\"font-medium tabular-nums\">{price}</span> : null}\n {unit ? (\n <span className={cn('inline-flex items-center gap-1', offHere ? 'text-foreground' : 'text-muted-foreground')}>\n <Building2 className=\"h-3.5 w-3.5\" aria-hidden />\n {offHere ? `Desligado em ${unit.unitName}` : 'Herdado da rede'}\n </span>\n ) : null}\n </p>\n ) : null}\n </div>\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {cog(href, plugin.name)}\n {blocked ? (\n <Badge variant=\"outline\" className=\"shrink-0 gap-1\">\n <Crown className=\"h-3 w-3\" /> No plano maior\n </Badge>\n ) : (\n <Switch\n checked={moduleOn}\n disabled={busy || (!unit && locked)}\n aria-label={`${moduleOn ? 'Desligar' : 'Ligar'} ${plugin.name}${unit ? ` em ${unit.unitName}` : ''}`}\n onCheckedChange={(next: boolean) => void (unit ? unit.onToggle : onToggle)(plugin.id, next ? 'active' : 'disabled')}\n />\n )}\n </div>\n </CardHeader>\n\n <CardContent className=\"space-y-3 pt-0\">\n {screens.length > 0 ? (\n <p className=\"text-sm text-muted-foreground\">\n {plugin.isActive ? 'Some do menu se desligar: ' : 'Aparece no menu: '}\n <span className=\"text-foreground\">{screens.slice(0, 5).join(' · ')}</span>\n {screens.length > 5 ? ` e mais ${screens.length - 5}` : ''}\n </p>\n ) : null}\n\n {locked && !unit ? (\n <p className=\"flex items-center gap-1.5 text-sm text-muted-foreground\">\n <Lock className=\"h-3.5 w-3.5 shrink-0\" />\n {neededBy.join(', ')} {neededBy.length > 1 ? 'dependem' : 'depende'} deste módulo. Desligue{' '}\n {neededBy.length > 1 ? 'esses' : 'esse'} primeiro.\n </p>\n ) : null}\n\n {plugin.isActive && moduleOn && facets.length > 0 ? (\n <>\n <Separator />\n <div className=\"space-y-2\">\n {facets.map((facet) => {\n const accountOn = facetState[facet.id] === true\n // A unit narrows; a part the account has not bought is not its to turn on.\n if (unit && !accountOn) return null\n const facetOn = unit ? !unit.disabled.has(`${plugin.id}.${facet.id}`) : accountOn\n const fPrice = facetPrice?.(facet.id)\n return (\n <div key={facet.id} className=\"flex items-center justify-between gap-3\">\n <div className=\"min-w-0\">\n <p className=\"text-sm\">{facet.label}{fPrice ? <span className=\"ml-2 text-xs tabular-nums text-muted-foreground\">+ {fPrice}</span> : null}</p>\n {facet.description ? (\n <p className=\"text-xs text-muted-foreground\">{facet.description}</p>\n ) : null}\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {facetOn ? cog(settingsHref?.(facet.id), facet.label) : null}\n <Switch\n checked={facetOn}\n disabled={busy}\n aria-label={`${facetOn ? 'Desligar' : 'Ligar'} ${facet.label}${unit ? ` em ${unit.unitName}` : ''}`}\n onCheckedChange={(next: boolean) =>\n void (unit ? unit.onToggle : onToggle)(plugin.id, next ? 'active' : 'disabled', facet.id)\n }\n />\n </div>\n </div>\n )\n })}\n </div>\n </>\n ) : null}\n\n {plugin.isActive && !unit && addons.length > 0 ? (\n <>\n <Separator />\n <div className=\"space-y-3\">\n {addons.map((addon) => {\n const addonBlocked = !addon.permitted && !addon.plugin.isActive\n return (\n <div key={addon.plugin.id} className={cn('flex items-center justify-between gap-4', addonBlocked && 'opacity-60')}>\n <div>\n <p className=\"text-sm\">{addon.plugin.name}</p>\n {addon.plugin.description ? (\n <p className=\"text-xs text-muted-foreground\">{addon.plugin.description}</p>\n ) : addon.screens.length > 0 ? (\n <p className=\"text-xs text-muted-foreground\">Adiciona ao menu: {addon.screens.join(' · ')}</p>\n ) : null}\n </div>\n {addonBlocked ? (\n <Badge variant=\"outline\" className=\"shrink-0 gap-1\">\n <Crown className=\"h-3 w-3\" /> No plano maior\n </Badge>\n ) : (\n <Switch\n checked={addon.plugin.isActive}\n disabled={busy}\n aria-label={`${addon.plugin.isActive ? 'Desligar' : 'Ligar'} ${addon.plugin.name}`}\n onCheckedChange={(next: boolean) =>\n void onToggle(addon.plugin.id, next ? 'active' : 'disabled')\n }\n />\n )}\n </div>\n )\n })}\n </div>\n </>\n ) : null}\n </CardContent>\n </Card>\n )\n}\n","import * as React from 'react'\nimport { ChevronDown, ChevronRight, Search } from 'lucide-react'\nimport { Button, Modal, ModalContent, ModalDescription, ModalHeader, ModalTitle, Input } from '@fayz-ai/ui'\nimport { ModuleCard, type ModuleRow, type ModuleToggle } from './ModuleCard'\nimport type { ModuleCategory } from './module-catalog'\n\n/**\n * O marketplace de módulos — o que existe além do que esta conta já ligou.\n *\n * Mesmo desenho de Configurações › Conectores: a tela principal é o INVENTÁRIO\n * (o que está ligado, e como desligar), e \"Adicionar\" abre um painel com o\n * catálogo. As duas telas não podem discordar sobre o que é um módulo, então o\n * card aqui é o MESMO card de lá — mesmo interruptor, mesma frase sobre o que\n * aparece no menu, mesmo selo de plano.\n *\n * ── Por que por categoria de ofício ────────────────────────────────────────\n * O aplicativo central compila vinte e cinco plugins. Numa lista plana, um\n * salão lê \"Cozinha, Mesas, Reservas, Cardápio\" e conclui que abriu o sistema\n * errado. Agrupado, ele lê \"Restaurante ▸ 8 módulos\" — a mesma informação,\n * dobrada, dizendo de quem ela é.\n *\n * ── Por que o ofício da conta já vem aberto ────────────────────────────────\n * Quem abre este painel está procurando o que serve para o NEGÓCIO dele. As\n * rubricas dele e o chão comum abrem; o resto fica a um clique, que é a\n * diferença entre um catálogo e um armário.\n */\nexport function AddModulesPanel({\n open,\n onOpenChange,\n categories,\n onToggle,\n busy,\n}: {\n open: boolean\n onOpenChange: (open: boolean) => void\n categories: ModuleCategory[]\n onToggle: ModuleToggle\n busy?: boolean\n}) {\n return (\n <Modal open={open} onOpenChange={onOpenChange}>\n <ModalContent size=\"2xl\">\n <ModalHeader>\n <ModalTitle>Adicionar módulo</ModalTitle>\n <ModalDescription>\n O que o produto oferece, por ramo de negócio. Ligar um módulo põe as telas dele no menu.\n </ModalDescription>\n </ModalHeader>\n <ModuleCatalogSections categories={categories} onToggle={onToggle} busy={busy} />\n </ModalContent>\n </Modal>\n )\n}\n\n/**\n * O conteúdo do painel, à parte.\n *\n * Exportado porque o `Modal` é um diálogo do Radix: ele desenha num portal e,\n * portanto, em coisa nenhuma sob `renderToStaticMarkup` — um teste do painel\n * inteiro passaria comparando strings vazias.\n */\nexport function ModuleCatalogSections({\n categories,\n onToggle,\n busy,\n}: {\n categories: ModuleCategory[]\n onToggle: ModuleToggle\n busy?: boolean\n}) {\n const [query, setQuery] = React.useState('')\n // Busca só quando a lista passa de uma tela: abaixo disso é um controle para\n // filtrar o que já se vê inteiro.\n const total = categories.reduce((n, c) => n + c.rows.length, 0)\n const searchable = total > 6\n\n const filtered = React.useMemo(() => filterCategories(categories, query), [categories, query])\n\n if (categories.length === 0) {\n return (\n <div className=\"py-8 text-center\">\n <p className=\"text-sm font-medium text-foreground\">Nada a adicionar</p>\n <p className=\"mx-auto mt-1 max-w-sm text-sm text-muted-foreground\">\n Esta conta já tem ligado tudo o que o produto oferece para ela.\n </p>\n </div>\n )\n }\n\n return (\n <>\n {searchable ? (\n <div className=\"relative\">\n <Search className=\"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder=\"Buscar módulo\"\n className=\"rounded-lg border-border bg-background pl-9\"\n />\n </div>\n ) : null}\n\n <div className=\"-mx-1 max-h-[55vh] space-y-3 overflow-y-auto px-1\">\n {filtered.length === 0 ? (\n <p className=\"py-8 text-center text-sm text-muted-foreground\">Nenhum módulo com \"{query}\".</p>\n ) : (\n filtered.map((category) => (\n <CategorySection\n key={category.id}\n category={category}\n // Uma busca em curso abre tudo: esconder o resultado atrás de um\n // clique é responder \"achei\" e não mostrar onde.\n forceOpen={query.trim().length > 0}\n onToggle={onToggle}\n busy={busy}\n />\n ))\n )}\n </div>\n </>\n )\n}\n\nfunction CategorySection({\n category,\n forceOpen,\n onToggle,\n busy,\n}: {\n category: ModuleCategory\n forceOpen: boolean\n onToggle: ModuleToggle\n busy?: boolean\n}) {\n const [open, setOpen] = React.useState(category.mine)\n const expanded = open || forceOpen\n const Chevron = expanded ? ChevronDown : ChevronRight\n\n return (\n <section>\n <Button\n variant=\"bare\"\n size=\"bare\"\n type=\"button\"\n onClick={() => setOpen(!expanded)}\n aria-expanded={expanded}\n className=\"flex w-full items-center gap-2 rounded-button py-1.5 text-left transition-colors hover:bg-muted/40 justify-start whitespace-normal text-[length:inherit] font-normal\"\n >\n <Chevron className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"text-sm font-medium text-foreground\">{category.label}</span>\n <span className=\"text-xs text-muted-foreground\">({category.rows.length})</span>\n </Button>\n\n {expanded ? (\n <div className=\"space-y-3 pt-2\">\n {category.rows.map((row) => (\n <ModuleCard key={row.plugin.id} row={row} onToggle={onToggle} busy={busy} />\n ))}\n </div>\n ) : null}\n </section>\n )\n}\n\n/** Filtra pelo nome e pela descrição do módulo, e deixa cair a rubrica vazia. */\nexport function filterCategories(categories: ModuleCategory[], query: string): ModuleCategory[] {\n const needle = query.trim().toLowerCase()\n if (!needle) return categories\n const matches = (row: ModuleRow) =>\n `${row.plugin.name} ${row.plugin.description ?? ''}`.toLowerCase().includes(needle)\n return categories\n .map((category) => ({ ...category, rows: category.rows.filter(matches) }))\n .filter((category) => category.rows.length > 0)\n}\n","import * as React from 'react'\nimport { ChevronRight, Home } from 'lucide-react'\nimport { usePluginRuntime } from '@fayz-ai/core'\nimport type { PluginNavigationEntry } from '@fayz-ai/core'\nimport { getLucideIcon } from '@fayz-ai/ui'\nimport { applyRailPreset, labelFor, type RailRow } from '../../app/rail-preset'\nimport { useAppPreset } from '../../app/useAppPreset'\nimport { cn } from '../../lib/cn'\n\n/**\n * O montador do sistema — a mesma pergunta que `BrandPreview` responde para\n * cor (\"como fica?\"), aqui para módulo (\"o que aparece no menu?\").\n *\n * Ao contrário de `BrandPreview` (barras falsas, de propósito — ver o\n * comentário em BrandingSettings.tsx), este lê o menu de VERDADE:\n * `usePluginRuntime().navigation` é o mesmo dado que o `AdminShell` desenha, e\n * `applyRailPreset` é a mesma função que agrupa por rubrica de ofício. Ele\n * reage sozinho a cada `tenant_plugin_set` — sem estado de rascunho — porque o\n * RPC de Módulos já é rápido e o Switch já fica `disabled` durante o round\n * trip; um preview otimista poderia mostrar uma linha que o servidor recusa\n * (plano, dependência) e depois ter que desmentir a si mesmo.\n *\n * As cores vêm das mesmas variáveis do rail de verdade (`bg-sidebar`,\n * `text-sidebar-foreground`, `sidebar-accent`…) — a mesma marca que\n * `/branding` já pinta no shell, não um cartão cinza de configurações. Uma\n * conta com cor própria vê a cor própria aqui.\n *\n * Não reaninha por prefixo de rota como o `AdminShell` faz (essa lógica é\n * privada dele, ligada a `pages`/`navContributions` de cada aplicativo) — uma\n * rubrica do preset (`rail: [{label, under}]`) ainda agrupa certo, porque\n * `applyRailPreset` funciona em cima de uma lista achatada. O que se perde é\n * só o agrupamento AUTOMÁTICO por sub-rota sem rubrica declarada (ex.:\n * `/agenda/confirmations` aparece como linha própria, não como filha\n * recolhida de \"Agenda\") — que é exatamente a mudança que este preview existe\n * para mostrar quando alguém liga a facet de Confirmações.\n */\nexport function ModulesPreview() {\n const runtime = usePluginRuntime()\n const preset = useAppPreset()\n\n const rows = React.useMemo(() => {\n const flat = runtime.navigation\n .filter((entry) => entry.section !== 'settings')\n .map((entry) => toRailRow(entry, preset.labels))\n return applyRailPreset(flat, preset.rail, preset.hide, preset.whole)\n }, [runtime.navigation, preset.rail, preset.hide, preset.whole, preset.labels])\n\n return (\n <div className=\"sticky top-4 overflow-hidden rounded-2xl border border-sidebar-border bg-sidebar p-3\">\n <p className=\"mb-2 px-2 text-xs font-medium text-sidebar-muted\">Prévia do menu</p>\n {rows.length === 0 ? (\n <p className=\"px-2 py-6 text-center text-xs text-sidebar-muted\">Nenhum módulo ligado ainda.</p>\n ) : (\n <nav className=\"space-y-0.5\">\n {rows.map((row) => (\n <PreviewRow key={row.id} row={row} />\n ))}\n </nav>\n )}\n </div>\n )\n}\n\nfunction toRailRow(entry: PluginNavigationEntry, labels: Record<string, string> | undefined): RailRow {\n return {\n id: entry.id ?? entry.route,\n label: labelFor(labels, entry.route, entry.label),\n route: entry.route,\n icon: entry.icon ?? 'Circle',\n section: entry.section,\n pluginId: entry.pluginId,\n }\n}\n\nfunction PreviewRow({ row, depth = 0 }: { row: RailRow; depth?: number }) {\n // Mesma regra do rail de verdade (`Sidebar.tsx`'s `getIcon`): um nome fora do\n // registro cai no `Home`, nunca em nada. Sem isto, um plugin com ícone que a\n // 079 curadoria não catalogou — comum em sub-telas — desenhava a linha sem\n // ícone nenhum, só aqui, só neste preview.\n //\n // Só no NÍVEL DO GRUPO: um filho é texto puro, como o rail real desenha em\n // `childConnector` — ícone repetido em cada linha indentada lia como ruído,\n // não como informação nova.\n const Icon = depth === 0 ? getLucideIcon(row.icon) ?? Home : null\n const hasChildren = !!row.children?.length\n return (\n <div>\n <div\n className={cn(\n 'flex items-center gap-2 rounded-lg px-2 py-1.5 text-sm text-sidebar-foreground/80',\n depth === 0 && 'hover:bg-sidebar-accent/60 hover:text-sidebar-accent-foreground',\n )}\n style={depth > 0 ? { paddingLeft: 12 + depth * 16 } : undefined}\n >\n {Icon ? <Icon className=\"h-4 w-4 shrink-0\" /> : null}\n <span className=\"flex-1 truncate\">{row.label}</span>\n {/* O `>` diz \"isto abre\" — a mesma promessa que o ChevronDown do rail de\n verdade faz num grupo fechado. Sem estado de aberto/fechado aqui (o\n preview já mostra tudo), então é sempre o repouso: fechado. */}\n {hasChildren ? <ChevronRight className=\"h-3.5 w-3.5 shrink-0 text-sidebar-muted\" /> : null}\n </div>\n {row.children?.map((child) => (\n <PreviewRow key={child.id} row={child} depth={depth + 1} />\n ))}\n </div>\n )\n}\n","import * as React from 'react'\nimport { Plus } from 'lucide-react'\nimport { Button, PageHeaderActions } from '@fayz-ai/ui'\nimport { unitDisabledModules, usePluginRuntime } from '@fayz-ai/core'\nimport { useAppConfigStore } from '../../stores/app-config.store'\nimport { useUnitStore } from '../../units/store'\nimport { UnitScopePicker, useSettingsUnitScope } from '../../settings/UnitScopePicker'\nimport { navigateTo } from '../../app/routing'\nimport { modulePriceLabel, moduleSettingsHref } from './module-links'\nimport { accountTrades, splitAccountModules } from './module-scope'\nimport { UpcomingModuleRow } from './ModuleFamilyBits'\nimport { COMING_SOON_MODULES, moduleFitsTrades, packageFor } from '../../billing/module-pricing'\nimport { MODULE_FAMILIES, moduleFamilyOf } from '../../billing/module-families'\nimport { tl } from '@fayz-ai/core'\nimport { useOfferedPlugins } from '../../app/useAppPreset'\nimport { AddModulesPanel } from './AddModulesPanel'\nimport { ModuleCard, buildRows, type ModuleRow, type ModuleToggle } from './ModuleCard'\nimport { buildCategories, appLabelFor, type CatalogApp } from './module-catalog'\nimport { ModulesPreview } from './ModulesPreview'\n\n/**\n * Configurações › Módulos — o que esta conta tem ligado.\n *\n * O painel é a porta que faltava: `app.tenant_plugins` existe desde a 150 e\n * nenhuma tela nunca chamou `tenant_plugin_set`, então a única forma de ligar\n * um módulo para um cliente era SQL.\n *\n * Três regras vindas de quem já fez isso antes:\n *\n * - **Nunca o catálogo inteiro.** O IMG do SAP é reconhecidamente grande demais\n * para ser usado, e a resposta deles foi gerar um subconjunto. Aqui: a tela\n * é o INVENTÁRIO — só o que está ligado — e o catálogo abre num painel, por\n * ramo de negócio, com o ofício desta conta já aberto.\n * - **A consequência antes do clique, não no erro.** O NetSuite só conta que\n * uma feature é irreversível quando você tenta desligar. Aqui cada card diz\n * quais linhas do menu somem com ele.\n * - **Dependência tem nome.** Desligar um módulo do qual outro depende é\n * recusado com o nome do dependente, não com \"não pode\".\n *\n * ── Por que \"Disponíveis\" saiu de baixo de \"Ligados\" ───────────────────────\n * Empilhados, o que a conta USA e o que ela PODERIA usar se liam como uma\n * lista só de vinte linhas, e a segunda metade — mais longa — enterrava a\n * primeira. São duas perguntas diferentes (\"o que eu tenho\" / \"o que existe\"),\n * e a segunda é a mesma que Configurações › Conectores já responde num painel\n * atrás de \"Adicionar\". Mesmo desenho, mesma razão.\n */\n\nexport interface ModulesSettingsProps {\n /** Ids que nunca aparecem: a casca do próprio app, não módulos do negócio. */\n hidden?: string[]\n /** `tenant_plugin_set` — injetado para a tela não conhecer o transporte. */\n onToggle: ModuleToggle\n /** Quando o plano não permite. Ausente = nada é bloqueado. */\n permits?: (plugin: string, facet?: string) => boolean\n busy?: boolean\n /**\n * O catálogo por ofício (090), que dá as categorias do marketplace. Vazio\n * — pool antigo, app sem Supabase — o painel vira uma lista só.\n */\n catalog?: CatalogApp[]\n /** `unit_plugin_set` for one unit. Absent: the page edits the account only. */\n onUnitToggle?: (unitId: string, plugin: string, status: 'active' | 'disabled', facet?: string) => Promise<void>\n}\n\nexport { buildRows }\nexport type { ModuleRow, ModuleToggle }\nexport { ModuleCard }\n\nexport function ModulesSettings({ hidden = [], onToggle, permits, busy, catalog = [], onUnitToggle }: ModulesSettingsProps) {\n const runtime = usePluginRuntime()\n const scope = useSettingsUnitScope()\n const unitId = onUnitToggle ? scope.unitId : null\n const unitName = useUnitStore((s) => s.units.find((u) => u.id === unitId)?.name)\n const config = useAppConfigStore((s) => s.config)\n const unit = React.useMemo(() => unitId && onUnitToggle ? {\n unitName: unitName ?? 'esta unidade',\n disabled: unitDisabledModules(config, unitId),\n onToggle: (plugin: string, status: 'active' | 'disabled', facet?: string) => onUnitToggle(unitId, plugin, status, facet),\n } : undefined, [unitId, unitName, config, onUnitToggle])\n const settingsHref = (plugin: string) => (facet?: string) => moduleSettingsHref(runtime.settingsTabs, plugin, facet)\n const offered = useOfferedPlugins()\n const [adding, setAdding] = React.useState(false)\n\n // O que pode ser listado é o que ALGUM ofício oferece, não tudo que o pacote\n // compilou — o aplicativo central compila vinte e cinco plugins, e um clube\n // de café não tem onde encaixar Cozinha nem Salão. Com o catálogo, o recorte\n // é a união dos ofícios (e o agrupamento diz de quem é cada um); sem ele,\n // volta a ser só o que ESTA conta oferece, como antes da 090.\n //\n // Um plugin já LIGADO aparece de qualquer jeito, mesmo fora da oferta: se a\n // conta o tem, ela precisa poder desligá-lo. Esconder o que está ligado é\n // tirar o interruptor e deixar a luz acesa.\n const rows = React.useMemo(() => {\n const known = catalog.length ? new Set(catalog.flatMap((app) => app.modules)) : new Set(offered)\n const inCatalogue = known.size ? runtime.plugins.filter((p) => known.has(p.id) || p.isActive) : runtime.plugins\n return buildRows(inCatalogue, new Set(hidden), permits)\n }, [runtime.plugins, hidden, permits, offered, catalog])\n\n // One trade map, the price list's: the offer and the bill are one list.\n const trades = React.useMemo(() => accountTrades((config.apps ?? []) as Array<{ id: string; vertical_id?: string | null; house?: boolean }>), [config.apps])\n // The account's base package: what it already pays for in one line.\n const pkg = React.useMemo(\n () => packageFor({ trades, modules: rows.filter((r) => r.plugin.isActive).map((r) => r.plugin.id) }),\n [trades, rows],\n )\n const chosen = React.useMemo(() => new Set(config.plugins\n .filter((p) => !p.facet && p.status === 'active' && ['manual', 'plan', 'trial', 'agent'].includes(p.source))\n .map((p) => p.plugin)), [config.plugins])\n const { has: on, usedByOthers } = React.useMemo(\n () => splitAccountModules(rows, { trades, chosen }),\n [rows, trades, chosen],\n )\n const upcoming = React.useMemo(\n () => (unit ? [] : COMING_SOON_MODULES.filter((k) => trades.length === 0 || moduleFitsTrades(k, trades))),\n [unit, trades],\n )\n const families = MODULE_FAMILIES.map((f) => ({\n family: f,\n rows: on.filter((r) => moduleFamilyOf(r.plugin.id) === f.id),\n upcoming: upcoming.filter((k) => moduleFamilyOf(k) === f.id),\n })).filter((g) => g.rows.length > 0 || g.upcoming.length > 0)\n const off = React.useMemo(() => rows.filter((r) => !r.plugin.isActive), [rows])\n const categories = React.useMemo(() => buildCategories(catalog, off), [catalog, off])\n\n return (\n <div className=\"space-y-8\">\n {/* A ação vai para a barra da shell, como em toda outra aba de\n Configurações (ver FieldRulesSettings, TeamTab): o nome da tela já\n está escrito lá em cima, e a ação principal mora ao lado dele. Um\n botão solto no meio do conteúdo é um segundo cabeçalho competindo com\n o primeiro. */}\n {onUnitToggle && <UnitScopePicker />}\n {!unit && (\n <PageHeaderActions>\n <Button size=\"sm\" className=\"shrink-0 gap-1.5\" onClick={() => setAdding(true)}>\n <Plus className=\"h-4 w-4\" /> Adicionar\n </Button>\n </PageHeaderActions>\n )}\n\n <div className=\"grid gap-8 lg:grid-cols-[minmax(0,1fr)_260px]\">\n <section className=\"space-y-3\">\n <div>\n <h3 className=\"text-sm font-medium\">\n {unit ? `Em ${unit.unitName}` : 'Ligados'} ({unit ? on.filter((r) => !unit.disabled.has(r.plugin.id)).length : on.length}{unit ? ` de ${on.length}` : ''})\n </h3>\n <p className=\"text-sm text-muted-foreground\">\n {unit\n ? `Cada unidade herda o que a rede tem. Desligar aqui vale só para ${unit.unitName}: a tela mostra o aviso em vez de abrir, e as outras unidades continuam.`\n : 'O que esta conta usa hoje. Desligar tira as telas do menu; os dados continuam onde estão.'}\n </p>\n </div>\n\n {on.length === 0 ? (\n <div className=\"rounded-xl border border-dashed border-border p-8 text-center\">\n <p className=\"font-medium text-foreground\">Nenhum módulo ligado</p>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n Abra o catálogo em \"Adicionar\" para escolher o que esta conta vai usar.\n </p>\n </div>\n ) : (\n families.map(({ family, rows: familyRows, upcoming: soon }) => (\n <div key={family.id} className=\"space-y-3 pt-2\">\n <div className=\"px-1\">\n <h4 className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">{tl(...family.label)}</h4>\n <p className=\"text-xs text-muted-foreground\">{tl(...family.line)}</p>\n </div>\n {familyRows.map((row) => (\n <ModuleCard\n key={row.plugin.id}\n row={row}\n onToggle={onToggle}\n busy={busy}\n appLabel={appLabelFor(catalog, row.plugin.id)}\n unit={unit}\n price={modulePriceLabel(row.plugin.id, undefined, pkg)}\n facetPrice={(facet) => modulePriceLabel(row.plugin.id, facet, pkg)}\n settingsHref={settingsHref(row.plugin.id)}\n onOpenSettings={navigateTo}\n />\n ))}\n {soon.map((k) => <UpcomingModuleRow key={k} moduleKey={k} />)}\n </div>\n ))\n )}\n {usedByOthers.length > 0 && (\n <p className=\"px-1 text-xs text-muted-foreground\">\n Também rodam, sem custo, porque outro módulo precisa:{' '}\n {usedByOthers.map(({ row, by }) => `${row.plugin.name}${by.length ? ` (usado por ${by.join(', ')})` : ''}`).join(' · ')}.\n </p>\n )}\n </section>\n\n {/* Some do grid em telas estreitas (empilha abaixo da lista) — não vale\n a pena uma folha/drawer separada para um painel que é só leitura. */}\n <ModulesPreview />\n </div>\n\n <AddModulesPanel\n open={adding}\n onOpenChange={setAdding}\n categories={categories}\n onToggle={onToggle}\n busy={busy}\n />\n </div>\n )\n}\n","import * as React from 'react'\nimport { invalidateAppConfig } from '@fayz-ai/core'\nimport { ModulesSettings } from './ModulesSettings'\nimport { useModuleCatalog } from './module-catalog'\nimport { useAppConfig } from '../../hooks/useAppConfig'\nimport { useAccessOptional } from '../../access/context'\nimport { getSupabaseClientOptional } from '../../lib/supabase'\nimport { useOrganizationStore } from '../../stores/organization.store'\nimport { clearAppConfigSnapshot } from '../../app/app-config-cache'\nimport { toast } from '../notifications/ToastProvider'\n\n/**\n * A porta de escrita de `app.tenant_plugins`, que existia no banco desde a 150\n * e não tinha chamador nenhum.\n *\n * `tenant_plugin_set` já exige `settings.manage` e já impõe o teto do plano,\n * devolvendo a mensagem que nomeia o que falta — então a tela não repete\n * nenhuma das duas regras: ela mostra o que o servidor respondeu.\n */\n\n/** A casca do próprio app, não módulos do negócio. */\nconst SHELL_PLUGINS = ['admin', 'dashboard', 'notifications', 'tasks']\n\nexport function ConnectedModulesSettings({ hidden = SHELL_PLUGINS }: { hidden?: string[] }) {\n const { refresh } = useAppConfig()\n const access = useAccessOptional()\n // O catálogo por ofício (090) — o que dá categoria ao marketplace. Lido aqui\n // e não no `app_config()`: aquela é a chamada do boot, e isto é uma aba.\n const catalog = useModuleCatalog()\n const tenantId = useOrganizationStore((s) => s.currentOrg?.id ?? null)\n const [busy, setBusy] = React.useState(false)\n\n const onToggle = React.useCallback(\n async (plugin: string, status: 'active' | 'disabled', facet?: string) => {\n const supabase = getSupabaseClientOptional()\n if (!supabase) return\n setBusy(true)\n try {\n const { error } = await supabase.rpc('tenant_plugin_set', {\n p_plugin: plugin,\n p_status: status,\n p_facet: facet ?? '',\n })\n if (error) throw error\n // Os dois caches, na ordem: o de memória em @fayz-ai/core e o snapshot\n // que pinta o próximo reload. Deixar um dos dois é pintar a resposta\n // velha em cima da nova.\n if (tenantId) {\n invalidateAppConfig(tenantId)\n clearAppConfigSnapshot(tenantId)\n }\n await refresh()\n toast.success(status === 'active' ? 'Módulo ligado' : 'Módulo desligado')\n } catch (err: any) {\n // A mensagem do servidor já nomeia o plano e o módulo; o HINT diz o que\n // fazer. Reescrever isso aqui seria inventar um segundo vocabulário.\n toast.error('Não foi possível mudar o módulo', { description: err?.hint ?? err?.message })\n } finally {\n setBusy(false)\n }\n },\n [refresh, tenantId],\n )\n\n // A unit narrows what the account has (202). Same cache drop as above: the\n // per-unit map arrives in app_config, which the gate and the rail read.\n const onUnitToggle = React.useCallback(\n async (unitId: string, plugin: string, status: 'active' | 'disabled', facet?: string) => {\n const supabase = getSupabaseClientOptional()\n if (!supabase) return\n setBusy(true)\n try {\n const { error } = await supabase.rpc('unit_plugin_set', {\n p_unit: unitId, p_plugin: plugin, p_facet: facet ?? '', p_status: status,\n })\n if (error) throw error\n if (tenantId) {\n invalidateAppConfig(tenantId)\n clearAppConfigSnapshot(tenantId)\n }\n await refresh()\n toast.success(status === 'active' ? 'Volta a valer o da rede nesta unidade' : 'Desligado nesta unidade')\n } catch (err: any) {\n toast.error('Não foi possível mudar a unidade', { description: err?.hint ?? err?.message })\n } finally {\n setBusy(false)\n }\n },\n [refresh, tenantId],\n )\n\n // Sem provider de acesso (storybook, app sem plano) nada é bloqueado — a\n // mesma leitura permissiva que `useAccessOptional` já faz em todo lugar.\n const permits = React.useCallback(\n (plugin: string) => (access ? access.can(plugin, 'read').allowed || access.entitled(plugin) : true),\n [access],\n )\n\n return <ModulesSettings hidden={hidden} onToggle={onToggle} onUnitToggle={onUnitToggle} permits={permits} busy={busy} catalog={catalog} />\n}\n"]}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { useAuthStore } from './chunk-XFTNIBDW.js';
|
|
2
|
+
import { useTranslation } from './chunk-YUHCC7JY.js';
|
|
3
|
+
import { toast } from './chunk-3OUD4XBK.js';
|
|
4
|
+
import './chunk-TL42NKTH.js';
|
|
5
|
+
import './chunk-5D5QLMOQ.js';
|
|
6
|
+
import './chunk-UQ2NTFQC.js';
|
|
7
|
+
import './chunk-KJELMULA.js';
|
|
8
|
+
import './chunk-JRZJBMOY.js';
|
|
9
|
+
import { useOrganizationStore } from './chunk-YKPPCV2Z.js';
|
|
10
|
+
import * as React from 'react';
|
|
11
|
+
import { createContext, useContext } from 'react';
|
|
12
|
+
import { Loader2, KeyRound, ShieldCheck, UserPlus, Clock } from 'lucide-react';
|
|
13
|
+
import { Card, CardHeader, CardTitle, CardDescription, CardContent, Button, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, Switch } from '@fayz-ai/ui';
|
|
14
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
15
|
+
|
|
16
|
+
var SESSION_TIMEOUT_OPTIONS = [
|
|
17
|
+
{ label: "30 minutes", value: 30 },
|
|
18
|
+
{ label: "1 hour", value: 60 },
|
|
19
|
+
{ label: "4 hours", value: 240 },
|
|
20
|
+
{ label: "8 hours", value: 480 },
|
|
21
|
+
{ label: "24 hours", value: 1440 },
|
|
22
|
+
{ label: "No limit", value: 0 }
|
|
23
|
+
];
|
|
24
|
+
function ToggleRow({
|
|
25
|
+
icon,
|
|
26
|
+
label,
|
|
27
|
+
description,
|
|
28
|
+
checked,
|
|
29
|
+
onChange,
|
|
30
|
+
disabled
|
|
31
|
+
}) {
|
|
32
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-4 py-3", children: [
|
|
33
|
+
/* @__PURE__ */ jsxs("div", { className: "flex gap-3", children: [
|
|
34
|
+
/* @__PURE__ */ jsx("div", { className: "mt-0.5 text-muted-foreground", children: icon }),
|
|
35
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
36
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm font-medium", children: label }),
|
|
37
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: description })
|
|
38
|
+
] })
|
|
39
|
+
] }),
|
|
40
|
+
/* @__PURE__ */ jsx(Switch, { size: "md", checked, onCheckedChange: onChange, disabled })
|
|
41
|
+
] });
|
|
42
|
+
}
|
|
43
|
+
function SecuritySettings({
|
|
44
|
+
user,
|
|
45
|
+
tenantSecurity,
|
|
46
|
+
isAdmin,
|
|
47
|
+
onResetPassword,
|
|
48
|
+
onTenantSecurityChange
|
|
49
|
+
}) {
|
|
50
|
+
const { t } = useTranslation();
|
|
51
|
+
const [resetting, setResetting] = React.useState(false);
|
|
52
|
+
const [resetSent, setResetSent] = React.useState(false);
|
|
53
|
+
const [savingTenant, setSavingTenant] = React.useState(false);
|
|
54
|
+
const handleResetPassword = async () => {
|
|
55
|
+
if (!onResetPassword) return;
|
|
56
|
+
setResetting(true);
|
|
57
|
+
try {
|
|
58
|
+
await onResetPassword();
|
|
59
|
+
setResetSent(true);
|
|
60
|
+
} catch {
|
|
61
|
+
} finally {
|
|
62
|
+
setResetting(false);
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
const updateTenantSecurity = async (partial) => {
|
|
66
|
+
if (!onTenantSecurityChange) return;
|
|
67
|
+
setSavingTenant(true);
|
|
68
|
+
try {
|
|
69
|
+
await onTenantSecurityChange({ ...tenantSecurity, ...partial });
|
|
70
|
+
} catch {
|
|
71
|
+
} finally {
|
|
72
|
+
setSavingTenant(false);
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
return /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
|
|
76
|
+
/* @__PURE__ */ jsxs(Card, { children: [
|
|
77
|
+
/* @__PURE__ */ jsxs(CardHeader, { children: [
|
|
78
|
+
/* @__PURE__ */ jsx(CardTitle, { className: "text-lg", children: t("settings.security.passwordTitle") }),
|
|
79
|
+
/* @__PURE__ */ jsx(CardDescription, { children: t("settings.security.passwordSubtitle") })
|
|
80
|
+
] }),
|
|
81
|
+
/* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between rounded-lg border p-4", children: [
|
|
82
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-0.5", children: [
|
|
83
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm font-medium", children: user?.email }),
|
|
84
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: resetSent ? t("settings.security.resetLinkSent") : t("settings.security.resetLinkDescription") })
|
|
85
|
+
] }),
|
|
86
|
+
/* @__PURE__ */ jsxs(
|
|
87
|
+
Button,
|
|
88
|
+
{
|
|
89
|
+
variant: "outline",
|
|
90
|
+
size: "sm",
|
|
91
|
+
disabled: resetting || resetSent,
|
|
92
|
+
onClick: handleResetPassword,
|
|
93
|
+
children: [
|
|
94
|
+
resetting && /* @__PURE__ */ jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }),
|
|
95
|
+
/* @__PURE__ */ jsx(KeyRound, { className: "mr-2 h-4 w-4" }),
|
|
96
|
+
resetSent ? t("settings.security.linkSent") : t("settings.security.resetPassword")
|
|
97
|
+
]
|
|
98
|
+
}
|
|
99
|
+
)
|
|
100
|
+
] }) })
|
|
101
|
+
] }),
|
|
102
|
+
isAdmin && /* @__PURE__ */ jsxs(Card, { children: [
|
|
103
|
+
/* @__PURE__ */ jsxs(CardHeader, { children: [
|
|
104
|
+
/* @__PURE__ */ jsx(CardTitle, { className: "text-lg", children: t("settings.security.orgSecurityTitle") }),
|
|
105
|
+
/* @__PURE__ */ jsx(CardDescription, { children: t("settings.security.orgSecuritySubtitle") })
|
|
106
|
+
] }),
|
|
107
|
+
/* @__PURE__ */ jsxs(CardContent, { className: "space-y-1 divide-y", children: [
|
|
108
|
+
/* @__PURE__ */ jsx(
|
|
109
|
+
ToggleRow,
|
|
110
|
+
{
|
|
111
|
+
icon: /* @__PURE__ */ jsx(ShieldCheck, { className: "h-4 w-4" }),
|
|
112
|
+
label: t("settings.security.require2FA"),
|
|
113
|
+
description: t("settings.security.require2FADescription"),
|
|
114
|
+
checked: tenantSecurity?.require2FA ?? false,
|
|
115
|
+
onChange: (val) => updateTenantSecurity({ require2FA: val }),
|
|
116
|
+
disabled: savingTenant
|
|
117
|
+
}
|
|
118
|
+
),
|
|
119
|
+
/* @__PURE__ */ jsx(
|
|
120
|
+
ToggleRow,
|
|
121
|
+
{
|
|
122
|
+
icon: /* @__PURE__ */ jsx(UserPlus, { className: "h-4 w-4" }),
|
|
123
|
+
label: t("settings.security.inviteOnly"),
|
|
124
|
+
description: t("settings.security.inviteOnlyDescription"),
|
|
125
|
+
checked: tenantSecurity?.inviteOnly ?? true,
|
|
126
|
+
onChange: (val) => updateTenantSecurity({ inviteOnly: val }),
|
|
127
|
+
disabled: savingTenant
|
|
128
|
+
}
|
|
129
|
+
),
|
|
130
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-4 py-3", children: [
|
|
131
|
+
/* @__PURE__ */ jsxs("div", { className: "flex gap-3", children: [
|
|
132
|
+
/* @__PURE__ */ jsx("div", { className: "mt-0.5 text-muted-foreground", children: /* @__PURE__ */ jsx(Clock, { className: "h-4 w-4" }) }),
|
|
133
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
134
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm font-medium", children: t("settings.security.sessionTimeout") }),
|
|
135
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: t("settings.security.sessionTimeoutDescription") })
|
|
136
|
+
] })
|
|
137
|
+
] }),
|
|
138
|
+
/* @__PURE__ */ jsxs(
|
|
139
|
+
Select,
|
|
140
|
+
{
|
|
141
|
+
value: String(tenantSecurity?.sessionTimeoutMinutes ?? 0),
|
|
142
|
+
onValueChange: (v) => updateTenantSecurity({ sessionTimeoutMinutes: Number(v) }),
|
|
143
|
+
disabled: savingTenant,
|
|
144
|
+
children: [
|
|
145
|
+
/* @__PURE__ */ jsx(SelectTrigger, { className: "h-10 w-36", children: /* @__PURE__ */ jsx(SelectValue, {}) }),
|
|
146
|
+
/* @__PURE__ */ jsx(SelectContent, { children: SESSION_TIMEOUT_OPTIONS.map((opt) => /* @__PURE__ */ jsx(SelectItem, { value: String(opt.value), children: opt.label }, opt.value)) })
|
|
147
|
+
]
|
|
148
|
+
}
|
|
149
|
+
)
|
|
150
|
+
] })
|
|
151
|
+
] })
|
|
152
|
+
] })
|
|
153
|
+
] });
|
|
154
|
+
}
|
|
155
|
+
var AuthAdapterContext = createContext(null);
|
|
156
|
+
AuthAdapterContext.Provider;
|
|
157
|
+
function useAuthAdapterOptional() {
|
|
158
|
+
return useContext(AuthAdapterContext);
|
|
159
|
+
}
|
|
160
|
+
function ConnectedSecuritySettings() {
|
|
161
|
+
const user = useAuthStore((s) => s.user);
|
|
162
|
+
const authAdapter = useAuthAdapterOptional();
|
|
163
|
+
const currentOrg = useOrganizationStore((s) => s.currentOrg);
|
|
164
|
+
const settings = currentOrg?.settings ?? {};
|
|
165
|
+
const tenantSecurity = settings.security ?? {};
|
|
166
|
+
const handleResetPassword = async () => {
|
|
167
|
+
if (!authAdapter || !user?.email) return;
|
|
168
|
+
try {
|
|
169
|
+
await authAdapter.resetPassword(user.email);
|
|
170
|
+
toast.success("Password reset link sent", { description: `Check ${user.email} for the reset link.` });
|
|
171
|
+
} catch (err) {
|
|
172
|
+
toast.error("Failed to send reset link", { description: err?.message });
|
|
173
|
+
throw err;
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
return /* @__PURE__ */ jsx(
|
|
177
|
+
SecuritySettings,
|
|
178
|
+
{
|
|
179
|
+
user,
|
|
180
|
+
tenantSecurity,
|
|
181
|
+
isAdmin: false,
|
|
182
|
+
onResetPassword: handleResetPassword
|
|
183
|
+
}
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
export { ConnectedSecuritySettings };
|
|
188
|
+
//# sourceMappingURL=ConnectedSecuritySettings-25AHA4HJ.js.map
|
|
189
|
+
//# sourceMappingURL=ConnectedSecuritySettings-25AHA4HJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/settings/SecuritySettings.tsx","../src/lib/auth-context.ts","../src/components/settings/ConnectedSecuritySettings.tsx"],"names":["jsx"],"mappings":"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","file":"ConnectedSecuritySettings-25AHA4HJ.js","sourcesContent":["import * as React from 'react'\nimport { KeyRound, Loader2, Clock, ShieldCheck, UserPlus } from 'lucide-react'\nimport { Button, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Switch } from '@fayz-ai/ui'\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@fayz-ai/ui'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport type { AuthUser } from '../../types/auth'\n\nexport interface TenantSecuritySettings {\n sessionTimeoutMinutes?: number\n require2FA?: boolean\n inviteOnly?: boolean\n}\n\ninterface SecuritySettingsProps {\n user?: AuthUser | null\n tenantSecurity?: TenantSecuritySettings\n isAdmin?: boolean\n onResetPassword?: () => Promise<void>\n onTenantSecurityChange?: (settings: TenantSecuritySettings) => Promise<void>\n}\n\nconst SESSION_TIMEOUT_OPTIONS = [\n { label: '30 minutes', value: 30 },\n { label: '1 hour', value: 60 },\n { label: '4 hours', value: 240 },\n { label: '8 hours', value: 480 },\n { label: '24 hours', value: 1440 },\n { label: 'No limit', value: 0 },\n]\n\nfunction ToggleRow({\n icon,\n label,\n description,\n checked,\n onChange,\n disabled,\n}: {\n icon: React.ReactNode\n label: string\n description: string\n checked: boolean\n onChange: (val: boolean) => void\n disabled?: boolean\n}) {\n return (\n <div className=\"flex items-start justify-between gap-4 py-3\">\n <div className=\"flex gap-3\">\n <div className=\"mt-0.5 text-muted-foreground\">{icon}</div>\n <div>\n <p className=\"text-sm font-medium\">{label}</p>\n <p className=\"text-xs text-muted-foreground\">{description}</p>\n </div>\n </div>\n <Switch size=\"md\" checked={checked} onCheckedChange={onChange} disabled={disabled} />\n </div>\n )\n}\n\nexport function SecuritySettings({\n user,\n tenantSecurity,\n isAdmin,\n onResetPassword,\n onTenantSecurityChange,\n}: SecuritySettingsProps) {\n const { t } = useTranslation()\n const [resetting, setResetting] = React.useState(false)\n const [resetSent, setResetSent] = React.useState(false)\n const [savingTenant, setSavingTenant] = React.useState(false)\n\n const handleResetPassword = async () => {\n if (!onResetPassword) return\n setResetting(true)\n try {\n await onResetPassword()\n setResetSent(true)\n } catch {\n // handled via toast in connected wrapper\n } finally {\n setResetting(false)\n }\n }\n\n const updateTenantSecurity = async (partial: Partial<TenantSecuritySettings>) => {\n if (!onTenantSecurityChange) return\n setSavingTenant(true)\n try {\n await onTenantSecurityChange({ ...tenantSecurity, ...partial })\n } catch {\n // handled via toast\n } finally {\n setSavingTenant(false)\n }\n }\n\n return (\n <div className=\"space-y-6\">\n {/* Password reset */}\n <Card>\n <CardHeader>\n <CardTitle className=\"text-lg\">{t('settings.security.passwordTitle')}</CardTitle>\n <CardDescription>\n {t('settings.security.passwordSubtitle')}\n </CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"flex items-center justify-between rounded-lg border p-4\">\n <div className=\"space-y-0.5\">\n <p className=\"text-sm font-medium\">{user?.email}</p>\n <p className=\"text-xs text-muted-foreground\">\n {resetSent\n ? t('settings.security.resetLinkSent')\n : t('settings.security.resetLinkDescription')}\n </p>\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={resetting || resetSent}\n onClick={handleResetPassword}\n >\n {resetting && <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />}\n <KeyRound className=\"mr-2 h-4 w-4\" />\n {resetSent ? t('settings.security.linkSent') : t('settings.security.resetPassword')}\n </Button>\n </div>\n </CardContent>\n </Card>\n\n {/* Tenant security — only visible to admins */}\n {isAdmin && (\n <Card>\n <CardHeader>\n <CardTitle className=\"text-lg\">{t('settings.security.orgSecurityTitle')}</CardTitle>\n <CardDescription>\n {t('settings.security.orgSecuritySubtitle')}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-1 divide-y\">\n <ToggleRow\n icon={<ShieldCheck className=\"h-4 w-4\" />}\n label={t('settings.security.require2FA')}\n description={t('settings.security.require2FADescription')}\n checked={tenantSecurity?.require2FA ?? false}\n onChange={(val) => updateTenantSecurity({ require2FA: val })}\n disabled={savingTenant}\n />\n <ToggleRow\n icon={<UserPlus className=\"h-4 w-4\" />}\n label={t('settings.security.inviteOnly')}\n description={t('settings.security.inviteOnlyDescription')}\n checked={tenantSecurity?.inviteOnly ?? true}\n onChange={(val) => updateTenantSecurity({ inviteOnly: val })}\n disabled={savingTenant}\n />\n\n <div className=\"flex items-start justify-between gap-4 py-3\">\n <div className=\"flex gap-3\">\n <div className=\"mt-0.5 text-muted-foreground\">\n <Clock className=\"h-4 w-4\" />\n </div>\n <div>\n <p className=\"text-sm font-medium\">{t('settings.security.sessionTimeout')}</p>\n <p className=\"text-xs text-muted-foreground\">\n {t('settings.security.sessionTimeoutDescription')}\n </p>\n </div>\n </div>\n <Select\n value={String(tenantSecurity?.sessionTimeoutMinutes ?? 0)}\n onValueChange={(v) => updateTenantSecurity({ sessionTimeoutMinutes: Number(v) })}\n disabled={savingTenant}\n >\n <SelectTrigger className=\"h-10 w-36\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {SESSION_TIMEOUT_OPTIONS.map((opt) => (\n <SelectItem key={opt.value} value={String(opt.value)}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </CardContent>\n </Card>\n )}\n </div>\n )\n}\n","import { createContext, useContext } from 'react'\nimport type { AuthAdapter } from '../types/auth-adapter'\n\nconst AuthAdapterContext = createContext<AuthAdapter | null>(null)\n\nexport const AuthAdapterProvider = AuthAdapterContext.Provider\n\nexport function useAuthAdapter(): AuthAdapter {\n const adapter = useContext(AuthAdapterContext)\n if (!adapter) {\n throw new Error('useAuthAdapter must be used within an AuthAdapterProvider')\n }\n return adapter\n}\n\nexport function useAuthAdapterOptional(): AuthAdapter | null {\n return useContext(AuthAdapterContext)\n}\n","import { SecuritySettings } from './SecuritySettings'\nimport type { TenantSecuritySettings } from './SecuritySettings'\nimport { useAuthStore } from '../../stores/auth.store'\nimport { useOrganizationStore } from '../../stores/organization.store'\nimport { useAuthAdapterOptional } from '../../lib/auth-context'\nimport { toast } from '../notifications/ToastProvider'\n\nexport function ConnectedSecuritySettings() {\n const user = useAuthStore((s) => s.user)\n const authAdapter = useAuthAdapterOptional()\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n\n const settings = (currentOrg?.settings ?? {}) as Record<string, unknown>\n const tenantSecurity = (settings.security ?? {}) as TenantSecuritySettings\n\n const handleResetPassword = async () => {\n if (!authAdapter || !user?.email) return\n try {\n await authAdapter.resetPassword(user.email)\n toast.success('Password reset link sent', { description: `Check ${user.email} for the reset link.` })\n } catch (err: any) {\n toast.error('Failed to send reset link', { description: err?.message })\n throw err\n }\n }\n\n return (\n <SecuritySettings\n user={user as any}\n tenantSecurity={tenantSecurity}\n // The account-wide layers (2FA, invitations, session) live in\n // Configurações › Acesso now; this screen is the person's own password.\n isAdmin={false}\n onResetPassword={handleResetPassword}\n />\n )\n}\n"]}
|