@oondemand/oon-core-front 0.7.9 → 0.7.10
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/{chunk-3EZ6GRFQ.js → chunk-4KTNTXOR.js} +4 -4
- package/dist/chunk-4KTNTXOR.js.map +1 -0
- package/dist/{chunk-JXU6W3ZU.js → chunk-EIFIGMY7.js} +2 -2
- package/dist/{chunk-5P3N4KJX.js → chunk-QW4OXKR7.js} +3 -3
- package/dist/{chunk-3JBDEAKP.js → chunk-Z4NC63HJ.js} +32 -13
- package/dist/chunk-Z4NC63HJ.js.map +1 -0
- package/dist/hooks.js +1 -1
- package/dist/index.js +4 -4
- package/dist/testing.js +3 -3
- package/dist/ui.js +3 -3
- package/package.json +1 -1
- package/dist/chunk-3EZ6GRFQ.js.map +0 -1
- package/dist/chunk-3JBDEAKP.js.map +0 -1
- /package/dist/{chunk-JXU6W3ZU.js.map → chunk-EIFIGMY7.js.map} +0 -0
- /package/dist/{chunk-5P3N4KJX.js.map → chunk-QW4OXKR7.js.map} +0 -0
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
CoreUsersAccess,
|
|
9
9
|
MissingRenderer,
|
|
10
10
|
resolveComponent
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-EIFIGMY7.js";
|
|
12
12
|
import {
|
|
13
13
|
OON_RESERVED_ROUTES,
|
|
14
14
|
defineOonNavigation,
|
|
@@ -29,7 +29,7 @@ import {
|
|
|
29
29
|
useCoreMetadata,
|
|
30
30
|
useOonApi,
|
|
31
31
|
useOonAuth
|
|
32
|
-
} from "./chunk-
|
|
32
|
+
} from "./chunk-Z4NC63HJ.js";
|
|
33
33
|
import {
|
|
34
34
|
OonThemeProvider
|
|
35
35
|
} from "./chunk-VC6NTMZS.js";
|
|
@@ -774,7 +774,7 @@ function Sidebar({ app, menu, registry }) {
|
|
|
774
774
|
// package.json
|
|
775
775
|
var package_default = {
|
|
776
776
|
name: "@oondemand/oon-core-front",
|
|
777
|
-
version: "0.7.
|
|
777
|
+
version: "0.7.10",
|
|
778
778
|
repository: {
|
|
779
779
|
type: "git",
|
|
780
780
|
url: "git+https://github.com/oondemand/oon-platform.git",
|
|
@@ -2167,4 +2167,4 @@ export {
|
|
|
2167
2167
|
appDefinitionToConfig,
|
|
2168
2168
|
startOonApp
|
|
2169
2169
|
};
|
|
2170
|
-
//# sourceMappingURL=chunk-
|
|
2170
|
+
//# sourceMappingURL=chunk-4KTNTXOR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/security/tenantStorage.ts","../src/start.tsx","../src/app/OonApp.tsx","../src/security/AcceptInviteCentralPage.tsx","../src/security/AcceptInvitePage.tsx","../src/security/OnboardingPage.tsx","../src/app/OonProviders.tsx","../src/config/queryClient.ts","../src/shell/LocalRuntimeBanner.tsx","../src/app/moduleRegistry.tsx","../src/app/createOonRouter.tsx","../src/shell/DefaultShell.tsx","../src/shell/Sidebar.tsx","../package.json","../src/runtime/versionInfo.ts","../src/shell/AuthenticatedLayout.tsx","../src/security/AccessDeniedPage.tsx","../src/security/AppAccessGuard.tsx","../src/security/LoginPage.tsx","../src/security/FirstAccessPage.tsx","../src/security/ActivationPage.tsx","../src/security/RouteGuard.tsx","../src/security/ActivationGuard.tsx","../src/components/internal/pipelineBoardLayout.ts","../src/app/codeFirst.ts"],"sourcesContent":["export interface TenantStorage {\n get(): string | null;\n set(tenantId: string): void;\n clear(): void;\n}\n\nexport interface TenantStorageOptions {\n enabled?: boolean;\n}\n\nfunction normalize(value: unknown): string | null {\n const normalized = String(value ?? \"\").trim();\n return normalized || null;\n}\n\nfunction tenantFromUrl(key: string): string | null {\n if (typeof window === \"undefined\") return null;\n const url = new URL(window.location.href);\n const tenantId = normalize(url.searchParams.get(\"tenant\"));\n if (!tenantId) return null;\n window.sessionStorage.setItem(key, tenantId);\n url.searchParams.delete(\"tenant\");\n window.history.replaceState(window.history.state, \"\", `${url.pathname}${url.search}${url.hash}`);\n return tenantId;\n}\n\n/**\n * Mantém o tenant no escopo da aba. Isso permite abrir Tenant A e Tenant B em\n * janelas diferentes sem uma aba trocar o contexto da outra. O query param\n * `tenant` transporta somente o identificador selecionado; o backend continua\n * validando o membership em todas as requisições.\n */\nexport function createTenantStorage(appId: string, options: TenantStorageOptions = {}): TenantStorage {\n const key = `oon:${appId}:tenant`;\n const enabled = options.enabled !== false;\n const clearStoredTenant = () => {\n if (typeof window === \"undefined\") return;\n window.sessionStorage.removeItem(key);\n window.localStorage.removeItem(key);\n };\n\n if (!enabled) {\n return {\n get() {\n clearStoredTenant();\n return null;\n },\n set() {\n clearStoredTenant();\n },\n clear: clearStoredTenant,\n };\n }\n\n return {\n get() {\n if (typeof window === \"undefined\") return null;\n const incoming = tenantFromUrl(key);\n if (incoming) return incoming;\n // Remove a seleção antiga global criada por versões anteriores do Core.\n window.localStorage.removeItem(key);\n return normalize(window.sessionStorage.getItem(key));\n },\n set(tenantId) {\n if (typeof window === \"undefined\") return;\n const value = normalize(tenantId);\n if (!value) {\n window.sessionStorage.removeItem(key);\n return;\n }\n window.sessionStorage.setItem(key, value);\n },\n clear() {\n if (typeof window !== \"undefined\") window.sessionStorage.removeItem(key);\n },\n };\n}\n\n","import { StrictMode } from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport type { OonCoreFrontConfig } from \"./types\";\nimport { OonApp } from \"./app/OonApp\";\nimport { installPipelineBoardLayoutStyles } from \"./components/internal/pipelineBoardLayout\";\n\nfunction validateConfig(config: OonCoreFrontConfig) {\n if (!config?.app?.id) throw new Error(\"oonCoreFront.start: config.app.id é obrigatório.\");\n if (!config?.api?.baseUrl) throw new Error(\"oonCoreFront.start: config.api.baseUrl é obrigatório.\");\n}\n\nfunction applyDocumentMeta(config: OonCoreFrontConfig) {\n if (config.app.title) document.title = config.app.title;\n if (config.app.favicon) {\n let link = document.querySelector<HTMLLinkElement>('link[rel=\"icon\"]');\n if (!link) {\n link = document.createElement(\"link\");\n link.rel = \"icon\";\n document.head.appendChild(link);\n }\n link.href = config.app.favicon;\n }\n}\n\nfunction hardenConsole(config: OonCoreFrontConfig) {\n if (config.security?.disableConsoleInProduction && import.meta.env?.PROD) {\n const noop = () => {};\n console.log = noop;\n console.debug = noop;\n console.info = noop;\n }\n}\n\n/**\n * Montagem interna usada por `startOonApp`. Apps consumidores usam somente a\n * API code-first pública e não precisam conhecer providers ou infraestrutura.\n */\nexport function start(config: OonCoreFrontConfig) {\n validateConfig(config);\n applyDocumentMeta(config);\n installPipelineBoardLayoutStyles();\n hardenConsole(config);\n\n const rootId = config.rootElementId ?? \"root\";\n const el = document.getElementById(rootId);\n if (!el) throw new Error(`oonCoreFront.start: elemento #${rootId} não encontrado no DOM.`);\n\n createRoot(el).render(\n <StrictMode>\n <OonApp config={config} />\n </StrictMode>\n );\n}\n\n","import { useMemo } from \"react\";\nimport { RouterProvider } from \"react-router-dom\";\nimport type { OonCoreFrontConfig, OonRoute } from \"../types\";\nimport { createRestClient } from \"../api/createRestClient\";\nimport { createTokenStorage } from \"../security/tokenStorage\";\nimport { createTenantStorage } from \"../security/tenantStorage\";\nimport { AcceptInviteCentralPage } from \"../security/AcceptInviteCentralPage\";\nimport { OnboardingPage } from \"../security/OnboardingPage\";\nimport { OonProviders } from \"./OonProviders\";\nimport { resolveRegistry } from \"./moduleRegistry\";\nimport { createOonRouter } from \"./createOonRouter\";\n\nfunction localLoginUrl(): string {\n const current = `${window.location.pathname}${window.location.search}`;\n return `/login?redirect=${encodeURIComponent(current)}`;\n}\n\n/**\n * Raiz da aplicação Core. Cria o cliente REST, resolve rotas/menu e monta os\n * providers. Respostas 401 seguem para o login; 403 é tratado pelo AuthProvider.\n */\nexport function OonApp({ config }: { config: OonCoreFrontConfig }) {\n const { http, storage, tenantStorage, router } = useMemo(() => {\n const storage = createTokenStorage(config.app.id);\n const tenantStorage = createTenantStorage(config.app.id, {\n enabled: config.app.tenancyModel !== \"none\",\n });\n const externalLoginUrl = config.auth?.loginUrl ?? config.api.meusAppsUrl;\n\n const http = createRestClient({\n api: config.api,\n appId: config.app.id,\n runtimeMode: config.runtimeMode,\n getToken: () => storage.get(),\n getTenantId: () => tenantStorage.get(),\n onUnauthorized: () => {\n storage.clear();\n\n if (config.runtimeMode === \"local\" || window.location.pathname === \"/accept-invite\") return;\n\n if (externalLoginUrl) {\n window.location.href = externalLoginUrl;\n return;\n }\n\n if (window.location.pathname !== \"/login\") {\n window.location.href = localLoginUrl();\n }\n },\n });\n\n const resolved = resolveRegistry(config);\n const routes: OonRoute[] = [...resolved.routes];\n const corePublicRoutes: OonRoute[] = [{\n path: \"/accept-invite\",\n public: true,\n element: <AcceptInviteCentralPage />,\n }];\n\n if (config.api.onboardingBaseUrl) {\n corePublicRoutes.push({ path: \"/cadastro\", public: true, element: <OnboardingPage baseUrl={config.api.onboardingBaseUrl} mode=\"register\" /> });\n corePublicRoutes.push({ path: \"/confirmar-email\", public: true, element: <OnboardingPage baseUrl={config.api.onboardingBaseUrl} mode=\"confirm\" /> });\n }\n\n const router = createOonRouter({\n app: config.app,\n menu: resolved.menu,\n routes,\n corePublicRoutes,\n onboardingEnabled: Boolean(config.api.onboardingBaseUrl),\n security: config.security,\n layout: config.layout ?? config.ui?.layout,\n registry: config.registry ?? config.ui?.registry,\n systemPages: config.systemPages,\n });\n\n return { http, storage, tenantStorage, router };\n }, [config]);\n\n return (\n <OonProviders\n config={config}\n http={http}\n storage={storage}\n tenantStorage={tenantStorage}\n >\n <RouterProvider router={router} />\n </OonProviders>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { Box, Text } from \"@chakra-ui/react\";\nimport { useOonApi } from \"../api/ApiProvider\";\nimport { AcceptInvitePage } from \"./AcceptInvitePage\";\n\ninterface PublicRbacInfo {\n central?: { appCode: string; name: string };\n}\n\nexport function AcceptInviteCentralPage() {\n const { http } = useOonApi();\n const [centralName, setCentralName] = useState(\"Central Oon\");\n\n useEffect(() => {\n let active = true;\n http.get<PublicRbacInfo>(\"/core/rbac\")\n .then((response) => {\n if (active && response.data.central?.name) setCentralName(response.data.central.name);\n })\n .catch(() => undefined);\n return () => { active = false; };\n }, [http]);\n\n return (\n <Box bg=\"#F5F8FA\" minH=\"100vh\" pt={4}>\n <Box mx=\"auto\" maxW=\"480px\" px={4} textAlign=\"center\">\n <Text fontSize=\"sm\" fontWeight=\"700\">Convite para: {centralName}</Text>\n </Box>\n <AcceptInvitePage />\n </Box>\n );\n}\n","import { useEffect, useState, useRef, type FormEvent } from \"react\";\nimport { Box, Button, Flex, Heading, Input, Text, VStack } from \"@chakra-ui/react\";\nimport { useLocation } from \"react-router-dom\";\nimport { useOonAuth } from \"./AuthProvider\";\nimport { useOonApi } from \"../api/ApiProvider\";\n\ninterface InvitationInfo {\n accountExists: boolean;\n allowedActions?: string[];\n blockedReason?: string | null;\n version?: number;\n registrationRequired?: boolean;\n sessionUser?: { email: string } | null;\n email: string;\n name?: string;\n roleCode: string;\n roleName?: string;\n expiresAt: string;\n}\n\nexport function AcceptInvitePage() {\n const { http } = useOonApi();\n const location = useLocation();\n const auth = useOonAuth();\n const token = new URLSearchParams(location.hash.slice(1)).get(\"token\") || new URLSearchParams(location.search).get(\"token\") || \"\";\n const [invitation, setInvitation] = useState<InvitationInfo | null>(null);\n const [sessionEmail, setSessionEmail] = useState(\"\");\n const operationKey = useRef(crypto.randomUUID());\n const [registration, setRegistration] = useState({ nome: \"\", userDocument: \"\", phone: \"\", termsAccepted: false });\n const [password, setPassword] = useState(\"\");\n const [confirm, setConfirm] = useState(\"\");\n const [message, setMessage] = useState<string | null>(null);\n const [inspectionAttempt, setInspectionAttempt] = useState(0);\n const [submitting, setSubmitting] = useState(false);\n const [done, setDone] = useState(false);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n let active = true;\n operationKey.current = crypto.randomUUID();\n setLoading(true); setInvitation(null); setDone(false); setMessage(null); setPassword(\"\"); setConfirm(\"\");\n if (!token) {\n setMessage(\"Link de convite inválido.\");\n setLoading(false);\n return;\n }\n http.post<{ invitation: InvitationInfo }>(\"/core/invitations/inspect\", { token }, { headers: { \"x-oon-tenant-id\": false } })\n .then((response) => { if (active) {\n setInvitation(response.data.invitation);\n setSessionEmail(String(response.data.invitation.sessionUser?.email || \"\").trim().toLowerCase());\n } })\n .catch((error) => { if (active) setMessage(error?.status === 410\n ? \"Este convite é inválido, expirou, foi revogado ou já foi utilizado. Convites anteriores ao corte também podem ter sido invalidados. Solicite um novo convite ao administrador.\"\n : \"Não foi possível validar o convite. Tente novamente.\"); })\n .finally(() => { if (active) setLoading(false); });\n return () => { active = false; };\n }, [http, token, inspectionAttempt]);\n\n function clearSession() { auth.clearSession(); setSessionEmail(\"\"); }\n const sameSession = Boolean(sessionEmail && sessionEmail === invitation?.email.toLowerCase());\n const otherSession = Boolean(sessionEmail && !sameSession);\n const register = invitation?.accountExists === false;\n\n async function submit(event: FormEvent) {\n event.preventDefault();\n if (submitting || otherSession || auth.status === \"loading\") return;\n setMessage(null);\n if (!sameSession && register && password.length < 8) {\n setMessage(\"A senha deve possuir pelo menos 8 caracteres.\");\n return;\n }\n if (!sameSession && register && password !== confirm) {\n setMessage(\"As senhas informadas não conferem.\");\n return;\n }\n setSubmitting(true);\n try {\n await http.post(\"/core/invitations/accept\", {\n token, ...(invitation?.version !== undefined ? { version: invitation.version } : {}),\n ...(register && invitation?.registrationRequired ? { registration: { ...registration, termsVersion: \"2026-08-18\", privacyVersion: \"2026-08-18\" } } : {}),\n intent: sameSession ? \"session\" : register ? \"register\" : \"authenticate\",\n ...(sameSession ? {} : { password }),\n }, { headers: { \"idempotency-key\": operationKey.current, ...(sameSession ? {} : { Authorization: false }), \"x-oon-tenant-id\": false } });\n setDone(true);\n setMessage(\"Convite aceito. Seu acesso está disponível.\");\n } catch (error: any) {\n if (sameSession && error?.status === 401) clearSession();\n setMessage(error?.message || \"Não foi possível concluir o convite.\");\n } finally { setSubmitting(false); }\n }\n\n return (\n <Flex minH=\"100vh\" align=\"center\" justify=\"center\" bg=\"#F5F8FA\" px={4}>\n <Box width=\"100%\" maxW=\"480px\" bg=\"white\" borderWidth=\"1px\" borderRadius=\"18px\" p={{ base: 6, md: 9 }}>\n <VStack align=\"stretch\" gap={5}>\n <Box>\n <Text color=\"#39BFED\" fontSize=\"xs\" fontWeight=\"700\" textTransform=\"uppercase\">Central Oon</Text>\n <Heading mt={2} size=\"lg\">Aceitar convite</Heading>\n </Box>\n\n {loading ? <Text>Validando convite…</Text> : null}\n {invitation && !done ? (\n <>\n <Box bg=\"gray.50\" borderRadius=\"md\" p={4}>\n <Text fontWeight=\"700\">{invitation.name || invitation.email}</Text>\n <Text fontSize=\"sm\">{invitation.email}</Text>\n <Text fontSize=\"sm\" color=\"gray.600\">Perfil: {invitation.roleName || invitation.roleCode}</Text>\n </Box>\n {otherSession ? <Box>\n <Text>Você está conectado como {sessionEmail}. Este convite é para {invitation.email}.</Text>\n <Button onClick={clearSession}>Trocar de conta</Button>\n </Box> : <form onSubmit={(event) => void submit(event)}>\n <VStack align=\"stretch\" gap={4}>\n {register && invitation.registrationRequired ? <Box>\n <Text>Complete seu cadastro para aceitar este convite. Não será criada outra organização.</Text>\n <Input aria-label=\"Nome completo\" placeholder=\"Nome completo\" required value={registration.nome} onChange={e => setRegistration({ ...registration, nome: e.target.value })} />\n <Input aria-label=\"CPF\" placeholder=\"CPF\" required value={registration.userDocument} onChange={e => setRegistration({ ...registration, userDocument: e.target.value })} />\n <Input aria-label=\"Telefone\" placeholder=\"Telefone com DDD\" required value={registration.phone} onChange={e => setRegistration({ ...registration, phone: e.target.value })} />\n <label><input type=\"checkbox\" required checked={registration.termsAccepted} onChange={e => setRegistration({ ...registration, termsAccepted: e.target.checked })} /> Aceito os termos e a política de privacidade da plataforma (2026-08-18).</label>\n </Box> : null}\n {!sameSession ? <Box>\n <Text mb={1} fontSize=\"sm\" fontWeight=\"600\">{register ? \"Nova senha\" : \"Senha atual\"}</Text>\n <Input aria-label={register ? \"Nova senha\" : \"Senha atual\"} type=\"password\" autoComplete={register ? \"new-password\" : \"current-password\"} value={password} onChange={(event) => setPassword(event.target.value)} required />\n </Box> : <Text>Você está conectado como {sessionEmail}. Confirme o aceite para liberar este acesso.</Text>}\n {!sameSession && register ? <Box>\n <Text mb={1} fontSize=\"sm\" fontWeight=\"600\">Confirmar senha</Text>\n <Input aria-label=\"Confirmar senha\" type=\"password\" autoComplete=\"new-password\" value={confirm} onChange={(event) => setConfirm(event.target.value)} required />\n </Box> : null}\n {!register && !sameSession ? <Text fontSize=\"sm\">Use a senha atual da sua conta Oon. Se esqueceu a senha, recupere-a pelo login da plataforma e depois reabra este convite.</Text> : null}\n {invitation.blockedReason ? <Text role=\"alert\">O aceite está indisponível ({invitation.blockedReason}). Solicite regularização ao administrador.</Text> : null}\n <Button type=\"submit\" disabled={submitting || auth.status === \"loading\" || Boolean(invitation.allowedActions && !invitation.allowedActions.includes(\"accept\"))}>{submitting ? \"Aceitando…\" : \"Aceitar convite\"}</Button>\n </VStack>\n </form>}\n </>\n ) : null}\n\n {message ? <Box role=\"status\" bg={done ? \"green.50\" : \"red.50\"} borderRadius=\"md\" p={3}><Text fontSize=\"sm\">{message}</Text></Box> : null}\n {!loading && !invitation && token ? <Button onClick={() => setInspectionAttempt(value => value + 1)}>Tentar novamente</Button> : null}\n {done ? <Button asChild><a href={sameSession ? \"/\" : \"/login\"}>{sameSession ? \"Abrir aplicativo\" : \"Ir para o login\"}</a></Button> : null}\n </VStack>\n </Box>\n </Flex>\n );\n}\n","import { useEffect, useRef, useState, type FormEvent } from \"react\";\nimport { Box, Button, Flex, Heading, Input, Text, VStack } from \"@chakra-ui/react\";\nimport { Link, useLocation } from \"react-router-dom\";\n\ntype Props = { baseUrl: string; mode: \"register\" | \"confirm\" };\nconst TERMS_VERSION = \"2026-08-18\";\nconst PRIVACY_VERSION = \"2026-08-18\";\n\nasync function post(baseUrl: string, path: string, body: unknown) {\n const response = await fetch(baseUrl.replace(/\\/$/, \"\") + \"/onboarding/\" + path, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", \"x-correlation-id\": crypto.randomUUID() },\n body: JSON.stringify(body),\n });\n const payload = await response.json().catch(() => ({}));\n if (!response.ok) throw new Error(payload.message || \"Não foi possível concluir a solicitação.\");\n return payload;\n}\n\nexport function OnboardingPage({ baseUrl, mode }: Props) {\n const location = useLocation();\n const [form, setForm] = useState({ nome: \"\", email: \"\", password: \"\", organizationName: \"\", organizationDocument: \"\" });\n const [accepted, setAccepted] = useState(false);\n const [message, setMessage] = useState(\"\");\n const [busy, setBusy] = useState(false);\n const confirmationToken = useRef<string | null>(null);\n\n useEffect(() => {\n if (mode !== \"confirm\") return;\n const token = new URLSearchParams(location.search).get(\"token\");\n if (!token) return setMessage(\"Link de confirmação inválido.\");\n if (confirmationToken.current === token) return;\n confirmationToken.current = token;\n setBusy(true);\n post(baseUrl, \"confirm-email\", { token })\n .then(() => setMessage(\"E-mail confirmado. Seu acesso ao Meus Apps e Workspace está pronto.\"))\n .catch((error) => setMessage(error.message))\n .finally(() => setBusy(false));\n }, [baseUrl, location.search, mode]);\n\n async function submit(event: FormEvent) {\n event.preventDefault();\n setBusy(true);\n setMessage(\"\");\n try {\n const result = await post(baseUrl, \"register\", {\n ...form, termsAccepted: accepted, termsVersion: TERMS_VERSION, privacyVersion: PRIVACY_VERSION,\n });\n setMessage(result.message);\n } catch (error) {\n setMessage((error as Error).message);\n } finally {\n setBusy(false);\n }\n }\n\n return <Flex minH=\"100vh\" align=\"center\" justify=\"center\" bg=\"#F5F8FA\" px={4}>\n <Box width=\"100%\" maxW=\"520px\" bg=\"white\" borderWidth=\"1px\" borderRadius=\"18px\" p={{ base: 6, md: 9 }}>\n <VStack align=\"stretch\" gap={5}>\n <Box>\n <Text color=\"#39BFED\" fontSize=\"xs\" fontWeight=\"700\" textTransform=\"uppercase\">Plataforma Oon</Text>\n <Heading mt={2} size=\"lg\" color=\"#07262E\">{mode === \"register\" ? \"Crie seu acesso\" : \"Confirmação de e-mail\"}</Heading>\n <Text mt={2} color=\"gray.600\" fontSize=\"sm\">\n {mode === \"register\" ? \"Comece com Meus Apps e Workspace em modo de onboarding.\" : \"Validando seu link seguro de uso único.\"}\n </Text>\n </Box>\n {mode === \"register\" ? <form onSubmit={submit}>\n <VStack align=\"stretch\" gap={3}>\n <Input placeholder=\"Seu nome\" value={form.nome} onChange={(e) => setForm({ ...form, nome: e.target.value })} required />\n <Input type=\"email\" placeholder=\"voce@empresa.com.br\" value={form.email} onChange={(e) => setForm({ ...form, email: e.target.value })} required />\n <Input type=\"password\" minLength={8} placeholder=\"Senha com 8 ou mais caracteres\" value={form.password} onChange={(e) => setForm({ ...form, password: e.target.value })} required />\n <Input placeholder=\"Nome da organização\" value={form.organizationName} onChange={(e) => setForm({ ...form, organizationName: e.target.value })} required />\n <Input placeholder=\"CNPJ/Documento (opcional)\" value={form.organizationDocument} onChange={(e) => setForm({ ...form, organizationDocument: e.target.value })} />\n <label><input type=\"checkbox\" checked={accepted} onChange={(e) => setAccepted(e.target.checked)} /> <Text as=\"span\" fontSize=\"sm\">Aceito os termos e a política de privacidade vigentes.</Text></label>\n <Button type=\"submit\" bg=\"#07262E\" color=\"white\" disabled={busy || !accepted}>{busy ? \"Enviando...\" : \"Criar acesso\"}</Button>\n </VStack>\n </form> : null}\n {message ? <Box role=\"status\" bg=\"blue.50\" color=\"blue.800\" borderRadius=\"10px\" p={4}>{message}</Box> : null}\n <Text fontSize=\"sm\"><Link to=\"/login\">Voltar para o login</Link></Text>\n </VStack>\n </Box>\n </Flex>;\n}\n","import { type ReactNode, useMemo } from \"react\";\nimport { QueryClientProvider } from \"@tanstack/react-query\";\nimport type { AxiosInstance } from \"axios\";\nimport type { OonCoreFrontConfig } from \"../types\";\nimport { createOonQueryClient } from \"../config/queryClient\";\nimport { OonThemeProvider } from \"../config/ThemeProvider\";\nimport { ApiProvider } from \"../api/ApiProvider\";\nimport { AuthProvider } from \"../security/AuthProvider\";\nimport { ActivationProvider } from \"../security/ActivationProvider\";\nimport { TenantProvider } from \"../security/TenantProvider\";\nimport type { TokenStorage } from \"../security/tokenStorage\";\nimport type { TenantStorage } from \"../security/tenantStorage\";\nimport { LocalRuntimeBanner } from \"../shell/LocalRuntimeBanner\";\n\nexport interface OonProvidersProps {\n config: OonCoreFrontConfig;\n http: AxiosInstance;\n storage: TokenStorage;\n tenantStorage: TenantStorage;\n children: ReactNode;\n}\n\n/**\n * Monta, em ordem, todos os providers globais. Nenhuma Central cliente deve\n * montar QueryClient/Chakra/Auth/Api/Tenant manualmente.\n *\n * Ordem: QueryClient -> Chakra -> Api -> Activation -> Tenant -> Auth.\n */\nexport function OonProviders({\n config,\n http,\n storage,\n tenantStorage,\n children,\n}: OonProvidersProps) {\n const queryClient = useMemo(() => createOonQueryClient(), []);\n const loginUrl = config.auth?.loginUrl ?? config.api.meusAppsUrl;\n const authenticatedContent = (\n <AuthProvider\n http={http}\n storage={storage}\n auth={config.auth}\n loginUrl={loginUrl}\n runtimeMode={config.runtimeMode}\n >\n {config.runtimeMode === \"local\"\n ? <LocalRuntimeBanner http={http}>{children}</LocalRuntimeBanner>\n : children}\n </AuthProvider>\n );\n\n return (\n <QueryClientProvider client={queryClient}>\n <OonThemeProvider config={config}>\n <ApiProvider http={http}>\n <ActivationProvider http={http}>\n {config.app.tenancyModel === \"none\"\n ? authenticatedContent\n : <TenantProvider http={http} storage={tenantStorage}>{authenticatedContent}</TenantProvider>}\n </ActivationProvider>\n </ApiProvider>\n </OonThemeProvider>\n </QueryClientProvider>\n );\n}\n","import { QueryClient } from \"@tanstack/react-query\";\n\nconst QUERY_STALE_TIME_MS = 5 * 1000;\nconst QUERY_REFETCH_INTERVAL_MS = 10 * 1000;\n\n/**\n * QueryClient padrão do Core.\n *\n * A Central é uma interface operacional: listas e datagrids precisam refletir\n * rapidamente alterações feitas por automações, webhooks e outros usuários.\n * Por isso, consultas ativas ficam obsoletas em poucos segundos e são\n * revalidadas periodicamente enquanto a aba estiver visível.\n */\nexport function createOonQueryClient(): QueryClient {\n return new QueryClient({\n defaultOptions: {\n queries: {\n retry: 1,\n staleTime: QUERY_STALE_TIME_MS,\n refetchInterval: QUERY_REFETCH_INTERVAL_MS,\n refetchIntervalInBackground: false,\n refetchOnMount: \"always\",\n refetchOnReconnect: \"always\",\n refetchOnWindowFocus: \"always\",\n },\n mutations: {\n retry: 0,\n },\n },\n });\n}\n","import { useEffect, useState, type ReactNode } from \"react\";\nimport type { AxiosInstance } from \"axios\";\nimport { useOonAuth } from \"../security/AuthProvider\";\nimport { useActivation } from \"../security/ActivationProvider\";\n\ntype LocalRole = { code: string; name: string };\n\nexport function LocalRuntimeBanner({ http, children }: { http: AxiosInstance; children: ReactNode }) {\n const auth = useOonAuth();\n const activation = useActivation();\n const [roles, setRoles] = useState<LocalRole[]>([]);\n const roleCode = String((auth.user as { roleCode?: string } | null)?.roleCode || \"\");\n\n useEffect(() => {\n if (!auth.isAuthenticated) return;\n void http.get<{ roles: LocalRole[] }>(\"/auth/local/context\")\n .then((response) => setRoles(response.data.roles || []))\n .catch(() => setRoles([]));\n }, [auth.isAuthenticated, http]);\n\n async function switchRole(nextRole: string) {\n await http.post(\"/auth/local/role\", { roleCode: nextRole });\n await auth.retry();\n }\n\n const expiration = activation.details?.expiresAt\n ? new Intl.DateTimeFormat(\"pt-BR\", { dateStyle: \"short\", timeStyle: \"short\" })\n .format(new Date(activation.details.expiresAt))\n : null;\n\n return (\n <>\n <div\n role=\"status\"\n style={{\n alignItems: \"center\",\n background: \"#172554\",\n color: \"white\",\n display: \"flex\",\n flexWrap: \"wrap\",\n font: \"600 13px system-ui\",\n gap: 12,\n justifyContent: \"center\",\n padding: \"8px 16px\",\n }}\n >\n <span>Desenvolvimento local · desconectado do Ecossistema</span>\n {expiration ? <span>Expira em {expiration}</span> : null}\n {auth.isAuthenticated && roles.length > 1 ? (\n <label>\n Perfil local:{\" \"}\n <select\n aria-label=\"Perfil local\"\n value={roleCode}\n onChange={(event) => void switchRole(event.target.value)}\n style={{ color: \"#111827\" }}\n >\n {roles.map((role) => (\n <option key={role.code} value={role.code}>{role.name}</option>\n ))}\n </select>\n </label>\n ) : null}\n </div>\n {children}\n </>\n );\n}\n","import type { CollectionViewDef, DashboardViewDef, DocumentViewDef, OonCoreFrontConfig, OonMenuItem, OonRoute, OonViewDefinition, OonPageDef } from \"../types\";\nimport type { OonPipelineViewDef } from \"../pipelineTicket\";\nimport { CoreCollection } from \"../components/CoreCollection\";\nimport { CoreDocument } from \"../components/CoreDocument\";\nimport { CorePipeline } from \"../components/CorePipeline\";\nimport { CoreDashboard } from \"../components/CoreDashboard\";\nimport { CoreUsersAccess } from \"../components/CoreUsersAccess\";\nimport { CorePage } from \"../components/ui-v2/CorePage\";\nimport { CoreTransactionalEmail } from \"../components/CoreTransactionalEmail\";\n\nexport interface ResolvedRegistry { routes: OonRoute[]; menu: OonMenuItem[]; }\nfunction slug(value: string): string { return value.normalize(\"NFD\").replace(/[\\u0300-\\u036f]/g, \"\").toLowerCase().replace(/[^a-z0-9]+/g, \"-\").replace(/^-+|-+$/g, \"\"); }\nfunction requiredPermissions(source: { permissions?: string[] }): string[] | undefined { const values = [...(source.permissions ?? [])].filter(Boolean); return values.length ? values : undefined; }\nfunction declaredAppCapabilities(config: OonCoreFrontConfig): string[] | undefined { const capabilities = (config.app as OonCoreFrontConfig[\"app\"] & { capabilities?: string[] }).capabilities; return Array.isArray(capabilities) ? capabilities : undefined; }\nfunction supportsCapabilities(config: OonCoreFrontConfig, source: { capabilities?: string[] }): boolean { const required = (source.capabilities ?? []).filter(Boolean); if (!required.length) return true; const declared = declaredAppCapabilities(config); if (!declared) return true; return required.every((capability) => declared.includes(capability)); }\nfunction viewId(view: OonViewDefinition): string { if (view.id) return view.id; if (view.type === \"dashboard\") return \"dashboard\"; return slug(view.model); }\nfunction viewPath(view: OonViewDefinition): string { if (view.path) return view.path; if (view.type === \"dashboard\") return \"/\"; return `/${viewId(view)}`; }\nfunction viewLabel(view: OonViewDefinition): string { if (view.label) return view.label; if (view.type === \"dashboard\") return \"Dashboard\"; return view.model; }\nfunction renderView(view: OonViewDefinition, registry?: OonCoreFrontConfig[\"registry\"]) {\n switch (view.type) {\n case \"collection\": { const v = view as CollectionViewDef; return <CoreCollection model={v.model} mode={v.mode} columns={v.columns} form={v.form} label={viewLabel(v)} section={v.section} importExport={v.importExport} list={v.list} relations={v.relations} detailModal={v.detailModal} cellRenderers={registry?.cellRenderers} registry={registry} />; }\n case \"document\": { const v = view as DocumentViewDef; return <CoreDocument model={v.model} label={viewLabel(v)} endpoint={v.endpoint} approval={v.approval} attachments={v.attachments} display={v.display} categoryField={v.categoryField} titleField={v.titleField} descriptionField={v.descriptionField} contentField={v.contentField} statusField={v.statusField} updatedAtField={v.updatedAtField} />; }\n case \"pipeline\": { const v = view as OonPipelineViewDef; return <CorePipeline model={v.model} label={viewLabel(v)} stageField={v.stageField} stages={v.stages} titleField={v.titleField} form={v.form} relations={v.relations} ticketModal={v.ticketModal} filters={v.filters} create={v.create} viewModes={v.viewModes} defaultView={v.defaultView} list={v.list} defaultActions={v.defaultActions} ticketActions={v.ticketActions} registry={registry} />; }\n case \"dashboard\": { const v = view as DashboardViewDef; return <CoreDashboard label={viewLabel(v)} widgets={v.widgets} />; }\n default: return null;\n }\n}\nfunction viewToRoute(view: OonViewDefinition, registry?: OonCoreFrontConfig[\"registry\"]): OonRoute { return { path: viewPath(view), element: renderView(view, registry), permissions: requiredPermissions(view), capabilities: \"capabilities\" in view ? view.capabilities : undefined }; }\nfunction pageToRoute(page: OonPageDef, registry: OonCoreFrontConfig[\"registry\"]): OonRoute { return { path: page.path, element: <CorePage page={page} registry={registry} />, public: page.public === true, permissions: requiredPermissions(page), capabilities: page.capabilities }; }\nfunction pageToMenu(page: OonPageDef): OonMenuItem | null { if (!page.label) return null; return { label: page.label, href: page.path, icon: page.icon, section: page.section, permissions: requiredPermissions(page), capabilities: page.capabilities, hidden: page.hidden, order: page.order }; }\nfunction viewToMenu(view: OonViewDefinition): OonMenuItem { const extended = view as OonViewDefinition & { hidden?: boolean; order?: number }; return { label: viewLabel(view), href: viewPath(view), icon: view.icon, section: view.section, permissions: requiredPermissions(view), capabilities: \"capabilities\" in view ? view.capabilities : undefined, hidden: extended.hidden, order: extended.order }; }\n\nexport function resolveRegistry(config: OonCoreFrontConfig): ResolvedRegistry {\n const routes: OonRoute[] = []; const menu: OonMenuItem[] = []; const seenPaths = new Set<string>(); const componentRegistry = config.registry ?? config.ui?.registry;\n const pushRoute = (route: OonRoute) => { if (!supportsCapabilities(config, route) || seenPaths.has(route.path)) return; seenPaths.add(route.path); routes.push({ ...route, permissions: requiredPermissions(route) }); };\n const pushMenu = (item: OonMenuItem) => { if (!supportsCapabilities(config, item)) return; menu.push({ ...item, permissions: requiredPermissions(item) }); };\n for (const mod of config.modules ?? []) { for (const route of mod.routes ?? []) pushRoute(route); for (const item of mod.menu ?? []) pushMenu(item); for (const view of mod.views ?? []) { pushRoute(viewToRoute(view, componentRegistry)); pushMenu(viewToMenu(view)); } }\n if ([\"root-central\", \"member-central\"].includes(String(config.app.kind || \"\"))) { pushRoute({ path: \"/usuarios-acessos\", element: <CoreUsersAccess />, permissions: [\"users.read\"] }); pushMenu({ label: \"Usuários e Acessos\", href: \"/usuarios-acessos\", section: \"Configurações\", order: 900, permissions: [\"users.read\"] }); }\n if (declaredAppCapabilities(config)?.includes(\"core.transactional-email\")) { pushRoute({ path: \"/configuracoes/email-transacional\", element: <CoreTransactionalEmail />, permissions: [\"transactional-email.config.read\"], capabilities: [\"core.transactional-email\"] }); pushMenu({ label: \"E-mail transacional\", href: \"/configuracoes/email-transacional\", section: \"Configurações\", order: 910, permissions: [\"transactional-email.config.read\"], capabilities: [\"core.transactional-email\"] }); }\n const navMode = config.ui?.navigation?.mode ?? \"auto\"; const includeAuto = navMode === \"auto\" || navMode === \"mixed\"; const includeManual = navMode === \"manual\" || navMode === \"mixed\";\n for (const view of config.ui?.views ?? []) { pushRoute(viewToRoute(view, componentRegistry)); if (includeAuto) pushMenu(viewToMenu(view)); }\n for (const page of config.ui?.pages ?? []) { pushRoute(pageToRoute(page, componentRegistry)); if (includeAuto) { const item = pageToMenu(page); if (item) pushMenu(item); } }\n if (includeManual) for (const item of config.ui?.navigation?.items ?? []) pushMenu(item);\n menu.sort((a, b) => (a.order ?? 100) - (b.order ?? 100)); return { routes, menu };\n}\n","import {\n Navigate,\n createBrowserRouter,\n type RouteObject,\n} from \"react-router-dom\";\nimport type {\n OonAppConfig,\n OonMenuItem,\n OonRoute,\n OonLayoutConfig,\n OonComponentRegistry,\n OonSecurityConfig,\n OonSystemPages,\n} from \"../types\";\nimport { AuthenticatedLayout } from \"../shell/AuthenticatedLayout\";\nimport { AccessDeniedPage } from \"../security/AccessDeniedPage\";\nimport { AppAccessGuard } from \"../security/AppAccessGuard\";\nimport { LoginPage } from \"../security/LoginPage\";\nimport { AcceptInvitePage } from \"../security/AcceptInvitePage\";\nimport { FirstAccessPage } from \"../security/FirstAccessPage\";\nimport {\n ActivationPage,\n InstanceBlockedPage,\n} from \"../security/ActivationPage\";\nimport { RouteGuard } from \"../security/RouteGuard\";\nimport { ActivationGuard } from \"../security/ActivationGuard\";\nimport { OON_RESERVED_ROUTES, routeElement } from \"../routing\";\n\nexport interface RouterInput {\n app: OonAppConfig;\n menu: OonMenuItem[];\n routes: OonRoute[];\n corePublicRoutes?: OonRoute[];\n onboardingEnabled?: boolean;\n security?: OonSecurityConfig;\n layout?: OonLayoutConfig;\n registry?: OonComponentRegistry;\n systemPages?: OonSystemPages;\n}\n\nexport function createOonRouter({ app, menu, routes, corePublicRoutes = [], onboardingEnabled, security, layout, registry, systemPages }: RouterInput) {\n const guardEnabled = security?.enableRouteGuard !== false;\n\n const publicRoutes: RouteObject[] = routes\n .filter((route) => route.public)\n .map((route) => ({ path: route.path, element: routeElement(route) }));\n\n const privateSource = routes.filter((route) => !route.public);\n const privateRoutes: RouteObject[] = privateSource.map((route) => {\n const content = routeElement(route);\n const element = guardEnabled ? (\n <RouteGuard permission={route.permissions}>{content}</RouteGuard>\n ) : content;\n return route.path === \"/\"\n ? { index: true, element }\n : { path: route.path.replace(/^\\//, \"\"), element };\n });\n\n const hasIndexRoute = privateSource.some((route) => route.path === \"/\");\n const firstRoute = privateSource.find((route) => route.path !== \"/\");\n if (!hasIndexRoute && firstRoute) {\n privateRoutes.unshift({ index: true, element: <Navigate to={firstRoute.path} replace /> });\n }\n\n const customPaths = new Set(publicRoutes.map((route) => route.path));\n const reservedCollision = [...customPaths].find((path) => OON_RESERVED_ROUTES.includes(String(path)));\n if (reservedCollision) throw new Error(`Rota reservada pelo OonCore: ${reservedCollision}.`);\n\n const coreRouteObjects: RouteObject[] = corePublicRoutes.map((route) => ({\n path: route.path,\n element: routeElement(route),\n }));\n const occupiedPaths = new Set([\n ...customPaths,\n ...corePublicRoutes.map((route) => route.path),\n ]);\n const builtInPublicRoutes: RouteObject[] = [...coreRouteObjects];\n\n if (!occupiedPaths.has(\"/login\")) {\n const Login = systemPages?.login;\n builtInPublicRoutes.push({\n path: \"/login\",\n element: <ActivationGuard>{Login ? <Login /> : <LoginPage app={app} onboardingEnabled={onboardingEnabled} />}</ActivationGuard>,\n });\n }\n if (!occupiedPaths.has(\"/accept-invite\")) {\n builtInPublicRoutes.push({\n path: \"/accept-invite\",\n element: <ActivationGuard><AcceptInvitePage /></ActivationGuard>,\n });\n }\n if (!occupiedPaths.has(\"/first-access\")) {\n builtInPublicRoutes.push({\n path: \"/first-access\",\n element: <ActivationGuard><FirstAccessPage /></ActivationGuard>,\n });\n }\n if (!occupiedPaths.has(\"/ativacao\")) builtInPublicRoutes.push({ path: \"/ativacao\", element: <ActivationPage /> });\n if (!occupiedPaths.has(\"/instancia-suspensa\")) {\n builtInPublicRoutes.push({\n path: \"/instancia-suspensa\",\n element: <InstanceBlockedPage title=\"Instância suspensa\" message=\"Esta Central está suspensa.\" />,\n });\n }\n if (!occupiedPaths.has(\"/instancia-revogada\")) {\n builtInPublicRoutes.push({\n path: \"/instancia-revogada\",\n element: <InstanceBlockedPage title=\"Instância revogada\" message=\"Esta Central foi revogada.\" />,\n });\n }\n if (!occupiedPaths.has(\"/acesso-negado\")) {\n builtInPublicRoutes.push({ path: \"/acesso-negado\", element: <AccessDeniedPage app={app} /> });\n }\n\n const tree: RouteObject[] = [\n ...builtInPublicRoutes,\n ...publicRoutes,\n {\n path: \"/\",\n element: (\n <ActivationGuard>\n <AppAccessGuard>\n <AuthenticatedLayout app={app} menu={menu} layout={layout} registry={registry} />\n </AppAccessGuard>\n </ActivationGuard>\n ),\n children: privateRoutes,\n },\n ];\n\n return createBrowserRouter(tree);\n}\n","import { Box, Button, Flex, Spacer, Text } from \"@chakra-ui/react\";\nimport { Outlet, useNavigate } from \"react-router-dom\";\nimport type {\n OonAppConfig,\n OonComponentRegistry,\n OonLayoutConfig,\n OonMenuItem,\n} from \"../types\";\nimport { useOonAuth } from \"../security/AuthProvider\";\nimport { useCoreMetadata } from \"../api/ApiProvider\";\nimport { Sidebar } from \"./Sidebar\";\nimport { resolveComponent, MissingRenderer } from \"../app/componentRegistry\";\nimport {\n formatRuntimeDate,\n resolveRuntimeVersionInfo,\n shortCommit,\n} from \"../runtime/versionInfo\";\n\nfunction SettingsIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 15.25a3.25 3.25 0 1 0 0-6.5 3.25 3.25 0 0 0 0 6.5Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n />\n <path\n d=\"M19.43 12.98c.04-.32.07-.65.07-.98s-.03-.66-.08-.98l2.12-1.66-2-3.46-2.5 1a7.64 7.64 0 0 0-1.7-.98L15 3.25h-4l-.35 2.67c-.61.25-1.18.58-1.7.98l-2.5-1-2 3.46 2.12 1.66c-.04.32-.07.65-.07.98s.03.66.08.98l-2.12 1.66 2 3.46 2.5-1c.52.4 1.09.73 1.7.98l.34 2.67h4l.35-2.67a7.64 7.64 0 0 0 1.7-.98l2.5 1 2-3.46-2.12-1.66Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction resolveSettingsHref(menu: OonMenuItem[]): string | null {\n const explicit = menu.find((item) => item.action === \"settings\");\n if (explicit) return explicit.href;\n\n const settingsPage = menu.find((item) => item.href === \"/configuracoes\");\n if (settingsPage) return settingsPage.href;\n\n return null;\n}\n\nfunction CoreTopbar({ app, menu }: { app: OonAppConfig; menu: OonMenuItem[] }) {\n const { user, logout, hasPermission } = useOonAuth();\n const navigate = useNavigate();\n const metadataQuery = useCoreMetadata();\n const runtime = resolveRuntimeVersionInfo(app, metadataQuery.data);\n const centralVersion = runtime.centralVersion ?? \"não informada\";\n const backendVersion = metadataQuery.isLoading\n ? \"carregando\"\n : runtime.coreBackVersion ?? \"indisponível\";\n const updatedAt = formatRuntimeDate(runtime.updatedAt);\n const commit = shortCommit(runtime.commit);\n const versionParts = [\n `Central ${centralVersion}`,\n `Front ${runtime.coreFrontVersion}`,\n `Back ${backendVersion}`,\n updatedAt ? `Atualizado ${updatedAt}` : undefined,\n commit ? `Commit ${commit}` : undefined,\n ].filter(Boolean);\n const details = [\n `Central ${centralVersion}`,\n `OonCore front ${runtime.coreFrontVersion}`,\n `OonCore back ${backendVersion}`,\n runtime.environment ? `Ambiente ${runtime.environment}` : undefined,\n runtime.commit ? `Commit ${runtime.commit}` : undefined,\n runtime.releaseId ? `Release ${runtime.releaseId}` : undefined,\n runtime.startedAt ? `Backend iniciado ${formatRuntimeDate(runtime.startedAt)}` : undefined,\n ].filter(Boolean).join(\" · \");\n const settingsHref = resolveSettingsHref(\n menu.filter((item) => hasPermission(item.permissions)),\n );\n const tenant = user?.tenant as { nome?: string; slug?: string } | undefined;\n const tenantLabel = String(tenant?.nome || tenant?.slug || \"\").trim();\n\n return (\n <Flex\n as=\"header\"\n align=\"center\"\n minH=\"64px\"\n px={{ base: 4, lg: 6 }}\n py={3}\n borderBottomWidth=\"1px\"\n borderColor=\"border.default\"\n bg=\"surface.panel\"\n backdropFilter=\"blur(10px)\"\n position=\"sticky\"\n top={0}\n zIndex={10}\n >\n <Box minW={0} title={details}>\n <Text\n fontSize=\"xs\"\n fontWeight=\"600\"\n color=\"brand.500\"\n textTransform=\"uppercase\"\n letterSpacing=\"0.08em\"\n >\n Central Oon\n </Text>\n <Text fontSize=\"sm\" fontWeight=\"600\" color=\"text.primary\">\n {app.title ?? app.name}\n </Text>\n {tenantLabel ? (\n <Text fontSize=\"xs\" fontWeight=\"600\" color=\"brand.fg\" lineHeight=\"1.4\">\n Tenant: {tenantLabel}\n </Text>\n ) : null}\n <Text fontSize=\"10px\" color=\"text.muted\" lineHeight=\"1.35\">\n {versionParts.join(\" · \")}\n </Text>\n </Box>\n <Spacer />\n {user ? (\n <Flex align=\"center\" gap={3}>\n <Box textAlign=\"right\" display={{ base: \"none\", md: \"block\" }}>\n <Text fontSize=\"sm\" fontWeight=\"600\" color=\"text.primary\">\n {user.nome}\n </Text>\n {user.email ? <Text fontSize=\"xs\" color=\"text.muted\">{user.email}</Text> : null}\n </Box>\n {settingsHref ? (\n <Button\n size=\"sm\"\n variant=\"outline\"\n colorPalette=\"brand\"\n borderRadius=\"8px\"\n minW=\"36px\"\n px={2}\n aria-label=\"Abrir configurações\"\n title=\"Configurações\"\n onClick={() => navigate(settingsHref)}\n >\n <SettingsIcon />\n </Button>\n ) : null}\n <Button\n size=\"sm\"\n variant=\"outline\"\n colorPalette=\"brand\"\n borderRadius=\"8px\"\n onClick={logout}\n >\n Sair\n </Button>\n </Flex>\n ) : null}\n </Flex>\n );\n}\n\nfunction Slot({\n name,\n slot,\n registry,\n app,\n menu,\n}: {\n name: \"sidebar\" | \"topbar\" | \"header\" | \"footer\";\n slot?: string;\n registry?: OonComponentRegistry;\n app: OonAppConfig;\n menu: OonMenuItem[];\n}) {\n if (slot === \"none\") return null;\n if (slot?.startsWith(\"custom:\")) {\n const Component = resolveComponent(registry, slot, \"layoutSlots\");\n return Component\n ? <Component app={app} menu={menu} />\n : <MissingRenderer renderer={slot} />;\n }\n if (name === \"sidebar\") return <Sidebar app={app} menu={menu} registry={registry} />;\n if (name === \"topbar\") return <CoreTopbar app={app} menu={menu} />;\n if (name === \"footer\" && slot === \"core\") {\n return (\n <Box as=\"footer\" px={6} py={4} color=\"gray.500\" fontSize=\"xs\" borderTopWidth=\"1px\">\n OonCore\n </Box>\n );\n }\n return null;\n}\n\nexport function DefaultShell({\n app,\n menu,\n layout,\n registry,\n}: {\n app: OonAppConfig;\n menu: OonMenuItem[];\n layout?: OonLayoutConfig;\n registry?: OonComponentRegistry;\n}) {\n const portal = layout?.shell === \"portal\" || layout?.shell === \"content-only\";\n const mainPadding = portal ? { base: 4, lg: 10 } : { base: 4, lg: 6 };\n return (\n <Flex align=\"stretch\" minH=\"100vh\" bg={portal ? \"surface.panel\" : \"surface.canvas\"}>\n <Slot\n name=\"sidebar\"\n slot={layout?.sidebar ?? \"core\"}\n registry={registry}\n app={app}\n menu={menu}\n />\n <Flex direction=\"column\" flex=\"1\" minW={0}>\n <Slot\n name=\"topbar\"\n slot={layout?.topbar ?? \"core\"}\n registry={registry}\n app={app}\n menu={menu}\n />\n <Slot name=\"header\" slot={layout?.header} registry={registry} app={app} menu={menu} />\n <Box as=\"main\" flex=\"1\" p={mainPadding} minW={0}>\n <Box maxW={portal ? \"1180px\" : \"1680px\"} mx=\"auto\">\n <Outlet />\n </Box>\n </Box>\n <Slot\n name=\"footer\"\n slot={layout?.footer ?? \"none\"}\n registry={registry}\n app={app}\n menu={menu}\n />\n </Flex>\n </Flex>\n );\n}\n\nexport function PortalShell(props: {\n app: OonAppConfig;\n menu: OonMenuItem[];\n layout?: OonLayoutConfig;\n registry?: OonComponentRegistry;\n}) {\n return <DefaultShell {...props} layout={{ ...props.layout, shell: \"portal\" }} />;\n}\n","import { Box, Flex, Image, Spinner, Stack, Text } from \"@chakra-ui/react\";\nimport { useState } from \"react\";\nimport { NavLink } from \"react-router-dom\";\nimport type { OonAppConfig, OonComponentRegistry, OonMenuItem } from \"../types\";\nimport { resolveComponent } from \"../app/componentRegistry\";\nimport { useOonApi } from \"../api/ApiProvider\";\nimport { useOonAuth } from \"../security/AuthProvider\";\n\ntype PortalHome = {\n platformApps: Array<{\n app: { codigo: string; nome?: string };\n action: string;\n deployment: { environment?: string | null };\n }>;\n};\n\nfunction groupBySection(items: OonMenuItem[]): Array<[string, OonMenuItem[]]> {\n const groups = new Map<string, OonMenuItem[]>();\n for (const item of items) {\n const section = item.section ?? \"Geral\";\n if (!groups.has(section)) groups.set(section, []);\n groups.get(section)!.push(item);\n }\n return Array.from(groups.entries());\n}\n\nfunction launchAppCode(action?: string) {\n const match = /^launch-app:([a-z][a-z0-9-]{2,62})$/.exec(String(action || \"\"));\n return match?.[1] || \"\";\n}\n\nfunction errorMessage(error: unknown) {\n const value = error as {\n message?: string;\n response?: { data?: { message?: string; error?: { message?: string } } };\n };\n return value?.response?.data?.error?.message ||\n value?.response?.data?.message ||\n value?.message ||\n \"Não foi possível abrir o App.\";\n}\n\nfunction PlatformAppMenuItem({ item, appCode }: { item: OonMenuItem; appCode: string }) {\n const { http } = useOonApi();\n const [opening, setOpening] = useState(false);\n const [launchError, setLaunchError] = useState(\"\");\n\n async function launch() {\n if (opening) return;\n // A aba precisa nascer durante o gesto do usuário para não ser bloqueada.\n // O handshake continua assíncrono sem alterar a rota da aplicação atual.\n const popup = window.open(\"about:blank\", \"_blank\");\n if (!popup) {\n setLaunchError(\"Permita pop-ups para abrir o App em uma nova aba.\");\n return;\n }\n popup.opener = null;\n setOpening(true);\n setLaunchError(\"\");\n try {\n const home = (await http.get<PortalHome>(\"/portal/home\")).data;\n const target = home.platformApps.find((candidate) => candidate.app.codigo === appCode);\n if (!target || target.action !== \"open\") {\n throw new Error(`${target?.app.nome || item.label} ainda não está disponível.`);\n }\n const response = await http.post<{ openUrl: string }>(\"/portal/launch\", {\n appCode,\n environment: target.deployment.environment,\n });\n if (!response.data.openUrl) {\n throw new Error(\"A autorização de abertura não retornou uma URL.\");\n }\n popup.location.replace(response.data.openUrl);\n } catch (error) {\n popup.close();\n setLaunchError(errorMessage(error));\n } finally {\n setOpening(false);\n }\n }\n\n return (\n <Box width=\"100%\">\n <Flex\n as=\"button\"\n width=\"100%\"\n align=\"center\"\n justify={{ base: \"center\", lg: \"flex-start\" }}\n gap={3}\n px={{ base: 2, lg: 3 }}\n py=\"10px\"\n borderRadius=\"9px\"\n fontSize=\"13px\"\n fontWeight=\"500\"\n color=\"#46545C\"\n cursor={opening ? \"wait\" : \"pointer\"}\n aria-disabled={opening}\n pointerEvents={opening ? \"none\" : \"auto\"}\n title={item.label}\n aria-label={`Abrir ${item.label} em uma nova aba`}\n onClick={() => void launch()}\n _hover={{ bg: \"#F8F9FA\", color: \"brand.700\" }}\n >\n {opening\n ? <Spinner size=\"xs\" />\n : <Box w=\"7px\" h=\"7px\" borderRadius=\"full\" bg=\"gray.300\" />}\n <Text display={{ base: \"none\", lg: \"block\" }} lineClamp={1}>\n {item.label}\n </Text>\n </Flex>\n {launchError ? (\n <Text role=\"alert\" px={3} py={1} fontSize=\"10px\" color=\"red.600\">\n {launchError}\n </Text>\n ) : null}\n </Box>\n );\n}\n\n/** Menu lateral compacto e agrupado, seguindo o padrão operacional Minexco. */\nexport function Sidebar({ app, menu, registry }: { app: OonAppConfig; menu: OonMenuItem[]; registry?: OonComponentRegistry }) {\n const { hasPermission } = useOonAuth();\n const visible = menu.filter((item) => !item.hidden && hasPermission(item.permissions));\n\n return (\n <Box\n as=\"nav\"\n w={{ base: \"76px\", lg: \"248px\" }}\n minH=\"100vh\"\n borderRightWidth=\"1px\"\n borderColor=\"#E8ECEF\"\n px={{ base: 2, lg: 3 }}\n py={4}\n bg=\"white\"\n position=\"sticky\"\n top={0}\n alignSelf=\"flex-start\"\n overflowY=\"auto\"\n >\n <Flex align=\"center\" gap={3} mb={6} px={{ base: 1, lg: 2 }} minH=\"42px\">\n {app.logo ? (\n <Image src={app.logo} alt={app.name} maxH=\"36px\" maxW={{ base: \"44px\", lg: \"150px\" }} objectFit=\"contain\" />\n ) : (\n <Flex\n w=\"38px\"\n h=\"38px\"\n flex=\"0 0 auto\"\n borderRadius=\"12px\"\n align=\"center\"\n justify=\"center\"\n bg=\"brand.500\"\n color=\"white\"\n fontWeight=\"700\"\n fontSize=\"lg\"\n >\n O\n </Flex>\n )}\n <Box display={{ base: \"none\", lg: \"block\" }} minW={0}>\n <Text fontWeight=\"700\" fontSize=\"sm\" color=\"#07262E\" lineClamp={1}>\n {app.name}\n </Text>\n <Text fontSize=\"10px\" color=\"gray.500\" textTransform=\"uppercase\" letterSpacing=\"0.08em\">\n Operação digital\n </Text>\n </Box>\n </Flex>\n\n <Stack gap={5}>\n {groupBySection(visible).map(([section, items]) => (\n <Stack key={section} gap={1}>\n <Text\n display={{ base: \"none\", lg: \"block\" }}\n fontSize=\"10px\"\n fontWeight=\"600\"\n color=\"gray.400\"\n textTransform=\"uppercase\"\n letterSpacing=\"0.08em\"\n px={3}\n mb={1}\n >\n {section}\n </Text>\n {items.map((item) => {\n const CustomMenuItem = resolveComponent(registry, item.renderer, \"menuRenderers\");\n if (CustomMenuItem) return <CustomMenuItem key={item.href} item={item} />;\n const appCode = launchAppCode(item.action);\n if (appCode) return <PlatformAppMenuItem key={item.href} item={item} appCode={appCode} />;\n return (\n <NavLink key={item.href} to={item.href} end={item.href === \"/\"} title={item.label}>\n {({ isActive }) => (\n <Flex\n align=\"center\"\n justify={{ base: \"center\", lg: \"flex-start\" }}\n gap={3}\n px={{ base: 2, lg: 3 }}\n py=\"10px\"\n borderRadius=\"9px\"\n fontSize=\"13px\"\n fontWeight={isActive ? \"600\" : \"500\"}\n bg={isActive ? \"brand.50\" : \"transparent\"}\n color={isActive ? \"brand.700\" : \"#46545C\"}\n borderLeftWidth=\"3px\"\n borderLeftColor={isActive ? \"brand.500\" : \"transparent\"}\n transition=\"all 0.15s ease\"\n _hover={{ bg: isActive ? \"brand.50\" : \"#F8F9FA\", color: \"brand.700\" }}\n >\n {item.icon ? <Box flex=\"0 0 auto\">{item.icon}</Box> : <Box w=\"7px\" h=\"7px\" borderRadius=\"full\" bg={isActive ? \"brand.500\" : \"gray.300\"} />}\n <Text display={{ base: \"none\", lg: \"block\" }} lineClamp={1}>\n {item.label}\n </Text>\n </Flex>\n )}\n </NavLink>\n );\n })}\n </Stack>\n ))}\n </Stack>\n </Box>\n );\n}\n","{\n \"name\": \"@oondemand/oon-core-front\",\n \"version\": \"0.7.10\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/oondemand/oon-platform.git\",\n \"directory\": \"packages/oonCore-front\"\n },\n \"description\": \"Core de frontend para Centrais Oon: shell, providers, roteamento por metadata, SDK REST do /core/*, RBAC e componentes Core* (Coleção, Documento, Esteira, Multi-moedas, Assistente, Dashboard).\",\n \"type\": \"module\",\n \"main\": \"dist/index.js\",\n \"module\": \"dist/index.js\",\n \"types\": \"dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n },\n \"./ui\": {\n \"types\": \"./dist/ui.d.ts\",\n \"import\": \"./dist/ui.js\"\n },\n \"./routing\": {\n \"types\": \"./dist/routing.d.ts\",\n \"import\": \"./dist/routing.js\"\n },\n \"./theme\": {\n \"types\": \"./dist/theme.d.ts\",\n \"import\": \"./dist/theme.js\"\n },\n \"./hooks\": {\n \"types\": \"./dist/hooks.d.ts\",\n \"import\": \"./dist/hooks.js\"\n },\n \"./testing\": {\n \"types\": \"./dist/testing.d.ts\",\n \"import\": \"./dist/testing.js\"\n }\n },\n \"bin\": {\n \"oonCore-front\": \"bin/cli.js\"\n },\n \"files\": [\n \"bin\",\n \"dist\",\n \"README.md\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"prepublishOnly\": \"npm run build\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run\"\n },\n \"engines\": {\n \"node\": \">=18\"\n },\n \"keywords\": [\n \"oondemand\",\n \"ooncore\",\n \"central\",\n \"frontend\",\n \"metadata-driven\",\n \"react\",\n \"vite\"\n ],\n \"license\": \"SEE LICENSE IN LICENSE\",\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"dependencies\": {\n \"axios\": \"^1.7.7\"\n },\n \"peerDependencies\": {\n \"@chakra-ui/react\": \"^3.0.0\",\n \"@tanstack/react-query\": \"^5.0.0\",\n \"@tanstack/react-table\": \"^8.0.0\",\n \"react\": \"^18.0.0\",\n \"react-dom\": \"^18.0.0\",\n \"react-router-dom\": \"^6.0.0\"\n },\n \"devDependencies\": {\n \"@testing-library/dom\": \"^10.4.1\",\n \"@testing-library/react\": \"^16.3.2\",\n \"@types/react\": \"^18.3.18\",\n \"@types/react-dom\": \"^18.3.5\",\n \"happy-dom\": \"^20.10.2\",\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^5.5.0\",\n \"vitest\": \"^2.0.0\"\n }\n}\n","import frontPackage from \"../../package.json\";\nimport type { CoreMetadata, OonAppConfig } from \"../types\";\n\nexport interface RuntimeVersionInfo {\n centralVersion?: string;\n coreFrontVersion: string;\n coreBackVersion?: string;\n updatedAt?: string;\n startedAt?: string;\n commit?: string;\n releaseId?: string;\n environment?: string;\n}\n\ninterface RuntimeMetadataExtension {\n runtime?: {\n core?: {\n backendVersion?: string;\n };\n central?: {\n version?: string;\n };\n deployment?: {\n builtAt?: string;\n startedAt?: string;\n commit?: string;\n releaseId?: string;\n environment?: string;\n };\n };\n}\n\ntype RuntimeMetadata = CoreMetadata & RuntimeMetadataExtension;\ntype BuildEnvironment = Record<string, string | undefined>;\n\nfunction value(...candidates: Array<string | undefined>): string | undefined {\n return candidates.find((candidate) => typeof candidate === \"string\" && candidate.trim())?.trim();\n}\n\nfunction browserBuildEnvironment(): BuildEnvironment {\n return (import.meta.env ?? {}) as BuildEnvironment;\n}\n\nexport function resolveRuntimeVersionInfo(\n app: OonAppConfig,\n metadata?: CoreMetadata,\n environment: BuildEnvironment = browserBuildEnvironment(),\n): RuntimeVersionInfo {\n const extended = metadata as RuntimeMetadata | undefined;\n const runtime = extended?.runtime;\n const deployment = runtime?.deployment;\n\n return {\n centralVersion: value(\n environment.VITE_OON_CENTRAL_VERSION,\n app.version,\n runtime?.central?.version,\n ),\n coreFrontVersion: frontPackage.version,\n coreBackVersion: value(runtime?.core?.backendVersion, metadata?.service?.version),\n updatedAt: value(\n environment.VITE_OON_BUILD_TIME,\n deployment?.builtAt,\n deployment?.startedAt,\n ),\n startedAt: deployment?.startedAt,\n commit: value(environment.VITE_OON_BUILD_COMMIT, deployment?.commit),\n releaseId: value(environment.VITE_OON_RELEASE_ID, deployment?.releaseId),\n environment: value(environment.VITE_OON_ENVIRONMENT, deployment?.environment),\n };\n}\n\nexport function formatRuntimeDate(valueToFormat?: string, timeZone?: string): string | undefined {\n if (!valueToFormat) return undefined;\n const date = new Date(valueToFormat);\n if (Number.isNaN(date.getTime())) return valueToFormat;\n return new Intl.DateTimeFormat(\"pt-BR\", {\n day: \"2-digit\",\n month: \"2-digit\",\n year: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n // Sem fuso explícito, Intl usa o fuso local do navegador do operador.\n timeZone,\n }).format(date);\n}\n\nexport function shortCommit(commit?: string): string | undefined {\n if (!commit) return undefined;\n return commit.length > 8 ? commit.slice(0, 8) : commit;\n}\n","import type { OonAppConfig, OonComponentRegistry, OonLayoutConfig, OonMenuItem } from \"../types\";\nimport { resolveComponent, MissingRenderer } from \"../app/componentRegistry\";\nimport { DefaultShell, PortalShell } from \"./DefaultShell\";\n\n/** Layout autenticado padrão mantido como wrapper de compatibilidade v1. */\nexport function AuthenticatedLayout({ app, menu, layout, registry }: { app: OonAppConfig; menu: OonMenuItem[]; layout?: OonLayoutConfig; registry?: OonComponentRegistry }) {\n if (layout?.shell?.startsWith(\"custom:\")) {\n const CustomShell = resolveComponent(registry, layout.shell, \"layoutSlots\");\n return CustomShell ? <CustomShell app={app} menu={menu} layout={layout} /> : <MissingRenderer renderer={layout.shell} />;\n }\n if (layout?.shell === \"portal\") return <PortalShell app={app} menu={menu} layout={layout} registry={registry} />;\n return <DefaultShell app={app} menu={menu} layout={layout} registry={registry} />;\n}\n","import { Box, Button, Flex, Heading, Text, VStack } from \"@chakra-ui/react\";\nimport { useNavigate } from \"react-router-dom\";\nimport type { OonAppConfig } from \"../types\";\nimport { useOonAuth } from \"./AuthProvider\";\n\n/** Página exibida quando o usuário está autenticado, mas não possui o app. */\nexport function AccessDeniedPage({ app }: { app: OonAppConfig }) {\n const { logout } = useOonAuth();\n const navigate = useNavigate();\n\n function useAnotherAccount() {\n logout();\n navigate(\"/login\", { replace: true });\n }\n\n return (\n <Flex minH=\"100vh\" align=\"center\" justify=\"center\" bg=\"#F5F8FA\" px={4}>\n <Box\n width=\"100%\"\n maxW=\"560px\"\n bg=\"white\"\n borderWidth=\"1px\"\n borderColor=\"#E4EBEF\"\n borderRadius=\"18px\"\n boxShadow=\"0 24px 70px rgba(7, 38, 46, 0.10)\"\n p={{ base: 6, md: 10 }}\n >\n <VStack align=\"stretch\" gap={6}>\n <Box\n width=\"56px\"\n height=\"56px\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n borderRadius=\"16px\"\n bg=\"orange.50\"\n color=\"orange.700\"\n fontSize=\"2xl\"\n fontWeight=\"800\"\n aria-hidden=\"true\"\n >\n !\n </Box>\n\n <Box>\n <Text\n color=\"#39BFED\"\n fontSize=\"xs\"\n fontWeight=\"700\"\n letterSpacing=\"0.12em\"\n textTransform=\"uppercase\"\n >\n Acesso negado\n </Text>\n <Heading mt={2} size=\"lg\" color=\"#07262E\">\n Você não possui permissão para este aplicativo\n </Heading>\n <Text mt={3} color=\"gray.600\">\n Seu usuário foi autenticado, mas não existe uma permissão ativa\n para acessar {app.title ?? app.name}. Solicite o acesso ao\n administrador da sua organização.\n </Text>\n </Box>\n\n <Button\n alignSelf=\"flex-start\"\n bg=\"#07262E\"\n color=\"white\"\n _hover={{ bg: \"#0B3843\" }}\n onClick={useAnotherAccount}\n >\n Entrar com outra conta\n </Button>\n </VStack>\n </Box>\n </Flex>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { Navigate, useLocation } from \"react-router-dom\";\nimport { LoadingScreen } from \"../shell/LoadingScreen\";\nimport { useOonAuth } from \"./AuthProvider\";\n\nfunction loginRedirect(pathname: string, search: string): string {\n const destination = `${pathname}${search}`;\n return `/login?redirect=${encodeURIComponent(destination)}`;\n}\n\nexport function AppAccessGuard({ children }: { children: ReactNode }) {\n const { status, retry } = useOonAuth();\n const location = useLocation();\n\n if (status === \"loading\") return <LoadingScreen />;\n if (status === \"unauthenticated\") {\n return <Navigate to={loginRedirect(location.pathname, location.search)} replace />;\n }\n if (status === \"first-access\") return <Navigate to=\"/first-access\" replace />;\n if (status === \"forbidden\") return <Navigate to=\"/acesso-negado\" replace />;\n if (status === \"error\") {\n return (\n <LoadingScreen\n message=\"Não foi possível validar seu acesso. Tente novamente.\"\n actionLabel=\"Tentar novamente\"\n onAction={() => { void retry().catch(() => undefined); }}\n />\n );\n }\n return <>{children}</>;\n}\n","import { useState, type FormEvent } from \"react\";\nimport { Box, Button, Flex, Heading, Input, SimpleGrid, Text, VStack } from \"@chakra-ui/react\";\nimport { Link, Navigate, useLocation } from \"react-router-dom\";\nimport type { OonAppConfig, OonError } from \"../types\";\nimport { useOonAuth } from \"./AuthProvider\";\n\ntype TenantOption = {\n id: string;\n nome: string;\n slug?: string;\n tipo?: string;\n status?: string;\n};\n\nfunction tenantOptions(error: OonError): TenantOption[] {\n const details = error.details;\n if (!details || typeof details !== \"object\" || Array.isArray(details)) return [];\n const tenants = (details as { tenants?: unknown }).tenants;\n if (!Array.isArray(tenants)) return [];\n return tenants\n .filter((tenant): tenant is Record<string, unknown> => Boolean(tenant) && typeof tenant === \"object\")\n .map((tenant) => ({\n id: String(tenant.id || \"\"),\n nome: String(tenant.nome || tenant.slug || tenant.id || \"\"),\n slug: tenant.slug ? String(tenant.slug) : undefined,\n tipo: tenant.tipo ? String(tenant.tipo) : undefined,\n status: tenant.status ? String(tenant.status) : undefined,\n }))\n .filter((tenant) => tenant.id && tenant.nome);\n}\n\nfunction safeRedirect(search: string): string {\n const value = new URLSearchParams(search).get(\"redirect\") || \"/\";\n if (!value.startsWith(\"/\") || value.startsWith(\"//\")) return \"/\";\n if (value.startsWith(\"/login\") || value.startsWith(\"/acesso-negado\")) return \"/\";\n return value;\n}\n\nfunction tenantUrl(path: string, tenantId: string): string {\n const target = new URL(path, window.location.origin);\n target.searchParams.set(\"tenant\", tenantId);\n return target.toString();\n}\n\n/** Tela de login padrão das Centrais que usam a Central de Ativações. */\nexport function LoginPage({ app, onboardingEnabled = false }: { app: OonAppConfig; onboardingEnabled?: boolean }) {\n const { status, login } = useOonAuth();\n const location = useLocation();\n const [email, setEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [submitting, setSubmitting] = useState(false);\n const [message, setMessage] = useState<string | null>(null);\n const [tenants, setTenants] = useState<TenantOption[]>([]);\n const [selectorMode, setSelectorMode] = useState(false);\n const [openingTenant, setOpeningTenant] = useState<string | null>(null);\n const redirect = safeRedirect(location.search);\n\n if (status === \"authenticated\" && !selectorMode) return <Navigate to={redirect} replace />;\n if (status === \"forbidden\") return <Navigate to=\"/acesso-negado\" replace />;\n\n async function handleSubmit(event: FormEvent<HTMLFormElement>) {\n event.preventDefault();\n if (tenants.length > 1) return;\n setSubmitting(true);\n setMessage(null);\n try {\n await login(email.trim(), password);\n } catch (error) {\n const authError = error as OonError;\n if (authError.code === \"TENANT_SELECTION_REQUIRED\") {\n const options = tenantOptions(authError);\n if (options.length > 1) {\n setTenants(options);\n setMessage(\"Escolha uma organização. O tenant será aberto em uma nova aba.\");\n return;\n }\n }\n if (authError.status === 403) return;\n setMessage(authError.status === 401 ? \"E-mail ou senha inválidos.\" : authError.message || \"Não foi possível entrar. Tente novamente.\");\n } finally {\n setSubmitting(false);\n }\n }\n\n async function openTenant(tenant: TenantOption) {\n if (openingTenant) return;\n const popup = window.open(\"about:blank\", \"_blank\");\n if (!popup) {\n setMessage(\"Permita pop-ups para abrir o tenant em uma nova aba.\");\n return;\n }\n popup.opener = null;\n setOpeningTenant(tenant.id);\n setSelectorMode(true);\n setMessage(null);\n try {\n if (status !== \"authenticated\") await login(email.trim(), password, tenant.id);\n popup.location.replace(tenantUrl(redirect, tenant.id));\n setPassword(\"\");\n setMessage(`${tenant.nome} foi aberto em uma nova aba. Escolha outro tenant quando precisar.`);\n } catch (error) {\n popup.close();\n const authError = error as OonError;\n setMessage(authError.message || \"Não foi possível abrir o tenant.\");\n } finally {\n setOpeningTenant(null);\n }\n }\n\n return (\n <Flex minH=\"100vh\" align=\"center\" justify=\"center\" bg=\"#F5F8FA\" px={4}>\n <Box width=\"100%\" maxW={tenants.length > 1 ? \"760px\" : \"440px\"} bg=\"white\" borderWidth=\"1px\" borderColor=\"#E4EBEF\" borderRadius=\"18px\" boxShadow=\"0 24px 70px rgba(7, 38, 46, 0.10)\" p={{ base: 6, md: 9 }}>\n <form onSubmit={handleSubmit}>\n <VStack align=\"stretch\" gap={6}>\n <Box>\n <Text color=\"#39BFED\" fontSize=\"xs\" fontWeight=\"700\" letterSpacing=\"0.12em\" textTransform=\"uppercase\">Central Oon</Text>\n <Heading mt={2} size=\"lg\" color=\"#07262E\">{app.title ?? app.name}</Heading>\n <Text mt={2} color=\"gray.600\" fontSize=\"sm\">\n {tenants.length > 1 ? \"Abra uma ou mais organizações para trabalhar em contextos separados.\" : \"Entre com seu usuário autorizado para acessar este aplicativo.\"}\n </Text>\n </Box>\n\n {tenants.length <= 1 ? (\n <VStack align=\"stretch\" gap={4}>\n <Box>\n <Text mb={2} fontSize=\"sm\" fontWeight=\"600\" color=\"#24323A\">E-mail</Text>\n <Input type=\"email\" value={email} onChange={(event) => { setEmail(event.target.value); setTenants([]); setSelectorMode(false); }} autoComplete=\"email\" placeholder=\"voce@empresa.com.br\" required />\n </Box>\n <Box>\n <Text mb={2} fontSize=\"sm\" fontWeight=\"600\" color=\"#24323A\">Senha</Text>\n <Input type=\"password\" value={password} onChange={(event) => setPassword(event.target.value)} autoComplete=\"current-password\" placeholder=\"Sua senha\" required />\n </Box>\n </VStack>\n ) : (\n <Box>\n <Text mb={3} fontSize=\"sm\" fontWeight=\"600\" color=\"#24323A\">Escolha o tenant para acessar</Text>\n <SimpleGrid columns={{ base: 1, md: 2 }} gap={3}>\n {tenants.map((tenant) => (\n <Button key={tenant.id} type=\"button\" variant=\"outline\" height=\"auto\" minH=\"104px\" justifyContent=\"flex-start\" whiteSpace=\"normal\" textAlign=\"left\" borderWidth=\"2px\" borderColor=\"#D9E2E7\" bg=\"white\" color=\"#24323A\" disabled={Boolean(openingTenant)} aria-label={`Abrir ${tenant.nome} em nova aba`} onClick={() => void openTenant(tenant)} _hover={{ borderColor: \"#39BFED\", bg: \"#F6FCFE\" }}>\n <VStack align=\"start\" gap={1} py={3}>\n <Text fontWeight=\"700\">{tenant.nome}</Text>\n <Text fontSize=\"xs\" color=\"gray.500\">{[tenant.slug, tenant.tipo, tenant.status].filter(Boolean).join(\" · \")}</Text>\n <Text fontSize=\"xs\" color=\"#168EB9\">{openingTenant === tenant.id ? \"Abrindo...\" : \"Abrir em nova aba\"}</Text>\n </VStack>\n </Button>\n ))}\n </SimpleGrid>\n </Box>\n )}\n\n {message ? <Box role=\"status\" borderRadius=\"10px\" bg=\"blue.50\" color=\"blue.800\" px={4} py={3} fontSize=\"sm\">{message}</Box> : null}\n\n {tenants.length <= 1 ? (\n <Button type=\"submit\" bg=\"#07262E\" color=\"white\" _hover={{ bg: \"#0B3843\" }} disabled={submitting || !email.trim() || !password}>\n {submitting ? \"Validando acesso...\" : \"Entrar\"}\n </Button>\n ) : null}\n {app.kind === \"portal-cockpit\" && onboardingEnabled && tenants.length <= 1 ? (\n <Text textAlign=\"center\" fontSize=\"sm\" color=\"gray.600\">Ainda não possui acesso? <Link to=\"/cadastro\">Criar conta</Link></Text>\n ) : null}\n </VStack>\n </form>\n </Box>\n </Flex>\n );\n}\n\n","import { useState, type FormEvent } from \"react\";\nimport { Box, Button, Flex, Heading, Input, Text, VStack } from \"@chakra-ui/react\";\nimport { Navigate } from \"react-router-dom\";\nimport { useOonAuth } from \"./AuthProvider\";\n\nexport function FirstAccessPage() {\n const { status, completeFirstAccess } = useOonAuth();\n const [password, setPassword] = useState(\"\");\n const [confirm, setConfirm] = useState(\"\");\n const [submitting, setSubmitting] = useState(false);\n const [message, setMessage] = useState<string | null>(null);\n\n if (status === \"authenticated\") return <Navigate to=\"/\" replace />;\n if (status === \"unauthenticated\") return <Navigate to=\"/login\" replace />;\n if (status === \"forbidden\") return <Navigate to=\"/acesso-negado\" replace />;\n\n async function submit(event: FormEvent) {\n event.preventDefault();\n setMessage(null);\n if (password.length < 8) {\n setMessage(\"A senha deve possuir pelo menos 8 caracteres.\");\n return;\n }\n if (password !== confirm) {\n setMessage(\"As senhas informadas não conferem.\");\n return;\n }\n setSubmitting(true);\n try {\n await completeFirstAccess(password);\n } catch (error: any) {\n setMessage(error?.message || \"Não foi possível definir a nova senha.\");\n } finally {\n setSubmitting(false);\n }\n }\n\n return (\n <Flex minH=\"100vh\" align=\"center\" justify=\"center\" bg=\"#F5F8FA\" px={4}>\n <Box width=\"100%\" maxW=\"460px\" bg=\"white\" borderWidth=\"1px\" borderRadius=\"18px\" p={{ base: 6, md: 9 }}>\n <form onSubmit={(event) => void submit(event)}>\n <VStack align=\"stretch\" gap={5}>\n <Box>\n <Text color=\"#39BFED\" fontSize=\"xs\" fontWeight=\"700\" textTransform=\"uppercase\">Primeiro acesso</Text>\n <Heading mt={2} size=\"lg\">Defina sua nova senha</Heading>\n <Text mt={2} fontSize=\"sm\" color=\"gray.600\">O acesso à Central só será liberado depois desta etapa.</Text>\n </Box>\n <Box>\n <Text mb={1} fontSize=\"sm\" fontWeight=\"600\">Nova senha</Text>\n <Input type=\"password\" autoComplete=\"new-password\" value={password} onChange={(event) => setPassword(event.target.value)} required />\n </Box>\n <Box>\n <Text mb={1} fontSize=\"sm\" fontWeight=\"600\">Confirmar senha</Text>\n <Input type=\"password\" autoComplete=\"new-password\" value={confirm} onChange={(event) => setConfirm(event.target.value)} required />\n </Box>\n {message ? <Box role=\"alert\" bg=\"red.50\" borderRadius=\"md\" p={3}><Text fontSize=\"sm\">{message}</Text></Box> : null}\n <Button type=\"submit\" disabled={submitting}>{submitting ? \"Salvando…\" : \"Definir nova senha\"}</Button>\n </VStack>\n </form>\n </Box>\n </Flex>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { Box, Button, Heading, Input, Text, VStack } from \"@chakra-ui/react\";\nimport { useOonApi } from \"../api/ApiProvider\";\nimport { useActivation } from \"./ActivationProvider\";\n\ntype Field = {\n name: string;\n label: string;\n type: string;\n required?: boolean;\n defaultValue?: unknown;\n options?: string[];\n readOnly?: boolean;\n placeholder?: string;\n helpText?: string;\n minLength?: number;\n autoComplete?: string;\n};\n\ntype Preview = {\n tenant?: Record<string, unknown>;\n app?: Record<string, unknown>;\n licenca?: Record<string, unknown>;\n entitlement?: Record<string, unknown>;\n deployment?: Record<string, unknown>;\n binding?: Record<string, unknown>;\n ativacao?: Record<string, unknown>;\n};\n\ntype ActivationConfiguration = {\n mode: \"root-bootstrap\" | \"member-activation\";\n rootFields: Field[];\n globalFields: Field[];\n appFields: Field[];\n defaults: Record<string, unknown>;\n technical: Record<string, string>;\n};\n\ntype DevLocalActivationResult = {\n token?: string;\n appCode?: string;\n usuario?: Record<string, unknown>;\n tenant?: Record<string, unknown>;\n app?: Record<string, unknown>;\n licenca?: Record<string, unknown>;\n entitlement?: Record<string, unknown>;\n deployment?: Record<string, unknown>;\n binding?: Record<string, unknown>;\n instrucoes?: { env?: string; observacao?: string };\n};\n\nfunction encodeBasicCredentials(email: string, password: string): string {\n const bytes = new TextEncoder().encode(`${email}:${password}`);\n let binary = \"\";\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return window.btoa(binary);\n}\n\nexport function ActivationPage() {\n const { http } = useOonApi();\n const activation = useActivation();\n const [step, setStep] = useState(1);\n const [config, setConfig] = useState<ActivationConfiguration | null>(null);\n const [code, setCode] = useState(\"\");\n const [preview, setPreview] = useState<Preview | null>(null);\n const [global, setGlobal] = useState<Record<string, unknown>>({});\n const [app, setApp] = useState<Record<string, unknown>>({});\n const [rootEmail, setRootEmail] = useState(\"\");\n const [rootPassword, setRootPassword] = useState(\"\");\n const [devName, setDevName] = useState(\"\");\n const [devEmail, setDevEmail] = useState(\"\");\n const [devPassword, setDevPassword] = useState(\"\");\n const [showCodeFlow, setShowCodeFlow] = useState(false);\n const [devResult, setDevResult] = useState<DevLocalActivationResult | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [submitting, setSubmitting] = useState(false);\n\n useEffect(() => {\n http\n .get<ActivationConfiguration>(\"/ativacao/configuracao\")\n .then((response) => {\n setConfig(response.data);\n setGlobal(response.data.defaults || {});\n })\n .catch(() =>\n setError(\"Não foi possível carregar a configuração de ativação.\"),\n );\n }, [http]);\n\n useEffect(() => {\n if (activation.status === \"active\") {\n window.location.replace(\"/login\");\n }\n }, [activation.status]);\n\n async function activateRoot() {\n setSubmitting(true);\n setError(null);\n\n try {\n await http.post(\"/ativacao/ativar-root\", {\n email: rootEmail.trim(),\n senha: rootPassword,\n });\n setRootPassword(\"\");\n setStep(6);\n await activation.refresh();\n window.setTimeout(() => window.location.replace(\"/login\"), 900);\n } catch (caught) {\n setRootPassword(\"\");\n setError(\n (caught as Error).message ||\n \"Não foi possível concluir a ativação inicial.\",\n );\n } finally {\n setSubmitting(false);\n }\n }\n\n async function activateDevLocal() {\n setSubmitting(true);\n setError(null);\n\n try {\n const response = await http.post<DevLocalActivationResult>(\n \"/ativacao/ativar-dev-local\",\n {\n nomeUsuario: devName.trim() || undefined,\n nomeCentral: global.nomeInstancia || config?.defaults?.nomeInstancia,\n appName: config?.defaults?.nomeInstancia || config?.technical?.appCode,\n urlPublica: global.urlPublica,\n },\n {\n headers: {\n Authorization: `Basic ${encodeBasicCredentials(\n devEmail.trim().toLowerCase(),\n devPassword,\n )}`,\n },\n },\n );\n\n setDevPassword(\"\");\n setDevResult(response.data);\n setStep(6);\n\n const token = response.data.token;\n window.setTimeout(() => {\n window.location.replace(token ? `/?code=${encodeURIComponent(token)}` : \"/login\");\n }, 900);\n } catch (caught) {\n setDevPassword(\"\");\n setError(\n (caught as Error).message ||\n \"Não foi possível ativar a Central em desenvolvimento.\",\n );\n } finally {\n setSubmitting(false);\n }\n }\n\n async function validateCode() {\n setSubmitting(true);\n setError(null);\n\n try {\n const response = await http.post(\"/ativacao/validar-codigo\", {\n codigoAtivacao: code,\n });\n setPreview(response.data);\n setStep(2);\n } catch (caught) {\n setError((caught as Error).message || \"Código inválido.\");\n } finally {\n setSubmitting(false);\n }\n }\n\n async function completeMemberActivation() {\n setSubmitting(true);\n setError(null);\n\n try {\n await http.post(\"/ativacao/concluir\", {\n codigoAtivacao: code,\n nomeInstancia: global.nomeInstancia,\n parametrosGlobais: global,\n parametrosAplicacao: app,\n });\n setStep(6);\n setCode(\"\");\n await activation.refresh();\n window.setTimeout(() => window.location.replace(\"/login\"), 1200);\n } catch (caught) {\n setError(\n (caught as Error).message ||\n \"Não foi possível concluir a ativação.\",\n );\n } finally {\n setSubmitting(false);\n }\n }\n\n function renderField(\n field: Field,\n values: Record<string, unknown>,\n setValues: (value: Record<string, unknown>) => void,\n ) {\n return (\n <Box key={field.name} w=\"100%\">\n <Text fontWeight=\"medium\">\n {field.label}\n {field.required ? \" *\" : \"\"}\n </Text>\n <Input\n type={\n field.type === \"password\" || field.type === \"secret\"\n ? \"password\"\n : field.type === \"email\"\n ? \"email\"\n : field.type === \"url\"\n ? \"url\"\n : field.type === \"number\" || field.type === \"integer\"\n ? \"number\"\n : \"text\"\n }\n value={String(values[field.name] ?? field.defaultValue ?? \"\")}\n readOnly={field.readOnly}\n placeholder={field.placeholder}\n minLength={field.minLength}\n autoComplete={field.autoComplete}\n onChange={(event) =>\n setValues({ ...values, [field.name]: event.target.value })\n }\n />\n {field.helpText ? (\n <Text fontSize=\"sm\" color=\"gray.500\">\n {field.helpText}\n </Text>\n ) : null}\n </Box>\n );\n }\n\n function renderDevLocalActivation() {\n return (\n <>\n <Text color=\"gray.700\">\n Entre com seu e-mail e senha para ativar esta Central em ambiente de\n desenvolvimento. Se o e-mail ainda não existir na Central de\n Ativações, o usuário será criado automaticamente com perfil de\n desenvolvedor.\n </Text>\n\n <Box w=\"100%\">\n <Text fontWeight=\"medium\">Nome do usuário</Text>\n <Input\n value={devName}\n onChange={(event) => setDevName(event.target.value)}\n placeholder=\"Seu nome\"\n autoComplete=\"name\"\n />\n </Box>\n\n <Box w=\"100%\">\n <Text fontWeight=\"medium\">E-mail *</Text>\n <Input\n type=\"email\"\n value={devEmail}\n onChange={(event) => setDevEmail(event.target.value)}\n placeholder=\"dev@empresa.com.br\"\n autoComplete=\"email\"\n />\n </Box>\n\n <Box w=\"100%\">\n <Text fontWeight=\"medium\">Senha *</Text>\n <Input\n type=\"password\"\n value={devPassword}\n onChange={(event) => setDevPassword(event.target.value)}\n placeholder=\"Mínimo de 8 caracteres\"\n minLength={8}\n autoComplete=\"current-password\"\n />\n </Box>\n\n <Button\n colorPalette=\"blue\"\n onClick={activateDevLocal}\n loading={submitting}\n disabled={\n submitting ||\n !devEmail.trim() ||\n devPassword.length < 8 ||\n !activation.details?.podeAtivar\n }\n >\n Ativar ambiente de desenvolvimento\n </Button>\n\n <Button\n variant=\"outline\"\n onClick={() => setShowCodeFlow(true)}\n disabled={submitting}\n >\n Usar código de ativação manual\n </Button>\n </>\n );\n }\n\n const rootMode =\n config?.mode === \"root-bootstrap\" || activation.details?.role === \"root\";\n const isDevelopmentMember =\n !rootMode && config?.technical?.ambiente === \"desenvolvimento\";\n\n if (activation.status === \"loading\" || !config) {\n return (\n <Box minH=\"100vh\" bg=\"gray.50\" p={8}>\n <VStack\n maxW=\"760px\"\n mx=\"auto\"\n bg=\"white\"\n p={8}\n borderRadius=\"lg\"\n align=\"stretch\"\n gap={5}\n >\n <Heading>Preparando ativação...</Heading>\n {error ? <Text color=\"red.600\">{error}</Text> : null}\n </VStack>\n </Box>\n );\n }\n\n if (rootMode) {\n return (\n <Box minH=\"100vh\" bg=\"gray.50\" p={8}>\n <VStack\n maxW=\"560px\"\n mx=\"auto\"\n bg=\"white\"\n p={8}\n borderRadius=\"lg\"\n align=\"stretch\"\n gap={5}\n >\n <Heading>Ativação inicial do Ecossistema Oon</Heading>\n <Text color=\"gray.600\">\n Esta é a aplicação root do ecossistema. Informe somente o e-mail e\n a senha do primeiro administrador. O Core criará a estrutura mínima\n necessária para liberar o primeiro login.\n </Text>\n <Text fontSize=\"sm\" color=\"gray.500\">\n App: {config.technical.appCode} · Ambiente:{\" \"}\n {config.technical.ambiente}\n </Text>\n\n {error ? <Text color=\"red.600\">{error}</Text> : null}\n\n {step !== 6 ? (\n <>\n <Box w=\"100%\">\n <Text fontWeight=\"medium\">E-mail do administrador *</Text>\n <Input\n type=\"email\"\n autoComplete=\"email\"\n value={rootEmail}\n onChange={(event) => setRootEmail(event.target.value)}\n placeholder=\"administrador@empresa.com.br\"\n />\n </Box>\n\n <Box w=\"100%\">\n <Text fontWeight=\"medium\">Senha *</Text>\n <Input\n type=\"password\"\n minLength={8}\n autoComplete=\"new-password\"\n value={rootPassword}\n onChange={(event) => setRootPassword(event.target.value)}\n placeholder=\"Mínimo de 8 caracteres\"\n />\n </Box>\n\n <Button\n colorPalette=\"blue\"\n onClick={activateRoot}\n loading={submitting}\n disabled={\n submitting ||\n !rootEmail.trim() ||\n rootPassword.length < 8 ||\n !activation.details?.podeAtivar\n }\n >\n Criar ecossistema e ativar\n </Button>\n </>\n ) : (\n <>\n <Heading size=\"md\">Ativação concluída</Heading>\n <Text>\n Usuário, acesso do sistema e aplicativo root foram preparados.\n Redirecionando para o primeiro login...\n </Text>\n </>\n )}\n </VStack>\n </Box>\n );\n }\n\n return (\n <Box minH=\"100vh\" bg=\"gray.50\" p={8}>\n <VStack\n maxW=\"760px\"\n mx=\"auto\"\n bg=\"white\"\n p={8}\n borderRadius=\"lg\"\n align=\"stretch\"\n gap={5}\n >\n <Heading>Ativação da Central Oon</Heading>\n <Text>\n App: {config.technical.appCode} · Ambiente:{\" \"}\n {config.technical.ambiente} · Central:{\" \"}\n {config.technical.centralAtivacaoUrl ||\n config.technical.centralAtivacaoHost}\n </Text>\n\n {error ? <Text color=\"red.600\">{error}</Text> : null}\n\n {step === 1 && isDevelopmentMember && !showCodeFlow\n ? renderDevLocalActivation()\n : null}\n\n {step === 1 && (!isDevelopmentMember || showCodeFlow) && (\n <>\n <Text>\n Informe o código de ativação para validar Tenant, App,\n Entitlement e Deployment. A licença será validada somente para\n Apps comerciais.\n </Text>\n <Input\n aria-label=\"Código de ativação\"\n value={code}\n onChange={(event) => setCode(event.target.value)}\n placeholder=\"OON-XXXX\"\n />\n <Button\n onClick={validateCode}\n loading={submitting}\n disabled={!code || submitting}\n >\n Validar código\n </Button>\n {isDevelopmentMember ? (\n <Button\n variant=\"outline\"\n onClick={() => setShowCodeFlow(false)}\n disabled={submitting}\n >\n Voltar para ativação com usuário\n </Button>\n ) : null}\n </>\n )}\n\n {step === 2 && (\n <>\n <Heading size=\"md\">Confirmação</Heading>\n <pre>{JSON.stringify(preview, null, 2)}</pre>\n <Button onClick={() => setStep(3)}>Continuar</Button>\n </>\n )}\n\n {step === 3 && (\n <>\n {config.globalFields.map((field) =>\n renderField(field, global, setGlobal),\n )}\n <Button onClick={() => setStep(4)}>Continuar</Button>\n </>\n )}\n\n {step === 4 && (\n <>\n {config.appFields.length ? (\n config.appFields.map((field) => renderField(field, app, setApp))\n ) : (\n <Text>Nenhum parâmetro adicional declarado.</Text>\n )}\n <Button onClick={() => setStep(5)}>Revisar</Button>\n </>\n )}\n\n {step === 5 && (\n <>\n <Text>\n Ao confirmar, o código será consumido e este runtime será\n vinculado ao Deployment do Ecossistema Oon.\n </Text>\n <Button\n colorPalette=\"blue\"\n onClick={completeMemberActivation}\n loading={submitting}\n disabled={submitting}\n >\n Concluir ativação\n </Button>\n </>\n )}\n\n {step === 6 && (\n <>\n <Heading size=\"md\">Ativação concluída</Heading>\n {devResult?.appCode ? (\n <Text>\n Código do app: {devResult.appCode}. Redirecionando para a\n Central em desenvolvimento...\n </Text>\n ) : (\n <Text>Redirecionando para o login...</Text>\n )}\n {devResult?.instrucoes?.env ? (\n <Text fontSize=\"sm\" color=\"gray.500\">\n {devResult.instrucoes.env}\n </Text>\n ) : null}\n </>\n )}\n </VStack>\n </Box>\n );\n}\n\nexport function InstanceBlockedPage({\n title,\n message,\n}: {\n title: string;\n message: string;\n}) {\n return (\n <Box p={8}>\n <Heading>{title}</Heading>\n <Text>{message}</Text>\n </Box>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { useOonAuth } from \"./AuthProvider\";\nimport { LoadingScreen } from \"../shell/LoadingScreen\";\n\n/**\n * Protege rotas privadas: enquanto valida o token mostra loading; sem sessão\n * o AuthProvider já redireciona para o login externo, então aqui só seguramos\n * o render. `permission` opcional bloqueia por papel (UX; back valida de novo).\n */\nexport function RouteGuard({\n permission,\n children,\n}: {\n permission?: string | string[];\n children: ReactNode;\n}) {\n const { status, hasPermission } = useOonAuth();\n\n if (status === \"loading\") return <LoadingScreen />;\n if (status === \"unauthenticated\") return <LoadingScreen message=\"Redirecionando para o login...\" />;\n if (!hasPermission(permission)) {\n return <LoadingScreen message=\"Você não tem acesso a esta tela.\" />;\n }\n return <>{children}</>;\n}\n","import { Navigate } from \"react-router-dom\";\nimport { useActivation } from \"./ActivationProvider\";\nexport function ActivationGuard({ children }: { children: JSX.Element }) {\n const { status } = useActivation();\n if (status === \"loading\") return null;\n if (status === \"suspended\") return <Navigate to=\"/instancia-suspensa\" replace />;\n if (status === \"revoked\") return <Navigate to=\"/instancia-revogada\" replace />;\n if (status !== \"active\" && window.location.pathname !== \"/ativacao\") return <Navigate to=\"/ativacao\" replace />;\n return children;\n}\n","const PIPELINE_BOARD_STYLE_ID = \"oon-core-pipeline-board-natural-height\";\n\n/**\n * O quadro mantém a rolagem horizontal no fim do conteúdo e cresce conforme\n * a etapa com mais tickets. As setas continuam acessíveis durante a rolagem\n * vertical sem transformar o quadro em uma área de scroll própria.\n */\nexport const PIPELINE_BOARD_LAYOUT_CSS = `\n:where(*) > [data-oon-pipeline-board=\"true\"] {\n height: auto !important;\n min-height: 420px;\n overflow-y: visible !important;\n align-items: stretch !important;\n}\n\n:where(*) > [data-oon-pipeline-board=\"true\"] > * {\n align-self: stretch;\n}\n\n:where(*):has(> [data-oon-pipeline-board=\"true\"]) {\n display: grid;\n grid-template-areas: \"oon-pipeline-board\";\n align-items: start;\n}\n\n:where(*):has(> [data-oon-pipeline-board=\"true\"]) > [data-oon-pipeline-board=\"true\"] {\n grid-area: oon-pipeline-board;\n}\n\n:where(*):has(> [data-oon-pipeline-board=\"true\"]) > button[aria-label=\"Deslizar quadro para a esquerda\"],\n:where(*):has(> [data-oon-pipeline-board=\"true\"]) > button[aria-label=\"Deslizar quadro para a direita\"] {\n grid-area: oon-pipeline-board;\n position: sticky !important;\n top: calc(50vh - 17px) !important;\n right: auto !important;\n left: auto !important;\n align-self: start;\n transform: none !important;\n z-index: 3;\n}\n\n:where(*):has(> [data-oon-pipeline-board=\"true\"]) > button[aria-label=\"Deslizar quadro para a esquerda\"] {\n justify-self: start;\n margin-left: 8px;\n}\n\n:where(*):has(> [data-oon-pipeline-board=\"true\"]) > button[aria-label=\"Deslizar quadro para a direita\"] {\n justify-self: end;\n margin-right: 8px;\n}\n`;\n\nexport function installPipelineBoardLayoutStyles(targetDocument: Document = document) {\n if (targetDocument.getElementById(PIPELINE_BOARD_STYLE_ID)) return;\n\n const style = targetDocument.createElement(\"style\");\n style.id = PIPELINE_BOARD_STYLE_ID;\n style.textContent = PIPELINE_BOARD_LAYOUT_CSS;\n targetDocument.head.appendChild(style);\n}\n","import type { OonAppDefinition, OonCoreFrontConfig, OonMenuItem, OonModule, OonNavigationConfig } from \"../types\";\nimport { start } from \"../start\";\nimport { defineOonNavigation, defineOonRoutes } from \"../routing\";\n\nfunction navigationItems(navigation: OonAppDefinition[\"navigation\"]): OonMenuItem[] {\n if (!navigation) return [];\n return Array.isArray(navigation) ? navigation : navigation.items ?? [];\n}\n\nexport function defineOonApp<const T extends OonAppDefinition>(definition: T): T {\n if (!definition?.app?.id) throw new Error(\"defineOonApp: app.id é obrigatório.\");\n if (!definition?.app?.name) throw new Error(\"defineOonApp: app.name é obrigatório.\");\n if (!definition?.api?.baseUrl) throw new Error(\"defineOonApp: api.baseUrl é obrigatório.\");\n if (definition.security?.enableRouteGuard === false || definition.security?.enablePermissionGate === false) {\n throw new Error(\"defineOonApp: guards obrigatórios de rota e permissão não podem ser desabilitados.\");\n }\n defineOonRoutes(definition.routes ?? []);\n defineOonNavigation(navigationItems(definition.navigation));\n return definition;\n}\n\nexport function appDefinitionToConfig(definition: OonAppDefinition): OonCoreFrontConfig {\n const app = defineOonApp(definition);\n const localModule: OonModule = {\n id: \"app.local\",\n label: app.app.name,\n routes: [...(app.routes ?? [])],\n menu: navigationItems(app.navigation),\n };\n const modules = localModule.routes?.length || localModule.menu?.length\n ? [localModule, ...(app.modules ?? [])]\n : [...(app.modules ?? [])];\n const uiNavigation: OonNavigationConfig | undefined = Array.isArray(app.navigation)\n ? { mode: \"manual\", items: app.navigation }\n : app.navigation;\n\n return {\n app: app.app,\n api: app.api,\n runtimeMode: app.runtimeMode,\n auth: app.auth,\n theme: app.theme,\n themes: app.themes,\n defaultThemeId: app.defaultThemeId,\n modules,\n ui: app.ui || app.pages?.length\n ? {\n ...app.ui,\n schemaVersion: 2,\n views: app.ui?.views ?? [],\n navigation: app.ui?.navigation ?? uiNavigation,\n pages: [...(app.ui?.pages ?? []), ...(app.pages ?? [])],\n }\n : undefined,\n layout: app.shell ?? app.ui?.layout,\n registry: {\n ...app.components,\n layoutSlots: { ...app.components?.layoutSlots, ...app.layouts },\n },\n security: {\n enableRouteGuard: true,\n enablePermissionGate: true,\n redactAssistantContext: true,\n disableConsoleInProduction: true,\n ...app.security,\n },\n systemPages: app.systemPages,\n rootElementId: app.rootElementId,\n };\n}\n\nexport function startOonApp(definition: OonAppDefinition): OonCoreFrontConfig {\n const config = appDefinitionToConfig(definition);\n start(config);\n return config;\n}\n"],"mappings":"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","names":["value","useMemo","useEffect","useState","Box","Text","value","jsx","jsxs","useState","useEffect","Box","Text","useEffect","useRef","useState","Box","Button","Flex","Heading","Input","Text","VStack","useLocation","jsx","jsxs","useEffect","useState","Fragment","jsx","jsxs","useState","useEffect","jsx","jsx","value","Navigate","Box","Button","Flex","Text","Box","Flex","Text","useState","jsx","jsxs","value","useState","Box","Flex","Text","jsx","jsxs","Flex","Box","Text","Button","jsx","Box","Button","Flex","Heading","Text","VStack","useNavigate","jsx","jsxs","useNavigate","Flex","Box","VStack","Text","Heading","Button","useLocation","Fragment","jsx","useLocation","useState","Box","Button","Flex","Heading","Input","Text","VStack","Link","Navigate","useLocation","jsx","jsxs","value","useLocation","useState","Navigate","Flex","Box","VStack","Text","Heading","Input","Button","Link","useState","Box","Button","Flex","Heading","Input","Text","VStack","Navigate","jsx","jsxs","useState","Navigate","Flex","Box","VStack","Text","Heading","Input","Button","useEffect","useState","Box","Button","Heading","Input","Text","VStack","Fragment","jsx","jsxs","useState","useEffect","Box","Text","Input","Button","VStack","Heading","Fragment","jsx","Navigate","jsx","Navigate","jsx","Navigate","jsx","useMemo","storage","tenantStorage","http","router","jsx"]}
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
useOonApi,
|
|
7
7
|
useOonAuth,
|
|
8
8
|
useOonResource
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-Z4NC63HJ.js";
|
|
10
10
|
import {
|
|
11
11
|
__publicField
|
|
12
12
|
} from "./chunk-V6TY7KAL.js";
|
|
@@ -5432,4 +5432,4 @@ export {
|
|
|
5432
5432
|
CorePage2 as CorePage,
|
|
5433
5433
|
CoreTransactionalEmail
|
|
5434
5434
|
};
|
|
5435
|
-
//# sourceMappingURL=chunk-
|
|
5435
|
+
//# sourceMappingURL=chunk-EIFIGMY7.js.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
CoreCollection
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-EIFIGMY7.js";
|
|
4
4
|
import {
|
|
5
5
|
useOonApi
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-Z4NC63HJ.js";
|
|
7
7
|
|
|
8
8
|
// src/components/CoreCurrency.tsx
|
|
9
9
|
import { Button, Flex, Heading, Stack, Text } from "@chakra-ui/react";
|
|
@@ -100,4 +100,4 @@ export {
|
|
|
100
100
|
CoreCurrency,
|
|
101
101
|
CoreAssistant
|
|
102
102
|
};
|
|
103
|
-
//# sourceMappingURL=chunk-
|
|
103
|
+
//# sourceMappingURL=chunk-QW4OXKR7.js.map
|
|
@@ -474,6 +474,7 @@ function AuthProvider({ http, storage, auth, loginUrl, runtimeMode = "platform",
|
|
|
474
474
|
const switchTenant = tenantContext?.switchTenant;
|
|
475
475
|
const clearTenant = tenantContext?.clearTenant;
|
|
476
476
|
const launchAbort = useRef2(null);
|
|
477
|
+
const sessionEpoch = useRef2(0);
|
|
477
478
|
const launchSession = useRef2(null);
|
|
478
479
|
const redirectToExternalLogin = useCallback3(() => {
|
|
479
480
|
if (runtimeMode === "local" || window.location.pathname === "/accept-invite") return;
|
|
@@ -508,8 +509,9 @@ function AuthProvider({ http, storage, auth, loginUrl, runtimeMode = "platform",
|
|
|
508
509
|
[storage, redirectToExternalLogin]
|
|
509
510
|
);
|
|
510
511
|
const validateSession = useCallback3(async () => {
|
|
512
|
+
const epoch = sessionEpoch.current;
|
|
511
513
|
const response = await http.get("/auth/validar-token");
|
|
512
|
-
applyUser(response.data.usuario);
|
|
514
|
+
if (epoch === sessionEpoch.current) applyUser(response.data.usuario);
|
|
513
515
|
}, [http, applyUser]);
|
|
514
516
|
const retry = useCallback3(async () => {
|
|
515
517
|
setStatus("loading");
|
|
@@ -532,29 +534,44 @@ function AuthProvider({ http, storage, auth, loginUrl, runtimeMode = "platform",
|
|
|
532
534
|
}
|
|
533
535
|
launchAbort.current?.abort();
|
|
534
536
|
launchSession.current = null;
|
|
537
|
+
const controller = new AbortController();
|
|
538
|
+
launchAbort.current = controller;
|
|
539
|
+
const epoch = ++sessionEpoch.current;
|
|
540
|
+
const cancelled = () => controller.signal.aborted || epoch !== sessionEpoch.current;
|
|
541
|
+
storage.clear();
|
|
542
|
+
clearTenant?.();
|
|
535
543
|
setStatus("loading");
|
|
536
544
|
setUser(null);
|
|
537
545
|
try {
|
|
538
546
|
const normalizedTenantId = String(tenantId || "").trim();
|
|
539
|
-
if (normalizedTenantId) switchTenant?.(normalizedTenantId);
|
|
540
|
-
else clearTenant?.();
|
|
541
547
|
const response = await http.post(
|
|
542
548
|
"/auth/autenticar",
|
|
543
549
|
{},
|
|
544
550
|
{
|
|
551
|
+
signal: controller.signal,
|
|
545
552
|
headers: {
|
|
546
553
|
Authorization: `Basic ${encodeBasicCredentials(email, password)}`,
|
|
547
|
-
|
|
554
|
+
"x-oon-tenant-id": normalizedTenantId || false
|
|
548
555
|
}
|
|
549
556
|
}
|
|
550
557
|
);
|
|
551
|
-
if (
|
|
558
|
+
if (cancelled()) return;
|
|
559
|
+
const token = response.data.token;
|
|
560
|
+
if (!token) {
|
|
552
561
|
const error = { code: "AUTH_TOKEN_MISSING", message: "Token n\xE3o retornado pelo backend.", status: 502 };
|
|
553
562
|
throw error;
|
|
554
563
|
}
|
|
555
|
-
|
|
556
|
-
|
|
564
|
+
const validation = await http.get("/auth/validar-token", {
|
|
565
|
+
signal: controller.signal,
|
|
566
|
+
headers: { Authorization: `Bearer ${token}`, "x-oon-tenant-id": false }
|
|
567
|
+
});
|
|
568
|
+
if (cancelled()) return;
|
|
569
|
+
storage.set(token);
|
|
570
|
+
applyUser(validation.data.usuario);
|
|
557
571
|
} catch (error) {
|
|
572
|
+
if (cancelled()) return;
|
|
573
|
+
storage.clear();
|
|
574
|
+
clearTenant?.();
|
|
558
575
|
if (error?.code === "TENANT_SELECTION_REQUIRED") {
|
|
559
576
|
setStatus("unauthenticated");
|
|
560
577
|
} else {
|
|
@@ -563,13 +580,14 @@ function AuthProvider({ http, storage, auth, loginUrl, runtimeMode = "platform",
|
|
|
563
580
|
throw error;
|
|
564
581
|
}
|
|
565
582
|
},
|
|
566
|
-
[http, storage,
|
|
583
|
+
[http, storage, applyUser, applyValidationError, clearTenant, runtimeMode]
|
|
567
584
|
);
|
|
568
585
|
const completeFirstAccess = useCallback3(async (password) => {
|
|
569
586
|
await http.post("/auth/first-access/password", { password });
|
|
570
587
|
await validateSession();
|
|
571
588
|
}, [http, validateSession]);
|
|
572
589
|
const logout = useCallback3((options) => {
|
|
590
|
+
sessionEpoch.current += 1;
|
|
573
591
|
launchAbort.current?.abort();
|
|
574
592
|
launchSession.current = null;
|
|
575
593
|
storage.clear();
|
|
@@ -584,6 +602,7 @@ function AuthProvider({ http, storage, auth, loginUrl, runtimeMode = "platform",
|
|
|
584
602
|
}, [storage, redirectToExternalLogin, clearTenant, runtimeMode, http]);
|
|
585
603
|
useEffect2(() => {
|
|
586
604
|
let active = true;
|
|
605
|
+
const epoch = sessionEpoch.current;
|
|
587
606
|
if (activation && !["active", "error"].includes(activation.status)) {
|
|
588
607
|
setUser(null);
|
|
589
608
|
setStatus("unauthenticated");
|
|
@@ -595,10 +614,10 @@ function AuthProvider({ http, storage, auth, loginUrl, runtimeMode = "platform",
|
|
|
595
614
|
setStatus("loading");
|
|
596
615
|
const bootstrap = bootstrapCode ? http.post("/auth/local/bootstrap", { code: bootstrapCode }) : Promise.resolve();
|
|
597
616
|
bootstrap.then(() => http.get("/auth/validar-token")).then((response) => {
|
|
598
|
-
if (!active) return;
|
|
617
|
+
if (!active || epoch !== sessionEpoch.current) return;
|
|
599
618
|
applyUser(response.data.usuario);
|
|
600
619
|
}).catch((error) => {
|
|
601
|
-
if (!active) return;
|
|
620
|
+
if (!active || epoch !== sessionEpoch.current) return;
|
|
602
621
|
applyValidationError(error);
|
|
603
622
|
});
|
|
604
623
|
return () => {
|
|
@@ -670,10 +689,10 @@ function AuthProvider({ http, storage, auth, loginUrl, runtimeMode = "platform",
|
|
|
670
689
|
}
|
|
671
690
|
setStatus("loading");
|
|
672
691
|
http.get("/auth/validar-token").then((response) => {
|
|
673
|
-
if (!active) return;
|
|
692
|
+
if (!active || epoch !== sessionEpoch.current) return;
|
|
674
693
|
applyUser(response.data.usuario);
|
|
675
694
|
}).catch((error) => {
|
|
676
|
-
if (!active) return;
|
|
695
|
+
if (!active || epoch !== sessionEpoch.current) return;
|
|
677
696
|
applyValidationError(error);
|
|
678
697
|
});
|
|
679
698
|
return () => {
|
|
@@ -726,4 +745,4 @@ export {
|
|
|
726
745
|
AuthProvider,
|
|
727
746
|
useOonAuth
|
|
728
747
|
};
|
|
729
|
-
//# sourceMappingURL=chunk-
|
|
748
|
+
//# sourceMappingURL=chunk-Z4NC63HJ.js.map
|