@oondemand/oon-core-front 0.2.0 → 0.3.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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/start.tsx","../src/app/OonApp.tsx","../src/api/createRestClient.ts","../src/api/errorNormalizer.ts","../src/security/tokenStorage.ts","../src/app/OonProviders.tsx","../src/config/queryClient.ts","../src/config/theme.ts","../src/api/ApiProvider.tsx","../src/api/coreClient.ts","../src/api/resourceClient.ts","../src/security/AuthProvider.tsx","../src/components/CoreCollection.tsx","../src/components/internal/fieldUtils.ts","../src/components/internal/DataGrid.tsx","../src/shell/LoadingScreen.tsx","../src/shell/ErrorState.tsx","../src/components/internal/DynamicForm.tsx","../src/components/CoreDocument.tsx","../src/components/CorePipeline.tsx","../src/components/CoreDashboard.tsx","../src/app/moduleRegistry.tsx","../src/app/createOonRouter.tsx","../src/shell/AuthenticatedLayout.tsx","../src/shell/Sidebar.tsx","../src/security/RouteGuard.tsx","../src/manifest.ts","../src/define/views.ts","../src/components/CoreIntegration.tsx","../src/components/CoreCurrency.tsx","../src/components/CoreAssistant.tsx","../src/security/PermissionGate.tsx"],"sourcesContent":["import { StrictMode } from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport type { OonCoreFrontConfig } from \"./types\";\nimport { OonApp } from \"./app/OonApp\";\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 * Ponto de entrada único de uma Central (Seção 3.2). O `main.tsx` da Central\n * só chama isto — não conhece providers, router, auth, layout nem serviços.\n *\n * import { start } from \"@oondemand/oon-core-front\";\n * import { appConfig } from \"./central.ui\";\n * start(appConfig);\n */\nexport function start(config: OonCoreFrontConfig) {\n validateConfig(config);\n applyDocumentMeta(config);\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/** Alias namespaced, compatível com a doc (`oonCoreFront.start`). */\nexport const oonCoreFront = { start };\n","import { useMemo } from \"react\";\nimport { RouterProvider } from \"react-router-dom\";\nimport type { OonCoreFrontConfig } from \"../types\";\nimport { createRestClient } from \"../api/createRestClient\";\nimport { createTokenStorage } from \"../security/tokenStorage\";\nimport { OonProviders } from \"./OonProviders\";\nimport { resolveRegistry } from \"./moduleRegistry\";\nimport { createOonRouter } from \"./createOonRouter\";\n\n/**\n * Raiz da aplicação Core. Cria o cliente REST (com token storage + 401),\n * resolve o registry de rotas/menu e monta providers + router.\n */\nexport function OonApp({ config }: { config: OonCoreFrontConfig }) {\n const { http, storage, router } = useMemo(() => {\n const storage = createTokenStorage(config.app.id);\n const loginUrl = config.auth?.loginUrl ?? config.api.meusAppsUrl;\n\n const http = createRestClient({\n api: config.api,\n appId: config.app.id,\n getToken: () => storage.get(),\n onUnauthorized: () => {\n storage.clear();\n if (loginUrl) window.location.href = loginUrl;\n },\n });\n\n const { routes, menu } = resolveRegistry(config);\n const router = createOonRouter({ app: config.app, menu, routes, security: config.security });\n\n return { http, storage, router };\n }, [config]);\n\n return (\n <OonProviders config={config} http={http} storage={storage}>\n <RouterProvider router={router} />\n </OonProviders>\n );\n}\n","import axios, { type AxiosInstance } from \"axios\";\nimport type { AuditContext, OonApiConfig } from \"../types\";\nimport { normalizeError } from \"./errorNormalizer\";\n\nexport interface RestClientDeps {\n api: OonApiConfig;\n /** Lê o token atual (Bearer). Retorna null se não autenticado. */\n getToken: () => string | null;\n /** Chamado uma vez ao receber 401 (logout + redirect). */\n onUnauthorized?: () => void;\n /** Origem app id, vai no header x-oon-app. */\n appId?: string;\n}\n\n/**\n * Cliente REST único do Core (Seção 2.5). Centraliza:\n * - baseUrl + versionPrefix;\n * - injeção de Bearer token;\n * - headers de auditoria x-oon-* nas mutações;\n * - tratamento global de 401 e normalização de erro.\n *\n * Nenhuma página de domínio deve instanciar axios diretamente.\n */\nexport function createRestClient(deps: RestClientDeps): AxiosInstance {\n const { api, getToken, onUnauthorized, appId } = deps;\n const prefix = api.versionPrefix ?? \"\";\n\n const instance = axios.create({\n baseURL: `${api.baseUrl.replace(/\\/$/, \"\")}${prefix}`,\n timeout: api.timeout ?? 30000,\n });\n\n instance.interceptors.request.use((config) => {\n // Em interceptors do axios v1, config.headers já é um AxiosHeaders.\n const token = getToken();\n if (token) config.headers.Authorization = `Bearer ${token}`;\n if (appId) config.headers[\"x-oon-app\"] = appId;\n return config;\n });\n\n instance.interceptors.response.use(\n (res) => res,\n (error) => {\n const normalized = normalizeError(error);\n if (normalized.status === 401) onUnauthorized?.();\n return Promise.reject(normalized);\n }\n );\n\n return instance;\n}\n\n/** Monta os headers de auditoria x-oon-* a partir do contexto. */\nexport function auditHeaders(audit?: AuditContext): Record<string, string> {\n if (!audit) return {};\n const headers: Record<string, string> = {};\n if (audit.origem) headers[\"x-oon-origin\"] = audit.origem;\n if (audit.module) headers[\"x-oon-module\"] = audit.module;\n if (audit.entity) headers[\"x-oon-entity\"] = audit.entity;\n return headers;\n}\n","import axios from \"axios\";\nimport type { OonError } from \"../types\";\n\n/**\n * Normaliza qualquer erro de rede/axios para o formato `OonError`, lendo o\n * envelope de erro padrão do back (`{ message }` ou `{ error: {...} }`).\n */\nexport function normalizeError(err: unknown): OonError {\n if (axios.isAxiosError(err)) {\n const status = err.response?.status;\n const data = err.response?.data as\n | { message?: string; error?: { code?: string; message?: string; details?: unknown; requestId?: string } }\n | undefined;\n\n const envelope = data?.error;\n return {\n code: envelope?.code || codeFromStatus(status),\n message: envelope?.message || data?.message || err.message || \"Erro inesperado.\",\n status,\n details: envelope?.details,\n requestId: envelope?.requestId || (err.response?.headers?.[\"x-request-id\"] as string | undefined),\n };\n }\n\n if (err instanceof Error) {\n return { code: \"UNKNOWN\", message: err.message };\n }\n\n return { code: \"UNKNOWN\", message: \"Erro inesperado.\" };\n}\n\nfunction codeFromStatus(status?: number): string {\n switch (status) {\n case 400:\n return \"VALIDATION_ERROR\";\n case 401:\n return \"UNAUTHORIZED\";\n case 403:\n return \"FORBIDDEN\";\n case 404:\n return \"NOT_FOUND\";\n case 409:\n return \"CONFLICT\";\n default:\n return status && status >= 500 ? \"SERVER_ERROR\" : \"REQUEST_ERROR\";\n }\n}\n","/**\n * Armazenamento de token encapsulado (Seção 6.2). Toda leitura/escrita de\n * token passa por aqui — nada de `localStorage.getItem('token')` espalhado.\n * Tudo com try/catch para JSON/localStorage inválido não derrubar a tela.\n */\nconst STORAGE_KEY = \"oon.auth.token\";\n\nexport interface TokenStorage {\n get(): string | null;\n set(token: string): void;\n clear(): void;\n}\n\nexport function createTokenStorage(namespace?: string): TokenStorage {\n const key = namespace ? `${STORAGE_KEY}.${namespace}` : STORAGE_KEY;\n\n return {\n get() {\n try {\n return window.localStorage.getItem(key);\n } catch {\n return null;\n }\n },\n set(token: string) {\n try {\n window.localStorage.setItem(key, token);\n } catch {\n /* storage indisponível (modo privado) — ignora silenciosamente. */\n }\n },\n clear() {\n try {\n window.localStorage.removeItem(key);\n } catch {\n /* noop */\n }\n },\n };\n}\n\n/**\n * Lê o token vindo do SSO via query string (?code=...) e remove da URL para\n * não vazar em histórico/logs. Retorna o token capturado, se houver.\n */\nexport function captureTokenFromUrl(tokenParam = \"code\"): string | null {\n try {\n const url = new URL(window.location.href);\n const token = url.searchParams.get(tokenParam);\n if (!token) return null;\n url.searchParams.delete(tokenParam);\n window.history.replaceState({}, document.title, url.pathname + url.search + url.hash);\n return token;\n } catch {\n return null;\n }\n}\n","import { type ReactNode, useMemo } from \"react\";\nimport { ChakraProvider } from \"@chakra-ui/react\";\nimport { QueryClientProvider } from \"@tanstack/react-query\";\nimport type { AxiosInstance } from \"axios\";\nimport type { OonCoreFrontConfig } from \"../types\";\nimport { createOonQueryClient } from \"../config/queryClient\";\nimport { createOonSystem } from \"../config/theme\";\nimport { ApiProvider } from \"../api/ApiProvider\";\nimport { AuthProvider } from \"../security/AuthProvider\";\nimport type { TokenStorage } from \"../security/tokenStorage\";\n\nexport interface OonProvidersProps {\n config: OonCoreFrontConfig;\n http: AxiosInstance;\n storage: TokenStorage;\n children: ReactNode;\n}\n\n/**\n * Monta, em ordem (Seção 3.3), todos os providers globais. Nenhuma Central\n * cliente deve montar QueryClient/Chakra/Auth/Api manualmente.\n *\n * Ordem: QueryClient -> Chakra -> Api -> Auth -> (Router, montado fora).\n */\nexport function OonProviders({ config, http, storage, children }: OonProvidersProps) {\n const queryClient = useMemo(() => createOonQueryClient(), []);\n const system = useMemo(() => createOonSystem(config.theme), [config.theme]);\n const loginUrl = config.auth?.loginUrl ?? config.api.meusAppsUrl;\n\n return (\n <QueryClientProvider client={queryClient}>\n <ChakraProvider value={system}>\n <ApiProvider http={http}>\n <AuthProvider http={http} storage={storage} auth={config.auth} loginUrl={loginUrl}>\n {children}\n </AuthProvider>\n </ApiProvider>\n </ChakraProvider>\n </QueryClientProvider>\n );\n}\n","import { QueryClient } from \"@tanstack/react-query\";\n\n/** QueryClient padrão do Core, com defaults conservadores para telas admin. */\nexport function createOonQueryClient(): QueryClient {\n return new QueryClient({\n defaultOptions: {\n queries: {\n retry: 1,\n refetchOnWindowFocus: false,\n staleTime: 30 * 1000,\n },\n mutations: {\n retry: 0,\n },\n },\n });\n}\n","import { createSystem, defaultConfig, defineConfig, mergeConfigs } from \"@chakra-ui/react\";\nimport type { OonCoreFrontConfig } from \"../types\";\n\n/**\n * Paleta `brand` oondemand (portada de cst-multimoedas-frontend/styles/theming.js).\n * É o que dá à Central gerada o mesmo visual do projeto raiz: azul oondemand no\n * sidebar, estados ativos, botões e acentos — em vez do azul padrão do Chakra.\n */\nexport const brandColors = {\n brand: {\n 25: { value: \"#F5FBFF\" },\n 50: { value: \"#F0F7FF\" },\n 75: { value: \"#E6F2FF\" },\n 100: { value: \"#C7E3FF\" },\n 200: { value: \"#6CBCE8\" },\n 300: { value: \"#3FA6E0\" },\n 350: { value: \"#0F8DD0\" },\n 400: { value: \"#0580B9\" },\n 500: { value: \"#0474AF\" },\n 600: { value: \"#036491\" },\n 700: { value: \"#014364\" },\n 800: { value: \"#034167\" },\n 850: { value: \"#021D42\" },\n 900: { value: \"#011225\" },\n },\n} as const;\n\n/** Config base do Core: paleta brand + `colorPalette` default = brand. */\nconst oonThemeConfig = defineConfig({\n theme: {\n tokens: {\n colors: brandColors,\n },\n semanticTokens: {\n colors: {\n brand: {\n solid: { value: \"{colors.brand.500}\" },\n contrast: { value: \"white\" },\n fg: { value: \"{colors.brand.700}\" },\n muted: { value: \"{colors.brand.50}\" },\n subtle: { value: \"{colors.brand.75}\" },\n emphasized: { value: \"{colors.brand.600}\" },\n focusRing: { value: \"{colors.brand.500}\" },\n },\n },\n },\n },\n});\n\n/**\n * Constrói o `system` do Chakra para o Core. Parte do `defaultConfig`, aplica a\n * identidade oondemand e, por último, mescla qualquer override vindo de\n * `config.theme` (uma Central pode trocar a paleta sem reescrever o shell).\n */\nexport function createOonSystem(themeOverride?: OonCoreFrontConfig[\"theme\"]) {\n const base = mergeConfigs(defaultConfig, oonThemeConfig);\n const config = themeOverride\n ? mergeConfigs(base, defineConfig(themeOverride as Parameters<typeof defineConfig>[0]))\n : base;\n return createSystem(config);\n}\n\n/** System pronto com a identidade padrão (sem overrides). */\nexport const oonSystem = createOonSystem();\n","import { createContext, useContext, useMemo, type ReactNode } from \"react\";\nimport type { AxiosInstance } from \"axios\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport type { ModelSummary } from \"../types\";\nimport { createCoreClient, type CoreClient } from \"./coreClient\";\nimport { createResourceClient, type ResourceClient } from \"./resourceClient\";\n\ninterface ApiContextValue {\n http: AxiosInstance;\n core: CoreClient;\n resource: <T = Record<string, unknown>>(basePath: string) => ResourceClient<T>;\n}\n\nconst ApiContext = createContext<ApiContextValue | null>(null);\n\nexport function ApiProvider({ http, children }: { http: AxiosInstance; children: ReactNode }) {\n const value = useMemo<ApiContextValue>(() => {\n const cache = new Map<string, ResourceClient>();\n return {\n http,\n core: createCoreClient(http),\n resource<T = Record<string, unknown>>(basePath: string) {\n let client = cache.get(basePath);\n if (!client) {\n client = createResourceClient(http, basePath);\n cache.set(basePath, client);\n }\n return client as ResourceClient<T>;\n },\n };\n }, [http]);\n\n return <ApiContext.Provider value={value}>{children}</ApiContext.Provider>;\n}\n\nexport function useOonApi(): ApiContextValue {\n const ctx = useContext(ApiContext);\n if (!ctx) throw new Error(\"useOonApi deve ser usado dentro de <ApiProvider> (oonCoreFront.start).\");\n return ctx;\n}\n\n/** Cliente de um recurso, memoizado pelo basePath. */\nexport function useOonResource<T = Record<string, unknown>>(basePath: string): ResourceClient<T> {\n const { resource } = useOonApi();\n return useMemo(() => resource<T>(basePath), [resource, basePath]);\n}\n\n/** Metadata completa do back (cache de 5 min). */\nexport function useCoreMetadata() {\n const { core } = useOonApi();\n return useQuery({\n queryKey: [\"oon\", \"core\", \"metadata\"],\n queryFn: () => core.metadata(),\n staleTime: 5 * 60 * 1000,\n });\n}\n\n/** Descrição de uma model específica — base do modo \"dynamic\". */\nexport function useModelSchema(name: string) {\n const { core } = useOonApi();\n return useQuery<ModelSummary>({\n queryKey: [\"oon\", \"core\", \"model\", name],\n queryFn: () => core.model(name),\n staleTime: 5 * 60 * 1000,\n enabled: !!name,\n });\n}\n","import type { AxiosInstance } from \"axios\";\nimport type { CoreMetadata, ModelSummary } from \"../types\";\n\n/**\n * SDK do contrato /core/* (introspecção dirigida por metadata). É o que\n * permite o modo \"dynamic\" das coleções: o front monta grid/form/rotas a\n * partir do que o back descreve, sem código de UI por entidade.\n */\nexport interface CoreClient {\n metadata(): Promise<CoreMetadata>;\n models(): Promise<ModelSummary[]>;\n model(name: string): Promise<ModelSummary>;\n permissions(): Promise<Array<{ resource: string; action: string; roles: string[] }>>;\n menus(): Promise<CoreMetadata[\"menus\"]>;\n}\n\nexport function createCoreClient(http: AxiosInstance): CoreClient {\n return {\n async metadata() {\n const { data } = await http.get<CoreMetadata>(\"/core/metadata\");\n return data;\n },\n async models() {\n const { data } = await http.get<{ results: ModelSummary[] }>(\"/core/models\");\n return data.results;\n },\n async model(name) {\n const { data } = await http.get<ModelSummary>(`/core/models/${name}`);\n return data;\n },\n async permissions() {\n const { data } = await http.get<{ results: Array<{ resource: string; action: string; roles: string[] }> }>(\n \"/core/permissions\"\n );\n return data.results;\n },\n async menus() {\n const { data } = await http.get<{ results: CoreMetadata[\"menus\"] }>(\"/core/menus\");\n return data.results;\n },\n };\n}\n","import type { AxiosInstance } from \"axios\";\nimport type { AuditContext, ListParams, PaginatedResult } from \"../types\";\nimport { auditHeaders } from \"./createRestClient\";\n\n/**\n * SDK por recurso (Seção 2.5). Espelha o CRUD gerado pelo back em `basePath`:\n * GET / -> list (paginado)\n * GET /:id -> get\n * POST / -> create\n * PUT /:id -> update\n * PATCH /:id -> patch\n * DELETE /:id -> delete\n * POST /import -> importMany\n * GET /export -> exportAll\n *\n * O back devolve registro único na chave do singular (`{ [singular]: {...} }`);\n * `unwrap` extrai o primeiro valor não-meta para o consumidor não precisar\n * conhecer o singular.\n */\nexport interface ResourceClient<T = Record<string, unknown>> {\n list(params?: ListParams): Promise<PaginatedResult<T>>;\n get(id: string): Promise<T>;\n create(body: Partial<T>, audit?: AuditContext): Promise<T>;\n update(id: string, body: Partial<T>, audit?: AuditContext): Promise<T>;\n patch(id: string, body: Partial<T>, audit?: AuditContext): Promise<T>;\n delete(id: string, audit?: AuditContext): Promise<T>;\n importMany(rows: unknown[], audit?: AuditContext): Promise<{ inserted?: number; [k: string]: unknown }>;\n exportAll(params?: ListParams): Promise<T[]>;\n}\n\nconst META_KEYS = new Set([\"pagination\", \"results\", \"message\", \"requestId\"]);\n\nfunction unwrap<T>(data: Record<string, unknown>): T {\n // resposta tipo { pessoa: {...} } — pega o primeiro valor de objeto.\n for (const [key, value] of Object.entries(data)) {\n if (!META_KEYS.has(key) && value && typeof value === \"object\") {\n return value as T;\n }\n }\n return data as T;\n}\n\nexport function createResourceClient<T = Record<string, unknown>>(\n http: AxiosInstance,\n basePath: string\n): ResourceClient<T> {\n const base = `/${basePath.replace(/^\\/+/, \"\")}`;\n\n return {\n async list(params) {\n const { data } = await http.get<PaginatedResult<T>>(base, { params });\n return data;\n },\n async get(id) {\n const { data } = await http.get<Record<string, unknown>>(`${base}/${id}`);\n return unwrap<T>(data);\n },\n async create(body, audit) {\n const { data } = await http.post<Record<string, unknown>>(base, body, {\n headers: auditHeaders(audit ?? { origem: \"form\" }),\n });\n return unwrap<T>(data);\n },\n async update(id, body, audit) {\n const { data } = await http.put<Record<string, unknown>>(`${base}/${id}`, body, {\n headers: auditHeaders(audit ?? { origem: \"form\" }),\n });\n return unwrap<T>(data);\n },\n async patch(id, body, audit) {\n const { data } = await http.patch<Record<string, unknown>>(`${base}/${id}`, body, {\n headers: auditHeaders(audit ?? { origem: \"datagrid\" }),\n });\n return unwrap<T>(data);\n },\n async delete(id, audit) {\n const { data } = await http.delete<Record<string, unknown>>(`${base}/${id}`, {\n headers: auditHeaders(audit ?? { origem: \"datagrid\" }),\n });\n return unwrap<T>(data);\n },\n async importMany(rows, audit) {\n const { data } = await http.post<{ inserted?: number }>(\n `${base}/import`,\n { rows },\n { headers: auditHeaders(audit ?? { origem: \"import\" }) }\n );\n return data;\n },\n async exportAll(params) {\n const { data } = await http.get<{ results: T[] } | T[]>(`${base}/export`, { params });\n return Array.isArray(data) ? data : data.results;\n },\n };\n}\n","import { createContext, useContext, useEffect, useState, useCallback, type ReactNode } from \"react\";\nimport type { AxiosInstance } from \"axios\";\nimport type { OonAuthConfig, OonUser } from \"../types\";\nimport { captureTokenFromUrl, type TokenStorage } from \"./tokenStorage\";\n\ninterface AuthContextValue {\n user: OonUser | null;\n roles: string[];\n status: \"loading\" | \"authenticated\" | \"unauthenticated\";\n isAuthenticated: boolean;\n hasPermission: (permission?: string | string[]) => boolean;\n logout: () => void;\n}\n\nconst AuthContext = createContext<AuthContextValue | null>(null);\n\nexport interface AuthProviderProps {\n http: AxiosInstance;\n storage: TokenStorage;\n auth?: OonAuthConfig;\n /** URL externa de login (Meus Apps) para redirecionar quando sem sessão. */\n loginUrl?: string;\n children: ReactNode;\n}\n\n/**\n * Provider de autenticação do Core. Fluxo (Seção 2.4 do back / 6.2 da doc):\n * 1. captura token do ?code= e guarda no tokenStorage;\n * 2. valida em GET /auth/validar-token e resolve `usuario`;\n * 3. sem token/ inválido => redireciona para o login externo.\n *\n * Backend continua sendo a autoridade final — o RBAC do front é só UX.\n */\nexport function AuthProvider({ http, storage, auth, loginUrl, children }: AuthProviderProps) {\n const tokenParam = auth?.tokenParam ?? \"code\";\n const [user, setUser] = useState<OonUser | null>(null);\n const [status, setStatus] = useState<AuthContextValue[\"status\"]>(\"loading\");\n\n const redirectToLogin = useCallback(() => {\n if (loginUrl) {\n window.location.href = loginUrl;\n } else {\n setStatus(\"unauthenticated\");\n }\n }, [loginUrl]);\n\n const logout = useCallback(() => {\n storage.clear();\n setUser(null);\n redirectToLogin();\n }, [storage, redirectToLogin]);\n\n useEffect(() => {\n let active = true;\n\n const incoming = captureTokenFromUrl(tokenParam);\n if (incoming) storage.set(incoming);\n\n const token = storage.get();\n if (!token) {\n redirectToLogin();\n return;\n }\n\n http\n .get<{ usuario: OonUser }>(\"/auth/validar-token\")\n .then((res) => {\n if (!active) return;\n setUser(res.data.usuario);\n setStatus(\"authenticated\");\n })\n .catch(() => {\n if (!active) return;\n storage.clear();\n redirectToLogin();\n });\n\n return () => {\n active = false;\n };\n }, [http, storage, tokenParam, redirectToLogin]);\n\n const roles = user?.tipo ? [user.tipo] : [];\n\n const hasPermission = useCallback(\n (permission?: string | string[]) => {\n if (!permission) return true;\n const required = Array.isArray(permission) ? permission : [permission];\n if (required.length === 0) return true;\n // admin/master sempre passa; demais checam interseção simples por papel.\n if (roles.includes(\"admin\") || roles.includes(\"master\")) return true;\n return required.some((p) => roles.includes(p) || roles.some((r) => p.startsWith(`${r}.`)));\n },\n [roles]\n );\n\n const value: AuthContextValue = {\n user,\n roles,\n status,\n isAuthenticated: status === \"authenticated\",\n hasPermission,\n logout,\n };\n\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;\n}\n\nexport function useOonAuth(): AuthContextValue {\n const ctx = useContext(AuthContext);\n if (!ctx) throw new Error(\"useOonAuth deve ser usado dentro de <AuthProvider> (oonCoreFront.start).\");\n return ctx;\n}\n","import { useState } from \"react\";\nimport { Box, Heading, Stack } from \"@chakra-ui/react\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { CollectionMode, OonColumnDef, OonFormFieldDef } from \"../types\";\nimport { useModelSchema, useOonResource } from \"../api/ApiProvider\";\nimport { columnsFromMeta, formFieldsFromMeta } from \"./internal/fieldUtils\";\nimport { DataGrid } from \"./internal/DataGrid\";\nimport { DynamicForm } from \"./internal/DynamicForm\";\nimport { LoadingScreen } from \"../shell/LoadingScreen\";\nimport { ErrorState } from \"../shell/ErrorState\";\n\nexport interface CoreCollectionProps {\n model: string;\n label?: string;\n /**\n * Três formas de declarar a coleção (Seção 4.4):\n * - \"full\" : colunas + form explícitos (passe `columns` e `form`).\n * - \"minimal\" : só `model`; Core busca a metadata e deriva tudo.\n * - \"dynamic\" : 100% dirigido por /core/models/:model (default).\n */\n mode?: CollectionMode;\n /** basePath do recurso; default vem da metadata da model. */\n endpoint?: string;\n columns?: OonColumnDef[];\n form?: OonFormFieldDef[];\n importExport?: boolean;\n}\n\ntype FormState = { open: false } | { open: true; row?: Record<string, unknown> };\n\n/**\n * Componente Core de coleção. Renderiza grid + form de qualquer model do back\n * sem código de UI por entidade. No modo dinâmico, lê /core/models/:model e\n * monta colunas, formulário e endpoint a partir da metadata — esse é o\n * critério de pronto da Fase 3.\n */\nexport function CoreCollection({ model, label, mode = \"dynamic\", endpoint, columns, form, importExport }: CoreCollectionProps) {\n const needsSchema = mode !== \"full\" || !columns || !form || !endpoint;\n const schemaQuery = useModelSchema(needsSchema ? model : \"\");\n\n // Resolve endpoint/colunas/form: props têm prioridade; metadata preenche o resto.\n const schema = schemaQuery.data;\n const basePath = endpoint ?? schema?.basePath ?? `/${model.toLowerCase()}s`;\n const resolvedColumns = columns ?? (schema ? columnsFromMeta(schema.fields) : []);\n const resolvedForm = form ?? (schema ? formFieldsFromMeta(schema.fields) : []);\n\n const resource = useOonResource(basePath);\n const queryClient = useQueryClient();\n const [formState, setFormState] = useState<FormState>({ open: false });\n const [formError, setFormError] = useState<string | null>(null);\n\n const invalidate = () => queryClient.invalidateQueries({ queryKey: [\"oon\", \"list\", basePath] });\n\n const saveMutation = useMutation({\n mutationFn: (values: Record<string, unknown>) => {\n const editingRow = formState.open ? formState.row : undefined;\n const id = editingRow?._id as string | undefined;\n return id ? resource.update(id, values) : resource.create(values);\n },\n onSuccess: () => {\n setFormState({ open: false });\n setFormError(null);\n invalidate();\n },\n onError: (err) => setFormError(err.message),\n });\n\n const deleteMutation = useMutation({\n mutationFn: (row: Record<string, unknown>) => resource.delete(row._id as string),\n onSuccess: invalidate,\n });\n\n if (needsSchema && schemaQuery.isLoading) return <LoadingScreen />;\n if (needsSchema && schemaQuery.isError) return <ErrorState error={schemaQuery.error} />;\n\n const title = label ?? schema?.name ?? model;\n\n return (\n <Stack gap={6}>\n <Heading size=\"lg\">{title}</Heading>\n\n {formState.open ? (\n <DynamicForm\n title={formState.row ? `Editar ${title}` : `Novo ${title}`}\n fields={resolvedForm}\n initialValues={formState.row}\n submitting={saveMutation.isPending}\n error={formError}\n onSubmit={(values) => saveMutation.mutate(values)}\n onCancel={() => {\n setFormState({ open: false });\n setFormError(null);\n }}\n />\n ) : (\n <Box>\n <DataGrid\n resource={resource}\n resourceKey={basePath}\n columns={resolvedColumns}\n onCreate={() => setFormState({ open: true })}\n onEdit={(row) => setFormState({ open: true, row })}\n onDelete={(row) => {\n if (window.confirm(\"Excluir este registro?\")) deleteMutation.mutate(row);\n }}\n />\n {importExport ? null /* hook de import/export entra aqui (resource.importMany/exportAll) */ : null}\n </Box>\n )}\n </Stack>\n );\n}\n","import type { FieldKind, FieldMeta, OonColumnDef, OonFormFieldDef } from \"../../types\";\n\n/** Campos que normalmente não fazem sentido em grid/form de CRUD. */\nconst HIDDEN_FIELDS = new Set([\"__v\", \"_id\", \"createdAt\", \"updatedAt\", \"criadoEm\", \"atualizadoEm\"]);\n\nexport function isEditableField(meta: FieldMeta): boolean {\n return !HIDDEN_FIELDS.has(meta.name) && meta.kind !== \"raw\";\n}\n\nexport function fieldLabel(meta: { name: string; label?: string }): string {\n if (meta.label) return meta.label;\n // humaniza: camelCase/snake_case -> \"Camel Case\".\n return meta.name\n .replace(/_/g, \" \")\n .replace(/([a-z])([A-Z])/g, \"$1 $2\")\n .replace(/^./, (c) => c.toUpperCase());\n}\n\n/** Deriva colunas de grid a partir da metadata da model (modo dynamic/minimal). */\nexport function columnsFromMeta(fields: FieldMeta[]): OonColumnDef[] {\n return fields\n .filter(isEditableField)\n .slice(0, 8)\n .map((f) => ({ field: f.name, label: fieldLabel(f), kind: f.kind, sortable: true }));\n}\n\n/** Deriva campos de formulário a partir da metadata da model. */\nexport function formFieldsFromMeta(fields: FieldMeta[]): OonFormFieldDef[] {\n return fields.filter(isEditableField).map((f) => ({\n field: f.name,\n label: fieldLabel(f),\n kind: f.kind,\n options: f.options,\n }));\n}\n\n/** Formata um valor de célula conforme o tipo declarado. */\nexport function formatCell(value: unknown, kind?: FieldKind): string {\n if (value == null || value === \"\") return \"—\";\n switch (kind) {\n case \"boolean\":\n return value ? \"Sim\" : \"Não\";\n case \"date\":\n try {\n return new Date(value as string).toLocaleDateString(\"pt-BR\");\n } catch {\n return String(value);\n }\n case \"currency\":\n case \"currencyConverted\":\n return new Intl.NumberFormat(\"pt-BR\", { style: \"currency\", currency: \"BRL\" }).format(Number(value));\n case \"ref\":\n // ref populada vem como objeto { _id, nome/label } ou string id.\n if (value && typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n return String(obj.nome ?? obj.label ?? obj.descricao ?? obj._id ?? \"—\");\n }\n return String(value);\n default:\n return String(value);\n }\n}\n","import { useState, type ReactNode } from \"react\";\nimport { Box, Button, Flex, Input, Spacer, Table, Text } from \"@chakra-ui/react\";\nimport { keepPreviousData, useQuery } from \"@tanstack/react-query\";\nimport type { OonColumnDef } from \"../../types\";\nimport type { ResourceClient } from \"../../api/resourceClient\";\nimport { formatCell } from \"./fieldUtils\";\nimport { LoadingScreen } from \"../../shell/LoadingScreen\";\nimport { ErrorState } from \"../../shell/ErrorState\";\n\nexport interface DataGridProps {\n resource: ResourceClient;\n resourceKey: string;\n columns: OonColumnDef[];\n search?: boolean;\n onCreate?: () => void;\n onEdit?: (row: Record<string, unknown>) => void;\n onDelete?: (row: Record<string, unknown>) => void;\n toolbarExtra?: ReactNode;\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Grid genérico dirigido pelo `ResourceClient`. Paginação/ordenação/busca são\n * server-side (contrato do back: pageIndex/pageSize/searchTerm/sort). Não\n * conhece nenhuma entidade específica.\n */\nexport function DataGrid({\n resource,\n resourceKey,\n columns,\n search = true,\n onCreate,\n onEdit,\n onDelete,\n toolbarExtra,\n}: DataGridProps) {\n const [pageIndex, setPageIndex] = useState(0);\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [sort, setSort] = useState<string | undefined>(undefined);\n\n const query = useQuery({\n queryKey: [\"oon\", \"list\", resourceKey, { pageIndex, searchTerm, sort }],\n queryFn: () => resource.list({ pageIndex, pageSize: PAGE_SIZE, searchTerm: searchTerm || undefined, sort }),\n placeholderData: keepPreviousData,\n });\n\n const toggleSort = (field: string) => {\n setPageIndex(0);\n setSort((prev) => {\n if (prev === `${field}.asc`) return `${field}.desc`;\n if (prev === `${field}.desc`) return undefined;\n return `${field}.asc`;\n });\n };\n\n const pagination = query.data?.pagination;\n const rows = query.data?.results ?? [];\n\n return (\n <Box>\n <Flex mb={4} gap={3} align=\"center\">\n {search ? (\n <Input\n size=\"sm\"\n maxW=\"320px\"\n placeholder=\"Buscar...\"\n value={searchTerm}\n onChange={(e) => {\n setPageIndex(0);\n setSearchTerm(e.target.value);\n }}\n />\n ) : null}\n <Spacer />\n {toolbarExtra}\n {onCreate ? (\n <Button size=\"sm\" colorPalette=\"blue\" onClick={onCreate}>\n Novo\n </Button>\n ) : null}\n </Flex>\n\n {query.isLoading ? (\n <LoadingScreen />\n ) : query.isError ? (\n <ErrorState error={query.error} />\n ) : (\n <Box borderWidth=\"1px\" borderColor=\"gray.200\" borderRadius=\"md\" overflowX=\"auto\" bg=\"white\">\n <Table.Root size=\"sm\" interactive>\n <Table.Header>\n <Table.Row>\n {columns.map((col) => (\n <Table.ColumnHeader\n key={col.field}\n cursor={col.sortable ? \"pointer\" : undefined}\n onClick={col.sortable ? () => toggleSort(col.field) : undefined}\n >\n {col.label ?? col.field}\n {sort?.startsWith(`${col.field}.`) ? (sort.endsWith(\".asc\") ? \" ▲\" : \" ▼\") : \"\"}\n </Table.ColumnHeader>\n ))}\n {onEdit || onDelete ? <Table.ColumnHeader textAlign=\"end\">Ações</Table.ColumnHeader> : null}\n </Table.Row>\n </Table.Header>\n <Table.Body>\n {rows.length === 0 ? (\n <Table.Row>\n <Table.Cell colSpan={columns.length + 1}>\n <Text color=\"gray.400\" py={6} textAlign=\"center\">\n Nenhum registro encontrado.\n </Text>\n </Table.Cell>\n </Table.Row>\n ) : (\n rows.map((row, idx) => (\n <Table.Row key={(row._id as string) ?? idx}>\n {columns.map((col) => (\n <Table.Cell key={col.field}>{formatCell(row[col.field], col.kind)}</Table.Cell>\n ))}\n {onEdit || onDelete ? (\n <Table.Cell textAlign=\"end\">\n <Flex gap={2} justify=\"end\">\n {onEdit ? (\n <Button size=\"xs\" variant=\"ghost\" onClick={() => onEdit(row)}>\n Editar\n </Button>\n ) : null}\n {onDelete ? (\n <Button size=\"xs\" variant=\"ghost\" colorPalette=\"red\" onClick={() => onDelete(row)}>\n Excluir\n </Button>\n ) : null}\n </Flex>\n </Table.Cell>\n ) : null}\n </Table.Row>\n ))\n )}\n </Table.Body>\n </Table.Root>\n </Box>\n )}\n\n {pagination ? (\n <Flex mt={4} align=\"center\" gap={3}>\n <Text fontSize=\"sm\" color=\"gray.500\">\n {pagination.totalItems} registro(s) · página {pagination.currentPage} de {pagination.totalPages}\n </Text>\n <Spacer />\n <Button size=\"xs\" variant=\"outline\" disabled={pageIndex <= 0} onClick={() => setPageIndex((p) => p - 1)}>\n Anterior\n </Button>\n <Button\n size=\"xs\"\n variant=\"outline\"\n disabled={pagination.currentPage >= pagination.totalPages}\n onClick={() => setPageIndex((p) => p + 1)}\n >\n Próxima\n </Button>\n </Flex>\n ) : null}\n </Box>\n );\n}\n","import { Flex, Spinner, Text } from \"@chakra-ui/react\";\n\n/** Tela de carregamento/estado neutro reutilizada por guards e Suspense. */\nexport function LoadingScreen({ message }: { message?: string }) {\n return (\n <Flex direction=\"column\" align=\"center\" justify=\"center\" minH=\"60vh\" gap={4}>\n <Spinner size=\"lg\" />\n {message ? (\n <Text color=\"gray.500\" fontSize=\"sm\">\n {message}\n </Text>\n ) : null}\n </Flex>\n );\n}\n","import { Box, Heading, Text } from \"@chakra-ui/react\";\n\n/**\n * Estado de erro padrão. Aceita tanto o `OonError` do client quanto um `Error`\n * cru (o que o React Query tipa em `query.error`) — só precisa de `message` e,\n * opcionalmente, `requestId`.\n */\nexport function ErrorState({\n error,\n title = \"Não foi possível carregar\",\n}: {\n error?: { message?: string; requestId?: string } | null;\n title?: string;\n}) {\n return (\n <Box borderWidth=\"1px\" borderColor=\"red.200\" bg=\"red.50\" borderRadius=\"md\" p={4}>\n <Heading size=\"sm\" color=\"red.700\">\n {title}\n </Heading>\n <Text mt={1} fontSize=\"sm\" color=\"red.600\">\n {error?.message ?? \"Erro inesperado.\"}\n </Text>\n {error?.requestId ? (\n <Text mt={2} fontSize=\"xs\" color=\"red.400\">\n requestId: {error.requestId}\n </Text>\n ) : null}\n </Box>\n );\n}\n","import { useState, type FormEvent } from \"react\";\nimport { Box, Button, Flex, Heading, Input, Stack, Text, NativeSelect } from \"@chakra-ui/react\";\nimport type { OonFormFieldDef } from \"../../types\";\nimport { fieldLabel } from \"./fieldUtils\";\n\nexport interface DynamicFormProps {\n title: string;\n fields: OonFormFieldDef[];\n initialValues?: Record<string, unknown>;\n submitting?: boolean;\n error?: string | null;\n onSubmit: (values: Record<string, unknown>) => void;\n onCancel: () => void;\n}\n\nfunction coerce(value: string, kind?: string): unknown {\n if (value === \"\") return undefined;\n if (kind === \"number\" || kind === \"currency\" || kind === \"currencyConverted\") return Number(value);\n if (kind === \"boolean\") return value === \"true\";\n return value;\n}\n\nfunction toInputValue(value: unknown, kind?: string): string {\n if (value == null) return \"\";\n if (kind === \"date\" && value) {\n try {\n return new Date(value as string).toISOString().slice(0, 10);\n } catch {\n return \"\";\n }\n }\n if (typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n return String(obj._id ?? \"\");\n }\n return String(value);\n}\n\n/**\n * Formulário gerado a partir das definições de campo (modo dynamic monta isto\n * direto da metadata). Render por `kind`: enum -> select; boolean -> select\n * Sim/Não; date -> input date; currency/number -> number; demais -> texto.\n */\nexport function DynamicForm({ title, fields, initialValues, submitting, error, onSubmit, onCancel }: DynamicFormProps) {\n const [values, setValues] = useState<Record<string, string>>(() => {\n const init: Record<string, string> = {};\n for (const f of fields) init[f.field] = toInputValue(initialValues?.[f.field], f.kind);\n return init;\n });\n\n const setField = (name: string, value: string) => setValues((prev) => ({ ...prev, [name]: value }));\n\n const handleSubmit = (e: FormEvent) => {\n e.preventDefault();\n const payload: Record<string, unknown> = {};\n for (const f of fields) {\n const coerced = coerce(values[f.field] ?? \"\", f.kind);\n if (coerced !== undefined) payload[f.field] = coerced;\n }\n onSubmit(payload);\n };\n\n return (\n <Box borderWidth=\"1px\" borderColor=\"gray.200\" borderRadius=\"md\" bg=\"white\" p={6} maxW=\"640px\">\n <Heading size=\"md\" mb={4}>\n {title}\n </Heading>\n <form onSubmit={handleSubmit}>\n <Stack gap={4}>\n {fields.map((f) => {\n const label = fieldLabel({ name: f.field, label: f.label });\n if (f.kind === \"enum\" && f.options?.length) {\n return (\n <Box key={f.field}>\n <Text fontSize=\"sm\" mb={1} fontWeight=\"medium\">\n {label}\n </Text>\n <NativeSelect.Root size=\"sm\">\n <NativeSelect.Field\n value={values[f.field] ?? \"\"}\n onChange={(e) => setField(f.field, e.currentTarget.value)}\n >\n <option value=\"\">—</option>\n {f.options.map((opt) => (\n <option key={opt} value={opt}>\n {opt}\n </option>\n ))}\n </NativeSelect.Field>\n <NativeSelect.Indicator />\n </NativeSelect.Root>\n </Box>\n );\n }\n if (f.kind === \"boolean\") {\n return (\n <Box key={f.field}>\n <Text fontSize=\"sm\" mb={1} fontWeight=\"medium\">\n {label}\n </Text>\n <NativeSelect.Root size=\"sm\">\n <NativeSelect.Field\n value={values[f.field] ?? \"\"}\n onChange={(e) => setField(f.field, e.currentTarget.value)}\n >\n <option value=\"\">—</option>\n <option value=\"true\">Sim</option>\n <option value=\"false\">Não</option>\n </NativeSelect.Field>\n <NativeSelect.Indicator />\n </NativeSelect.Root>\n </Box>\n );\n }\n const inputType =\n f.kind === \"date\"\n ? \"date\"\n : f.kind === \"number\" || f.kind === \"currency\" || f.kind === \"currencyConverted\"\n ? \"number\"\n : \"text\";\n return (\n <Box key={f.field}>\n <Text fontSize=\"sm\" mb={1} fontWeight=\"medium\">\n {label}\n {f.required ? \" *\" : \"\"}\n </Text>\n <Input\n size=\"sm\"\n type={inputType}\n required={f.required}\n value={values[f.field] ?? \"\"}\n onChange={(e) => setField(f.field, e.currentTarget.value)}\n />\n </Box>\n );\n })}\n\n {error ? (\n <Text fontSize=\"sm\" color=\"red.600\">\n {error}\n </Text>\n ) : null}\n\n <Flex gap={3} justify=\"end\" mt={2}>\n <Button size=\"sm\" variant=\"ghost\" type=\"button\" onClick={onCancel}>\n Cancelar\n </Button>\n <Button size=\"sm\" colorPalette=\"blue\" type=\"submit\" loading={submitting}>\n Salvar\n </Button>\n </Flex>\n </Stack>\n </form>\n </Box>\n );\n}\n","import type { OonColumnDef, OonFormFieldDef } from \"../types\";\nimport { useOonApi } from \"../api/ApiProvider\";\nimport { CoreCollection } from \"./CoreCollection\";\n\nexport interface CoreDocumentProps {\n model: string;\n label?: string;\n endpoint?: string;\n columns?: OonColumnDef[];\n form?: OonFormFieldDef[];\n /** liga ações de aprovar/reprovar (RESTful: /:id/actions/approve|reject). */\n approval?: boolean;\n /** liga gestão de anexos (futuro: /:id/files). */\n attachments?: boolean;\n}\n\n/**\n * Tipo documental. Hoje reusa a coleção genérica (list + CRUD). Quando\n * `approval` está ligado, expõe o helper `approveDocument` para as ações\n * RESTful do back (Seção 5.2) — documentos fiscais e cadastrais viram\n * configuração, não páginas escritas à mão.\n */\nexport function CoreDocument({ model, label, endpoint, columns, form }: CoreDocumentProps) {\n return (\n <CoreCollection\n model={model}\n label={label}\n mode={columns && form ? \"full\" : \"dynamic\"}\n endpoint={endpoint}\n columns={columns}\n form={form}\n />\n );\n}\n\n/**\n * Aciona uma ação RESTful de documento (approve/reject/archive). Exposto para\n * o domínio usar em botões de linha sem reimplementar a chamada.\n */\nexport function useDocumentAction(basePath: string) {\n const { http } = useOonApi();\n return (id: string, action: \"approve\" | \"reject\" | \"archive\") =>\n http.post(`${basePath}/${id}/actions/${action}`, {}, { headers: { \"x-oon-origin\": \"form\" } });\n}\n","import { Box, Flex, Heading, Stack, Text } from \"@chakra-ui/react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useModelSchema, useOonResource } from \"../api/ApiProvider\";\nimport { LoadingScreen } from \"../shell/LoadingScreen\";\nimport { ErrorState } from \"../shell/ErrorState\";\nimport { formatCell } from \"./internal/fieldUtils\";\n\nexport interface CorePipelineProps {\n model: string;\n label?: string;\n endpoint?: string;\n /** campo do registro que define a coluna/etapa. Default: \"status\". */\n stageField?: string;\n /** etapas fixas; se omitido, derivadas do enum de `stageField`. */\n stages?: Array<{ id: string; label: string }>;\n /** campo exibido como título do card. Default: primeiro string. */\n titleField?: string;\n}\n\n/**\n * Esteira (kanban) genérica do Core. Agrupa registros por `stageField` em\n * colunas. As etapas vêm das props ou são derivadas do enum declarado na\n * metadata da model — nenhuma esteira específica hardcoded.\n */\nexport function CorePipeline({ model, label, endpoint, stageField = \"status\", stages, titleField }: CorePipelineProps) {\n const schemaQuery = useModelSchema(model);\n const schema = schemaQuery.data;\n const basePath = endpoint ?? schema?.basePath ?? `/${model.toLowerCase()}s`;\n const resource = useOonResource(basePath);\n\n const listQuery = useQuery({\n queryKey: [\"oon\", \"pipeline\", basePath],\n queryFn: () => resource.list({ pageSize: 200 }),\n enabled: !!schema,\n });\n\n if (schemaQuery.isLoading || listQuery.isLoading) return <LoadingScreen />;\n if (schemaQuery.isError) return <ErrorState error={schemaQuery.error} />;\n if (listQuery.isError) return <ErrorState error={listQuery.error} />;\n\n const stageFieldMeta = schema?.fields.find((f) => f.name === stageField);\n const resolvedStages =\n stages ??\n (stageFieldMeta?.options ?? []).map((opt) => ({ id: opt, label: opt })) ?? [];\n\n const title =\n titleField ?? schema?.fields.find((f) => f.kind === \"string\")?.name ?? schema?.searchable[0] ?? \"_id\";\n\n const rows = listQuery.data?.results ?? [];\n const byStage = new Map<string, Record<string, unknown>[]>();\n for (const stage of resolvedStages) byStage.set(stage.id, []);\n for (const row of rows) {\n const key = String(row[stageField] ?? \"\");\n if (!byStage.has(key)) byStage.set(key, []);\n byStage.get(key)!.push(row);\n }\n\n return (\n <Stack gap={6}>\n <Heading size=\"lg\">{label ?? schema?.name ?? model}</Heading>\n <Flex gap={4} align=\"stretch\" overflowX=\"auto\" pb={2}>\n {Array.from(byStage.entries()).map(([stageId, items]) => {\n const stageLabel = resolvedStages.find((s) => s.id === stageId)?.label ?? (stageId || \"—\");\n return (\n <Box key={stageId} minW=\"280px\" bg=\"gray.100\" borderRadius=\"md\" p={3}>\n <Flex align=\"center\" justify=\"space-between\" mb={3}>\n <Text fontWeight=\"semibold\" fontSize=\"sm\">\n {stageLabel}\n </Text>\n <Text fontSize=\"xs\" color=\"gray.500\">\n {items.length}\n </Text>\n </Flex>\n <Stack gap={2}>\n {items.map((row, idx) => (\n <Box key={(row._id as string) ?? idx} bg=\"white\" borderRadius=\"md\" p={3} borderWidth=\"1px\" borderColor=\"gray.200\">\n <Text fontSize=\"sm\" fontWeight=\"medium\">\n {formatCell(row[title], \"string\")}\n </Text>\n </Box>\n ))}\n </Stack>\n </Box>\n );\n })}\n </Flex>\n </Stack>\n );\n}\n","import { Box, Heading, SimpleGrid, Stack, Text } from \"@chakra-ui/react\";\nimport { useQueries } from \"@tanstack/react-query\";\nimport type { DashboardWidgetDef } from \"../types\";\nimport { useOonApi } from \"../api/ApiProvider\";\n\nexport interface CoreDashboardProps {\n label?: string;\n widgets?: DashboardWidgetDef[];\n}\n\n/**\n * Dashboard do Core: renderiza widgets registrados (count/sum por model ou\n * render custom). Cache, loading e erro ficam no Core; a Central só declara.\n */\nexport function CoreDashboard({ label = \"Dashboard\", widgets = [] }: CoreDashboardProps) {\n const { resource } = useOonApi();\n\n const queries = useQueries({\n queries: widgets\n .filter((w) => w.kind !== \"custom\" && w.model)\n .map((w) => ({\n queryKey: [\"oon\", \"widget\", w.id],\n queryFn: async () => {\n const r = await resource(`/${w.model!.toLowerCase()}s`).list({ pageSize: w.kind === \"sum\" ? 200 : 1 });\n if (w.kind === \"sum\" && w.field) {\n return r.results.reduce((acc, row) => acc + Number((row as Record<string, unknown>)[w.field!] ?? 0), 0);\n }\n return r.pagination.totalItems;\n },\n staleTime: 60 * 1000,\n })),\n });\n\n let queryIdx = 0;\n\n return (\n <Stack gap={6}>\n <Heading size=\"lg\">{label}</Heading>\n <SimpleGrid columns={{ base: 1, md: 2, lg: 3 }} gap={4}>\n {widgets.map((w) => {\n if (w.kind === \"custom\" && w.render) {\n return (\n <Box key={w.id} borderWidth=\"1px\" borderColor=\"gray.200\" borderRadius=\"md\" bg=\"white\" p={5}>\n {w.render()}\n </Box>\n );\n }\n const q = queries[queryIdx++];\n const value = q?.isLoading ? \"…\" : q?.isError ? \"—\" : formatWidget(q?.data, w.kind, w.field);\n return (\n <Box key={w.id} borderWidth=\"1px\" borderColor=\"gray.200\" borderRadius=\"md\" bg=\"white\" p={5}>\n <Text fontSize=\"sm\" color=\"gray.500\">\n {w.label}\n </Text>\n <Heading size=\"xl\" mt={1}>\n {value}\n </Heading>\n </Box>\n );\n })}\n </SimpleGrid>\n </Stack>\n );\n}\n\nfunction formatWidget(value: unknown, kind?: string, field?: string): string {\n if (value == null) return \"—\";\n if ((kind === \"sum\" && field?.toLowerCase().includes(\"valor\")) || kind === \"sum\") {\n return new Intl.NumberFormat(\"pt-BR\", { style: \"currency\", currency: \"BRL\" }).format(Number(value));\n }\n return String(value);\n}\n","import type {\n CollectionViewDef,\n DashboardViewDef,\n DocumentViewDef,\n OonCoreFrontConfig,\n OonMenuItem,\n OonRoute,\n OonViewDefinition,\n PipelineViewDef,\n} from \"../types\";\nimport { CoreCollection } from \"../components/CoreCollection\";\nimport { CoreDocument } from \"../components/CoreDocument\";\nimport { CorePipeline } from \"../components/CorePipeline\";\nimport { CoreDashboard } from \"../components/CoreDashboard\";\n\n/** Resultado da resolução de módulos + manifesto de UI em rotas e menu. */\nexport interface ResolvedRegistry {\n routes: OonRoute[];\n menu: OonMenuItem[];\n}\n\nfunction slug(value: string): string {\n return value\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\nfunction viewId(view: OonViewDefinition): string {\n if (view.id) return view.id;\n if (view.type === \"dashboard\") return \"dashboard\";\n return slug(view.model);\n}\n\nfunction viewPath(view: OonViewDefinition): string {\n if (view.path) return view.path;\n if (view.type === \"dashboard\") return \"/\";\n return `/${viewId(view)}`;\n}\n\nfunction viewLabel(view: OonViewDefinition): string {\n if (view.label) return view.label;\n if (view.type === \"dashboard\") return \"Dashboard\";\n return view.model;\n}\n\n/** Converte uma view declarativa no componente Core correspondente. */\nfunction renderView(view: OonViewDefinition) {\n switch (view.type) {\n case \"collection\": {\n const v = view as CollectionViewDef;\n return (\n <CoreCollection\n model={v.model}\n mode={v.mode}\n columns={v.columns}\n form={v.form}\n label={viewLabel(v)}\n importExport={v.importExport}\n />\n );\n }\n case \"document\": {\n const v = view as DocumentViewDef;\n return <CoreDocument model={v.model} label={viewLabel(v)} approval={v.approval} attachments={v.attachments} />;\n }\n case \"pipeline\": {\n const v = view as PipelineViewDef;\n return (\n <CorePipeline\n model={v.model}\n label={viewLabel(v)}\n stageField={v.stageField}\n stages={v.stages}\n />\n );\n }\n case \"dashboard\": {\n const v = view as DashboardViewDef;\n return <CoreDashboard label={viewLabel(v)} widgets={v.widgets} />;\n }\n default:\n return null;\n }\n}\n\nfunction viewToRoute(view: OonViewDefinition): OonRoute {\n return {\n path: viewPath(view),\n element: renderView(view),\n permissions: \"permissions\" in view ? view.permissions : undefined,\n };\n}\n\nfunction viewToMenu(view: OonViewDefinition): OonMenuItem {\n return {\n label: viewLabel(view),\n href: viewPath(view),\n icon: view.icon,\n section: view.section,\n permissions: \"permissions\" in view ? view.permissions : undefined,\n };\n}\n\n/**\n * Resolve a config inteira (módulos + `ui.views`) em um registry plano de\n * rotas e menu. É o que substitui o `router.jsx` hardcoded por geração\n * dirigida por declaração/metadata.\n */\nexport function resolveRegistry(config: OonCoreFrontConfig): ResolvedRegistry {\n const routes: OonRoute[] = [];\n const menu: OonMenuItem[] = [];\n const seenPaths = new Set<string>();\n\n const pushRoute = (route: OonRoute) => {\n if (seenPaths.has(route.path)) return;\n seenPaths.add(route.path);\n routes.push(route);\n };\n\n for (const mod of config.modules ?? []) {\n for (const route of mod.routes ?? []) pushRoute(route);\n for (const item of mod.menu ?? []) menu.push(item);\n for (const view of mod.views ?? []) {\n pushRoute(viewToRoute(view));\n menu.push(viewToMenu(view));\n }\n }\n\n for (const view of config.ui?.views ?? []) {\n pushRoute(viewToRoute(view));\n menu.push(viewToMenu(view));\n }\n\n menu.sort((a, b) => (a.order ?? 100) - (b.order ?? 100));\n return { routes, menu };\n}\n","import { createBrowserRouter, type RouteObject } from \"react-router-dom\";\nimport type { OonAppConfig, OonMenuItem, OonRoute, OonSecurityConfig } from \"../types\";\nimport { AuthenticatedLayout } from \"../shell/AuthenticatedLayout\";\nimport { RouteGuard } from \"../security/RouteGuard\";\n\nexport interface RouterInput {\n app: OonAppConfig;\n menu: OonMenuItem[];\n routes: OonRoute[];\n security?: OonSecurityConfig;\n}\n\n/**\n * Constrói o router a partir do registry resolvido (rotas dos módulos/views).\n * Rotas privadas ficam sob o layout autenticado e passam pelo RouteGuard;\n * rotas `public: true` ficam fora do layout.\n */\nexport function createOonRouter({ app, menu, routes, security }: RouterInput) {\n const guardEnabled = security?.enableRouteGuard !== false;\n\n const publicRoutes: RouteObject[] = routes\n .filter((r) => r.public)\n .map((r) => ({ path: r.path, element: r.element }));\n\n const privateRoutes: RouteObject[] = routes\n .filter((r) => !r.public)\n .map((r) => {\n const element = guardEnabled ? <RouteGuard permission={r.permissions}>{r.element}</RouteGuard> : r.element;\n // Rota raiz vira index route; demais usam path relativo ao layout.\n return r.path === \"/\" ? { index: true, element } : { path: r.path.replace(/^\\//, \"\"), element };\n });\n\n const tree: RouteObject[] = [\n ...publicRoutes,\n {\n path: \"/\",\n element: <AuthenticatedLayout app={app} menu={menu} />,\n children: privateRoutes,\n },\n ];\n\n return createBrowserRouter(tree);\n}\n","import { Box, Button, Flex, Spacer, Text } from \"@chakra-ui/react\";\nimport { Outlet } from \"react-router-dom\";\nimport type { OonAppConfig, OonMenuItem } from \"../types\";\nimport { useOonAuth } from \"../security/AuthProvider\";\nimport { Sidebar } from \"./Sidebar\";\n\n/**\n * Layout autenticado do Core: sidebar + topbar com usuário e logout.\n * Totalmente orientado por `appConfig` e pelo menu resolvido do registry.\n */\nexport function AuthenticatedLayout({ app, menu }: { app: OonAppConfig; menu: OonMenuItem[] }) {\n const { user, logout } = useOonAuth();\n\n return (\n <Flex align=\"stretch\" minH=\"100vh\" bg=\"gray.50\">\n <Sidebar app={app} menu={menu} />\n <Flex direction=\"column\" flex=\"1\" minW={0}>\n <Flex as=\"header\" align=\"center\" px={6} py={3} borderBottomWidth=\"1px\" borderColor=\"gray.200\" bg=\"white\">\n <Text fontSize=\"sm\" color=\"gray.500\">\n {app.title ?? app.name}\n </Text>\n <Spacer />\n {user ? (\n <Flex align=\"center\" gap={3}>\n <Text fontSize=\"sm\" color=\"gray.700\">\n {user.nome}\n </Text>\n <Button size=\"xs\" variant=\"outline\" colorPalette=\"brand\" onClick={logout}>\n Sair\n </Button>\n </Flex>\n ) : null}\n </Flex>\n <Box as=\"main\" flex=\"1\" p={6} minW={0}>\n <Outlet />\n </Box>\n </Flex>\n </Flex>\n );\n}\n","import { Box, Flex, Image, Stack, Text } from \"@chakra-ui/react\";\nimport { NavLink } from \"react-router-dom\";\nimport type { OonAppConfig, OonMenuItem } from \"../types\";\nimport { useOonAuth } from \"../security/AuthProvider\";\n\n/** Agrupa itens de menu por seção, preservando ordem de inserção. */\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 ?? \"\";\n if (!groups.has(section)) groups.set(section, []);\n groups.get(section)!.push(item);\n }\n return Array.from(groups.entries());\n}\n\n/**\n * Menu lateral dirigido pelo registry. Esconde itens sem permissão (UX).\n * Nada de label/itens hardcoded: tudo vem de `appConfig` e do menu resolvido.\n */\nexport function Sidebar({ app, menu }: { app: OonAppConfig; menu: OonMenuItem[] }) {\n const { hasPermission } = useOonAuth();\n const visible = menu.filter((item) => hasPermission(item.permissions));\n\n return (\n <Box as=\"nav\" w=\"260px\" minH=\"100vh\" borderRightWidth=\"1px\" borderColor=\"gray.200\" px={4} py={6} bg=\"white\">\n <Flex align=\"center\" gap={3} mb={8} px={2}>\n {app.logo ? <Image src={app.logo} alt={app.name} maxH=\"36px\" /> : null}\n <Text fontWeight=\"bold\" fontSize=\"md\" color=\"brand.500\">\n {app.name}\n </Text>\n </Flex>\n\n <Stack gap={6}>\n {groupBySection(visible).map(([section, items]) => (\n <Stack key={section || \"_\"} gap={1}>\n {section ? (\n <Text fontSize=\"xs\" fontWeight=\"semibold\" color=\"gray.400\" textTransform=\"uppercase\" px={3} mb={1}>\n {section}\n </Text>\n ) : null}\n {items.map((item) => (\n <NavLink key={item.href} to={item.href} end={item.href === \"/\"}>\n {({ isActive }) => (\n <Flex\n align=\"center\"\n gap={2}\n px={3}\n py={2}\n borderRadius=\"md\"\n fontSize=\"sm\"\n fontWeight={isActive ? \"semibold\" : \"normal\"}\n bg={isActive ? \"brand.50\" : \"transparent\"}\n color={isActive ? \"brand.700\" : \"gray.700\"}\n _hover={{ bg: isActive ? \"brand.50\" : \"gray.50\" }}\n >\n {item.icon}\n <span>{item.label}</span>\n </Flex>\n )}\n </NavLink>\n ))}\n </Stack>\n ))}\n </Stack>\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 type {\n CollectionMode,\n CollectionViewDef,\n DocumentViewDef,\n OonCoreFrontConfig,\n OonViewDefinition,\n PipelineViewDef,\n} from \"./types\";\nimport { start } from \"./start\";\n\n/**\n * Schema do `central.ui.json` (Seção 9 do escopo). É o que o frontend\n * consumidor gerado pelo `create-central-oon` carrega — declaração pura, sem\n * código de UI. O Core converte isto em `OonCoreFrontConfig`.\n */\nexport interface CentralUiManifest {\n name: string;\n slug: string;\n backend?: { metadataUrl?: string };\n navigation?: { mode?: \"auto\" | \"manual\" };\n collections?: Array<{\n model: string;\n mode?: CollectionMode;\n path?: string;\n label?: string;\n section?: string;\n }>;\n pipelines?: Array<{\n name?: string;\n model?: string;\n mode?: string;\n stageField?: string;\n path?: string;\n label?: string;\n section?: string;\n }>;\n documents?: Array<{\n model: string;\n mode?: string;\n path?: string;\n label?: string;\n section?: string;\n approval?: boolean;\n attachments?: boolean;\n }>;\n}\n\n/** Dados de runtime que o `central.ui.json` não carrega (vêm do .env). */\nexport interface ManifestRuntime {\n apiBaseUrl: string;\n meusAppsUrl?: string;\n assistantBaseUrl?: string;\n versionPrefix?: string;\n}\n\n/** Converte o manifesto declarativo + runtime em config do Core. */\nexport function manifestToConfig(manifest: CentralUiManifest, runtime: ManifestRuntime): OonCoreFrontConfig {\n const views: OonViewDefinition[] = [];\n\n for (const c of manifest.collections ?? []) {\n const view: CollectionViewDef = {\n type: \"collection\",\n model: c.model,\n mode: c.mode ?? \"dynamic\",\n path: c.path,\n label: c.label,\n section: c.section,\n };\n views.push(view);\n }\n\n for (const p of manifest.pipelines ?? []) {\n const model = p.model ?? p.name;\n if (!model) continue;\n const view: PipelineViewDef = {\n type: \"pipeline\",\n model,\n label: p.label ?? p.name,\n path: p.path,\n stageField: p.stageField,\n section: p.section,\n };\n views.push(view);\n }\n\n for (const d of manifest.documents ?? []) {\n const view: DocumentViewDef = {\n type: \"document\",\n model: d.model,\n label: d.label,\n path: d.path,\n section: d.section,\n approval: d.approval,\n attachments: d.attachments,\n };\n views.push(view);\n }\n\n return {\n app: {\n id: manifest.slug,\n name: manifest.name,\n title: manifest.name,\n },\n api: {\n baseUrl: runtime.apiBaseUrl,\n meusAppsUrl: runtime.meusAppsUrl,\n assistantBaseUrl: runtime.assistantBaseUrl,\n versionPrefix: runtime.versionPrefix ?? \"\",\n },\n auth: { mode: \"bearer\", tokenParam: \"code\" },\n security: {\n enableRouteGuard: true,\n enablePermissionGate: true,\n redactAssistantContext: true,\n disableConsoleInProduction: true,\n },\n ui: { views },\n };\n}\n\n/**\n * Bootstrap a partir do `central.ui.json`. É a única linha que o `main.tsx` de\n * uma Central gerada precisa:\n *\n * import manifest from \"../central.ui.json\";\n * startFromManifest(manifest, { apiBaseUrl: import.meta.env.VITE_API_URL });\n */\nexport function startFromManifest(manifest: CentralUiManifest, runtime: ManifestRuntime) {\n start(manifestToConfig(manifest, runtime));\n}\n","import type {\n CollectionViewDef,\n DashboardViewDef,\n DocumentViewDef,\n OonModule,\n PipelineViewDef,\n} from \"../types\";\n\n/**\n * Helpers declarativos (API pública da Seção 4.3). São identidades tipadas que\n * fixam o `type` da view — servem para o autocomplete e para registrar a view\n * num módulo ou no `ui.views` da config.\n */\n\nexport function defineCollectionView(def: Omit<CollectionViewDef, \"type\">): CollectionViewDef {\n return { type: \"collection\", ...def };\n}\n\nexport function defineDocumentView(def: Omit<DocumentViewDef, \"type\">): DocumentViewDef {\n return { type: \"document\", ...def };\n}\n\nexport function definePipelineView(def: Omit<PipelineViewDef, \"type\">): PipelineViewDef {\n return { type: \"pipeline\", ...def };\n}\n\nexport function defineDashboard(def: Omit<DashboardViewDef, \"type\">): DashboardViewDef {\n return { type: \"dashboard\", ...def };\n}\n\n/** Açúcar para declarar um módulo com tipagem. */\nexport function defineOonModule(mod: OonModule): OonModule {\n return mod;\n}\n","import { Badge, Box, Button, Flex, Heading, Stack, Text } from \"@chakra-ui/react\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { useCoreMetadata, useOonApi } from \"../api/ApiProvider\";\nimport { LoadingScreen } from \"../shell/LoadingScreen\";\nimport { ErrorState } from \"../shell/ErrorState\";\n\nexport interface CoreIntegrationProps {\n label?: string;\n}\n\ninterface IntegrationEntry {\n id?: string;\n name?: string;\n label?: string;\n status?: string;\n}\n\n/**\n * Painel de integrações: lista o que o back declarou em /core/integrations e\n * permite reprocessar via action RESTful (POST /integrations/actions/process-active).\n */\nexport function CoreIntegration({ label = \"Integrações\" }: CoreIntegrationProps) {\n const { http } = useOonApi();\n const metadata = useCoreMetadata();\n\n const reprocess = useMutation({\n mutationFn: () =>\n http.post(\"/integrations/actions/process-active\", {}, { headers: { \"x-oon-origin\": \"integration\" } }),\n });\n\n if (metadata.isLoading) return <LoadingScreen />;\n if (metadata.isError) return <ErrorState error={metadata.error} />;\n\n const integrations = (metadata.data?.integrations ?? []) as IntegrationEntry[];\n\n return (\n <Stack gap={6}>\n <Flex align=\"center\" justify=\"space-between\">\n <Heading size=\"lg\">{label}</Heading>\n <Button size=\"sm\" variant=\"outline\" loading={reprocess.isPending} onClick={() => reprocess.mutate()}>\n Reprocessar ativos\n </Button>\n </Flex>\n <Stack gap={3}>\n {integrations.length === 0 ? (\n <Text color=\"gray.400\">Nenhuma integração declarada.</Text>\n ) : (\n integrations.map((it, idx) => (\n <Box\n key={it.id ?? it.name ?? idx}\n borderWidth=\"1px\"\n borderColor=\"gray.200\"\n borderRadius=\"md\"\n bg=\"white\"\n p={4}\n >\n <Flex align=\"center\" justify=\"space-between\">\n <Text fontWeight=\"medium\">{it.label ?? it.name ?? \"Integração\"}</Text>\n <Badge colorPalette={it.status === \"erro\" ? \"red\" : it.status === \"ativo\" ? \"green\" : \"gray\"}>\n {it.status ?? \"—\"}\n </Badge>\n </Flex>\n </Box>\n ))\n )}\n </Stack>\n </Stack>\n );\n}\n","import { Button, Flex, Heading, Stack, Text } from \"@chakra-ui/react\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { OonColumnDef } from \"../types\";\nimport { useOonApi } from \"../api/ApiProvider\";\nimport { CoreCollection } from \"./CoreCollection\";\n\nexport interface CoreCurrencyProps {\n /** model das moedas. Default: \"Moeda\". */\n model?: string;\n label?: string;\n endpoint?: string;\n columns?: OonColumnDef[];\n}\n\n/**\n * Multi-moedas (módulo de domínio, Seção 4.6/2.11). Lista as moedas e expõe a\n * ação RESTful de atualizar cotações (POST /<endpoint>/actions/update-rates).\n */\nexport function CoreCurrency({ model = \"Moeda\", label = \"Multi-moedas\", endpoint = \"/moedas\", columns }: CoreCurrencyProps) {\n const { http } = useOonApi();\n const queryClient = useQueryClient();\n\n const updateRates = useMutation({\n mutationFn: () => http.post(`${endpoint}/actions/update-rates`, {}, { headers: { \"x-oon-origin\": \"integration\" } }),\n onSuccess: () => queryClient.invalidateQueries({ queryKey: [\"oon\", \"list\", endpoint] }),\n });\n\n return (\n <Stack gap={6}>\n <Flex align=\"center\" justify=\"space-between\">\n <Heading size=\"lg\">{label}</Heading>\n <Button size=\"sm\" colorPalette=\"blue\" loading={updateRates.isPending} onClick={() => updateRates.mutate()}>\n Atualizar cotações\n </Button>\n </Flex>\n {updateRates.isError ? (\n <Text fontSize=\"sm\" color=\"red.600\">\n {updateRates.error?.message}\n </Text>\n ) : null}\n <CoreCollection model={model} label=\"\" mode={columns ? \"full\" : \"dynamic\"} endpoint={endpoint} columns={columns} />\n </Stack>\n );\n}\n","import { useState } from \"react\";\nimport { Box, Button, Flex, Heading, Input, Stack, Text } from \"@chakra-ui/react\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { useOonApi } from \"../api/ApiProvider\";\n\nexport interface AssistantMessage {\n role: \"user\" | \"assistant\";\n content: string;\n}\n\nexport interface CoreAssistantProps {\n /** code do assistente registrado no back (ex.: \"servicos-tomados.revisao\"). */\n assistantCode: string;\n label?: string;\n /** entidade de contexto (apenas tipo + id; nada sensível). */\n entity?: { type: string; id: string };\n /** base de assistentes; default usa o mesmo client REST do Core. */\n endpoint?: string;\n}\n\n/**\n * Assistente IA do Core (Seção 2.12 / 6.2). Envia ao back apenas\n * assistantCode + entity + message — NUNCA chave de IA, modelo ou prompt.\n * O back resolve modelo, prompt, chave e políticas.\n */\nexport function CoreAssistant({ assistantCode, label = \"Assistente\", entity, endpoint = \"/assistant-runs\" }: CoreAssistantProps) {\n const { http } = useOonApi();\n const [messages, setMessages] = useState<AssistantMessage[]>([]);\n const [input, setInput] = useState(\"\");\n\n const ask = useMutation({\n mutationFn: async (message: string) => {\n const { data } = await http.post<{ reply?: string; message?: string }>(\n endpoint,\n {\n assistantCode,\n entity,\n message,\n // Contexto redigido: a Central pode enriquecer, mas o Core não envia PII por padrão.\n context: { redactionPolicy: \"default\" },\n },\n { headers: { \"x-oon-origin\": \"assistant\" } }\n );\n return data.reply ?? data.message ?? \"\";\n },\n onSuccess: (reply) => setMessages((prev) => [...prev, { role: \"assistant\", content: reply }]),\n });\n\n const send = () => {\n const text = input.trim();\n if (!text) return;\n setMessages((prev) => [...prev, { role: \"user\", content: text }]);\n setInput(\"\");\n ask.mutate(text);\n };\n\n return (\n <Stack gap={4} maxW=\"560px\">\n <Heading size=\"md\">{label}</Heading>\n <Box borderWidth=\"1px\" borderColor=\"gray.200\" borderRadius=\"md\" bg=\"white\" p={4} minH=\"240px\">\n <Stack gap={3}>\n {messages.length === 0 ? (\n <Text color=\"gray.400\" fontSize=\"sm\">\n Faça uma pergunta ao assistente.\n </Text>\n ) : (\n messages.map((m, idx) => (\n <Flex key={idx} justify={m.role === \"user\" ? \"flex-end\" : \"flex-start\"}>\n <Box\n bg={m.role === \"user\" ? \"brand.500\" : \"gray.100\"}\n color={m.role === \"user\" ? \"white\" : \"gray.800\"}\n px={3}\n py={2}\n borderRadius=\"md\"\n maxW=\"80%\"\n fontSize=\"sm\"\n >\n {m.content}\n </Box>\n </Flex>\n ))\n )}\n {ask.isPending ? (\n <Text color=\"gray.400\" fontSize=\"sm\">\n Pensando…\n </Text>\n ) : null}\n {ask.isError ? (\n <Text color=\"red.600\" fontSize=\"sm\">\n {ask.error?.message}\n </Text>\n ) : null}\n </Stack>\n </Box>\n <Flex gap={2}>\n <Input\n size=\"sm\"\n value={input}\n placeholder=\"Digite sua mensagem...\"\n onChange={(e) => setInput(e.currentTarget.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") send();\n }}\n />\n <Button size=\"sm\" colorPalette=\"blue\" onClick={send} loading={ask.isPending}>\n Enviar\n </Button>\n </Flex>\n </Stack>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { useOonAuth } from \"./AuthProvider\";\n\n/**\n * Esconde a UI quando o usuário não tem a permissão. NÃO é segurança real\n * (Seção 6.2, item 3) — o back é a autoridade. Serve apenas para não exibir\n * ações/menus que o usuário não pode usar.\n */\nexport function PermissionGate({\n permission,\n fallback = null,\n children,\n}: {\n permission?: string | string[];\n fallback?: ReactNode;\n children: ReactNode;\n}) {\n const { hasPermission } = useOonAuth();\n return <>{hasPermission(permission) ? children : fallback}</>;\n}\n"],"mappings":"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","names":["useMemo","axios","axios","useMemo","createContext","useContext","jsx","createContext","useContext","jsx","useMemo","useState","Box","Heading","Stack","useState","Box","Flex","Text","useQuery","jsx","Text","jsx","jsxs","jsx","jsxs","useState","useQuery","Box","Flex","Text","useState","Box","Button","Flex","Heading","Input","Text","jsx","jsxs","useState","Box","Heading","Text","Input","Flex","Button","jsx","jsxs","useState","Stack","Heading","Box","jsx","Box","Flex","Heading","Stack","Text","useQuery","jsx","jsxs","useQuery","Stack","Heading","Flex","Box","Text","Box","Heading","Stack","Text","jsx","jsxs","Stack","Heading","Box","Text","jsx","Box","Button","Flex","Spacer","Text","Box","Flex","Stack","Text","jsx","jsxs","Box","Flex","Text","Stack","jsx","jsxs","Flex","Text","Spacer","Button","Box","jsx","jsx","jsx","useMemo","storage","http","router","jsx","Box","Button","Flex","Heading","Stack","Text","useMutation","jsx","jsxs","useMutation","Stack","Flex","Heading","Button","Text","Box","Button","Flex","Heading","Stack","Text","useMutation","useQueryClient","jsx","jsxs","useQueryClient","useMutation","Stack","Flex","Heading","Button","Text","useState","Box","Button","Flex","Heading","Input","Stack","Text","useMutation","jsx","jsxs","useState","useMutation","Stack","Heading","Box","Text","Flex","Input","Button","Fragment","jsx"]}
1
+ {"version":3,"sources":["../src/start.tsx","../src/app/OonApp.tsx","../src/api/createRestClient.ts","../src/api/errorNormalizer.ts","../src/security/tokenStorage.ts","../src/app/OonProviders.tsx","../src/config/queryClient.ts","../src/config/theme.ts","../src/api/ApiProvider.tsx","../src/api/coreClient.ts","../src/api/resourceClient.ts","../src/security/AuthProvider.tsx","../src/security/ActivationProvider.tsx","../src/components/CoreCollection.tsx","../src/components/internal/fieldUtils.ts","../src/components/internal/DataGrid.tsx","../src/shell/LoadingScreen.tsx","../src/shell/ErrorState.tsx","../src/components/internal/DynamicForm.tsx","../src/components/internal/ReferenceSelect.tsx","../src/components/internal/referenceUtils.ts","../src/components/CoreDocument.tsx","../src/components/CorePipeline.tsx","../src/components/CoreDashboard.tsx","../src/app/moduleRegistry.tsx","../src/app/createOonRouter.tsx","../src/shell/AuthenticatedLayout.tsx","../src/shell/Sidebar.tsx","../src/security/AccessDeniedPage.tsx","../src/security/AppAccessGuard.tsx","../src/security/LoginPage.tsx","../src/security/ActivationPage.tsx","../src/security/RouteGuard.tsx","../src/security/ActivationGuard.tsx","../src/manifest.ts","../src/define/views.ts","../src/components/CoreIntegration.tsx","../src/components/CoreCurrency.tsx","../src/components/CoreAssistant.tsx","../src/security/PermissionGate.tsx"],"sourcesContent":["import { StrictMode } from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport type { OonCoreFrontConfig } from \"./types\";\nimport { OonApp } from \"./app/OonApp\";\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 * Ponto de entrada único de uma Central (Seção 3.2). O `main.tsx` da Central\n * só chama isto — não conhece providers, router, auth, layout nem serviços.\n *\n * import { start } from \"@oondemand/oon-core-front\";\n * import { appConfig } from \"./central.ui\";\n * start(appConfig);\n */\nexport function start(config: OonCoreFrontConfig) {\n validateConfig(config);\n applyDocumentMeta(config);\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/** Alias namespaced, compatível com a doc (`oonCoreFront.start`). */\nexport const oonCoreFront = { start };\n","import { useMemo } from \"react\";\nimport { RouterProvider } from \"react-router-dom\";\nimport type { OonCoreFrontConfig } from \"../types\";\nimport { createRestClient } from \"../api/createRestClient\";\nimport { createTokenStorage } from \"../security/tokenStorage\";\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, router } = useMemo(() => {\n const storage = createTokenStorage(config.app.id);\n const externalLoginUrl = config.auth?.loginUrl ?? config.api.meusAppsUrl;\n\n const http = createRestClient({\n api: config.api,\n appId: config.app.id,\n getToken: () => storage.get(),\n onUnauthorized: () => {\n storage.clear();\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 { routes, menu } = resolveRegistry(config);\n const router = createOonRouter({\n app: config.app,\n menu,\n routes,\n security: config.security,\n });\n\n return { http, storage, router };\n }, [config]);\n\n return (\n <OonProviders config={config} http={http} storage={storage}>\n <RouterProvider router={router} />\n </OonProviders>\n );\n}\n","import axios, { type AxiosInstance } from \"axios\";\nimport type { AuditContext, OonApiConfig } from \"../types\";\nimport { normalizeError } from \"./errorNormalizer\";\n\nexport interface RestClientDeps {\n api: OonApiConfig;\n /** Lê o token atual (Bearer). Retorna null se não autenticado. */\n getToken: () => string | null;\n /** Chamado uma vez ao receber 401 (logout + redirect). */\n onUnauthorized?: () => void;\n /** Origem app id, vai no header x-oon-app. */\n appId?: string;\n}\n\n/**\n * Cliente REST único do Core (Seção 2.5). Centraliza:\n * - baseUrl + versionPrefix;\n * - injeção de Bearer token;\n * - headers de auditoria x-oon-* nas mutações;\n * - tratamento global de 401 e normalização de erro.\n */\nexport function createRestClient(deps: RestClientDeps): AxiosInstance {\n const { api, getToken, onUnauthorized, appId } = deps;\n const prefix = api.versionPrefix ?? \"\";\n\n const instance = axios.create({\n baseURL: `${api.baseUrl.replace(/\\/$/, \"\")}${prefix}`,\n timeout: api.timeout ?? 30000,\n });\n\n instance.interceptors.request.use((config) => {\n const token = getToken();\n if (token && !config.headers.Authorization) {\n config.headers.Authorization = `Bearer ${token}`;\n }\n if (appId) config.headers[\"x-oon-app\"] = appId;\n return config;\n });\n\n instance.interceptors.response.use(\n (res) => res,\n (error) => {\n const normalized = normalizeError(error);\n const requestPath = String(error.config?.url || \"\")\n .split(\"?\")[0]\n .replace(/\\/$/, \"\");\n const isLogin = requestPath.endsWith(\"/auth/autenticar\");\n if (normalized.status === 401 && !isLogin) onUnauthorized?.();\n return Promise.reject(normalized);\n }\n );\n\n return instance;\n}\n\n/** Monta os headers de auditoria x-oon-* a partir do contexto. */\nexport function auditHeaders(audit?: AuditContext): Record<string, string> {\n if (!audit) return {};\n const headers: Record<string, string> = {};\n if (audit.origem) headers[\"x-oon-origin\"] = audit.origem;\n if (audit.module) headers[\"x-oon-module\"] = audit.module;\n if (audit.entity) headers[\"x-oon-entity\"] = audit.entity;\n return headers;\n}\n","import axios from \"axios\";\nimport type { OonError } from \"../types\";\n\n/**\n * Normaliza qualquer erro de rede/axios para o formato `OonError`, lendo o\n * envelope de erro padrão do back (`{ message }` ou `{ error: {...} }`).\n */\nexport function normalizeError(err: unknown): OonError {\n if (axios.isAxiosError(err)) {\n const status = err.response?.status;\n const data = err.response?.data as\n | { message?: string; error?: { code?: string; message?: string; details?: unknown; requestId?: string } }\n | undefined;\n\n const envelope = data?.error;\n return {\n code: envelope?.code || codeFromStatus(status),\n message: envelope?.message || data?.message || err.message || \"Erro inesperado.\",\n status,\n details: envelope?.details,\n requestId: envelope?.requestId || (err.response?.headers?.[\"x-request-id\"] as string | undefined),\n };\n }\n\n if (err instanceof Error) {\n return { code: \"UNKNOWN\", message: err.message };\n }\n\n return { code: \"UNKNOWN\", message: \"Erro inesperado.\" };\n}\n\nfunction codeFromStatus(status?: number): string {\n switch (status) {\n case 400:\n return \"VALIDATION_ERROR\";\n case 401:\n return \"UNAUTHORIZED\";\n case 403:\n return \"FORBIDDEN\";\n case 404:\n return \"NOT_FOUND\";\n case 409:\n return \"CONFLICT\";\n default:\n return status && status >= 500 ? \"SERVER_ERROR\" : \"REQUEST_ERROR\";\n }\n}\n","/**\n * Armazenamento de token encapsulado (Seção 6.2). Toda leitura/escrita de\n * token passa por aqui — nada de `localStorage.getItem('token')` espalhado.\n * Tudo com try/catch para JSON/localStorage inválido não derrubar a tela.\n */\nconst STORAGE_KEY = \"oon.auth.token\";\n\nexport interface TokenStorage {\n get(): string | null;\n set(token: string): void;\n clear(): void;\n}\n\nexport function createTokenStorage(namespace?: string): TokenStorage {\n const key = namespace ? `${STORAGE_KEY}.${namespace}` : STORAGE_KEY;\n\n return {\n get() {\n try {\n return window.localStorage.getItem(key);\n } catch {\n return null;\n }\n },\n set(token: string) {\n try {\n window.localStorage.setItem(key, token);\n } catch {\n /* storage indisponível (modo privado) — ignora silenciosamente. */\n }\n },\n clear() {\n try {\n window.localStorage.removeItem(key);\n } catch {\n /* noop */\n }\n },\n };\n}\n\n/**\n * Lê o token vindo do SSO via query string (?code=...) e remove da URL para\n * não vazar em histórico/logs. Retorna o token capturado, se houver.\n */\nexport function captureTokenFromUrl(tokenParam = \"code\"): string | null {\n try {\n const url = new URL(window.location.href);\n const token = url.searchParams.get(tokenParam);\n if (!token) return null;\n url.searchParams.delete(tokenParam);\n window.history.replaceState({}, document.title, url.pathname + url.search + url.hash);\n return token;\n } catch {\n return null;\n }\n}\n","import { type ReactNode, useMemo } from \"react\";\nimport { ChakraProvider } from \"@chakra-ui/react\";\nimport { QueryClientProvider } from \"@tanstack/react-query\";\nimport type { AxiosInstance } from \"axios\";\nimport type { OonCoreFrontConfig } from \"../types\";\nimport { createOonQueryClient } from \"../config/queryClient\";\nimport { createOonSystem } from \"../config/theme\";\nimport { ApiProvider } from \"../api/ApiProvider\";\nimport { AuthProvider } from \"../security/AuthProvider\";\nimport { ActivationProvider } from \"../security/ActivationProvider\";\nimport type { TokenStorage } from \"../security/tokenStorage\";\n\nexport interface OonProvidersProps {\n config: OonCoreFrontConfig;\n http: AxiosInstance;\n storage: TokenStorage;\n children: ReactNode;\n}\n\n/**\n * Monta, em ordem (Seção 3.3), todos os providers globais. Nenhuma Central\n * cliente deve montar QueryClient/Chakra/Auth/Api manualmente.\n *\n * Ordem: QueryClient -> Chakra -> Api -> Auth -> (Router, montado fora).\n */\nexport function OonProviders({ config, http, storage, children }: OonProvidersProps) {\n const queryClient = useMemo(() => createOonQueryClient(), []);\n const system = useMemo(() => createOonSystem(config.theme), [config.theme]);\n const loginUrl = config.auth?.loginUrl ?? config.api.meusAppsUrl;\n\n return (\n <QueryClientProvider client={queryClient}>\n <ChakraProvider value={system}>\n <ApiProvider http={http}>\n <ActivationProvider http={http}>\n <AuthProvider http={http} storage={storage} auth={config.auth} loginUrl={loginUrl}>\n {children}\n </AuthProvider>\n </ActivationProvider>\n </ApiProvider>\n </ChakraProvider>\n </QueryClientProvider>\n );\n}\n","import { QueryClient } from \"@tanstack/react-query\";\n\n/** QueryClient padrão do Core, com defaults conservadores para telas admin. */\nexport function createOonQueryClient(): QueryClient {\n return new QueryClient({\n defaultOptions: {\n queries: {\n retry: 1,\n refetchOnWindowFocus: false,\n staleTime: 30 * 1000,\n },\n mutations: {\n retry: 0,\n },\n },\n });\n}\n","import { createSystem, defaultConfig, defineConfig, mergeConfigs } from \"@chakra-ui/react\";\nimport type { OonCoreFrontConfig } from \"../types\";\n\n/**\n * Identidade visual padrão das Centrais Oon, consolidada a partir da Central\n * Minexco/CST: azul operacional, superfícies claras, tipografia Poppins e alta\n * densidade de informação.\n */\nexport const brandColors = {\n brand: {\n 25: { value: \"#F8FCFF\" },\n 50: { value: \"#EEF8FD\" },\n 75: { value: \"#E2F3FB\" },\n 100: { value: \"#C7E8F7\" },\n 200: { value: \"#82C8E8\" },\n 300: { value: \"#3FA6E0\" },\n 350: { value: \"#0F8DD0\" },\n 400: { value: \"#0580B9\" },\n 500: { value: \"#0474AF\" },\n 600: { value: \"#036491\" },\n 700: { value: \"#014364\" },\n 800: { value: \"#073A52\" },\n 850: { value: \"#082F3F\" },\n 900: { value: \"#07262E\" },\n },\n} as const;\n\nconst oonThemeConfig = defineConfig({\n globalCss: {\n \"html, body, #root\": {\n minHeight: \"100%\",\n },\n body: {\n margin: 0,\n bg: \"#F8F9FA\",\n color: \"#24323A\",\n fontFamily: \"Poppins, Inter, system-ui, sans-serif\",\n fontSize: \"14px\",\n },\n \"button, input, select, textarea\": {\n fontFamily: \"inherit\",\n },\n \"::selection\": {\n bg: \"#C7E8F7\",\n color: \"#07262E\",\n },\n },\n theme: {\n tokens: {\n colors: brandColors,\n fonts: {\n body: { value: \"Poppins, Inter, system-ui, sans-serif\" },\n heading: { value: \"Poppins, Inter, system-ui, sans-serif\" },\n },\n radii: {\n oon: { value: \"10px\" },\n },\n shadows: {\n oon: { value: \"0 8px 24px rgba(7, 38, 46, 0.08)\" },\n },\n },\n semanticTokens: {\n colors: {\n brand: {\n solid: { value: \"{colors.brand.500}\" },\n contrast: { value: \"white\" },\n fg: { value: \"{colors.brand.700}\" },\n muted: { value: \"{colors.brand.50}\" },\n subtle: { value: \"{colors.brand.75}\" },\n emphasized: { value: \"{colors.brand.600}\" },\n focusRing: { value: \"{colors.brand.500}\" },\n },\n },\n },\n },\n});\n\n/**\n * Constrói o system do Chakra. O padrão Minexco é aplicado primeiro e pode ser\n * sobrescrito por uma identidade específica da Central sem reescrever o shell.\n */\nexport function createOonSystem(themeOverride?: OonCoreFrontConfig[\"theme\"]) {\n const base = mergeConfigs(defaultConfig, oonThemeConfig);\n const config = themeOverride\n ? mergeConfigs(base, defineConfig(themeOverride as Parameters<typeof defineConfig>[0]))\n : base;\n return createSystem(config);\n}\n\nexport const oonSystem = createOonSystem();\n","import { createContext, useContext, useMemo, type ReactNode } from \"react\";\nimport type { AxiosInstance } from \"axios\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport type { ModelSummary } from \"../types\";\nimport { createCoreClient, type CoreClient } from \"./coreClient\";\nimport { createResourceClient, type ResourceClient } from \"./resourceClient\";\n\ninterface ApiContextValue {\n http: AxiosInstance;\n core: CoreClient;\n resource: <T = Record<string, unknown>>(basePath: string) => ResourceClient<T>;\n}\n\nconst ApiContext = createContext<ApiContextValue | null>(null);\n\nexport function ApiProvider({ http, children }: { http: AxiosInstance; children: ReactNode }) {\n const value = useMemo<ApiContextValue>(() => {\n const cache = new Map<string, ResourceClient>();\n return {\n http,\n core: createCoreClient(http),\n resource<T = Record<string, unknown>>(basePath: string) {\n let client = cache.get(basePath);\n if (!client) {\n client = createResourceClient(http, basePath);\n cache.set(basePath, client);\n }\n return client as ResourceClient<T>;\n },\n };\n }, [http]);\n\n return <ApiContext.Provider value={value}>{children}</ApiContext.Provider>;\n}\n\nexport function useOonApi(): ApiContextValue {\n const ctx = useContext(ApiContext);\n if (!ctx) throw new Error(\"useOonApi deve ser usado dentro de <ApiProvider> (oonCoreFront.start).\");\n return ctx;\n}\n\n/** Cliente de um recurso, memoizado pelo basePath. */\nexport function useOonResource<T = Record<string, unknown>>(basePath: string): ResourceClient<T> {\n const { resource } = useOonApi();\n return useMemo(() => resource<T>(basePath), [resource, basePath]);\n}\n\n/** Metadata completa do back (cache de 5 min). */\nexport function useCoreMetadata() {\n const { core } = useOonApi();\n return useQuery({\n queryKey: [\"oon\", \"core\", \"metadata\"],\n queryFn: () => core.metadata(),\n staleTime: 5 * 60 * 1000,\n });\n}\n\n/** Descrição de uma model específica — base do modo \"dynamic\". */\nexport function useModelSchema(name: string) {\n const { core } = useOonApi();\n return useQuery<ModelSummary>({\n queryKey: [\"oon\", \"core\", \"model\", name],\n queryFn: () => core.model(name),\n staleTime: 5 * 60 * 1000,\n enabled: !!name,\n });\n}\n","import type { AxiosInstance } from \"axios\";\nimport type { CoreMetadata, ModelSummary } from \"../types\";\n\n/**\n * SDK do contrato /core/* (introspecção dirigida por metadata). É o que\n * permite o modo \"dynamic\" das coleções: o front monta grid/form/rotas a\n * partir do que o back descreve, sem código de UI por entidade.\n */\nexport interface CoreClient {\n metadata(): Promise<CoreMetadata>;\n models(): Promise<ModelSummary[]>;\n model(name: string): Promise<ModelSummary>;\n permissions(): Promise<Array<{ resource: string; action: string; roles: string[] }>>;\n menus(): Promise<CoreMetadata[\"menus\"]>;\n}\n\nexport function createCoreClient(http: AxiosInstance): CoreClient {\n return {\n async metadata() {\n const { data } = await http.get<CoreMetadata>(\"/core/metadata\");\n return data;\n },\n async models() {\n const { data } = await http.get<{ results: ModelSummary[] }>(\"/core/models\");\n return data.results;\n },\n async model(name) {\n const { data } = await http.get<ModelSummary>(`/core/models/${name}`);\n return data;\n },\n async permissions() {\n const { data } = await http.get<{ results: Array<{ resource: string; action: string; roles: string[] }> }>(\n \"/core/permissions\"\n );\n return data.results;\n },\n async menus() {\n const { data } = await http.get<{ results: CoreMetadata[\"menus\"] }>(\"/core/menus\");\n return data.results;\n },\n };\n}\n","import type { AxiosInstance } from \"axios\";\nimport type { AuditContext, ListParams, PaginatedResult } from \"../types\";\nimport { auditHeaders } from \"./createRestClient\";\n\n/**\n * SDK por recurso (Seção 2.5). Espelha o CRUD gerado pelo back em `basePath`:\n * GET / -> list (paginado)\n * GET /:id -> get\n * POST / -> create\n * PUT /:id -> update\n * PATCH /:id -> patch\n * DELETE /:id -> delete\n * POST /import -> importMany\n * GET /export -> exportAll\n *\n * O back devolve registro único na chave do singular (`{ [singular]: {...} }`);\n * `unwrap` extrai o primeiro valor não-meta para o consumidor não precisar\n * conhecer o singular.\n */\nexport interface ResourceClient<T = Record<string, unknown>> {\n list(params?: ListParams): Promise<PaginatedResult<T>>;\n get(id: string): Promise<T>;\n create(body: Partial<T>, audit?: AuditContext): Promise<T>;\n update(id: string, body: Partial<T>, audit?: AuditContext): Promise<T>;\n patch(id: string, body: Partial<T>, audit?: AuditContext): Promise<T>;\n delete(id: string, audit?: AuditContext): Promise<T>;\n importMany(rows: unknown[], audit?: AuditContext): Promise<{ inserted?: number; [k: string]: unknown }>;\n exportAll(params?: ListParams): Promise<T[]>;\n}\n\nconst META_KEYS = new Set([\"pagination\", \"results\", \"message\", \"requestId\"]);\n\nfunction unwrap<T>(data: Record<string, unknown>): T {\n // resposta tipo { pessoa: {...} } — pega o primeiro valor de objeto.\n for (const [key, value] of Object.entries(data)) {\n if (!META_KEYS.has(key) && value && typeof value === \"object\") {\n return value as T;\n }\n }\n return data as T;\n}\n\nexport function createResourceClient<T = Record<string, unknown>>(\n http: AxiosInstance,\n basePath: string\n): ResourceClient<T> {\n const base = `/${basePath.replace(/^\\/+/, \"\")}`;\n\n return {\n async list(params) {\n const { data } = await http.get<PaginatedResult<T>>(base, { params });\n return data;\n },\n async get(id) {\n const { data } = await http.get<Record<string, unknown>>(`${base}/${id}`);\n return unwrap<T>(data);\n },\n async create(body, audit) {\n const { data } = await http.post<Record<string, unknown>>(base, body, {\n headers: auditHeaders(audit ?? { origem: \"form\" }),\n });\n return unwrap<T>(data);\n },\n async update(id, body, audit) {\n const { data } = await http.put<Record<string, unknown>>(`${base}/${id}`, body, {\n headers: auditHeaders(audit ?? { origem: \"form\" }),\n });\n return unwrap<T>(data);\n },\n async patch(id, body, audit) {\n const { data } = await http.patch<Record<string, unknown>>(`${base}/${id}`, body, {\n headers: auditHeaders(audit ?? { origem: \"datagrid\" }),\n });\n return unwrap<T>(data);\n },\n async delete(id, audit) {\n const { data } = await http.delete<Record<string, unknown>>(`${base}/${id}`, {\n headers: auditHeaders(audit ?? { origem: \"datagrid\" }),\n });\n return unwrap<T>(data);\n },\n async importMany(rows, audit) {\n const { data } = await http.post<{ inserted?: number }>(\n `${base}/import`,\n { rows },\n { headers: auditHeaders(audit ?? { origem: \"import\" }) }\n );\n return data;\n },\n async exportAll(params) {\n const { data } = await http.get<{ results: T[] } | T[]>(`${base}/export`, { params });\n return Array.isArray(data) ? data : data.results;\n },\n };\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useState,\n type ReactNode,\n} from \"react\";\nimport type { AxiosInstance } from \"axios\";\nimport type { OonAuthConfig, OonError, OonUser } from \"../types\";\nimport { captureTokenFromUrl, type TokenStorage } from \"./tokenStorage\";\nimport { useOptionalActivation } from \"./ActivationProvider\";\n\nexport type AuthStatus =\n | \"loading\"\n | \"authenticated\"\n | \"unauthenticated\"\n | \"forbidden\"\n | \"error\";\n\ninterface AuthContextValue {\n user: OonUser | null;\n roles: string[];\n status: AuthStatus;\n isAuthenticated: boolean;\n hasPermission: (permission?: string | string[]) => boolean;\n login: (email: string, password: string) => Promise<void>;\n retry: () => Promise<void>;\n logout: () => void;\n}\n\nconst AuthContext = createContext<AuthContextValue | null>(null);\n\nexport interface AuthProviderProps {\n http: AxiosInstance;\n storage: TokenStorage;\n auth?: OonAuthConfig;\n /** URL externa opcional. Sem ela, o Core usa a tela local em /login. */\n loginUrl?: string;\n children: ReactNode;\n}\n\nfunction errorStatus(error: unknown): number | undefined {\n return (error as OonError | undefined)?.status;\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\n/**\n * Provider de autenticação do Core:\n * 1. captura token do ?code=, token de desenvolvimento ou storage;\n * 2. valida o token e a permissão do app em GET /auth/validar-token;\n * 3. trata 401 como ausência de sessão e 403 como acesso negado;\n * 4. oferece login local via POST /auth/autenticar.\n */\nexport function AuthProvider({\n http,\n storage,\n auth,\n loginUrl,\n children,\n}: AuthProviderProps) {\n const tokenParam = auth?.tokenParam ?? \"code\";\n const devToken = auth?.devToken?.trim() || null;\n const [user, setUser] = useState<OonUser | null>(null);\n const [status, setStatus] = useState<AuthStatus>(\"loading\");\n const activation = useOptionalActivation();\n\n const redirectToExternalLogin = useCallback(() => {\n if (loginUrl) window.location.href = loginUrl;\n }, [loginUrl]);\n\n const applyValidationError = useCallback(\n (error: unknown) => {\n const currentStatus = errorStatus(error);\n setUser(null);\n\n if (currentStatus === 403) {\n setStatus(\"forbidden\");\n return;\n }\n\n if (currentStatus === 401) {\n storage.clear();\n setStatus(\"unauthenticated\");\n redirectToExternalLogin();\n return;\n }\n\n setStatus(\"error\");\n },\n [storage, redirectToExternalLogin],\n );\n\n const validateSession = useCallback(async () => {\n const response = await http.get<{ usuario: OonUser }>(\n \"/auth/validar-token\",\n );\n setUser(response.data.usuario);\n setStatus(\"authenticated\");\n }, [http]);\n\n const retry = useCallback(async () => {\n setStatus(\"loading\");\n try {\n await validateSession();\n } catch (error) {\n applyValidationError(error);\n throw error;\n }\n }, [validateSession, applyValidationError]);\n\n const login = useCallback(\n async (email: string, password: string) => {\n setStatus(\"loading\");\n setUser(null);\n\n try {\n const response = await http.post<{ token: string }>(\n \"/auth/autenticar\",\n {},\n {\n headers: {\n Authorization: `Basic ${encodeBasicCredentials(email, password)}`,\n },\n },\n );\n\n if (!response.data.token) {\n const error: OonError = {\n code: \"AUTH_TOKEN_MISSING\",\n message: \"Token não retornado pelo backend.\",\n status: 502,\n };\n throw error;\n }\n\n storage.set(response.data.token);\n await validateSession();\n } catch (error) {\n applyValidationError(error);\n throw error;\n }\n },\n [http, storage, validateSession, applyValidationError],\n );\n\n const logout = useCallback(() => {\n storage.clear();\n setUser(null);\n setStatus(\"unauthenticated\");\n redirectToExternalLogin();\n }, [storage, redirectToExternalLogin]);\n\n useEffect(() => {\n let active = true;\n\n if (\n activation &&\n ![\"active\", \"error\"].includes(activation.status)\n ) {\n setUser(null);\n setStatus(\"unauthenticated\");\n return;\n }\n\n const incoming = captureTokenFromUrl(tokenParam);\n const stored = storage.get();\n const token = incoming ?? devToken ?? stored;\n\n if (token && token !== stored) storage.set(token);\n\n if (!token) {\n setUser(null);\n setStatus(\"unauthenticated\");\n redirectToExternalLogin();\n return;\n }\n\n setStatus(\"loading\");\n http\n .get<{ usuario: OonUser }>(\"/auth/validar-token\")\n .then((response) => {\n if (!active) return;\n setUser(response.data.usuario);\n setStatus(\"authenticated\");\n })\n .catch((error) => {\n if (!active) return;\n applyValidationError(error);\n });\n\n return () => {\n active = false;\n };\n }, [\n http,\n storage,\n tokenParam,\n devToken,\n redirectToExternalLogin,\n applyValidationError,\n activation?.status,\n ]);\n\n const roles = user?.tipo ? [user.tipo] : [];\n\n const hasPermission = useCallback(\n (permission?: string | string[]) => {\n if (!permission) return true;\n const required = Array.isArray(permission) ? permission : [permission];\n if (required.length === 0) return true;\n if (roles.includes(\"admin\") || roles.includes(\"master\")) return true;\n return required.some(\n (value) =>\n roles.includes(value) ||\n roles.some((role) => value.startsWith(`${role}.`)),\n );\n },\n [roles],\n );\n\n const value: AuthContextValue = {\n user,\n roles,\n status,\n isAuthenticated: status === \"authenticated\",\n hasPermission,\n login,\n retry,\n logout,\n };\n\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;\n}\n\nexport function useOonAuth(): AuthContextValue {\n const context = useContext(AuthContext);\n if (!context) {\n throw new Error(\n \"useOonAuth deve ser usado dentro de <AuthProvider> (oonCoreFront.start).\",\n );\n }\n return context;\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useState,\n type ReactNode,\n} from \"react\";\nimport type { AxiosInstance } from \"axios\";\n\nexport type InstanceStatus =\n | \"loading\"\n | \"notActivated\"\n | \"validatingCode\"\n | \"codeValidated\"\n | \"submitting\"\n | \"configuring\"\n | \"active\"\n | \"suspended\"\n | \"revoked\"\n | \"error\";\n\nexport interface ActivationStatusResponse {\n role: \"root\" | \"member\";\n status: string;\n appCode: string;\n ambiente: string;\n podeAtivar: boolean;\n podeTentarNovamente: boolean;\n motivoSuspensao?: string;\n motivoRevogacao?: string;\n}\n\ninterface ActivationContextValue {\n status: InstanceStatus;\n details: ActivationStatusResponse | null;\n refresh: () => Promise<void>;\n}\n\nconst ActivationContext = createContext<ActivationContextValue | null>(null);\n\nfunction mapStatus(data: ActivationStatusResponse): InstanceStatus {\n if (data.status === \"ativa\") return \"active\";\n if (data.status === \"suspensa\") return \"suspended\";\n if (data.status === \"revogada\") return \"revoked\";\n if (data.status === \"configurando\") return \"configuring\";\n if (data.status === \"erro\" && !data.podeAtivar) return \"error\";\n return \"notActivated\";\n}\n\nexport function ActivationProvider({\n http,\n children,\n}: {\n http: AxiosInstance;\n children: ReactNode;\n}) {\n const [status, setStatus] = useState<InstanceStatus>(\"loading\");\n const [details, setDetails] = useState<ActivationStatusResponse | null>(null);\n\n const refresh = useCallback(async () => {\n setStatus(\"loading\");\n try {\n const response =\n await http.get<ActivationStatusResponse>(\"/ativacao/status\");\n setDetails(response.data);\n setStatus(mapStatus(response.data));\n } catch {\n setStatus(\"error\");\n }\n }, [http]);\n\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n return (\n <ActivationContext.Provider value={{ status, details, refresh }}>\n {children}\n </ActivationContext.Provider>\n );\n}\n\nexport function useOptionalActivation() {\n return useContext(ActivationContext);\n}\n\nexport function useActivation() {\n const context = useOptionalActivation();\n if (!context) {\n throw new Error(\n \"useActivation deve ser usado dentro de <ActivationProvider>.\",\n );\n }\n return context;\n}\n","import { useState } from \"react\";\nimport { Box, Heading, Stack, Text } from \"@chakra-ui/react\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { CollectionMode, OonColumnDef, OonFormFieldDef } from \"../types\";\nimport { useModelSchema, useOonResource } from \"../api/ApiProvider\";\nimport { columnsFromMeta, formFieldsFromMeta } from \"./internal/fieldUtils\";\nimport { DataGrid } from \"./internal/DataGrid\";\nimport { DynamicForm } from \"./internal/DynamicForm\";\nimport { LoadingScreen } from \"../shell/LoadingScreen\";\nimport { ErrorState } from \"../shell/ErrorState\";\n\nexport interface CoreCollectionProps {\n model: string;\n label?: string;\n section?: string;\n mode?: CollectionMode;\n endpoint?: string;\n columns?: OonColumnDef[];\n form?: OonFormFieldDef[];\n importExport?: boolean;\n}\n\ntype FormState = { open: false } | { open: true; row?: Record<string, unknown> };\n\nexport function CoreCollection({ model, label, section = \"Coleção\", mode = \"dynamic\", endpoint, columns, form, importExport }: CoreCollectionProps) {\n const needsSchema = mode !== \"full\" || !columns || !form || !endpoint;\n const schemaQuery = useModelSchema(needsSchema ? model : \"\");\n const schema = schemaQuery.data;\n const basePath = endpoint ?? schema?.basePath ?? `/${model.toLowerCase()}s`;\n const resolvedColumns = columns ?? (schema ? columnsFromMeta(schema.fields) : []);\n const resolvedForm = form ?? (schema ? formFieldsFromMeta(schema.fields) : []);\n\n const resource = useOonResource(basePath);\n const queryClient = useQueryClient();\n const [formState, setFormState] = useState<FormState>({ open: false });\n const [formError, setFormError] = useState<unknown>(null);\n\n const invalidate = () => queryClient.invalidateQueries({ queryKey: [\"oon\", \"list\", basePath] });\n\n const saveMutation = useMutation({\n mutationFn: (values: Record<string, unknown>) => {\n const editingRow = formState.open ? formState.row : undefined;\n const id = editingRow?._id as string | undefined;\n return id ? resource.update(id, values) : resource.create(values);\n },\n onSuccess: () => {\n setFormState({ open: false });\n setFormError(null);\n invalidate();\n },\n onError: (error) => setFormError(error),\n });\n\n const deleteMutation = useMutation({\n mutationFn: (row: Record<string, unknown>) => resource.delete(row._id as string),\n onSuccess: invalidate,\n });\n\n if (needsSchema && schemaQuery.isLoading) return <LoadingScreen />;\n if (needsSchema && schemaQuery.isError) return <ErrorState error={schemaQuery.error} />;\n\n const title = label ?? schema?.name ?? model;\n\n return (\n <Stack gap={5}>\n <Box>\n <Text fontSize=\"11px\" fontWeight=\"700\" color=\"brand.500\" textTransform=\"uppercase\" letterSpacing=\"0.08em\" mb={1}>\n {section}\n </Text>\n <Heading size=\"lg\" color=\"#24323A\" letterSpacing=\"-0.02em\">\n {title}\n </Heading>\n <Text mt={1} fontSize=\"13px\" color=\"gray.500\">\n Consulte, filtre e mantenha os registros desta operação.\n </Text>\n </Box>\n\n <DataGrid\n resource={resource}\n resourceKey={basePath}\n columns={resolvedColumns}\n onCreate={() => {\n setFormError(null);\n setFormState({ open: true });\n }}\n onEdit={(row) => {\n setFormError(null);\n setFormState({ open: true, row });\n }}\n onDelete={(row) => {\n if (window.confirm(\"Excluir este registro?\")) deleteMutation.mutate(row);\n }}\n />\n\n {formState.open ? (\n <DynamicForm\n title={formState.row ? `Editar ${title}` : `Novo ${title}`}\n eyebrow={section}\n fields={resolvedForm}\n initialValues={formState.row}\n submitting={saveMutation.isPending}\n error={formError}\n onSubmit={(values) => {\n setFormError(null);\n saveMutation.mutate(values);\n }}\n onFieldChange={() => setFormError(null)}\n onCancel={() => {\n setFormState({ open: false });\n setFormError(null);\n }}\n />\n ) : null}\n\n {importExport ? null : null}\n </Stack>\n );\n}\n","import type { FieldKind, FieldMeta, OonColumnDef, OonFormFieldDef } from \"../../types\";\n\n/** Campos que normalmente não fazem sentido em grid/form de CRUD. */\nconst HIDDEN_FIELDS = new Set([\"__v\", \"_id\", \"createdAt\", \"updatedAt\", \"criadoEm\", \"atualizadoEm\"]);\n\nexport function isEditableField(meta: FieldMeta): boolean {\n return !HIDDEN_FIELDS.has(meta.name) && meta.kind !== \"raw\";\n}\n\nexport function fieldLabel(meta: { name: string; label?: string }): string {\n if (meta.label) return meta.label;\n return meta.name\n .replace(/_/g, \" \")\n .replace(/([a-z])([A-Z])/g, \"$1 $2\")\n .replace(/^./, (character) => character.toUpperCase());\n}\n\n/** Deriva colunas de grid a partir da metadata da model (modo dynamic/minimal). */\nexport function columnsFromMeta(fields: FieldMeta[]): OonColumnDef[] {\n return fields\n .filter(isEditableField)\n .slice(0, 8)\n .map((field) => ({ field: field.name, label: fieldLabel(field), kind: field.kind, sortable: true }));\n}\n\nfunction formRequired(field: FieldMeta): boolean {\n const raw = field as unknown as Record<string, unknown>;\n const options = raw.options;\n const validation = raw.validation;\n const schema = raw.schema;\n\n return Boolean(\n field.required ||\n (options && !Array.isArray(options) && typeof options === \"object\" && (options as Record<string, unknown>).required) ||\n (validation && typeof validation === \"object\" && (validation as Record<string, unknown>).required) ||\n (schema && typeof schema === \"object\" && (schema as Record<string, unknown>).required)\n );\n}\n\nfunction formOptions(field: FieldMeta): string[] | undefined {\n const rawOptions = (field as unknown as Record<string, unknown>).options;\n if (Array.isArray(rawOptions)) return rawOptions.filter((value): value is string => typeof value === \"string\");\n if (!rawOptions || typeof rawOptions !== \"object\") return undefined;\n\n const options = rawOptions as Record<string, unknown>;\n const candidates = [options.values, options.enum, options.options];\n for (const candidate of candidates) {\n if (Array.isArray(candidate)) return candidate.filter((value): value is string => typeof value === \"string\");\n }\n return undefined;\n}\n\n/** Deriva campos de formulário a partir da metadata da model. */\nexport function formFieldsFromMeta(fields: FieldMeta[]): OonFormFieldDef[] {\n return fields.filter(isEditableField).map((field) => ({\n field: field.name,\n label: fieldLabel(field),\n kind: field.kind,\n required: formRequired(field),\n options: formOptions(field),\n ref: field.ref,\n }));\n}\n\n/** Formata um valor de célula conforme o tipo declarado. */\nexport function formatCell(value: unknown, kind?: FieldKind): string {\n if (value == null || value === \"\") return \"—\";\n switch (kind) {\n case \"boolean\":\n return value ? \"Sim\" : \"Não\";\n case \"date\":\n try {\n return new Date(value as string).toLocaleDateString(\"pt-BR\");\n } catch {\n return String(value);\n }\n case \"currency\":\n case \"currencyConverted\":\n return new Intl.NumberFormat(\"pt-BR\", { style: \"currency\", currency: \"BRL\" }).format(Number(value));\n case \"ref\":\n if (value && typeof value === \"object\") {\n const object = value as Record<string, unknown>;\n return String(object.nome ?? object.label ?? object.descricao ?? object._id ?? \"—\");\n }\n return String(value);\n default:\n return String(value);\n }\n}\n","import { useDeferredValue, useState, type ReactNode } from \"react\";\nimport { Badge, Box, Button, Flex, Input, NativeSelect, Spacer, Table, Text } from \"@chakra-ui/react\";\nimport { keepPreviousData, useQuery } from \"@tanstack/react-query\";\nimport type { FieldKind, OonColumnDef } from \"../../types\";\nimport type { ResourceClient } from \"../../api/resourceClient\";\nimport { formatCell } from \"./fieldUtils\";\nimport { LoadingScreen } from \"../../shell/LoadingScreen\";\nimport { ErrorState } from \"../../shell/ErrorState\";\n\nexport interface DataGridProps {\n resource: ResourceClient;\n resourceKey: string;\n columns: OonColumnDef[];\n search?: boolean;\n onCreate?: () => void;\n onEdit?: (row: Record<string, unknown>) => void;\n onDelete?: (row: Record<string, unknown>) => void;\n toolbarExtra?: ReactNode;\n}\n\nfunction SearchIcon() {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"17\" height=\"17\" aria-hidden=\"true\">\n <circle cx=\"8.5\" cy=\"8.5\" r=\"5.25\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"m12.4 12.4 4 4\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nfunction EditIcon() {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"15\" height=\"15\" aria-hidden=\"true\">\n <path d=\"M4 14.5V16h1.5L14.7 6.8l-1.5-1.5L4 14.5Z\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.45\" strokeLinejoin=\"round\" />\n <path d=\"m12.5 6 1.5-1.5a1.05 1.05 0 0 1 1.5 0l.1.1a1.05 1.05 0 0 1 0 1.5L14.1 7.6\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.45\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nfunction TrashIcon() {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"15\" height=\"15\" aria-hidden=\"true\">\n <path d=\"M5.5 6.5h9l-.6 9H6.1l-.6-9Zm2-2h5l.7 2H6.8l.7-2Z\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.35\" strokeLinejoin=\"round\" />\n <path d=\"M4.5 6.5h11\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.35\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nfunction ChevronIcon({ direction }: { direction: \"left\" | \"right\" }) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"17\" height=\"17\" aria-hidden=\"true\" style={{ transform: direction === \"right\" ? \"rotate(180deg)\" : undefined }}>\n <path d=\"m12 5-5 5 5 5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nfunction PlusIcon() {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"17\" height=\"17\" aria-hidden=\"true\">\n <path d=\"M10 4v12M4 10h12\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nfunction renderCell(value: unknown, kind?: FieldKind) {\n const formatted = formatCell(value, kind);\n\n if (kind === \"enum\") {\n const normalized = String(value ?? \"\").toLowerCase();\n const palette = /erro|cancel|inativo|recus|critica/.test(normalized)\n ? \"red\"\n : /pendente|aguardando|rascunho/.test(normalized)\n ? \"orange\"\n : /processando|conferencia|integrando|validando/.test(normalized)\n ? \"blue\"\n : /ativo|sucesso|conclu|aplicada|disponivel|aprov/.test(normalized)\n ? \"green\"\n : \"gray\";\n return (\n <Badge colorPalette={palette} variant=\"subtle\" borderRadius=\"full\" px=\"7px\" py=\"3px\" fontSize=\"9px\" fontWeight=\"600\" textTransform=\"capitalize\">\n {formatted}\n </Badge>\n );\n }\n\n if (kind === \"boolean\") {\n const active = value === true || value === \"true\";\n return (\n <Badge colorPalette={active ? \"green\" : \"gray\"} variant=\"subtle\" borderRadius=\"full\" px=\"7px\" py=\"3px\" fontSize=\"9px\" fontWeight=\"600\">\n {formatted}\n </Badge>\n );\n }\n\n return formatted;\n}\n\n/** Datagrid no mesmo padrão explícito da Central Minexco. */\nexport function DataGrid({\n resource,\n resourceKey,\n columns,\n search = true,\n onCreate,\n onEdit,\n onDelete,\n toolbarExtra,\n}: DataGridProps) {\n const [pageIndex, setPageIndex] = useState(0);\n const [pageSize, setPageSize] = useState(20);\n const [searchTerm, setSearchTerm] = useState(\"\");\n const deferredSearch = useDeferredValue(searchTerm);\n const [sort, setSort] = useState<string | undefined>(undefined);\n\n const query = useQuery({\n queryKey: [\"oon\", \"list\", resourceKey, { pageIndex, pageSize, searchTerm: deferredSearch, sort }],\n queryFn: () => resource.list({ pageIndex, pageSize, searchTerm: deferredSearch || undefined, sort }),\n placeholderData: keepPreviousData,\n });\n\n const toggleSort = (field: string) => {\n setPageIndex(0);\n setSort((previous) => {\n if (previous === `${field}.asc`) return `${field}.desc`;\n if (previous === `${field}.desc`) return undefined;\n return `${field}.asc`;\n });\n };\n\n const pagination = query.data?.pagination;\n const rows = query.data?.results ?? [];\n const totalItems = pagination?.totalItems ?? rows.length;\n const totalPages = Math.max(1, pagination?.totalPages ?? 1);\n const currentPage = Math.min(pageIndex + 1, totalPages);\n const actionCount = onEdit || onDelete ? 1 : 0;\n\n return (\n <Box bg=\"white\" borderWidth=\"1px\" borderColor=\"#E5E9ED\" borderRadius=\"10px\" boxShadow=\"0 1px 2px rgba(15,23,42,.06)\" overflow=\"hidden\">\n <Flex minH=\"60px\" px=\"14px\" py=\"12px\" align=\"center\" gap={4} borderBottomWidth=\"1px\" borderColor=\"#E5E9ED\">\n {search ? (\n <Flex minW={{ base: \"100%\", md: \"min(420px, 55vw)\" }} maxW=\"420px\" h=\"35px\" px=\"10px\" align=\"center\" gap={2} color=\"#98A2B3\" bg=\"white\" borderWidth=\"1px\" borderColor=\"#D5DDE3\" borderRadius=\"6px\" _focusWithin={{ borderColor: \"#0F8DD0\", boxShadow: \"0 0 0 3px rgba(15,141,208,.10)\" }}>\n <SearchIcon />\n <Input\n value={searchTerm}\n onChange={(event) => {\n setSearchTerm(event.target.value);\n setPageIndex(0);\n }}\n placeholder=\"Pesquisar registros...\"\n h=\"100%\"\n p={0}\n color=\"#475467\"\n bg=\"transparent\"\n border={0}\n borderRadius={0}\n fontSize=\"11px\"\n _placeholder={{ color: \"#A6B0BC\" }}\n _focusVisible={{ boxShadow: \"none\", outline: \"none\" }}\n />\n </Flex>\n ) : null}\n\n <Spacer />\n <Flex align=\"center\" gap={3} color=\"#98A2B3\" fontSize=\"10px\">\n {query.isFetching ? <Text>Atualizando...</Text> : null}\n <Text as=\"strong\" color=\"#667085\" fontWeight=\"600\">\n {totalItems} registro{totalItems === 1 ? \"\" : \"s\"}\n </Text>\n </Flex>\n {toolbarExtra}\n {onCreate ? (\n <Button minH=\"35px\" px=\"13px\" colorPalette=\"brand\" borderRadius=\"6px\" fontSize=\"11px\" fontWeight=\"600\" onClick={onCreate}>\n <PlusIcon /> Novo registro\n </Button>\n ) : null}\n </Flex>\n\n {query.isLoading ? (\n <LoadingScreen />\n ) : query.isError ? (\n <ErrorState error={query.error} />\n ) : (\n <Box overflowX=\"auto\">\n <Table.Root size=\"sm\" minW=\"900px\" borderCollapse=\"collapse\">\n <Table.Header>\n <Table.Row bg=\"#F4F7F9\">\n {columns.map((column) => (\n <Table.ColumnHeader\n key={column.field}\n h=\"39px\"\n px=\"10px\"\n py=\"8px\"\n color=\"#667085\"\n borderBottomWidth=\"1px\"\n borderColor=\"#D5DDE3\"\n fontSize=\"10px\"\n fontWeight=\"600\"\n letterSpacing=\".015em\"\n textTransform=\"none\"\n whiteSpace=\"nowrap\"\n cursor={column.sortable ? \"pointer\" : undefined}\n onClick={column.sortable ? () => toggleSort(column.field) : undefined}\n >\n {column.label ?? column.field}\n {sort?.startsWith(`${column.field}.`) ? (sort.endsWith(\".asc\") ? \" ▲\" : \" ▼\") : \"\"}\n </Table.ColumnHeader>\n ))}\n {actionCount ? (\n <Table.ColumnHeader w=\"84px\" h=\"39px\" px=\"10px\" py=\"8px\" color=\"#667085\" borderBottomWidth=\"1px\" borderColor=\"#D5DDE3\" fontSize=\"10px\" fontWeight=\"600\" textAlign=\"center\">\n Ações\n </Table.ColumnHeader>\n ) : null}\n </Table.Row>\n </Table.Header>\n\n <Table.Body>\n {rows.length === 0 ? (\n <Table.Row>\n <Table.Cell colSpan={columns.length + actionCount}>\n <Text minH=\"140px\" display=\"grid\" placeItems=\"center\" color=\"#98A2B3\" fontSize=\"12px\">\n Nenhum registro encontrado.\n </Text>\n </Table.Cell>\n </Table.Row>\n ) : (\n rows.map((row, index) => (\n <Table.Row key={(row._id as string) ?? index} bg={index % 2 ? \"#FBFCFD\" : \"white\"} _hover={{ bg: \"#F0F7FF\" }}>\n {columns.map((column) => (\n <Table.Cell key={column.field} maxW=\"250px\" h=\"42px\" px=\"10px\" py=\"8px\" overflow=\"hidden\" color=\"#52606D\" borderBottomWidth=\"1px\" borderColor=\"#EEF1F3\" fontSize=\"11px\" textOverflow=\"ellipsis\" whiteSpace=\"nowrap\">\n {renderCell(row[column.field], column.kind)}\n </Table.Cell>\n ))}\n {actionCount ? (\n <Table.Cell h=\"42px\" px=\"10px\" py=\"5px\" borderBottomWidth=\"1px\" borderColor=\"#EEF1F3\" textAlign=\"center\">\n <Flex justify=\"center\" gap=\"5px\">\n {onEdit ? (\n <Button type=\"button\" aria-label=\"Editar\" w=\"31px\" minW=\"31px\" h=\"31px\" p={0} color=\"#667085\" bg=\"white\" borderWidth=\"1px\" borderColor=\"#E5E9ED\" borderRadius=\"6px\" onClick={() => onEdit(row)} _hover={{ color: \"#036491\", bg: \"#F0F7FF\", borderColor: \"#B8D9EB\" }}>\n <EditIcon />\n </Button>\n ) : null}\n {onDelete ? (\n <Button type=\"button\" aria-label=\"Excluir\" w=\"31px\" minW=\"31px\" h=\"31px\" p={0} color=\"#667085\" bg=\"white\" borderWidth=\"1px\" borderColor=\"#E5E9ED\" borderRadius=\"6px\" onClick={() => onDelete(row)} _hover={{ color: \"#B42318\", bg: \"#FFF5F5\", borderColor: \"#FECACA\" }}>\n <TrashIcon />\n </Button>\n ) : null}\n </Flex>\n </Table.Cell>\n ) : null}\n </Table.Row>\n ))\n )}\n </Table.Body>\n </Table.Root>\n </Box>\n )}\n\n <Flex minH=\"56px\" px=\"14px\" py=\"10px\" align=\"center\" justify=\"flex-end\" gap=\"18px\" color=\"#7B8794\" borderTopWidth=\"1px\" borderColor=\"#E5E9ED\" fontSize=\"10px\" flexWrap=\"wrap\">\n <Flex align=\"center\" gap={2}>\n <Text>Linhas por página</Text>\n <NativeSelect.Root size=\"xs\" w=\"68px\">\n <NativeSelect.Field\n value={pageSize}\n h=\"30px\"\n pl=\"8px\"\n pr=\"26px\"\n color=\"#52606D\"\n bg=\"white\"\n borderColor=\"#D5DDE3\"\n borderRadius=\"5px\"\n fontSize=\"10px\"\n onChange={(event) => {\n setPageSize(Number(event.currentTarget.value));\n setPageIndex(0);\n }}\n >\n {[10, 20, 50, 100].map((size) => <option key={size} value={size}>{size}</option>)}\n </NativeSelect.Field>\n <NativeSelect.Indicator />\n </NativeSelect.Root>\n </Flex>\n\n <Text>Página {currentPage} de {totalPages}</Text>\n\n <Flex gap=\"5px\">\n <Button type=\"button\" aria-label=\"Página anterior\" w=\"31px\" minW=\"31px\" h=\"31px\" p={0} color=\"#667085\" bg=\"white\" borderWidth=\"1px\" borderColor=\"#E5E9ED\" borderRadius=\"6px\" disabled={pageIndex <= 0} onClick={() => setPageIndex((current) => Math.max(0, current - 1))} _hover={{ color: \"#036491\", bg: \"#F0F7FF\", borderColor: \"#B8D9EB\" }}>\n <ChevronIcon direction=\"left\" />\n </Button>\n <Button type=\"button\" aria-label=\"Próxima página\" w=\"31px\" minW=\"31px\" h=\"31px\" p={0} color=\"#667085\" bg=\"white\" borderWidth=\"1px\" borderColor=\"#E5E9ED\" borderRadius=\"6px\" disabled={currentPage >= totalPages} onClick={() => setPageIndex((current) => Math.min(totalPages - 1, current + 1))} _hover={{ color: \"#036491\", bg: \"#F0F7FF\", borderColor: \"#B8D9EB\" }}>\n <ChevronIcon direction=\"right\" />\n </Button>\n </Flex>\n </Flex>\n </Box>\n );\n}\n","import { Button, Flex, Spinner, Text } from \"@chakra-ui/react\";\n\ninterface LoadingScreenProps {\n message?: string;\n actionLabel?: string;\n onAction?: () => void;\n}\n\n/** Tela de carregamento/estado neutro reutilizada por guards e Suspense. */\nexport function LoadingScreen({\n message,\n actionLabel,\n onAction,\n}: LoadingScreenProps) {\n return (\n <Flex direction=\"column\" align=\"center\" justify=\"center\" minH=\"60vh\" gap={4}>\n <Spinner size=\"lg\" />\n {message ? (\n <Text color=\"gray.500\" fontSize=\"sm\" textAlign=\"center\">\n {message}\n </Text>\n ) : null}\n {actionLabel && onAction ? (\n <Button size=\"sm\" variant=\"outline\" onClick={onAction}>\n {actionLabel}\n </Button>\n ) : null}\n </Flex>\n );\n}\n","import { Box, Heading, Text } from \"@chakra-ui/react\";\n\n/**\n * Estado de erro padrão. Aceita tanto o `OonError` do client quanto um `Error`\n * cru (o que o React Query tipa em `query.error`) — só precisa de `message` e,\n * opcionalmente, `requestId`.\n */\nexport function ErrorState({\n error,\n title = \"Não foi possível carregar\",\n}: {\n error?: { message?: string; requestId?: string } | null;\n title?: string;\n}) {\n return (\n <Box borderWidth=\"1px\" borderColor=\"red.200\" bg=\"red.50\" borderRadius=\"md\" p={4}>\n <Heading size=\"sm\" color=\"red.700\">\n {title}\n </Heading>\n <Text mt={1} fontSize=\"sm\" color=\"red.600\">\n {error?.message ?? \"Erro inesperado.\"}\n </Text>\n {error?.requestId ? (\n <Text mt={2} fontSize=\"xs\" color=\"red.400\">\n requestId: {error.requestId}\n </Text>\n ) : null}\n </Box>\n );\n}\n","import { useEffect, useState, type FormEvent } from \"react\";\nimport { Box, Button, Flex, Heading, Input, NativeSelect, SimpleGrid, Stack, Text, Textarea } from \"@chakra-ui/react\";\nimport type { OonFormFieldDef } from \"../../types\";\nimport { fieldLabel } from \"./fieldUtils\";\nimport { ReferenceSelect } from \"./ReferenceSelect\";\n\nexport interface DynamicFormProps {\n title: string;\n eyebrow?: string;\n fields: OonFormFieldDef[];\n initialValues?: Record<string, unknown>;\n submitting?: boolean;\n error?: unknown;\n onSubmit: (values: Record<string, unknown>) => void;\n onCancel: () => void;\n onFieldChange?: () => void;\n}\n\ntype FieldErrors = Record<string, string>;\ntype ExtendedField = OonFormFieldDef & { multiline?: boolean; rows?: number; span?: 1 | 2 };\n\nconst idFor = (field: string) => `oon-form-field-${field.replace(/[^a-zA-Z0-9_-]/g, \"-\")}`;\nconst errorIdFor = (field: string) => `${idFor(field)}-error`;\nconst normalize = (value: unknown) => String(value ?? \"\").normalize(\"NFD\").replace(/[\\u0300-\\u036f]/g, \"\").toLowerCase();\n\nfunction CloseIcon() {\n return <svg viewBox=\"0 0 20 20\" width=\"18\" height=\"18\" aria-hidden=\"true\"><path d=\"m6 6 8 8M14 6l-8 8\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" /></svg>;\n}\n\nfunction CheckIcon() {\n return <svg viewBox=\"0 0 20 20\" width=\"16\" height=\"16\" aria-hidden=\"true\"><circle cx=\"10\" cy=\"10\" r=\"7\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.4\" /><path d=\"m6.8 10.1 2 2 4.3-4.4\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" /></svg>;\n}\n\nfunction AlertIcon() {\n return <svg viewBox=\"0 0 20 20\" width=\"17\" height=\"17\" aria-hidden=\"true\"><circle cx=\"10\" cy=\"10\" r=\"7\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.4\" /><path d=\"M10 6.5v4.2M10 13.5v.1\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" /></svg>;\n}\n\nfunction toValue(value: unknown, kind?: string) {\n if (value == null) return \"\";\n if (kind === \"date\") {\n try { return new Date(value as string).toISOString().slice(0, 10); } catch { return \"\"; }\n }\n if (typeof value === \"object\") {\n const record = value as Record<string, unknown>;\n return String(record._id ?? record.id ?? \"\");\n }\n return String(value);\n}\n\nfunction coerce(value: string, kind?: string): unknown {\n if (value === \"\") return undefined;\n if ([\"number\", \"currency\", \"currencyConverted\"].includes(kind ?? \"\")) return Number(value);\n if (kind === \"boolean\") return value === \"true\";\n return value;\n}\n\nfunction validate(fields: OonFormFieldDef[], values: Record<string, string>) {\n const errors: FieldErrors = {};\n fields.forEach((field) => {\n if (field.required && !(values[field.field] ?? \"\").trim()) errors[field.field] = `${fieldLabel({ name: field.field, label: field.label })} é obrigatório.`;\n });\n return errors;\n}\n\nfunction messageOf(error: unknown) {\n if (!error) return null;\n if (typeof error === \"string\") return error;\n if (error instanceof Error) return error.message;\n if (typeof error === \"object\") {\n const record = error as Record<string, unknown>;\n if (typeof record.message === \"string\") return record.message;\n if (record.error && typeof record.error === \"object\" && typeof (record.error as Record<string, unknown>).message === \"string\") return (record.error as Record<string, unknown>).message as string;\n }\n return \"Não foi possível salvar o registro.\";\n}\n\nfunction detailErrors(error: unknown, fields: OonFormFieldDef[]) {\n const result: FieldErrors = {};\n const lookup = new Map(fields.flatMap((field) => [[normalize(field.field), field], [normalize(field.label), field]] as Array<[string, OonFormFieldDef]>));\n const seen = new WeakSet<object>();\n const visit = (value: unknown, hint?: string) => {\n if (value == null) return;\n if (Array.isArray(value)) return value.forEach((item) => visit(item, hint));\n if (typeof value !== \"object\" || seen.has(value)) return;\n seen.add(value);\n const record = value as Record<string, unknown>;\n const candidate = String(record.field ?? record.path ?? record.property ?? record.name ?? hint ?? \"\");\n const field = lookup.get(normalize(candidate.split(/[.[\\]]+/).filter(Boolean).pop() ?? candidate));\n const raw = record.message ?? record.msg ?? record.reason;\n if (field && typeof raw === \"string\") result[field.field] = /required|obrigat/i.test(raw) ? `${fieldLabel({ name: field.field, label: field.label })} é obrigatório.` : raw;\n Object.entries(record).forEach(([key, nested]) => {\n const direct = lookup.get(normalize(key));\n if (direct && typeof nested === \"string\") result[direct.field] = nested;\n visit(nested, key);\n });\n };\n if (error && typeof error === \"object\") {\n const record = error as Record<string, unknown>;\n visit(record.details ?? (record.error as Record<string, unknown> | undefined)?.details ?? record);\n }\n return result;\n}\n\nfunction focusField(field: string) {\n window.setTimeout(() => {\n const element = document.getElementById(idFor(field)) as HTMLElement | null;\n element?.scrollIntoView?.({ behavior: \"smooth\", block: \"center\" });\n element?.focus({ preventScroll: true });\n }, 0);\n}\n\nfunction isMultiline(field: ExtendedField) {\n return field.multiline === true || /observa|descricao|mensagem|detalhe|necessidade/i.test(field.field);\n}\n\nfunction Label({ id, label, required }: { id: string; label: string; required?: boolean }) {\n return <label htmlFor={id}><Text as=\"span\" display=\"block\" mb=\"6px\" color=\"#475467\" fontSize=\"11px\" fontWeight=\"600\">{label}{required ? <Text as=\"span\" color=\"#DC2626\"> *</Text> : null}</Text></label>;\n}\n\nfunction ErrorText({ id, text }: { id?: string; text?: string }) {\n return text ? <Text id={id} role=\"alert\" mt=\"5px\" color=\"#DC2626\" fontSize=\"10px\" fontWeight=\"500\">{text}</Text> : null;\n}\n\nconst controlProps = (invalid: boolean) => ({\n minH: \"37px\",\n px: \"10px\",\n py: \"8px\",\n color: \"#475467\",\n bg: \"white\",\n borderColor: invalid ? \"#DC2626\" : \"#D5DDE3\",\n borderRadius: \"6px\",\n boxShadow: invalid ? \"0 0 0 3px rgba(220,38,38,.08)\" : undefined,\n fontSize: \"11px\",\n});\n\nexport function DynamicForm({ title, eyebrow = \"Cadastro\", fields, initialValues, submitting, error, onSubmit, onCancel, onFieldChange }: DynamicFormProps) {\n const [values, setValues] = useState<Record<string, string>>(() => Object.fromEntries(fields.map((field) => [field.field, toValue(initialValues?.[field.field], field.kind)])));\n const [errors, setErrors] = useState<FieldErrors>({});\n const [dismissed, setDismissed] = useState(false);\n\n useEffect(() => {\n const listener = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\" || event.defaultPrevented || submitting) return;\n if ((event.target as HTMLElement | null)?.closest('[role=\"combobox\"], [role=\"listbox\"]')) return;\n onCancel();\n };\n document.addEventListener(\"keydown\", listener);\n return () => document.removeEventListener(\"keydown\", listener);\n }, [onCancel, submitting]);\n\n useEffect(() => {\n setDismissed(false);\n if (!error) return;\n const detailed = detailErrors(error, fields);\n const fallback = /validacao|validation/i.test(normalize(messageOf(error))) ? validate(fields, values) : {};\n const next = Object.keys(detailed).length ? detailed : fallback;\n if (!Object.keys(next).length) return;\n setErrors((current) => ({ ...current, ...next }));\n const first = fields.find((field) => next[field.field]);\n if (first) focusField(first.field);\n }, [error]);\n\n const change = (field: string, value: string) => {\n setValues((current) => ({ ...current, [field]: value }));\n setErrors((current) => { if (!current[field]) return current; const next = { ...current }; delete next[field]; return next; });\n setDismissed(true);\n onFieldChange?.();\n };\n\n const submit = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n const validation = validate(fields, values);\n if (Object.keys(validation).length) {\n setErrors(validation);\n setDismissed(true);\n const first = fields.find((field) => validation[field.field]);\n if (first) focusField(first.field);\n return;\n }\n const payload: Record<string, unknown> = {};\n fields.forEach((field) => { const value = coerce(values[field.field] ?? \"\", field.kind); if (value !== undefined) payload[field.field] = value; });\n setErrors({});\n onSubmit(payload);\n };\n\n const invalid = fields.filter((field) => errors[field.field]);\n const generic = dismissed ? null : messageOf(error);\n\n return (\n <Flex position=\"fixed\" inset={0} zIndex={1000} align=\"center\" justify=\"center\" p={{ base: 2, md: 6 }} bg=\"rgba(15,23,42,.48)\" backdropFilter=\"blur(2px)\" onMouseDown={(event) => { if (event.currentTarget === event.target && !submitting) onCancel(); }}>\n <Box role=\"dialog\" aria-modal=\"true\" aria-label={title} w=\"min(860px, 96vw)\" maxH=\"min(880px, 94vh)\" overflow=\"hidden\" bg=\"white\" borderWidth=\"1px\" borderColor=\"#E5E9ED\" borderRadius=\"14px\" boxShadow=\"0 24px 70px rgba(15,23,42,.24)\">\n <Flex minH=\"76px\" px=\"20px\" py=\"16px\" align=\"center\" justify=\"space-between\" borderBottomWidth=\"1px\" borderColor=\"#E5E9ED\">\n <Box><Text color=\"#0474AF\" fontSize=\"10px\" fontWeight=\"600\" letterSpacing=\".07em\" textTransform=\"uppercase\">{eyebrow}</Text><Heading mt=\"3px\" color=\"#344054\" fontSize=\"18px\" fontWeight=\"600\">{title}</Heading></Box>\n <Button type=\"button\" aria-label=\"Fechar\" w=\"31px\" minW=\"31px\" h=\"31px\" p={0} color=\"#667085\" bg=\"white\" borderWidth=\"1px\" borderColor=\"#E5E9ED\" borderRadius=\"6px\" disabled={submitting} onClick={onCancel} _hover={{ color: \"#036491\", bg: \"#F0F7FF\", borderColor: \"#B8D9EB\" }}><CloseIcon /></Button>\n </Flex>\n\n <form noValidate onSubmit={submit}>\n <Box maxH=\"calc(94vh - 148px)\" px=\"20px\" pt=\"18px\" pb=\"24px\" overflowY=\"auto\">\n <Stack gap={4}>\n {invalid.length ? <Box role=\"alert\" p=\"11px 13px\" color=\"#9B1C1C\" bg=\"#FFF5F5\" borderWidth=\"1px\" borderColor=\"#FECACA\" borderLeftWidth=\"4px\" borderLeftColor=\"#DC2626\" borderRadius=\"8px\" fontSize=\"11px\"><Flex align=\"center\" gap=\"7px\"><AlertIcon /><Text as=\"strong\">Não foi possível salvar. Corrija os campos abaixo:</Text></Flex><Box as=\"ul\" mt=\"7px\" mb={0} pl=\"20px\" display=\"grid\" gap=\"3px\">{invalid.map((field) => <li key={field.field}><Button type=\"button\" variant=\"plain\" minH=\"auto\" h=\"auto\" p={0} color=\"#B42318\" fontSize=\"10px\" fontWeight=\"400\" textDecoration=\"underline\" onClick={() => focusField(field.field)}>{fieldLabel({ name: field.field, label: field.label })}: {errors[field.field]}</Button></li>)}</Box></Box> : null}\n {generic && !invalid.length ? <Flex role=\"alert\" p=\"10px 12px\" align=\"center\" gap={2} color=\"#B42318\" bg=\"#FEF3F2\" borderWidth=\"1px\" borderColor=\"#FECDCA\" borderRadius=\"7px\" fontSize=\"11px\"><AlertIcon />{generic}</Flex> : null}\n\n <SimpleGrid columns={{ base: 1, lg: 2 }} gapX=\"16px\" gapY=\"15px\">\n {fields.map((baseField) => {\n const field = baseField as ExtendedField;\n const label = fieldLabel({ name: field.field, label: field.label });\n const message = errors[field.field];\n const id = idFor(field.field);\n const errorId = message ? errorIdFor(field.field) : undefined;\n const multiline = isMultiline(field);\n const span = field.span === 2 || multiline;\n const wrap = (control: React.ReactNode) => <Box key={field.field} gridColumn={span ? \"1 / -1\" : undefined}><Label id={id} label={label} required={field.required} />{control}<ErrorText id={errorId} text={message} /></Box>;\n\n if (field.kind === \"ref\" && field.ref) return wrap(<ReferenceSelect field={field.field} inputId={id} errorId={errorId} label={label} refModel={field.ref} value={values[field.field] ?? \"\"} initialValue={initialValues?.[field.field]} required={field.required} invalid={!!message} error={message} onChange={(value) => change(field.field, value)} />);\n if (field.kind === \"enum\" && field.options?.length) return wrap(<NativeSelect.Root size=\"sm\"><NativeSelect.Field id={id} aria-invalid={!!message} aria-describedby={errorId} value={values[field.field] ?? \"\"} {...controlProps(!!message)} onChange={(event) => change(field.field, event.currentTarget.value)}><option value=\"\">— Selecione —</option>{field.options.map((option) => <option key={option} value={option}>{option}</option>)}</NativeSelect.Field><NativeSelect.Indicator /></NativeSelect.Root>);\n if (field.kind === \"boolean\") return wrap(<NativeSelect.Root size=\"sm\"><NativeSelect.Field id={id} aria-invalid={!!message} aria-describedby={errorId} value={values[field.field] ?? \"\"} {...controlProps(!!message)} onChange={(event) => change(field.field, event.currentTarget.value)}><option value=\"\">— Selecione —</option><option value=\"true\">Sim</option><option value=\"false\">Não</option></NativeSelect.Field><NativeSelect.Indicator /></NativeSelect.Root>);\n if (multiline) return wrap(<Textarea id={id} rows={field.rows ?? 4} resize=\"vertical\" aria-invalid={!!message} aria-describedby={errorId} value={values[field.field] ?? \"\"} {...controlProps(!!message)} lineHeight=\"1.5\" onChange={(event) => change(field.field, event.currentTarget.value)} />);\n const type = field.kind === \"date\" ? \"date\" : [\"number\", \"currency\", \"currencyConverted\"].includes(field.kind ?? \"\") ? \"number\" : \"text\";\n return wrap(<Input id={id} type={type} step={type === \"number\" ? \"any\" : undefined} autoComplete=\"off\" aria-invalid={!!message} aria-describedby={errorId} value={values[field.field] ?? \"\"} {...controlProps(!!message)} onChange={(event) => change(field.field, event.currentTarget.value)} />);\n })}\n </SimpleGrid>\n </Stack>\n </Box>\n\n <Flex minH=\"68px\" px=\"20px\" py=\"14px\" justify=\"flex-end\" gap=\"9px\" borderTopWidth=\"1px\" borderColor=\"#E5E9ED\"><Button type=\"button\" minH=\"35px\" px=\"13px\" color=\"#475467\" bg=\"white\" borderWidth=\"1px\" borderColor=\"#D5DDE3\" borderRadius=\"6px\" fontSize=\"11px\" fontWeight=\"600\" disabled={submitting} onClick={onCancel}>Cancelar</Button><Button type=\"submit\" minH=\"35px\" px=\"13px\" colorPalette=\"brand\" borderRadius=\"6px\" fontSize=\"11px\" fontWeight=\"600\" loading={submitting}><CheckIcon /> Salvar</Button></Flex>\n </form>\n </Box>\n </Flex>\n );\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { Box, Button, Flex, Input, Spinner, Stack, Text } from \"@chakra-ui/react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useModelSchema, useOonResource } from \"../../api/ApiProvider\";\nimport { initialReferenceLabel, referenceId, referenceOptionLabel } from \"./referenceUtils\";\n\nexport interface ReferenceSelectProps {\n field: string;\n inputId?: string;\n errorId?: string;\n label: string;\n refModel: string;\n value: string;\n initialValue?: unknown;\n required?: boolean;\n invalid?: boolean;\n error?: string;\n onChange: (value: string) => void;\n}\n\nfunction SearchIcon() {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"15\" height=\"15\" aria-hidden=\"true\">\n <circle cx=\"8.5\" cy=\"8.5\" r=\"5.25\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"m12.4 12.4 4 4\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nfunction ChevronIcon({ open }: { open: boolean }) {\n return (\n <svg\n viewBox=\"0 0 20 20\"\n width=\"16\"\n height=\"16\"\n aria-hidden=\"true\"\n style={{ display: \"block\", transition: \"transform .15s ease\", transform: open ? \"rotate(180deg)\" : \"rotate(0deg)\" }}\n >\n <path d=\"M5.5 7.5 10 12l4.5-4.5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.7\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nfunction ClearIcon() {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"14\" height=\"14\" aria-hidden=\"true\">\n <path d=\"m6 6 8 8M14 6l-8 8\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.7\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\n/** Campo relacionado no mesmo padrão explícito da Central Minexco. */\nexport function ReferenceSelect({\n field,\n inputId,\n errorId,\n label,\n refModel,\n value,\n initialValue,\n required,\n invalid,\n error,\n onChange,\n}: ReferenceSelectProps) {\n const initialLabel = useMemo(() => initialReferenceLabel(initialValue), [initialValue]);\n const [selectedLabel, setSelectedLabel] = useState(initialLabel);\n const [search, setSearch] = useState(\"\");\n const [debouncedSearch, setDebouncedSearch] = useState(\"\");\n const [open, setOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState(-1);\n const rootRef = useRef<HTMLDivElement | null>(null);\n const searchRef = useRef<HTMLInputElement | null>(null);\n const optionRefs = useRef<Array<HTMLButtonElement | null>>([]);\n\n const schemaQuery = useModelSchema(refModel);\n const schema = schemaQuery.data;\n const basePath = schema?.basePath ?? `/${refModel.toLowerCase()}s`;\n const resource = useOonResource<Record<string, unknown>>(basePath);\n\n useEffect(() => {\n const timer = window.setTimeout(() => setDebouncedSearch(search.trim()), 250);\n return () => window.clearTimeout(timer);\n }, [search]);\n\n useEffect(() => {\n if (!value) setSelectedLabel(\"\");\n else if (initialLabel) setSelectedLabel(initialLabel);\n }, [initialLabel, value]);\n\n useEffect(() => {\n if (!open) return;\n const onPointerDown = (event: PointerEvent) => {\n if (!rootRef.current?.contains(event.target as Node)) {\n setOpen(false);\n setActiveIndex(-1);\n }\n };\n document.addEventListener(\"pointerdown\", onPointerDown);\n return () => document.removeEventListener(\"pointerdown\", onPointerDown);\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n window.setTimeout(() => searchRef.current?.focus(), 0);\n }, [open]);\n\n const listQuery = useQuery({\n queryKey: [\"oon\", \"reference-options\", refModel, basePath, debouncedSearch],\n queryFn: () => resource.list({ pageIndex: 0, pageSize: 30, searchTerm: debouncedSearch || undefined }),\n enabled: !!schema && open,\n staleTime: 30_000,\n });\n\n const currentQuery = useQuery({\n queryKey: [\"oon\", \"reference-current\", refModel, basePath, value],\n queryFn: () => resource.get(value),\n enabled: !!schema && !!value && !selectedLabel,\n staleTime: 5 * 60_000,\n });\n\n useEffect(() => {\n if (!currentQuery.data) return;\n setSelectedLabel(referenceOptionLabel(currentQuery.data, schema?.searchable));\n }, [currentQuery.data, schema?.searchable]);\n\n const items = listQuery.data?.results ?? [];\n const listId = `oon-reference-${field}`;\n const resolvedInputId = inputId ?? `oon-reference-input-${field}`;\n const activeOptionId = activeIndex >= 0 ? `${listId}-option-${activeIndex}` : undefined;\n\n const openList = (seed = \"\") => {\n if (seed) setSearch(seed);\n setOpen(true);\n setActiveIndex((current) => (current >= 0 ? current : 0));\n };\n\n const closeList = () => {\n setOpen(false);\n setActiveIndex(-1);\n };\n\n const choose = (record: Record<string, unknown>) => {\n const id = referenceId(record);\n if (!id) return;\n onChange(id);\n setSelectedLabel(referenceOptionLabel(record, schema?.searchable));\n setSearch(\"\");\n setDebouncedSearch(\"\");\n closeList();\n };\n\n const clear = (event: React.MouseEvent | React.KeyboardEvent) => {\n event.preventDefault();\n event.stopPropagation();\n onChange(\"\");\n setSelectedLabel(\"\");\n setSearch(\"\");\n setDebouncedSearch(\"\");\n };\n\n const moveActive = (direction: 1 | -1) => {\n if (!items.length) return;\n setActiveIndex((current) => {\n const start = current < 0 ? (direction === 1 ? -1 : 0) : current;\n const next = (start + direction + items.length) % items.length;\n window.setTimeout(() => optionRefs.current[next]?.scrollIntoView({ block: \"nearest\" }), 0);\n return next;\n });\n };\n\n return (\n <Box ref={rootRef} position=\"relative\">\n <Button\n id={resolvedInputId}\n type=\"button\"\n variant=\"outline\"\n w=\"100%\"\n minH=\"37px\"\n h=\"auto\"\n px=\"10px\"\n py=\"8px\"\n justifyContent=\"space-between\"\n gap={2}\n color=\"#475467\"\n bg=\"white\"\n borderColor={invalid ? \"#DC2626\" : \"#D5DDE3\"}\n borderRadius=\"6px\"\n boxShadow={invalid ? \"0 0 0 3px rgba(220,38,38,.08)\" : undefined}\n fontSize=\"11px\"\n fontWeight=\"400\"\n textAlign=\"left\"\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={listId}\n aria-activedescendant={open ? activeOptionId : undefined}\n aria-required={required}\n aria-invalid={invalid || undefined}\n aria-describedby={error ? errorId : undefined}\n onClick={() => (open ? closeList() : openList())}\n onKeyDown={(event) => {\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n if (!open) openList();\n else moveActive(1);\n return;\n }\n if (event.key === \"ArrowUp\") {\n event.preventDefault();\n if (!open) openList();\n else moveActive(-1);\n return;\n }\n if (event.key === \"Enter\" && open && activeIndex >= 0 && items[activeIndex]) {\n event.preventDefault();\n choose(items[activeIndex]);\n return;\n }\n if (event.key === \"Escape\" && open) {\n event.preventDefault();\n event.stopPropagation();\n closeList();\n return;\n }\n if (!event.ctrlKey && !event.metaKey && !event.altKey && event.key.length === 1) {\n event.preventDefault();\n openList(event.key);\n }\n }}\n _hover={{ bg: \"white\", borderColor: \"#B9C7D1\" }}\n _focusVisible={{ borderColor: invalid ? \"#DC2626\" : \"#0F8DD0\", boxShadow: invalid ? \"0 0 0 3px rgba(220,38,38,.08)\" : \"0 0 0 3px rgba(15,141,208,.10)\" }}\n >\n <Text as=\"span\" minW={0} flex=\"1\" overflow=\"hidden\" textOverflow=\"ellipsis\" whiteSpace=\"nowrap\" color={selectedLabel || value ? \"#475467\" : \"#98A2B3\"}>\n {selectedLabel || (value ? String(value) : \"Selecione ou digite para pesquisar...\")}\n </Text>\n <Flex as=\"span\" align=\"center\" gap={1} flex=\"0 0 auto\" color=\"#98A2B3\">\n {value ? (\n <Box\n as=\"span\"\n role=\"button\"\n tabIndex={0}\n aria-label={`Limpar ${label}`}\n w=\"20px\"\n h=\"20px\"\n display=\"grid\"\n placeItems=\"center\"\n borderRadius=\"4px\"\n onClick={clear}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") clear(event);\n }}\n _hover={{ color: \"#B42318\", bg: \"#FFF1F1\" }}\n >\n <ClearIcon />\n </Box>\n ) : null}\n <ChevronIcon open={open} />\n </Flex>\n </Button>\n\n {open ? (\n <Box\n position=\"absolute\"\n zIndex={120}\n top=\"calc(100% + 5px)\"\n left={0}\n right={0}\n overflow=\"hidden\"\n bg=\"white\"\n borderWidth=\"1px\"\n borderColor=\"#D5DDE3\"\n borderRadius=\"8px\"\n boxShadow=\"0 10px 30px rgba(15,23,42,.10)\"\n >\n <Flex h=\"38px\" px=\"10px\" align=\"center\" gap=\"7px\" color=\"#98A2B3\" borderBottomWidth=\"1px\" borderColor=\"#E5E9ED\">\n <SearchIcon />\n <Input\n ref={searchRef}\n value={search}\n onChange={(event) => {\n setSearch(event.target.value);\n setActiveIndex(0);\n }}\n placeholder=\"Digite para filtrar...\"\n h=\"100%\"\n p={0}\n color=\"#475467\"\n bg=\"transparent\"\n border={0}\n borderRadius={0}\n fontSize=\"11px\"\n _focusVisible={{ boxShadow: \"none\", outline: \"none\" }}\n onKeyDown={(event) => {\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n moveActive(1);\n } else if (event.key === \"ArrowUp\") {\n event.preventDefault();\n moveActive(-1);\n } else if (event.key === \"Enter\" && activeIndex >= 0 && items[activeIndex]) {\n event.preventDefault();\n choose(items[activeIndex]);\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n closeList();\n }\n }}\n />\n </Flex>\n\n <Stack id={listId} role=\"listbox\" gap={0} maxH=\"230px\" p=\"5px\" overflowY=\"auto\">\n {schemaQuery.isLoading || listQuery.isLoading ? (\n <Flex minH=\"54px\" align=\"center\" justify=\"center\" gap={2} color=\"#98A2B3\" fontSize=\"10px\"><Spinner size=\"xs\" /> Carregando...</Flex>\n ) : schemaQuery.isError || listQuery.isError ? (\n <Text py=\"18px\" px=\"10px\" color=\"#B42318\" fontSize=\"10px\" textAlign=\"center\">Não foi possível carregar as opções.</Text>\n ) : items.length === 0 ? (\n <Text py=\"18px\" px=\"10px\" color=\"#98A2B3\" fontSize=\"10px\" textAlign=\"center\">Nenhum registro encontrado.</Text>\n ) : (\n items.map((record, index) => {\n const id = referenceId(record);\n if (!id) return null;\n const selected = String(id) === String(value);\n const active = index === activeIndex;\n const optionLabel = referenceOptionLabel(record, schema?.searchable);\n const status = record.status;\n return (\n <Button\n id={`${listId}-option-${index}`}\n ref={(element) => { optionRefs.current[index] = element; }}\n key={id}\n type=\"button\"\n role=\"option\"\n aria-selected={selected}\n w=\"100%\"\n minH=\"38px\"\n h=\"auto\"\n px=\"9px\"\n py=\"7px\"\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"flex-start\"\n gap={0}\n color={active || selected ? \"#014364\" : \"#475467\"}\n bg={active || selected ? \"#F0F7FF\" : \"transparent\"}\n border={0}\n borderRadius=\"5px\"\n fontWeight=\"400\"\n textAlign=\"left\"\n onMouseEnter={() => setActiveIndex(index)}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => choose(record)}\n _hover={{ color: \"#014364\", bg: \"#F0F7FF\" }}\n >\n <Text as=\"strong\" fontSize=\"10px\" fontWeight=\"600\">{optionLabel}</Text>\n {status ? <Text as=\"small\" color=\"#98A2B3\" fontSize=\"9px\" textTransform=\"capitalize\">{String(status).replace(/_/g, \" \")}</Text> : null}\n </Button>\n );\n })\n )}\n </Stack>\n </Box>\n ) : null}\n </Box>\n );\n}\n","const COMMON_LABEL_FIELDS = [\n \"nome\",\n \"razaoSocial\",\n \"razao_social\",\n \"descricao\",\n \"numero\",\n \"codigoIndividual\",\n \"codigo_individual\",\n \"codigo\",\n \"label\",\n \"email\",\n];\n\nfunction primitiveText(value: unknown): string | null {\n if (value == null || value === \"\") return null;\n if (typeof value === \"string\" || typeof value === \"number\") return String(value);\n return null;\n}\n\n/**\n * Resolve um rótulo humano para qualquer registro relacionado. Prioriza campos\n * conhecidos e depois os campos pesquisáveis expostos pela metadata.\n */\nexport function referenceOptionLabel(\n row: Record<string, unknown>,\n searchableFields: string[] = []\n): string {\n const ordered = [...COMMON_LABEL_FIELDS, ...searchableFields];\n const seenFields = new Set<string>();\n const seenValues = new Set<string>();\n const values: string[] = [];\n\n for (const field of ordered) {\n if (seenFields.has(field)) continue;\n seenFields.add(field);\n const text = primitiveText(row[field]);\n if (!text || seenValues.has(text)) continue;\n seenValues.add(text);\n values.push(text);\n if (values.length === 2) break;\n }\n\n if (values.length) return values.join(\" — \");\n return primitiveText(row._id) ?? primitiveText(row.id) ?? \"Registro sem identificação\";\n}\n\nexport function initialReferenceLabel(value: unknown): string {\n if (!value || typeof value !== \"object\") return \"\";\n return referenceOptionLabel(value as Record<string, unknown>);\n}\n\nexport function referenceId(row: Record<string, unknown>): string {\n return String(row._id ?? row.id ?? \"\");\n}\n","import type { OonColumnDef, OonFormFieldDef } from \"../types\";\nimport { useOonApi } from \"../api/ApiProvider\";\nimport { CoreCollection } from \"./CoreCollection\";\n\nexport interface CoreDocumentProps {\n model: string;\n label?: string;\n endpoint?: string;\n columns?: OonColumnDef[];\n form?: OonFormFieldDef[];\n /** liga ações de aprovar/reprovar (RESTful: /:id/actions/approve|reject). */\n approval?: boolean;\n /** liga gestão de anexos (futuro: /:id/files). */\n attachments?: boolean;\n}\n\n/**\n * Tipo documental. Hoje reusa a coleção genérica (list + CRUD). Quando\n * `approval` está ligado, expõe o helper `approveDocument` para as ações\n * RESTful do back (Seção 5.2) — documentos fiscais e cadastrais viram\n * configuração, não páginas escritas à mão.\n */\nexport function CoreDocument({ model, label, endpoint, columns, form }: CoreDocumentProps) {\n return (\n <CoreCollection\n model={model}\n label={label}\n mode={columns && form ? \"full\" : \"dynamic\"}\n endpoint={endpoint}\n columns={columns}\n form={form}\n />\n );\n}\n\n/**\n * Aciona uma ação RESTful de documento (approve/reject/archive). Exposto para\n * o domínio usar em botões de linha sem reimplementar a chamada.\n */\nexport function useDocumentAction(basePath: string) {\n const { http } = useOonApi();\n return (id: string, action: \"approve\" | \"reject\" | \"archive\") =>\n http.post(`${basePath}/${id}/actions/${action}`, {}, { headers: { \"x-oon-origin\": \"form\" } });\n}\n","import { useState } from \"react\";\nimport { Badge, Box, Button, Flex, Heading, Stack, Text } from \"@chakra-ui/react\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useModelSchema, useOonResource } from \"../api/ApiProvider\";\nimport { LoadingScreen } from \"../shell/LoadingScreen\";\nimport { ErrorState } from \"../shell/ErrorState\";\nimport { DynamicForm } from \"./internal/DynamicForm\";\nimport { fieldLabel, formatCell, formFieldsFromMeta } from \"./internal/fieldUtils\";\n\nexport interface CorePipelineProps {\n model: string;\n label?: string;\n endpoint?: string;\n stageField?: string;\n stages?: Array<{ id: string; label: string }>;\n titleField?: string;\n}\n\nfunction ticketId(row: Record<string, unknown>): string | undefined {\n const id = row._id ?? row.id;\n return id == null ? undefined : String(id);\n}\n\n/** Esteira horizontal padrão, com tickets clicáveis e formulário completo em modal. */\nexport function CorePipeline({ model, label, endpoint, stageField = \"status\", stages, titleField }: CorePipelineProps) {\n const schemaQuery = useModelSchema(model);\n const schema = schemaQuery.data;\n const basePath = endpoint ?? schema?.basePath ?? `/${model.toLowerCase()}s`;\n const resource = useOonResource(basePath);\n const queryClient = useQueryClient();\n const [selectedTicket, setSelectedTicket] = useState<Record<string, unknown> | null>(null);\n const [formError, setFormError] = useState<unknown>(null);\n\n const listQuery = useQuery({\n queryKey: [\"oon\", \"pipeline\", basePath],\n queryFn: () => resource.list({ pageSize: 200 }),\n enabled: !!schema,\n });\n\n const saveMutation = useMutation({\n mutationFn: (values: Record<string, unknown>) => {\n const id = selectedTicket ? ticketId(selectedTicket) : undefined;\n if (!id) throw new Error(\"Não foi possível identificar o ticket selecionado.\");\n return resource.update(id, values);\n },\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey: [\"oon\", \"pipeline\", basePath] });\n setSelectedTicket(null);\n setFormError(null);\n },\n onError: (error) => setFormError(error),\n });\n\n if (schemaQuery.isLoading || listQuery.isLoading) return <LoadingScreen />;\n if (schemaQuery.isError) return <ErrorState error={schemaQuery.error} />;\n if (listQuery.isError) return <ErrorState error={listQuery.error} />;\n\n const stageFieldMeta = schema?.fields.find((field) => field.name === stageField);\n const resolvedStages = stages ?? (stageFieldMeta?.options ?? []).map((option) => ({ id: option, label: option }));\n const title = titleField ?? schema?.fields.find((field) => field.kind === \"string\")?.name ?? schema?.searchable[0] ?? \"_id\";\n const detailFields = (schema?.fields ?? [])\n .filter((field) => field.name !== stageField && field.name !== title && ![\"raw\"].includes(field.kind))\n .slice(0, 3);\n const formFields = formFieldsFromMeta(schema?.fields ?? []);\n\n const rows = listQuery.data?.results ?? [];\n const byStage = new Map<string, Record<string, unknown>[]>();\n for (const stage of resolvedStages) byStage.set(stage.id, []);\n for (const row of rows) {\n const key = String(row[stageField] ?? \"\");\n if (!byStage.has(key)) byStage.set(key, []);\n byStage.get(key)!.push(row);\n }\n\n return (\n <Stack gap={5}>\n <Box>\n <Text fontSize=\"11px\" fontWeight=\"700\" color=\"brand.500\" textTransform=\"uppercase\" letterSpacing=\"0.08em\" mb={1}>\n Esteira de processo\n </Text>\n <Heading size=\"lg\" color=\"#24323A\" letterSpacing=\"-0.02em\">\n {label ?? schema?.name ?? model}\n </Heading>\n <Text mt={1} fontSize=\"13px\" color=\"gray.500\">\n Acompanhe os tickets por etapa e visualize os principais dados de cada item.\n </Text>\n </Box>\n\n <Flex gap={4} align=\"stretch\" overflowX=\"auto\" pb={3} minH=\"420px\">\n {Array.from(byStage.entries()).map(([stageId, items]) => {\n const stageLabel = resolvedStages.find((stage) => stage.id === stageId)?.label ?? (stageId || \"Sem etapa\");\n return (\n <Box\n key={stageId}\n minW=\"300px\"\n maxW=\"340px\"\n flex=\"1 0 300px\"\n bg=\"#E8ECEF\"\n borderRadius=\"12px\"\n p={3}\n borderWidth=\"1px\"\n borderColor=\"#DDE3E7\"\n >\n <Flex align=\"center\" justify=\"space-between\" mb={3} px={1}>\n <Text fontWeight=\"700\" fontSize=\"12px\" color=\"#33434C\" textTransform=\"uppercase\" letterSpacing=\"0.03em\">\n {stageLabel}\n </Text>\n <Badge colorPalette=\"brand\" variant=\"solid\" borderRadius=\"full\" minW=\"24px\" justifyContent=\"center\">\n {items.length}\n </Badge>\n </Flex>\n\n <Stack gap={2}>\n {items.length === 0 ? (\n <Box borderWidth=\"1px\" borderStyle=\"dashed\" borderColor=\"#C8D0D5\" borderRadius=\"10px\" p={5} textAlign=\"center\">\n <Text fontSize=\"12px\" color=\"gray.500\">Nenhum ticket nesta etapa.</Text>\n </Box>\n ) : (\n items.map((row, index) => {\n const ticketTitle = formatCell(row[title], \"string\");\n return (\n <Button\n key={ticketId(row) ?? index}\n type=\"button\"\n variant=\"plain\"\n display=\"block\"\n w=\"100%\"\n h=\"auto\"\n minH=\"auto\"\n p={3}\n bg=\"white\"\n borderRadius=\"10px\"\n borderWidth=\"1px\"\n borderColor=\"#DDE3E7\"\n boxShadow=\"0 3px 10px rgba(7, 38, 46, 0.05)\"\n textAlign=\"left\"\n whiteSpace=\"normal\"\n transition=\"all 0.15s ease\"\n aria-label={`Abrir ticket ${ticketTitle}`}\n onClick={() => {\n setFormError(null);\n setSelectedTicket(row);\n }}\n _hover={{ borderColor: \"brand.300\", transform: \"translateY(-1px)\", boxShadow: \"0 7px 18px rgba(7, 38, 46, 0.09)\" }}\n _focusVisible={{ borderColor: \"brand.500\", boxShadow: \"0 0 0 3px rgba(4, 116, 175, 0.16)\" }}\n >\n <Text fontSize=\"13px\" fontWeight=\"700\" color=\"#24323A\" mb={2} lineClamp={2}>\n {ticketTitle}\n </Text>\n <Stack gap={1}>\n {detailFields.map((field) => (\n <Flex key={field.name} gap={2} align=\"baseline\" justify=\"space-between\">\n <Text fontSize=\"10px\" color=\"gray.500\" textTransform=\"uppercase\" letterSpacing=\"0.03em\">\n {fieldLabel(field)}\n </Text>\n <Text fontSize=\"11px\" color=\"#46545C\" fontWeight=\"500\" textAlign=\"right\" lineClamp={1}>\n {formatCell(row[field.name], field.kind)}\n </Text>\n </Flex>\n ))}\n </Stack>\n </Button>\n );\n })\n )}\n </Stack>\n </Box>\n );\n })}\n </Flex>\n\n {selectedTicket ? (\n <DynamicForm\n title={`Editar ${schema?.singular ?? label ?? model}`}\n eyebrow=\"Ticket\"\n fields={formFields}\n initialValues={selectedTicket}\n submitting={saveMutation.isPending}\n error={formError}\n onSubmit={(values) => {\n setFormError(null);\n saveMutation.mutate(values);\n }}\n onFieldChange={() => setFormError(null)}\n onCancel={() => {\n if (saveMutation.isPending) return;\n setSelectedTicket(null);\n setFormError(null);\n }}\n />\n ) : null}\n </Stack>\n );\n}\n","import { Box, Heading, SimpleGrid, Stack, Text } from \"@chakra-ui/react\";\nimport { useQueries } from \"@tanstack/react-query\";\nimport type { DashboardWidgetDef } from \"../types\";\nimport { useOonApi } from \"../api/ApiProvider\";\n\nexport interface CoreDashboardProps {\n label?: string;\n widgets?: DashboardWidgetDef[];\n}\n\n/**\n * Dashboard do Core: renderiza widgets registrados (count/sum por model ou\n * render custom). Cache, loading e erro ficam no Core; a Central só declara.\n */\nexport function CoreDashboard({ label = \"Dashboard\", widgets = [] }: CoreDashboardProps) {\n const { resource } = useOonApi();\n\n const queries = useQueries({\n queries: widgets\n .filter((w) => w.kind !== \"custom\" && w.model)\n .map((w) => ({\n queryKey: [\"oon\", \"widget\", w.id],\n queryFn: async () => {\n const r = await resource(`/${w.model!.toLowerCase()}s`).list({ pageSize: w.kind === \"sum\" ? 200 : 1 });\n if (w.kind === \"sum\" && w.field) {\n return r.results.reduce((acc, row) => acc + Number((row as Record<string, unknown>)[w.field!] ?? 0), 0);\n }\n return r.pagination.totalItems;\n },\n staleTime: 60 * 1000,\n })),\n });\n\n let queryIdx = 0;\n\n return (\n <Stack gap={6}>\n <Heading size=\"lg\">{label}</Heading>\n <SimpleGrid columns={{ base: 1, md: 2, lg: 3 }} gap={4}>\n {widgets.map((w) => {\n if (w.kind === \"custom\" && w.render) {\n return (\n <Box key={w.id} borderWidth=\"1px\" borderColor=\"gray.200\" borderRadius=\"md\" bg=\"white\" p={5}>\n {w.render()}\n </Box>\n );\n }\n const q = queries[queryIdx++];\n const value = q?.isLoading ? \"…\" : q?.isError ? \"—\" : formatWidget(q?.data, w.kind, w.field);\n return (\n <Box key={w.id} borderWidth=\"1px\" borderColor=\"gray.200\" borderRadius=\"md\" bg=\"white\" p={5}>\n <Text fontSize=\"sm\" color=\"gray.500\">\n {w.label}\n </Text>\n <Heading size=\"xl\" mt={1}>\n {value}\n </Heading>\n </Box>\n );\n })}\n </SimpleGrid>\n </Stack>\n );\n}\n\nfunction formatWidget(value: unknown, kind?: string, field?: string): string {\n if (value == null) return \"—\";\n if ((kind === \"sum\" && field?.toLowerCase().includes(\"valor\")) || kind === \"sum\") {\n return new Intl.NumberFormat(\"pt-BR\", { style: \"currency\", currency: \"BRL\" }).format(Number(value));\n }\n return String(value);\n}\n","import type {\n CollectionViewDef,\n DashboardViewDef,\n DocumentViewDef,\n OonCoreFrontConfig,\n OonMenuItem,\n OonRoute,\n OonViewDefinition,\n PipelineViewDef,\n} from \"../types\";\nimport { CoreCollection } from \"../components/CoreCollection\";\nimport { CoreDocument } from \"../components/CoreDocument\";\nimport { CorePipeline } from \"../components/CorePipeline\";\nimport { CoreDashboard } from \"../components/CoreDashboard\";\n\n/** Resultado da resolução de módulos + manifesto de UI em rotas e menu. */\nexport interface ResolvedRegistry {\n routes: OonRoute[];\n menu: OonMenuItem[];\n}\n\nfunction slug(value: string): string {\n return value\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\nfunction viewId(view: OonViewDefinition): string {\n if (view.id) return view.id;\n if (view.type === \"dashboard\") return \"dashboard\";\n return slug(view.model);\n}\n\nfunction viewPath(view: OonViewDefinition): string {\n if (view.path) return view.path;\n if (view.type === \"dashboard\") return \"/\";\n return `/${viewId(view)}`;\n}\n\nfunction viewLabel(view: OonViewDefinition): string {\n if (view.label) return view.label;\n if (view.type === \"dashboard\") return \"Dashboard\";\n return view.model;\n}\n\n/** Converte uma view declarativa no componente Core correspondente. */\nfunction renderView(view: OonViewDefinition) {\n switch (view.type) {\n case \"collection\": {\n const v = view as CollectionViewDef;\n return (\n <CoreCollection\n model={v.model}\n mode={v.mode}\n columns={v.columns}\n form={v.form}\n label={viewLabel(v)}\n importExport={v.importExport}\n />\n );\n }\n case \"document\": {\n const v = view as DocumentViewDef;\n return <CoreDocument model={v.model} label={viewLabel(v)} approval={v.approval} attachments={v.attachments} />;\n }\n case \"pipeline\": {\n const v = view as PipelineViewDef;\n return (\n <CorePipeline\n model={v.model}\n label={viewLabel(v)}\n stageField={v.stageField}\n stages={v.stages}\n />\n );\n }\n case \"dashboard\": {\n const v = view as DashboardViewDef;\n return <CoreDashboard label={viewLabel(v)} widgets={v.widgets} />;\n }\n default:\n return null;\n }\n}\n\nfunction viewToRoute(view: OonViewDefinition): OonRoute {\n return {\n path: viewPath(view),\n element: renderView(view),\n permissions: \"permissions\" in view ? view.permissions : undefined,\n };\n}\n\nfunction viewToMenu(view: OonViewDefinition): OonMenuItem {\n return {\n label: viewLabel(view),\n href: viewPath(view),\n icon: view.icon,\n section: view.section,\n permissions: \"permissions\" in view ? view.permissions : undefined,\n };\n}\n\n/**\n * Resolve a config inteira (módulos + `ui.views`) em um registry plano de\n * rotas e menu. É o que substitui o `router.jsx` hardcoded por geração\n * dirigida por declaração/metadata.\n */\nexport function resolveRegistry(config: OonCoreFrontConfig): ResolvedRegistry {\n const routes: OonRoute[] = [];\n const menu: OonMenuItem[] = [];\n const seenPaths = new Set<string>();\n\n const pushRoute = (route: OonRoute) => {\n if (seenPaths.has(route.path)) return;\n seenPaths.add(route.path);\n routes.push(route);\n };\n\n for (const mod of config.modules ?? []) {\n for (const route of mod.routes ?? []) pushRoute(route);\n for (const item of mod.menu ?? []) menu.push(item);\n for (const view of mod.views ?? []) {\n pushRoute(viewToRoute(view));\n menu.push(viewToMenu(view));\n }\n }\n\n for (const view of config.ui?.views ?? []) {\n pushRoute(viewToRoute(view));\n menu.push(viewToMenu(view));\n }\n\n menu.sort((a, b) => (a.order ?? 100) - (b.order ?? 100));\n 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 OonSecurityConfig,\n} from \"../types\";\nimport { AuthenticatedLayout } from \"../shell/AuthenticatedLayout\";\nimport { AccessDeniedPage } from \"../security/AccessDeniedPage\";\nimport { AppAccessGuard } from \"../security/AppAccessGuard\";\nimport { LoginPage } from \"../security/LoginPage\";\nimport {\n ActivationPage,\n InstanceBlockedPage,\n} from \"../security/ActivationPage\";\nimport { RouteGuard } from \"../security/RouteGuard\";\nimport { ActivationGuard } from \"../security/ActivationGuard\";\n\nexport interface RouterInput {\n app: OonAppConfig;\n menu: OonMenuItem[];\n routes: OonRoute[];\n security?: OonSecurityConfig;\n}\n\n/** Constrói o router, incluindo os estados públicos de autenticação. */\nexport function createOonRouter({ app, menu, routes, security }: 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: route.element }));\n\n const privateSource = routes.filter((route) => !route.public);\n const privateRoutes: RouteObject[] = privateSource.map((route) => {\n const element = guardEnabled ? (\n <RouteGuard permission={route.permissions}>{route.element}</RouteGuard>\n ) : (\n route.element\n );\n\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({\n index: true,\n element: <Navigate to={firstRoute.path} replace />,\n });\n }\n\n const customPaths = new Set(publicRoutes.map((route) => route.path));\n const builtInPublicRoutes: RouteObject[] = [];\n\n if (!customPaths.has(\"/login\")) {\n builtInPublicRoutes.push({\n path: \"/login\",\n element: (\n <ActivationGuard>\n <LoginPage app={app} />\n </ActivationGuard>\n ),\n });\n }\n\n if (!customPaths.has(\"/ativacao\")) {\n builtInPublicRoutes.push({\n path: \"/ativacao\",\n element: <ActivationPage />,\n });\n }\n\n if (!customPaths.has(\"/instancia-suspensa\")) {\n builtInPublicRoutes.push({\n path: \"/instancia-suspensa\",\n element: (\n <InstanceBlockedPage\n title=\"Instância suspensa\"\n message=\"Esta Central está suspensa.\"\n />\n ),\n });\n }\n\n if (!customPaths.has(\"/instancia-revogada\")) {\n builtInPublicRoutes.push({\n path: \"/instancia-revogada\",\n element: (\n <InstanceBlockedPage\n title=\"Instância revogada\"\n message=\"Esta Central foi revogada.\"\n />\n ),\n });\n }\n\n if (!customPaths.has(\"/acesso-negado\")) {\n builtInPublicRoutes.push({\n path: \"/acesso-negado\",\n element: <AccessDeniedPage app={app} />,\n });\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} />\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 } from \"react-router-dom\";\nimport type { OonAppConfig, OonMenuItem } from \"../types\";\nimport { useOonAuth } from \"../security/AuthProvider\";\nimport { Sidebar } from \"./Sidebar\";\n\n/** Layout autenticado padrão: sidebar compacta, topbar fixa e área operacional. */\nexport function AuthenticatedLayout({ app, menu }: { app: OonAppConfig; menu: OonMenuItem[] }) {\n const { user, logout } = useOonAuth();\n\n return (\n <Flex align=\"stretch\" minH=\"100vh\" bg=\"#F8F9FA\">\n <Sidebar app={app} menu={menu} />\n <Flex direction=\"column\" flex=\"1\" minW={0}>\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=\"#E8ECEF\"\n bg=\"rgba(255, 255, 255, 0.96)\"\n backdropFilter=\"blur(10px)\"\n position=\"sticky\"\n top={0}\n zIndex={10}\n >\n <Box>\n <Text fontSize=\"xs\" fontWeight=\"600\" color=\"brand.500\" textTransform=\"uppercase\" letterSpacing=\"0.08em\">\n Central Oon\n </Text>\n <Text fontSize=\"sm\" fontWeight=\"600\" color=\"#24323A\">\n {app.title ?? app.name}\n </Text>\n </Box>\n <Spacer />\n {user ? (\n <Flex align=\"center\" gap={3}>\n <Box textAlign=\"right\" display={{ base: \"none\", md: \"block\" }}>\n <Text fontSize=\"sm\" fontWeight=\"600\" color=\"#24323A\">\n {user.nome}\n </Text>\n {user.email ? (\n <Text fontSize=\"xs\" color=\"gray.500\">\n {user.email}\n </Text>\n ) : null}\n </Box>\n <Button size=\"sm\" variant=\"outline\" colorPalette=\"brand\" borderRadius=\"8px\" onClick={logout}>\n Sair\n </Button>\n </Flex>\n ) : null}\n </Flex>\n <Box as=\"main\" flex=\"1\" p={{ base: 4, lg: 6 }} minW={0}>\n <Box maxW=\"1680px\" mx=\"auto\">\n <Outlet />\n </Box>\n </Box>\n </Flex>\n </Flex>\n );\n}\n","import { Box, Flex, Image, Stack, Text } from \"@chakra-ui/react\";\nimport { NavLink } from \"react-router-dom\";\nimport type { OonAppConfig, OonMenuItem } from \"../types\";\nimport { useOonAuth } from \"../security/AuthProvider\";\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\n/** Menu lateral compacto e agrupado, seguindo o padrão operacional Minexco. */\nexport function Sidebar({ app, menu }: { app: OonAppConfig; menu: OonMenuItem[] }) {\n const { hasPermission } = useOonAuth();\n const visible = menu.filter((item) => 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 <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 </Stack>\n ))}\n </Stack>\n </Box>\n );\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\n/**\n * Guarda a aplicação inteira depois que o backend valida token e permissão do\n * app. 401 segue para login; 403 segue para a página de acesso negado.\n */\nexport function AppAccessGuard({ children }: { children: ReactNode }) {\n const { status, retry } = useOonAuth();\n const location = useLocation();\n\n if (status === \"loading\") return <LoadingScreen />;\n\n if (status === \"unauthenticated\") {\n return (\n <Navigate\n to={loginRedirect(location.pathname, location.search)}\n replace\n />\n );\n }\n\n if (status === \"forbidden\") {\n return <Navigate to=\"/acesso-negado\" replace />;\n }\n\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={() => {\n void retry().catch(() => undefined);\n }}\n />\n );\n }\n\n return <>{children}</>;\n}\n","import { useState, type FormEvent } from \"react\";\nimport {\n Box,\n Button,\n Flex,\n Heading,\n Input,\n Text,\n VStack,\n} from \"@chakra-ui/react\";\nimport { Navigate, useLocation } from \"react-router-dom\";\nimport type { OonAppConfig, OonError } from \"../types\";\nimport { useOonAuth } from \"./AuthProvider\";\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\")) {\n return \"/\";\n }\n return value;\n}\n\n/** Tela de login padrão das Centrais que usam a Central de Ativações. */\nexport function LoginPage({ app }: { app: OonAppConfig }) {\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 redirect = safeRedirect(location.search);\n\n if (status === \"authenticated\") {\n return <Navigate to={redirect} replace />;\n }\n\n if (status === \"forbidden\") {\n return <Navigate to=\"/acesso-negado\" replace />;\n }\n\n async function handleSubmit(event: FormEvent<HTMLFormElement>) {\n event.preventDefault();\n setSubmitting(true);\n setMessage(null);\n\n try {\n await login(email.trim(), password);\n } catch (error) {\n const authError = error as OonError;\n if (authError.status === 403) return;\n setMessage(\n authError.status === 401\n ? \"E-mail ou senha inválidos.\"\n : authError.message || \"Não foi possível entrar. Tente novamente.\",\n );\n } finally {\n setSubmitting(false);\n }\n }\n\n return (\n <Flex minH=\"100vh\" align=\"center\" justify=\"center\" bg=\"#F5F8FA\" px={4}>\n <Box\n width=\"100%\"\n maxW=\"440px\"\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: 9 }}\n >\n <form onSubmit={handleSubmit}>\n <VStack align=\"stretch\" gap={6}>\n <Box>\n <Text\n color=\"#39BFED\"\n fontSize=\"xs\"\n fontWeight=\"700\"\n letterSpacing=\"0.12em\"\n textTransform=\"uppercase\"\n >\n Central Oon\n </Text>\n <Heading mt={2} size=\"lg\" color=\"#07262E\">\n {app.title ?? app.name}\n </Heading>\n <Text mt={2} color=\"gray.600\" fontSize=\"sm\">\n Entre com seu usuário autorizado para acessar este aplicativo.\n </Text>\n </Box>\n\n <VStack align=\"stretch\" gap={4}>\n <Box>\n <Text mb={2} fontSize=\"sm\" fontWeight=\"600\" color=\"#24323A\">\n E-mail\n </Text>\n <Input\n type=\"email\"\n value={email}\n onChange={(event) => setEmail(event.target.value)}\n autoComplete=\"email\"\n placeholder=\"voce@empresa.com.br\"\n required\n />\n </Box>\n\n <Box>\n <Text mb={2} fontSize=\"sm\" fontWeight=\"600\" color=\"#24323A\">\n Senha\n </Text>\n <Input\n type=\"password\"\n value={password}\n onChange={(event) => setPassword(event.target.value)}\n autoComplete=\"current-password\"\n placeholder=\"Sua senha\"\n required\n />\n </Box>\n </VStack>\n\n {message ? (\n <Box\n role=\"alert\"\n borderRadius=\"10px\"\n bg=\"red.50\"\n color=\"red.700\"\n px={4}\n py={3}\n fontSize=\"sm\"\n >\n {message}\n </Box>\n ) : null}\n\n <Button\n type=\"submit\"\n bg=\"#07262E\"\n color=\"white\"\n _hover={{ bg: \"#0B3843\" }}\n disabled={submitting || !email.trim() || !password}\n >\n {submitting ? \"Validando acesso...\" : \"Entrar\"}\n </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 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\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 [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 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 const rootMode =\n config?.mode === \"root-bootstrap\" || activation.details?.role === \"root\";\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, tenant, aplicativo, licença e permissões foram\n preparados. 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.centralAtivacaoHost}\n </Text>\n\n {error ? <Text color=\"red.600\">{error}</Text> : null}\n\n {step === 1 && (\n <>\n <Text>\n Informe o código de ativação para validar tenant, aplicativo e\n licença antes de consumir o código.\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 </>\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 a instância será\n registrada no 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 <Text>Redirecionando para o login...</Text>\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","import type {\n CollectionMode,\n CollectionViewDef,\n DocumentViewDef,\n OonCoreFrontConfig,\n OonViewDefinition,\n PipelineViewDef,\n} from \"./types\";\nimport { start } from \"./start\";\n\n/**\n * Schema do `central.ui.json` (Seção 9 do escopo). É o que o frontend\n * consumidor gerado pelo `create-central-oon` carrega — declaração pura, sem\n * código de UI. O Core converte isto em `OonCoreFrontConfig`.\n */\nexport interface CentralUiManifest {\n name: string;\n slug: string;\n backend?: { metadataUrl?: string };\n navigation?: { mode?: \"auto\" | \"manual\" };\n collections?: Array<{\n model: string;\n mode?: CollectionMode;\n path?: string;\n label?: string;\n section?: string;\n }>;\n pipelines?: Array<{\n name?: string;\n model?: string;\n mode?: string;\n stageField?: string;\n path?: string;\n label?: string;\n section?: string;\n }>;\n documents?: Array<{\n model: string;\n mode?: string;\n path?: string;\n label?: string;\n section?: string;\n approval?: boolean;\n attachments?: boolean;\n }>;\n}\n\n/** Dados de runtime que o `central.ui.json` não carrega (vêm do .env). */\nexport interface ManifestRuntime {\n apiBaseUrl: string;\n meusAppsUrl?: string;\n assistantBaseUrl?: string;\n versionPrefix?: string;\n /** Token local enviado ao backend somente quando o consumidor o configurar. */\n devToken?: string;\n}\n\n/** Converte o manifesto declarativo + runtime em config do Core. */\nexport function manifestToConfig(manifest: CentralUiManifest, runtime: ManifestRuntime): OonCoreFrontConfig {\n const views: OonViewDefinition[] = [];\n\n for (const c of manifest.collections ?? []) {\n const view: CollectionViewDef = {\n type: \"collection\",\n model: c.model,\n mode: c.mode ?? \"dynamic\",\n path: c.path,\n label: c.label,\n section: c.section,\n };\n views.push(view);\n }\n\n for (const p of manifest.pipelines ?? []) {\n const model = p.model ?? p.name;\n if (!model) continue;\n const view: PipelineViewDef = {\n type: \"pipeline\",\n model,\n label: p.label ?? p.name,\n path: p.path,\n stageField: p.stageField,\n section: p.section,\n };\n views.push(view);\n }\n\n for (const d of manifest.documents ?? []) {\n const view: DocumentViewDef = {\n type: \"document\",\n model: d.model,\n label: d.label,\n path: d.path,\n section: d.section,\n approval: d.approval,\n attachments: d.attachments,\n };\n views.push(view);\n }\n\n return {\n app: {\n id: manifest.slug,\n name: manifest.name,\n title: manifest.name,\n },\n api: {\n baseUrl: runtime.apiBaseUrl,\n meusAppsUrl: runtime.meusAppsUrl,\n assistantBaseUrl: runtime.assistantBaseUrl,\n versionPrefix: runtime.versionPrefix ?? \"\",\n },\n auth: { mode: \"bearer\", tokenParam: \"code\", devToken: runtime.devToken },\n security: {\n enableRouteGuard: true,\n enablePermissionGate: true,\n redactAssistantContext: true,\n disableConsoleInProduction: true,\n },\n ui: { views },\n };\n}\n\n/**\n * Bootstrap a partir do `central.ui.json`. É a única linha que o `main.tsx` de\n * uma Central gerada precisa:\n *\n * import manifest from \"../central.ui.json\";\n * startFromManifest(manifest, { apiBaseUrl: import.meta.env.VITE_API_URL });\n */\nexport function startFromManifest(manifest: CentralUiManifest, runtime: ManifestRuntime) {\n start(manifestToConfig(manifest, runtime));\n}\n","import type {\n CollectionViewDef,\n DashboardViewDef,\n DocumentViewDef,\n OonModule,\n PipelineViewDef,\n} from \"../types\";\n\n/**\n * Helpers declarativos (API pública da Seção 4.3). São identidades tipadas que\n * fixam o `type` da view — servem para o autocomplete e para registrar a view\n * num módulo ou no `ui.views` da config.\n */\n\nexport function defineCollectionView(def: Omit<CollectionViewDef, \"type\">): CollectionViewDef {\n return { type: \"collection\", ...def };\n}\n\nexport function defineDocumentView(def: Omit<DocumentViewDef, \"type\">): DocumentViewDef {\n return { type: \"document\", ...def };\n}\n\nexport function definePipelineView(def: Omit<PipelineViewDef, \"type\">): PipelineViewDef {\n return { type: \"pipeline\", ...def };\n}\n\nexport function defineDashboard(def: Omit<DashboardViewDef, \"type\">): DashboardViewDef {\n return { type: \"dashboard\", ...def };\n}\n\n/** Açúcar para declarar um módulo com tipagem. */\nexport function defineOonModule(mod: OonModule): OonModule {\n return mod;\n}\n","import { Badge, Box, Button, Flex, Heading, Stack, Text } from \"@chakra-ui/react\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { useCoreMetadata, useOonApi } from \"../api/ApiProvider\";\nimport { LoadingScreen } from \"../shell/LoadingScreen\";\nimport { ErrorState } from \"../shell/ErrorState\";\n\nexport interface CoreIntegrationProps {\n label?: string;\n}\n\ninterface IntegrationEntry {\n id?: string;\n name?: string;\n label?: string;\n status?: string;\n}\n\n/**\n * Painel de integrações: lista o que o back declarou em /core/integrations e\n * permite reprocessar via action RESTful (POST /integrations/actions/process-active).\n */\nexport function CoreIntegration({ label = \"Integrações\" }: CoreIntegrationProps) {\n const { http } = useOonApi();\n const metadata = useCoreMetadata();\n\n const reprocess = useMutation({\n mutationFn: () =>\n http.post(\"/integrations/actions/process-active\", {}, { headers: { \"x-oon-origin\": \"integration\" } }),\n });\n\n if (metadata.isLoading) return <LoadingScreen />;\n if (metadata.isError) return <ErrorState error={metadata.error} />;\n\n const integrations = (metadata.data?.integrations ?? []) as IntegrationEntry[];\n\n return (\n <Stack gap={6}>\n <Flex align=\"center\" justify=\"space-between\">\n <Heading size=\"lg\">{label}</Heading>\n <Button size=\"sm\" variant=\"outline\" loading={reprocess.isPending} onClick={() => reprocess.mutate()}>\n Reprocessar ativos\n </Button>\n </Flex>\n <Stack gap={3}>\n {integrations.length === 0 ? (\n <Text color=\"gray.400\">Nenhuma integração declarada.</Text>\n ) : (\n integrations.map((it, idx) => (\n <Box\n key={it.id ?? it.name ?? idx}\n borderWidth=\"1px\"\n borderColor=\"gray.200\"\n borderRadius=\"md\"\n bg=\"white\"\n p={4}\n >\n <Flex align=\"center\" justify=\"space-between\">\n <Text fontWeight=\"medium\">{it.label ?? it.name ?? \"Integração\"}</Text>\n <Badge colorPalette={it.status === \"erro\" ? \"red\" : it.status === \"ativo\" ? \"green\" : \"gray\"}>\n {it.status ?? \"—\"}\n </Badge>\n </Flex>\n </Box>\n ))\n )}\n </Stack>\n </Stack>\n );\n}\n","import { Button, Flex, Heading, Stack, Text } from \"@chakra-ui/react\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { OonColumnDef } from \"../types\";\nimport { useOonApi } from \"../api/ApiProvider\";\nimport { CoreCollection } from \"./CoreCollection\";\n\nexport interface CoreCurrencyProps {\n /** model das moedas. Default: \"Moeda\". */\n model?: string;\n label?: string;\n endpoint?: string;\n columns?: OonColumnDef[];\n}\n\n/**\n * Multi-moedas (módulo de domínio, Seção 4.6/2.11). Lista as moedas e expõe a\n * ação RESTful de atualizar cotações (POST /<endpoint>/actions/update-rates).\n */\nexport function CoreCurrency({ model = \"Moeda\", label = \"Multi-moedas\", endpoint = \"/moedas\", columns }: CoreCurrencyProps) {\n const { http } = useOonApi();\n const queryClient = useQueryClient();\n\n const updateRates = useMutation({\n mutationFn: () => http.post(`${endpoint}/actions/update-rates`, {}, { headers: { \"x-oon-origin\": \"integration\" } }),\n onSuccess: () => queryClient.invalidateQueries({ queryKey: [\"oon\", \"list\", endpoint] }),\n });\n\n return (\n <Stack gap={6}>\n <Flex align=\"center\" justify=\"space-between\">\n <Heading size=\"lg\">{label}</Heading>\n <Button size=\"sm\" colorPalette=\"blue\" loading={updateRates.isPending} onClick={() => updateRates.mutate()}>\n Atualizar cotações\n </Button>\n </Flex>\n {updateRates.isError ? (\n <Text fontSize=\"sm\" color=\"red.600\">\n {updateRates.error?.message}\n </Text>\n ) : null}\n <CoreCollection model={model} label=\"\" mode={columns ? \"full\" : \"dynamic\"} endpoint={endpoint} columns={columns} />\n </Stack>\n );\n}\n","import { useState } from \"react\";\nimport { Box, Button, Flex, Heading, Input, Stack, Text } from \"@chakra-ui/react\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { useOonApi } from \"../api/ApiProvider\";\n\nexport interface AssistantMessage {\n role: \"user\" | \"assistant\";\n content: string;\n}\n\nexport interface CoreAssistantProps {\n /** code do assistente registrado no back (ex.: \"servicos-tomados.revisao\"). */\n assistantCode: string;\n label?: string;\n /** entidade de contexto (apenas tipo + id; nada sensível). */\n entity?: { type: string; id: string };\n /** base de assistentes; default usa o mesmo client REST do Core. */\n endpoint?: string;\n}\n\n/**\n * Assistente IA do Core (Seção 2.12 / 6.2). Envia ao back apenas\n * assistantCode + entity + message — NUNCA chave de IA, modelo ou prompt.\n * O back resolve modelo, prompt, chave e políticas.\n */\nexport function CoreAssistant({ assistantCode, label = \"Assistente\", entity, endpoint = \"/assistant-runs\" }: CoreAssistantProps) {\n const { http } = useOonApi();\n const [messages, setMessages] = useState<AssistantMessage[]>([]);\n const [input, setInput] = useState(\"\");\n\n const ask = useMutation({\n mutationFn: async (message: string) => {\n const { data } = await http.post<{ reply?: string; message?: string }>(\n endpoint,\n {\n assistantCode,\n entity,\n message,\n // Contexto redigido: a Central pode enriquecer, mas o Core não envia PII por padrão.\n context: { redactionPolicy: \"default\" },\n },\n { headers: { \"x-oon-origin\": \"assistant\" } }\n );\n return data.reply ?? data.message ?? \"\";\n },\n onSuccess: (reply) => setMessages((prev) => [...prev, { role: \"assistant\", content: reply }]),\n });\n\n const send = () => {\n const text = input.trim();\n if (!text) return;\n setMessages((prev) => [...prev, { role: \"user\", content: text }]);\n setInput(\"\");\n ask.mutate(text);\n };\n\n return (\n <Stack gap={4} maxW=\"560px\">\n <Heading size=\"md\">{label}</Heading>\n <Box borderWidth=\"1px\" borderColor=\"gray.200\" borderRadius=\"md\" bg=\"white\" p={4} minH=\"240px\">\n <Stack gap={3}>\n {messages.length === 0 ? (\n <Text color=\"gray.400\" fontSize=\"sm\">\n Faça uma pergunta ao assistente.\n </Text>\n ) : (\n messages.map((m, idx) => (\n <Flex key={idx} justify={m.role === \"user\" ? \"flex-end\" : \"flex-start\"}>\n <Box\n bg={m.role === \"user\" ? \"brand.500\" : \"gray.100\"}\n color={m.role === \"user\" ? \"white\" : \"gray.800\"}\n px={3}\n py={2}\n borderRadius=\"md\"\n maxW=\"80%\"\n fontSize=\"sm\"\n >\n {m.content}\n </Box>\n </Flex>\n ))\n )}\n {ask.isPending ? (\n <Text color=\"gray.400\" fontSize=\"sm\">\n Pensando…\n </Text>\n ) : null}\n {ask.isError ? (\n <Text color=\"red.600\" fontSize=\"sm\">\n {ask.error?.message}\n </Text>\n ) : null}\n </Stack>\n </Box>\n <Flex gap={2}>\n <Input\n size=\"sm\"\n value={input}\n placeholder=\"Digite sua mensagem...\"\n onChange={(e) => setInput(e.currentTarget.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") send();\n }}\n />\n <Button size=\"sm\" colorPalette=\"blue\" onClick={send} loading={ask.isPending}>\n Enviar\n </Button>\n </Flex>\n </Stack>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { useOonAuth } from \"./AuthProvider\";\n\n/**\n * Esconde a UI quando o usuário não tem a permissão. NÃO é segurança real\n * (Seção 6.2, item 3) — o back é a autoridade. Serve apenas para não exibir\n * ações/menus que o usuário não pode usar.\n */\nexport function PermissionGate({\n permission,\n fallback = null,\n children,\n}: {\n permission?: string | string[];\n fallback?: ReactNode;\n children: ReactNode;\n}) {\n const { hasPermission } = useOonAuth();\n return <>{hasPermission(permission) ? children : fallback}</>;\n}\n"],"mappings":"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","names":["useMemo","axios","axios","useMemo","createContext","useCallback","useContext","useEffect","useState","createContext","useContext","jsx","jsx","createContext","useState","useCallback","useEffect","value","useContext","jsx","useMemo","useState","Box","Heading","Stack","Text","useState","Box","Button","Flex","Text","useQuery","jsx","Text","jsx","jsxs","jsx","jsxs","useState","useQuery","Box","Flex","Text","Button","useEffect","useState","Box","Button","Flex","Heading","Input","NativeSelect","Stack","Text","useEffect","useMemo","useState","Box","Button","Flex","Input","Spinner","Text","useQuery","jsx","jsxs","SearchIcon","ChevronIcon","useMemo","useState","useEffect","useQuery","start","Box","Button","Text","Flex","Input","Spinner","jsx","jsxs","Text","useState","useEffect","Flex","Box","Heading","Button","Stack","NativeSelect","Input","jsx","jsxs","useState","Stack","Box","Text","Heading","jsx","useState","Badge","Box","Button","Flex","Heading","Stack","Text","useMutation","useQuery","useQueryClient","jsx","jsxs","useQueryClient","useState","useQuery","useMutation","Stack","Box","Text","Heading","Flex","Badge","Button","Box","Heading","SimpleGrid","Stack","Text","jsx","jsxs","Stack","Heading","SimpleGrid","Box","Text","jsx","Navigate","Box","Button","Flex","Spacer","Text","Box","Flex","Stack","Text","jsx","jsxs","Box","Flex","Text","Stack","jsx","jsxs","Flex","Box","Text","Spacer","Button","Box","Button","Flex","Heading","Text","jsx","jsxs","Flex","Box","Text","Heading","Button","jsx","useState","Box","Button","Flex","Heading","Input","Text","VStack","Navigate","useLocation","jsx","jsxs","useLocation","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","VStack","Heading","Button","Fragment","jsx","Navigate","jsx","Navigate","jsx","Navigate","jsx","useMemo","storage","http","router","jsx","Badge","Box","Button","Flex","Heading","Stack","Text","useMutation","jsx","jsxs","useMutation","Stack","Flex","Heading","Button","Text","Box","Badge","Button","Flex","Heading","Stack","Text","useMutation","useQueryClient","jsx","jsxs","useQueryClient","useMutation","Stack","Flex","Heading","Button","Text","useState","Box","Button","Flex","Heading","Input","Stack","Text","useMutation","jsx","jsxs","useState","useMutation","Stack","Heading","Box","Text","Flex","Input","Button","Fragment","jsx"]}