@oondemand/oon-core-front 0.5.6 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-32GGDIWB.js +71 -0
- package/dist/chunk-32GGDIWB.js.map +1 -0
- package/dist/chunk-ALZCHGGI.js +19 -0
- package/dist/chunk-ALZCHGGI.js.map +1 -0
- package/dist/chunk-KD7UQF5E.js +103 -0
- package/dist/chunk-KD7UQF5E.js.map +1 -0
- package/dist/chunk-R7ZBLDC2.js +5429 -0
- package/dist/chunk-R7ZBLDC2.js.map +1 -0
- package/dist/chunk-V6TY7KAL.js +8 -0
- package/dist/chunk-V6TY7KAL.js.map +1 -0
- package/dist/chunk-VC6NTMZS.js +187 -0
- package/dist/chunk-VC6NTMZS.js.map +1 -0
- package/dist/chunk-VJ7YNFF7.js +694 -0
- package/dist/chunk-VJ7YNFF7.js.map +1 -0
- package/dist/chunk-VJDTI2II.js +2111 -0
- package/dist/chunk-VJDTI2II.js.map +1 -0
- package/dist/hooks-lXMaiLqz.d.ts +89 -0
- package/dist/hooks.d.ts +8 -0
- package/dist/hooks.js +24 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +26 -1187
- package/dist/index.js +63 -10202
- package/dist/index.js.map +1 -1
- package/dist/routing.d.ts +12 -0
- package/dist/routing.js +17 -0
- package/dist/routing.js.map +1 -0
- package/dist/testing.d.ts +8 -0
- package/dist/testing.js +22 -0
- package/dist/testing.js.map +1 -0
- package/dist/theme-Clhoswb3.d.ts +28 -0
- package/dist/theme.d.ts +12 -0
- package/dist/theme.js +14 -0
- package/dist/theme.js.map +1 -0
- package/dist/types-BEVt-nU8.d.ts +666 -0
- package/dist/ui-1Um8gXIZ.d.ts +337 -0
- package/dist/ui.d.ts +5 -0
- package/dist/ui.js +86 -0
- package/dist/ui.js.map +1 -0
- package/package.json +21 -1
|
@@ -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\") 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, type FormEvent } from \"react\";\nimport { Box, Button, Flex, Heading, Input, Text, VStack } from \"@chakra-ui/react\";\nimport { Link, useLocation } from \"react-router-dom\";\nimport { useOonApi } from \"../api/ApiProvider\";\n\ninterface InvitationInfo {\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 token = new URLSearchParams(location.search).get(\"token\") || \"\";\n const [invitation, setInvitation] = useState<InvitationInfo | null>(null);\n const [password, setPassword] = useState(\"\");\n const [confirm, setConfirm] = useState(\"\");\n const [message, setMessage] = useState<string | null>(null);\n const [done, setDone] = useState(false);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n let active = true;\n if (!token) {\n setMessage(\"Link de convite inválido.\");\n setLoading(false);\n return;\n }\n http.get<{ invitation: InvitationInfo }>(`/core/invitations/${encodeURIComponent(token)}`)\n .then((response) => { if (active) setInvitation(response.data.invitation); })\n .catch(() => { if (active) setMessage(\"Este convite é inválido, expirou ou já foi utilizado.\"); })\n .finally(() => { if (active) setLoading(false); });\n return () => { active = false; };\n }, [http, token]);\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 try {\n await http.post(`/core/invitations/${encodeURIComponent(token)}/accept`, { password });\n setDone(true);\n setMessage(\"Convite aceito e senha definida. Você já pode entrar na Central.\");\n } catch (error: any) {\n setMessage(error?.message || \"Não foi possível concluir o convite.\");\n }\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 <form onSubmit={(event) => void submit(event)}>\n <VStack align=\"stretch\" gap={4}>\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 <Button type=\"submit\">Concluir primeiro acesso</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 {done ? <Button asChild><Link to=\"/login\">Ir para o login</Link></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 publicationParts = [\n updatedAt ? `Atualizado ${updatedAt}` : undefined,\n commit ? `commit ${commit}` : undefined,\n runtime.releaseId ? `release ${runtime.releaseId}` : 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 Central {centralVersion} · Front {runtime.coreFrontVersion} · Back {backendVersion}\n </Text>\n {publicationParts.length ? (\n <Text fontSize=\"10px\" color=\"text.muted\" lineHeight=\"1.35\">\n {publicationParts.join(\" · \")}\n </Text>\n ) : null}\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.6.0\",\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): 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 timeZone: \"UTC\",\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","jsx","jsxs","useState","useEffect","Box","Text","useEffect","useState","Box","Button","Flex","Heading","Input","Text","VStack","Link","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"]}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { H as OonUser, h as CoreMetadata, M as ModelSummary, L as ListParams, P as PaginatedResult, N as AuditContext } from './types-BEVt-nU8.js';
|
|
2
|
+
import * as _tanstack_react_query from '@tanstack/react-query';
|
|
3
|
+
import { AxiosInstance } from 'axios';
|
|
4
|
+
import './theme.js';
|
|
5
|
+
|
|
6
|
+
type AuthStatus = "loading" | "authenticated" | "first-access" | "unauthenticated" | "forbidden" | "error";
|
|
7
|
+
interface AuthContextValue {
|
|
8
|
+
user: OonUser | null;
|
|
9
|
+
roles: string[];
|
|
10
|
+
capabilities: string[];
|
|
11
|
+
permissions: string[];
|
|
12
|
+
status: AuthStatus;
|
|
13
|
+
isAuthenticated: boolean;
|
|
14
|
+
hasPermission: (permission?: string | string[]) => boolean;
|
|
15
|
+
login: (email: string, password: string, tenantId?: string) => Promise<void>;
|
|
16
|
+
completeFirstAccess: (password: string) => Promise<void>;
|
|
17
|
+
retry: () => Promise<void>;
|
|
18
|
+
logout: () => void;
|
|
19
|
+
}
|
|
20
|
+
declare function can(user: OonUser | null, permission?: string | string[]): boolean;
|
|
21
|
+
declare function useOonAuth(): AuthContextValue;
|
|
22
|
+
|
|
23
|
+
interface OonTenantContextValue {
|
|
24
|
+
activeTenantId: string | null;
|
|
25
|
+
switchTenant(tenantId: string): void;
|
|
26
|
+
clearTenant(): void;
|
|
27
|
+
}
|
|
28
|
+
declare function useOonTenant(): OonTenantContextValue;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* SDK do contrato /core/* (introspecção dirigida por metadata). É o que
|
|
32
|
+
* permite o modo "dynamic" das coleções: o front monta grid/form/rotas a
|
|
33
|
+
* partir do que o back descreve, sem código de UI por entidade.
|
|
34
|
+
*/
|
|
35
|
+
interface CoreClient {
|
|
36
|
+
metadata(): Promise<CoreMetadata>;
|
|
37
|
+
models(): Promise<ModelSummary[]>;
|
|
38
|
+
model(name: string): Promise<ModelSummary>;
|
|
39
|
+
permissions(): Promise<Array<{
|
|
40
|
+
resource: string;
|
|
41
|
+
action: string;
|
|
42
|
+
roles: string[];
|
|
43
|
+
}>>;
|
|
44
|
+
menus(): Promise<CoreMetadata["menus"]>;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* SDK por recurso (Seção 2.5). Espelha o CRUD gerado pelo back em `basePath`:
|
|
49
|
+
* GET / -> list (paginado)
|
|
50
|
+
* GET /:id -> get
|
|
51
|
+
* POST / -> create
|
|
52
|
+
* PUT /:id -> update
|
|
53
|
+
* PATCH /:id -> patch
|
|
54
|
+
* DELETE /:id -> delete
|
|
55
|
+
* POST /import -> importMany
|
|
56
|
+
* GET /export -> exportAll
|
|
57
|
+
*
|
|
58
|
+
* O back devolve registro único na chave do singular (`{ [singular]: {...} }`);
|
|
59
|
+
* `unwrap` extrai o primeiro valor não-meta para o consumidor não precisar
|
|
60
|
+
* conhecer o singular.
|
|
61
|
+
*/
|
|
62
|
+
interface ResourceClient<T = Record<string, unknown>> {
|
|
63
|
+
list(params?: ListParams): Promise<PaginatedResult<T>>;
|
|
64
|
+
get(id: string): Promise<T>;
|
|
65
|
+
create(body: Partial<T>, audit?: AuditContext): Promise<T>;
|
|
66
|
+
update(id: string, body: Partial<T>, audit?: AuditContext): Promise<T>;
|
|
67
|
+
patch(id: string, body: Partial<T>, audit?: AuditContext): Promise<T>;
|
|
68
|
+
delete(id: string, audit?: AuditContext): Promise<T>;
|
|
69
|
+
importMany(rows: unknown[], audit?: AuditContext): Promise<{
|
|
70
|
+
inserted?: number;
|
|
71
|
+
[k: string]: unknown;
|
|
72
|
+
}>;
|
|
73
|
+
exportAll(params?: ListParams): Promise<T[]>;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
interface ApiContextValue {
|
|
77
|
+
http: AxiosInstance;
|
|
78
|
+
core: CoreClient;
|
|
79
|
+
resource: <T = Record<string, unknown>>(basePath: string) => ResourceClient<T>;
|
|
80
|
+
}
|
|
81
|
+
declare function useOonApi(): ApiContextValue;
|
|
82
|
+
/** Cliente de um recurso, memoizado pelo basePath. */
|
|
83
|
+
declare function useOonResource<T = Record<string, unknown>>(basePath: string): ResourceClient<T>;
|
|
84
|
+
/** Metadata completa do back (cache de 5 min). */
|
|
85
|
+
declare function useCoreMetadata(): _tanstack_react_query.UseQueryResult<NoInfer<CoreMetadata>, Error>;
|
|
86
|
+
/** Descrição de uma model específica — base do modo "dynamic". */
|
|
87
|
+
declare function useModelSchema(name: string, enabled?: boolean): _tanstack_react_query.UseQueryResult<NoInfer<ModelSummary>, Error>;
|
|
88
|
+
|
|
89
|
+
export { type OonTenantContextValue as O, useModelSchema as a, useOonApi as b, can as c, useOonAuth as d, useOonResource as e, useOonTenant as f, useCoreMetadata as u };
|
package/dist/hooks.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { c as can, u as useCoreMetadata, a as useModelSchema, b as useOonApi, d as useOonAuth, e as useOonResource, f as useOonTenant } from './hooks-lXMaiLqz.js';
|
|
2
|
+
export { useOonTheme } from './theme.js';
|
|
3
|
+
import './types-BEVt-nU8.js';
|
|
4
|
+
import 'react';
|
|
5
|
+
import './theme-Clhoswb3.js';
|
|
6
|
+
import '@chakra-ui/react';
|
|
7
|
+
import '@tanstack/react-query';
|
|
8
|
+
import 'axios';
|
package/dist/hooks.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import {
|
|
2
|
+
can,
|
|
3
|
+
useCoreMetadata,
|
|
4
|
+
useModelSchema,
|
|
5
|
+
useOonApi,
|
|
6
|
+
useOonAuth,
|
|
7
|
+
useOonResource,
|
|
8
|
+
useOonTenant
|
|
9
|
+
} from "./chunk-VJ7YNFF7.js";
|
|
10
|
+
import {
|
|
11
|
+
useOonTheme
|
|
12
|
+
} from "./chunk-VC6NTMZS.js";
|
|
13
|
+
import "./chunk-V6TY7KAL.js";
|
|
14
|
+
export {
|
|
15
|
+
can,
|
|
16
|
+
useCoreMetadata,
|
|
17
|
+
useModelSchema,
|
|
18
|
+
useOonApi,
|
|
19
|
+
useOonAuth,
|
|
20
|
+
useOonResource,
|
|
21
|
+
useOonTenant,
|
|
22
|
+
useOonTheme
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|