@fayz-ai/admin 0.67.2 → 0.68.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/{ConnectedUserProfile-2PP755RY.js → ConnectedUserProfile-HL6Q6ECE.js} +3 -3
- package/dist/{ConnectedUserProfile-2PP755RY.js.map → ConnectedUserProfile-HL6Q6ECE.js.map} +1 -1
- package/dist/{TeamTab-M5SAKV6M.js → TeamTab-EIP4QLIV.js} +4 -4
- package/dist/{TeamTab-M5SAKV6M.js.map → TeamTab-EIP4QLIV.js.map} +1 -1
- package/dist/{chunk-RLZCH4NU.js → chunk-F54JFP54.js} +56 -19
- package/dist/chunk-F54JFP54.js.map +1 -0
- package/dist/{chunk-AIDRTAXD.js → chunk-LO26TZS3.js} +3 -3
- package/dist/{chunk-AIDRTAXD.js.map → chunk-LO26TZS3.js.map} +1 -1
- package/dist/crud/RelatedSection.d.ts.map +1 -1
- package/dist/crud/price-table-lookup.d.ts +50 -0
- package/dist/crud/price-table-lookup.d.ts.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +100 -7
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
- package/dist/chunk-RLZCH4NU.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useSystemPermission.ts","../src/access/useModuleAccess.ts","../src/plugins/WidgetSlot.tsx","../src/org/self.ts","../src/plugins/header-actions.ts","../src/crud/RecordMetaFooter.tsx","../src/crud/archetypes/AddressFormModal.tsx","../src/crud/CrudSkeletons.tsx","../src/crud/write-errors.ts","../src/crud/AttachedFieldSection.tsx","../src/crud/archetypes/ActiveToggle.tsx","../src/crud/archetypes/AddressesTab.tsx","../src/crud/SubForm.tsx","../src/crud/archetypes/PayeeAccountsSection.tsx","../src/crud/archetypes/PersonFormLayout.tsx","../src/crud/relation-field.tsx","../src/crud/RelatedSection.tsx","../src/crud/archetypes/ProductFormLayout.tsx","../src/crud/archetypes/ServiceFormLayout.tsx","../src/crud/archetypes/LocationFormLayout.tsx","../src/crud/archetypes/PersonPicker.tsx","../src/crud/archetypes/SubjectFormLayout.tsx","../src/crud/record-chrome.tsx","../src/crud/entity-zone.ts","../src/crud/fieldToColumn.tsx","../src/crud/CrudCardGrid.tsx","../src/permissions/PermissionGate.tsx","../src/components/billing/gates.tsx","../src/units/switching.store.ts","../src/units/useUnitFilter.ts","../src/crud/CrudListView.tsx","../src/crud/CrudAgentSurface.tsx","../src/crud/csv-export.ts","../src/lib/apply-field-rules.ts","../src/hooks/useFieldRules.ts","../src/crud/CrudPage.tsx","../src/crud/navTabRegistry.ts","../src/stores/audit.ts","../src/stores/createCrudStore.ts","../src/crud/createCrudPage.tsx","../src/crud/RelatedListTab.tsx","../src/crud/TagsField.tsx","../src/crud/InlineField.tsx","../src/crud/tab-counts.ts","../src/stores/invite.store.ts","../src/crud/archetypes/RoleSummary.tsx","../src/crud/archetypes/AccessTab.tsx","../src/units/PersonUnitsTab.tsx","../src/units/PersonAvailabilityTab.tsx","../src/crud/archetypes/PersonDetailTabs.tsx","../src/crud/archetypes/ProductDetailTabs.tsx","../src/crud/archetypes/ServiceDetailTabs.tsx","../src/units/UnitMembersTab.tsx","../src/crud/archetypes/LocationDetailTabs.tsx","../src/crud/archetypes/EntityLink.tsx","../src/crud/archetypes/SubjectDetailTabs.tsx","../src/crud/CrudDetailPage.tsx","../src/crud/AddressField.tsx","../src/crud/BankField.tsx","../src/crud/CrudFormPage.tsx","../src/crud/CrudRecordModal.tsx"],"names":["React","React2","usePluginRuntimeOptional","React3","React4","useState","useEffect","label","getSupabaseClientOptional","useTranslation","jsx","useRef","useCallback","client","toast","jsxs","createContext","useContext","Button","Card","CardContent","Plus","MapPin","EMPTY_FORM","toForm","formatLine","getActiveTenantId","Badge","Star","Pencil","Trash2","ModalTask","Checkbox","ConfirmDialog","renderField","labelOf","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","SearchSelect","Input","draft","cell","patch","commitDraft","lastEdit","siblingsToSync","applyToSiblings","Fragment","SKIP_FIELDS","FieldItem","IDENTITY_FIELDS","PRICING_FIELDS","CONTACT_FIELDS","ADDRESS_FIELDS","User","X","Loader2","getLucideIcon","formatCurrencyLocale","formatDateLocale","formatDateTimeLocale","formatCurrency","formatDate","Package","create","React11","useMemo","rows","t","Search","Check","DataTable","React13","useActiveUnitId","navigateApp","Copy","useStore","display","describeError","errorMessage","deriveEntityKey","resolveDataProvider","columnOf","React16","currentAppPath","onAppPathChange","Switch","React18","useOrgAdapterOptional","useAuthStore","React19","React20","Skeleton","UserX","AlertTriangle","Building2","React21","usePluginsOptional","getWidgetsForZone","ComingSoon","Clock","CalendarDays","Tag","NO_EXTRA_ROLE","React23","useDataVersion","BarChart3","PhoneLink","FileText","PageHeaderActions","appHref","isValidPostalCode","lookupPostalCode","formatPostalCode","payeeAccountFields","payeeMethodOf","Landmark","isAddressIncomplete","isBankIncomplete","CurrencyInput","Textarea","emitDataChanged","useSaveBar","ICON_MAP","usePageTrailParent","navigateToCrumb","SubpageHeader","Tabs","React27"],"mappings":"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","file":"chunk-F54JFP54.js","sourcesContent":["import { useCallback } from 'react'\nimport type { SystemPermission } from '@fayz-ai/core'\nimport { profileHasSystemPermission } from '@fayz-ai/core/access'\nimport { usePermissionsStore } from '../permissions'\n\n// ---------------------------------------------------------------------------\n// useSystemPermission — native replacement for the org-management (system)\n// permission check that used to live in the legacy hooks/usePermission.\n// The decision itself lives in core/access (one implementation for browser,\n// headless and the agent executor); this is the React binding to the effective\n// profile. Grants-based feature checks stay with usePermission(Optional).\n// ---------------------------------------------------------------------------\n\nexport function useSystemPermission(): (perm: SystemPermission) => boolean {\n const currentProfile = usePermissionsStore((s) => s.currentProfile)\n return useCallback(\n (perm: SystemPermission) => profileHasSystemPermission(currentProfile, perm),\n [currentProfile],\n )\n}\n","import * as React from 'react'\nimport { unitDisabledModules, useActiveUnitId, usePluginRuntimeOptional } from '@fayz-ai/core'\nimport { createModuleAccess, type ModuleAccessDecision, type ModuleAccessQuery } from '@fayz-ai/core/access'\nimport { useAppConfigStore } from '../stores/app-config.store'\nimport { useAccessOptional } from './context'\n\n/**\n * `canUseHere` for the person, the account and the unit they stand in, built\n * from what the boot already loaded (app_config + the plugin runtime). Rebuilt\n * only when one of those changes — an activation write refreshes the config,\n * which drops this cache with it.\n */\nexport function useModuleAccess(): (q: ModuleAccessQuery) => ModuleAccessDecision {\n const runtime = usePluginRuntimeOptional()\n const config = useAppConfigStore((s) => s.config)\n const unitId = useActiveUnitId()\n const access = useAccessOptional()\n return React.useMemo(() => {\n const plugins = new Map((runtime?.plugins ?? []).map((p) => [p.id, p]))\n return createModuleAccess({\n isModuleOn: (plugin, facet) => {\n const p = plugins.get(plugin)\n // No runtime (storybook, a page outside the shell): nothing to gate.\n if (!runtime) return true\n if (!p?.isActive) return false\n if (!facet) return true\n const facets = (p.config?.facets ?? {}) as Record<string, boolean>\n const declared = (p.facets ?? []).find((f) => f.id === facet)\n return facets[facet] ?? !!declared?.includedWithPlugin\n },\n unitDisabled: unitDisabledModules(config, unitId),\n entitled: (plugin, facet) => access.entitled(facet ? `${plugin}.${facet}` : plugin),\n can: (feature, action) => access.can(feature, action as never).allowed,\n })\n }, [runtime, config, unitId, access])\n}\n\n/** The units of this account that switched `plugin` off, for the Módulos page. */\nexport function useUnitsWithout(plugin: string, facet?: string): string[] {\n const rows = useAppConfigStore((s) => s.config.unit_plugins)\n return React.useMemo(\n () => (rows ?? []).filter((r) => r.status === 'disabled' && r.plugin === plugin && (r.facet ?? undefined) === facet).map((r) => r.unit_id),\n [rows, plugin, facet],\n )\n}\n","import * as React from 'react'\nimport { usePluginRuntimeOptional, getWidgetsForZone, resolvePluginComponent } from '@fayz-ai/core'\nimport { useModuleAccess } from '../access/useModuleAccess'\n\n/**\n * Onde este widget de fato aterrissou.\n *\n * Uma zona diz a INTENÇÃO (\"pé da trilha\"), e nem toda shell tem esse lugar —\n * o layout de topbar não tem trilha, e o widget cairia no vazio se a shell não\n * o pusesse em outro canto. Quem é montado precisa saber em qual dos dois está:\n * uma linha larga com rótulo serve numa coluna de 12rem e não numa barra.\n */\nexport type WidgetSurface = 'rail' | 'topbar'\nconst WidgetSurfaceContext = React.createContext<WidgetSurface>('rail')\nexport function useWidgetSurface(): WidgetSurface {\n return React.useContext(WidgetSurfaceContext)\n}\n\n/** Renders all plugin widgets registered for a zone, in order. Plugins fill\n * these slots (detail-tab zones, page zones) without the host knowing them. */\nexport function WidgetSlot({\n zone,\n contextOverrides,\n surface,\n ...props\n}: { zone: string; contextOverrides?: Record<string, unknown>; surface?: WidgetSurface } & Record<string, unknown>) {\n const runtime = usePluginRuntimeOptional()\n const canUseHere = useModuleAccess()\n if (!runtime) return null\n // The runtime already dropped what the account has off; this adds the unit\n // the person stands in and the plan.\n const widgets = getWidgetsForZone(runtime, zone, contextOverrides as never).filter((w) => {\n const keys = !w.requires ? [] : Array.isArray(w.requires) ? w.requires : [w.requires]\n return keys.every((key) => {\n const [plugin, facet] = key.split('.') as [string, string | undefined]\n return canUseHere({ plugin, facet }).allowed\n })\n })\n if (!widgets.length) return null\n return (\n <WidgetSurfaceContext.Provider value={surface ?? 'rail'}>\n {widgets.map((widget, i) => {\n const Component = resolvePluginComponent(widget) as React.ComponentType<Record<string, unknown>> | undefined\n if (!Component) return null\n const w = widget as unknown as { config?: unknown; plugin?: unknown; props?: Record<string, unknown> }\n // Pass BOTH contracts: the saas-core widget contract (config/runtime/\n // plugin/widget) the de-bridged plugins expect, AND the spread props\n // that native archetype zones use.\n return (\n <Component\n key={widget.id ?? `${zone}-${i}`}\n config={w.config}\n runtime={{ ...runtime.context, ...(contextOverrides ?? {}) }}\n plugin={w.plugin}\n widget={widget}\n {...(w.props ?? {})}\n {...props}\n />\n )\n })}\n </WidgetSurfaceContext.Provider>\n )\n}\n","import * as React from 'react'\nimport { getSupabaseClientOptional } from '@fayz-ai/core'\nimport { useAuthStore } from '@fayz-ai/auth'\nimport { dedup } from '../lib/dedup'\nimport { useOrganizationStore } from './store'\n\n// ---------------------------------------------------------------------------\n// O login e a ficha: duas linhas, uma pessoa.\n//\n// `tenant_members` guarda quem entra; `people` guarda quem trabalha. Numa\n// clínica de verdade a Dra. Silvania é as duas coisas, e hoje ela existe duas\n// vezes: um login chamado \"dra.silvaniamaia\" e uma ficha chamada \"Silvania\n// Maia\", sem nada ligando uma à outra. É daí que vem a sensação de duas telas\n// de perfil — não são duas telas do mesmo cadastro, são dois cadastros.\n//\n// A coluna que une existe desde a 019 (`tenant_members.person_id`) e nada nunca\n// a preencheu. Estas funções são o que passa a preencher.\n//\n// POR QUE NÃO É AUTOMÁTICO POR E-MAIL. Foi tentador e está errado: no pool vivo\n// da clínica, `creators@fayalabs.com` aparece em cinco fichas de lead e uma de\n// cliente. Casar por e-mail sem olhar ligaria o login do administrador a um\n// lead. A busca abaixo por isso exige TRÊS coisas ao mesmo tempo — o e-mail\n// bate, a ficha é de alguém da equipe, e o candidato é único — e mesmo assim\n// quem decide é a pessoa, num clique.\n// ---------------------------------------------------------------------------\n\nfunction client() {\n return getSupabaseClientOptional() as {\n from: (t: string) => any\n rpc: (fn: string, args?: Record<string, unknown>) => Promise<{ data: any; error: any }>\n } | null\n}\n\nexport interface LinkedPerson {\n id: string\n name: string\n kind: string | null\n}\n\n/** A ficha profissional deste login, se alguém já disse qual é. */\nexport async function fetchMyPersonRecord(\n tenantId: string,\n userId: string,\n): Promise<LinkedPerson | null> {\n const db = client()\n if (!db) return null\n const { data, error } = await db\n .from('v_team_members')\n .select('person_id')\n .eq('tenant_id', tenantId)\n .eq('user_id', userId)\n .maybeSingle()\n if (error || !data?.person_id) return null\n\n const { data: person, error: personError } = await db\n .from('people')\n .select('id, name, kind')\n .eq('id', data.person_id)\n .maybeSingle()\n // Ficha apagada com o vínculo apontando para ela: some da tela em vez de\n // virar um link quebrado. `ON DELETE SET NULL` já limpa o vínculo; isto cobre\n // a janela entre uma coisa e outra.\n if (personError || !person) return null\n return { id: person.id, name: person.name ?? '', kind: person.kind ?? null }\n}\n\n/**\n * A ficha que provavelmente é você — e só quando não há dúvida.\n *\n * Devolve `null` se não houver nenhuma, se houver mais de uma, ou se a que\n * houver já pertence a outro login. Ambiguidade aqui vira um vínculo errado\n * entre uma pessoa e uma identidade, que é o tipo de erro que ninguém vai\n * procurar depois.\n */\nexport async function findMyPersonCandidate(\n tenantId: string,\n email: string | undefined,\n staffKinds: string[],\n): Promise<LinkedPerson | null> {\n const db = client()\n if (!db || !email || staffKinds.length === 0) return null\n\n const { data, error } = await db\n .from('people')\n .select('id, name, kind, email')\n .eq('tenant_id', tenantId)\n .in('kind', staffKinds)\n .ilike('email', email)\n .limit(2)\n if (error || !data || data.length !== 1) return null\n\n const candidate = data[0]\n const { data: taken } = await db\n .from('v_team_members')\n .select('user_id')\n .eq('tenant_id', tenantId)\n .eq('person_id', candidate.id)\n .maybeSingle()\n if (taken) return null\n\n return { id: candidate.id, name: candidate.name ?? '', kind: candidate.kind ?? null }\n}\n\n/**\n * Diz que este login e esta ficha são a mesma pessoa.\n *\n * Escrever em `tenant_members` é de administrador (policy da 001, não\n * afrouxada) — e está certo assim: dizer quem é quem na equipe é uma decisão de\n * quem administra a equipe, não uma preferência pessoal. Quem não é\n * administrador recebe o erro do banco, e a tela traduz em \"peça a um\n * administrador\".\n */\nexport async function linkPersonToLogin(\n tenantId: string,\n userId: string,\n personId: string | null,\n): Promise<void> {\n const db = client()\n if (!db) throw new Error('sem conexão')\n // A verb, not a direct write: v_team_members is a JOINed view and does not\n // accept UPDATE, and the RPC checks the permission in one place.\n const { error } = await db.rpc('people_link_membership', { p_person: personId, p_user: userId })\n if (error) throw error\n}\n\n/** O login por trás de uma ficha, para a ficha poder dizer que a pessoa entra\n * no sistema. O espelho de `fetchMyPersonRecord`. */\nexport async function fetchLoginForPerson(\n personId: string,\n): Promise<{ userId: string; email: string | null } | null> {\n const db = client()\n if (!db) return null\n const { data, error } = await db\n .from('v_team_members')\n .select('user_id')\n .eq('person_id', personId)\n .maybeSingle()\n if (error || !data) return null\n\n const { data: profile } = await db\n .from('profiles')\n .select('email')\n .eq('id', data.user_id)\n .maybeSingle()\n // `profiles` só expõe a própria linha, então o e-mail de outra pessoa volta\n // nulo aqui. O fato que importa — ela entra no sistema — não depende dele.\n return { userId: data.user_id, email: profile?.email ?? null }\n}\n\n/** Só o id da ficha que é este login — uma consulta, não as duas de\n * `fetchMyPersonRecord`. É tudo que a ficha precisa para saber se é você. */\nexport async function fetchMyPersonId(\n tenantId: string,\n userId: string,\n): Promise<string | null> {\n const db = client()\n if (!db) return null\n const { data, error } = await db\n .from('v_team_members')\n .select('person_id')\n .eq('tenant_id', tenantId)\n .eq('user_id', userId)\n .maybeSingle()\n if (error) return null\n return data?.person_id ?? null\n}\n\n/**\n * A ficha que é você, para a tela poder dizer \"(você)\" em cima dela.\n *\n * `undefined` enquanto não sabe, `null` quando o login não está ligado a ficha\n * nenhuma — e a diferença importa: pintar \"(você)\" e tirar depois é pior do que\n * demorar um instante para pintar.\n *\n * `enabled` porque a ficha de detalhe é genérica e também desenha produto,\n * serviço e unidade. Um id de produto nunca casaria com uma ficha de pessoa,\n * mas perguntar em toda tela de detalhe é uma requisição por tela para saber\n * uma coisa que só faz sentido numa delas. Com `dedup`, quem pergunta várias\n * vezes na mesma sessão pergunta uma.\n */\nexport function useMyPersonId(enabled = true): string | null | undefined {\n const orgId = useOrganizationStore((s) => s.currentOrg?.id)\n const userId = useAuthStore((s) => s.user?.id)\n const [personId, setPersonId] = React.useState<string | null | undefined>(undefined)\n\n React.useEffect(() => {\n if (!enabled || !orgId || !userId) return\n let alive = true\n void dedup(`self:person:${orgId}:${userId}`, () => fetchMyPersonId(orgId, userId))\n .then((id) => { if (alive) setPersonId(id) })\n return () => { alive = false }\n }, [enabled, orgId, userId])\n\n return personId\n}\n\n// ---------------------------------------------------------------------------\n// O outro lado da mesma pergunta: a ficha olhando para o acesso.\n//\n// `fetchMyPersonRecord` acima responde \"qual ficha é este login\". O que a tela\n// de equipe e a aba Acesso da ficha precisam é o inverso — \"esta pessoa entra\n// no sistema?\" — e com o bastante para AGIR sobre a resposta ali mesmo: o id da\n// associação (para trocar o papel ou tirar o acesso) e o e-mail do login.\n// ---------------------------------------------------------------------------\n\nexport interface PersonAccess {\n /** Id da associação — o que `member_set_role` e `member_remove` recebem. */\n memberId: string\n userId: string\n /** Chave do papel ('owner', 'admin'…), como o seletor de papel a usa. */\n role: string | null\n joinedAt: string | null\n email: string | null\n name: string | null\n}\n\n/** O acesso desta ficha, ou `null` se ela não entra no sistema. */\nexport async function fetchPersonAccess(personId: string): Promise<PersonAccess | null> {\n const db = client()\n if (!db) return null\n const { data, error } = await db\n .from('v_team_members')\n .select('id, user_id, role, created_at')\n .eq('person_id', personId)\n .maybeSingle()\n if (error || !data) return null\n\n const { data: profile } = await db\n .from('profiles')\n .select('full_name, email')\n .eq('id', data.user_id)\n .maybeSingle()\n\n return {\n memberId: data.id,\n userId: data.user_id,\n role: data.role ?? null,\n joinedAt: data.created_at ?? null,\n email: profile?.email ?? null,\n name: profile?.full_name ?? null,\n }\n}\n\n/**\n * Escreve o e-mail na ficha ao conceder acesso.\n *\n * Não é conveniência de formulário: `app.person_for_login` casa o login novo\n * com uma ficha existente PELO E-MAIL no momento em que o convite é aceito. Sem\n * o e-mail na ficha, aceitar o convite cunha uma segunda pessoa — o duplicado\n * que esta aba existe para evitar.\n */\nexport async function setPersonEmail(personId: string, email: string): Promise<void> {\n const db = client()\n if (!db) throw new Error('sem conexão')\n const { error } = await db.from('people').update({ email }).eq('id', personId)\n if (error) throw error\n}\n","import * as React from 'react'\nimport { create } from 'zustand'\n\nimport type { PageAction } from './PageActions'\n\n// ---------------------------------------------------------------------------\n// Actions a plugin contributes to a screen it does not own.\n//\n// The widget zones (`<entity>.detail.header.actions`) mount a COMPONENT, so a\n// plugin's contribution arrives as drawn JSX. That was fine while the header\n// was a row of hand-made buttons; it is not fine now that the header is a\n// declared set which the shell folds into a caret on desktop and into the FAB\n// on a phone. Scribe's \"Gravar atendimento\" stayed a button in the corner,\n// crowding the crumb on a 393px screen while every other action had moved.\n//\n// Same shape as `useAgentSurface`: a mounted component registers by id and\n// unregisters on unmount, so the contribution follows the screen's lifetime and\n// nothing has to be torn down by hand.\n// ---------------------------------------------------------------------------\n\ninterface HeaderActionState {\n /** zone → id → action */\n byZone: Record<string, Record<string, PageAction>>\n register: (zone: string, action: PageAction) => void\n unregister: (zone: string, id: string) => void\n}\n\nconst useStore = create<HeaderActionState>((set) => ({\n byZone: {},\n register: (zone, action) =>\n set((s) => ({ byZone: { ...s.byZone, [zone]: { ...(s.byZone[zone] ?? {}), [action.id]: action } } })),\n unregister: (zone, id) =>\n set((s) => {\n const inZone = { ...(s.byZone[zone] ?? {}) }\n delete inZone[id]\n return { byZone: { ...s.byZone, [zone]: inZone } }\n }),\n}))\n\n/**\n * Contribute one action to a screen's header.\n *\n * `action` is read through a ref, so a handler that closes over fresh state does\n * not have to be memoised to stay current — the same trade useAgentSurface makes.\n */\nexport function useHeaderAction(zone: string, action: PageAction | null): void {\n const register = useStore((s) => s.register)\n const unregister = useStore((s) => s.unregister)\n const latest = React.useRef(action)\n latest.current = action\n\n const id = action?.id\n React.useEffect(() => {\n if (!zone || !id) return\n const current = latest.current\n if (current) register(zone, { ...current, onSelect: () => latest.current?.onSelect() })\n return () => unregister(zone, id)\n }, [zone, id, register, unregister])\n}\n\n/** Everything contributed to a zone, in registration order. */\nexport function useHeaderActions(zone: string): PageAction[] {\n const byZone = useStore((s) => s.byZone)\n return React.useMemo(() => Object.values(byZone[zone] ?? {}), [byZone, zone])\n}\n","import React, { useEffect, useState } from 'react'\nimport { useTranslation, getCurrentLocale } from '@fayz-ai/core'\nimport { getSupabaseClientOptional } from '@fayz-ai/core'\nimport { useOrganizationStore } from '../org'\n\n/**\n * A procedência do registro: quando nasceu, quando foi mexido pela última vez,\n * e por quem foi cadastrado.\n *\n * Isto NUNCA foi um campo. `created_at`/`updated_at` chegam em toda linha e são\n * removidos do formulário de propósito (ninguém digita \"criado em\"), então os\n * renderizadores declarativos — que só desenham `entityDef.fields` — nunca os\n * viam. O resultado era uma ficha que não sabia dizer sua própria idade.\n *\n * Rodapé e não um grupo de campos: é metadado sobre o registro, não conteúdo\n * dele. Acima, junto de \"Telefone\" e \"Alergias\", competiria por atenção com o\n * que a pessoa veio ler.\n */\n\n/** Quem criou, quando o dado existe. Nulo enquanto resolve, ou se não dá. */\nfunction useUserLabel(userId?: string | null): string | null {\n // Um membro já carregado responde sem ida ao banco — quem cria um registro é,\n // por definição, alguém com acesso ao tenant.\n const members = useOrganizationStore((s) => s.members)\n const member = userId ? members.find((m) => m.userId === userId) : undefined\n const fromMembers = member ? (member.user?.fullName || member.user?.email || null) : null\n\n const [resolved, setResolved] = useState<string | null>(null)\n\n useEffect(() => {\n if (!userId || fromMembers) return\n const cached = userLabelCache.get(userId)\n if (cached !== undefined) {\n setResolved(cached)\n return\n }\n let alive = true\n void (async () => {\n const label = await fetchUserLabel(userId)\n userLabelCache.set(userId, label)\n if (alive) setResolved(label)\n })()\n return () => { alive = false }\n }, [userId, fromMembers])\n\n return fromMembers ?? resolved\n}\n\n// Uma ficha por vez, mas a mesma pessoa cadastrou metade da base: sem cache, ir\n// e voltar entre dez clientes seriam dez consultas para o mesmo nome.\nconst userLabelCache = new Map<string, string | null>()\n\nasync function fetchUserLabel(userId: string): Promise<string | null> {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return null\n try {\n const { data } = await supabase\n .from('profiles')\n .select('full_name, email')\n .eq('id', userId)\n .maybeSingle()\n return data?.full_name || data?.email || null\n } catch {\n // Sem permissão de ler `profiles` o rodapé simplesmente omite o autor. Um\n // erro aqui não pode derrubar a ficha inteira por causa de uma linha cinza.\n return null\n }\n}\n\nfunction formatStamp(value: unknown): string | null {\n if (!value) return null\n const date = new Date(String(value))\n if (Number.isNaN(date.getTime())) return null\n // App locale, not the browser's: a pt-BR tenant on an en-US machine was\n // reading \"09/11/2026\" as November 9th.\n return date.toLocaleString(getCurrentLocale(), {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n })\n}\n\nexport function RecordMetaFooter({\n item,\n compact,\n}: {\n item: Record<string, any>\n compact?: boolean\n}) {\n const t = useTranslation()\n const createdAt = formatStamp(item.createdAt)\n const updatedAt = formatStamp(item.updatedAt)\n // `createdByName` deixa um provider que já sabe o nome (uma view com join)\n // entregá-lo pronto e pular a consulta.\n const authorFromRow = typeof item.createdByName === 'string' ? item.createdByName : null\n const authorFromId = useUserLabel(authorFromRow ? null : item.createdBy)\n const author = authorFromRow ?? authorFromId\n\n // A última edição só é notícia se for depois da criação: um registro nunca\n // tocado tem `updated_at = created_at`, e repetir a mesma data com dois\n // rótulos sugere duas coisas onde há uma.\n const edited = updatedAt && updatedAt !== createdAt ? updatedAt : null\n\n const parts: string[] = []\n if (createdAt) parts.push(t('crud.detail.createdAt', { date: createdAt }))\n if (author) parts.push(t('crud.detail.createdBy', { user: author }))\n if (edited) parts.push(t('crud.detail.updatedAt', { date: edited }))\n\n if (parts.length === 0) return null\n\n return (\n <p\n className={`border-t border-border pt-3 text-muted-foreground ${compact ? 'text-[10px]' : 'text-xs'}`}\n >\n {parts.join(' · ')}\n </p>\n )\n}\n","import React, { useCallback, useEffect, useRef, useState } from 'react'\nimport { MapPin, Loader2 } from 'lucide-react'\nimport {\n Button, Input, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, ModalTask, Checkbox\n} from '@fayz-ai/ui'\nimport {\n getSupabaseClientOptional, getActiveTenantId, useTranslation,\n formatPostalCode, isValidPostalCode, lookupPostalCode,\n} from '@fayz-ai/core'\n\nimport { toast } from '../../components/notifications/ToastProvider'\n\n// The address form of public.addresses, as a modal of its own: the person's\n// address book uses it, and so does any flow that needs ONE address on the spot\n// (a phone order) without rebuilding CEP lookup and the default-flag rule.\n\nexport interface AddressRow {\n id: string\n label: string | null\n recipient: string | null\n phone: string | null\n postal_code: string\n street: string\n number: string | null\n complement: string | null\n district: string | null\n city: string\n state: string\n country: string\n is_default: boolean\n kind: string\n latitude: number | null\n longitude: number | null\n}\n\n/** The editable shape. Separate from AddressRow: no id, every field a string. */\ninterface AddressForm {\n label: string\n kind: string\n recipient: string\n phone: string\n postal_code: string\n street: string\n number: string\n complement: string\n district: string\n city: string\n state: string\n is_default: boolean\n latitude: string\n longitude: string\n}\n\nconst EMPTY_FORM: AddressForm = {\n label: '', kind: 'both', recipient: '', phone: '', postal_code: '', street: '',\n number: '', complement: '', district: '', city: '', state: '', is_default: false,\n latitude: '', longitude: '',\n}\n\n// Um par, ou nada. Uma latitude sozinha não aponta para lugar nenhum, e\n// guardá-la faz o \"mais perto de mim\" achar que a unidade tem posição.\nfunction coordPair(form: AddressForm): { lat: number | null; lng: number | null } {\n const lat = Number(form.latitude.trim().replace(',', '.'))\n const lng = Number(form.longitude.trim().replace(',', '.'))\n if (!form.latitude.trim() || !form.longitude.trim()) return { lat: null, lng: null }\n if (!Number.isFinite(lat) || !Number.isFinite(lng)) return { lat: null, lng: null }\n return { lat, lng }\n}\n\nfunction toForm(a: AddressRow): AddressForm {\n return {\n label: a.label ?? '', kind: a.kind, recipient: a.recipient ?? '', phone: a.phone ?? '',\n postal_code: a.postal_code, street: a.street, number: a.number ?? '',\n complement: a.complement ?? '', district: a.district ?? '', city: a.city,\n state: a.state, is_default: a.is_default,\n latitude: a.latitude == null ? '' : String(a.latitude),\n longitude: a.longitude == null ? '' : String(a.longitude),\n }\n}\n\n// Duas colunas, sem breakpoint. O formulário vive na coluna da direita agora, e\n// `sm:` mede a JANELA, não a coluna: numa tela larga com um painel de 400px, as\n// seis colunas do desenho antigo davam campos de sessenta pixels.\nconst SPAN_CLASS: Record<number, string> = {\n 1: 'col-span-1',\n 2: 'col-span-2',\n}\n\n/** Label + control, wired by htmlFor/id so the label is actually clickable and\n * the control is reachable by its accessible name. */\nfunction Field({ id, label, required, span, children }: {\n id: string\n label: string\n required?: boolean\n span: number\n children: React.ReactNode\n}) {\n return (\n <div className={SPAN_CLASS[span]}>\n <label htmlFor={`address-${id}`} className=\"text-xs text-muted-foreground\">\n {label}{required ? ' *' : ''}\n </label>\n {children}\n </div>\n )\n}\n\nexport interface AddressFormModalProps {\n open: boolean\n onClose: () => void\n /** The row being edited; null/absent creates. */\n editing?: AddressRow | null\n /** Whose address book. Without it nothing is written: `onSaved` gets the typed address (id ''). */\n ownerId?: string | null\n ownerType?: string\n /** One address only (a unit): no label, use or default questions. */\n single?: boolean\n /** The saved row, and whether it was an edit. */\n onSaved: (row: AddressRow, edited: boolean) => void\n}\n\nexport function AddressFormModal({\n open, onClose, editing = null, ownerId, ownerType = 'person', single = false, onSaved,\n}: AddressFormModalProps) {\n const t = useTranslation()\n const [form, setForm] = useState<AddressForm>(EMPTY_FORM)\n const [saving, setSaving] = useState(false)\n const [geocoding, setGeocoding] = useState(false)\n const [geocodeState, setGeocodeState] = useState<'idle' | 'resolved' | 'notFound' | 'failed'>('idle')\n const db = () => getSupabaseClientOptional() as unknown as { from: (t: string) => any } | null\n\n useEffect(() => {\n if (!open) return\n // O CEP que já está gravado não se reconsulta.\n setForm(editing ? toForm(editing) : single ? { ...EMPTY_FORM, kind: 'main', is_default: true } : EMPTY_FORM)\n setCepState('idle')\n setGeocodeState(editing && editing.latitude != null && editing.longitude != null ? 'resolved' : 'idle')\n lastLookup.current = editing ? formatPostalCode(editing.postal_code) : ''\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, editing])\n\n const set = <K extends keyof AddressForm>(key: K, value: AddressForm[K]) => {\n const locatesAddress = ['postal_code', 'street', 'number', 'district', 'city', 'state'].includes(key)\n if (locatesAddress) setGeocodeState('idle')\n setForm((prev) => ({\n ...prev,\n [key]: value,\n ...(locatesAddress ? { latitude: '', longitude: '' } : {}),\n }))\n }\n\n // --- CEP -----------------------------------------------------------------\n //\n // `lookupPostalCode` (core) já traz cache e o cuidado que o ViaCEP exige: um\n // CEP inexistente volta HTTP 200 com `{erro:true}`, e tratar isso como\n // sucesso apagaria a rua que a pessoa acabou de digitar.\n //\n // O que se preenche é só o que veio PREENCHIDO. Um CEP de cidade inteira\n // responde com logradouro vazio; sobrescrever a rua com '' seria o mesmo erro\n // por outro caminho.\n const [cepState, setCepState] = useState<'idle' | 'loading' | 'notFound' | 'failed'>('idle')\n const lastLookup = useRef<string>('')\n const numberRef = useRef<HTMLInputElement>(null)\n\n const lookupCep = useCallback(async (raw: string) => {\n const masked = formatPostalCode(raw)\n if (!isValidPostalCode(masked) || lastLookup.current === masked) return\n lastLookup.current = masked\n setCepState('loading')\n try {\n const found = await lookupPostalCode(masked)\n if (!found) { setCepState('notFound'); return }\n setCepState('idle')\n setForm((prev) => ({\n ...prev,\n street: found.street || prev.street,\n district: found.district || prev.district,\n city: found.city || prev.city,\n state: found.state || prev.state,\n latitude: '',\n longitude: '',\n }))\n setGeocodeState('idle')\n // O número é o único campo que a consulta não sabe — é para lá que o\n // cursor vai, em vez de voltar para o começo do formulário.\n requestAnimationFrame(() => numberRef.current?.focus())\n } catch {\n // Offline ou provedor fora: dizer que não deu para checar é diferente de\n // dizer que o CEP não existe.\n setCepState('failed')\n }\n }, [])\n\n const onPostalChange = (raw: string) => {\n const masked = formatPostalCode(raw)\n set('postal_code', masked)\n if (cepState !== 'idle') setCepState('idle')\n if (isValidPostalCode(masked)) void lookupCep(masked)\n else lastLookup.current = ''\n }\n\n // CEP, street and city are what make an address findable; the rest is optional.\n const canSave = form.postal_code.trim() !== '' && form.street.trim() !== '' && form.city.trim() !== ''\n\n const handleGeocode = async () => {\n if (!canSave || geocoding) return\n setGeocoding(true)\n setGeocodeState('idle')\n try {\n if (!navigator.geolocation) throw new Error('geolocation_unavailable')\n const position = await new Promise<GeolocationPosition>((resolve, reject) => {\n navigator.geolocation.getCurrentPosition(resolve, reject, {\n enableHighAccuracy: true,\n timeout: 12_000,\n maximumAge: 0,\n })\n })\n setForm((prev) => ({\n ...prev,\n latitude: position.coords.latitude.toFixed(7),\n longitude: position.coords.longitude.toFixed(7),\n }))\n setGeocodeState('resolved')\n } catch {\n setGeocodeState('failed')\n } finally {\n setGeocoding(false)\n }\n }\n\n const handleSave = async () => {\n if (!canSave) return\n // No owner yet (an order for a walk-in): the address is used, not filed.\n if (!ownerId) {\n onSaved({\n id: '', label: form.label.trim() || null, recipient: form.recipient.trim() || null,\n phone: form.phone.trim() || null, postal_code: form.postal_code.trim(), street: form.street.trim(),\n number: form.number.trim() || null, complement: form.complement.trim() || null,\n district: form.district.trim() || null, city: form.city.trim(), state: form.state.trim().toUpperCase(),\n country: 'BR', is_default: form.is_default, kind: form.kind,\n latitude: coordPair(form).lat, longitude: coordPair(form).lng,\n }, false)\n return\n }\n const client = db()\n if (!client) return\n const tenantId = getActiveTenantId()\n if (!tenantId) { toast.error(t('crud.archetype.addresses.noTenant')); return }\n\n setSaving(true)\n try {\n const values = {\n label: form.label.trim() || null,\n kind: form.kind,\n recipient: form.recipient.trim() || null,\n phone: form.phone.trim() || null,\n postal_code: form.postal_code.trim(),\n street: form.street.trim(),\n number: form.number.trim() || null,\n complement: form.complement.trim() || null,\n district: form.district.trim() || null,\n city: form.city.trim(),\n state: form.state.trim().toUpperCase(),\n is_default: form.is_default,\n // Meia coordenada não localiza nada: ou vão as duas, ou nenhuma.\n latitude: coordPair(form).lat,\n longitude: coordPair(form).lng,\n }\n\n // addresses_one_default_idx is a UNIQUE partial index on\n // (owner_type, owner_id, kind) WHERE is_default — the previous default\n // must be cleared BEFORE this row claims the flag, or the write fails.\n if (form.is_default) {\n let q = client.from('addresses').update({ is_default: false })\n .eq('owner_id', ownerId).eq('owner_type', ownerType).eq('kind', form.kind).eq('is_default', true)\n if (editing) q = q.neq('id', editing.id)\n const { error: clearErr } = await q\n if (clearErr) throw clearErr\n }\n\n const { data: saved, error: err } = editing\n ? await client.from('addresses').update(values).eq('id', editing.id).select('*').single()\n : await client.from('addresses').insert({\n ...values,\n tenant_id: tenantId,\n owner_type: ownerType,\n owner_id: ownerId,\n }).select('*').single()\n if (err) throw err\n onSaved(saved as AddressRow, Boolean(editing))\n } catch (e: any) {\n toast.error(t('crud.archetype.addresses.saveFailed'), { description: e?.message })\n } finally {\n setSaving(false)\n }\n }\n\n return (\n <ModalTask\n title={editing ? t('crud.archetype.addresses.editTitle') : t('crud.archetype.addresses.addTitle')}\n open={open}\n onClose={onClose}\n width=\"max-w-lg\"\n >\n <div className=\"min-h-0 flex-1 overflow-y-auto p-4\">\n <p className=\"mb-4 text-sm text-muted-foreground\">\n {t('crud.archetype.addresses.formDescription')}\n </p>\n\n <div className=\"grid grid-cols-2 gap-3\">\n {/* Rótulo, uso e \"padrão\" distinguem um endereço DOS OUTROS. Onde só\n pode haver um, as três perguntas não têm resposta possível. */}\n {!single && (\n <>\n <Field id=\"label\" span={1} label={t('crud.archetype.addresses.field.label')}>\n <Input id=\"address-label\" value={form.label} onChange={(e) => set('label', e.target.value)}\n placeholder={t('crud.archetype.addresses.labelPlaceholder')} />\n </Field>\n <Field id=\"kind\" span={1} label={t('crud.archetype.addresses.field.kind')}>\n <Select value={form.kind} onValueChange={(v: string) => set('kind', v)}>\n <SelectTrigger id=\"address-kind\"><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"both\">{t('crud.archetype.addresses.kind.both')}</SelectItem>\n <SelectItem value=\"shipping\">{t('crud.archetype.addresses.kind.shipping')}</SelectItem>\n <SelectItem value=\"billing\">{t('crud.archetype.addresses.kind.billing')}</SelectItem>\n </SelectContent>\n </Select>\n </Field>\n </>\n )}\n\n {/* O CEP é o primeiro campo que se preenche e o único que preenche\n os outros. Dispara sozinho ao completar os oito dígitos — pedir\n um clique em \"buscar\" é cobrar por uma decisão que já foi\n tomada ao digitar o último número. */}\n <Field id=\"postal_code\" span={1} required label={t('crud.archetype.addresses.field.postalCode')}>\n <div className=\"relative\">\n <Input\n id=\"address-postal_code\"\n value={form.postal_code}\n onChange={(e) => onPostalChange(e.target.value)}\n onBlur={() => void lookupCep(form.postal_code)}\n inputMode=\"numeric\"\n placeholder=\"00000-000\"\n />\n {cepState === 'loading' ? (\n // Positioning on the wrapper, spin on the icon — see PersonPicker.\n <span className=\"pointer-events-none absolute inset-y-0 right-2.5 flex items-center\">\n <Loader2 className=\"h-3.5 w-3.5 animate-spin text-muted-foreground\" />\n </span>\n ) : null}\n </div>\n {cepState === 'notFound' ? (\n <p className=\"mt-1 text-xs text-muted-foreground\">{t('crud.archetype.addresses.cepNotFound')}</p>\n ) : cepState === 'failed' ? (\n <p className=\"mt-1 text-xs text-destructive\">{t('crud.archetype.addresses.cepFailed')}</p>\n ) : null}\n </Field>\n <Field id=\"number\" span={1} label={t('crud.archetype.addresses.field.number')}>\n <Input id=\"address-number\" ref={numberRef} value={form.number}\n onChange={(e) => set('number', e.target.value)} />\n </Field>\n\n <Field id=\"street\" span={2} required label={t('crud.archetype.addresses.field.street')}>\n <Input id=\"address-street\" value={form.street} onChange={(e) => set('street', e.target.value)} />\n </Field>\n <Field id=\"complement\" span={2} label={t('crud.archetype.addresses.field.complement')}>\n <Input id=\"address-complement\" value={form.complement} onChange={(e) => set('complement', e.target.value)} />\n </Field>\n <Field id=\"district\" span={2} label={t('crud.archetype.addresses.field.district')}>\n <Input id=\"address-district\" value={form.district} onChange={(e) => set('district', e.target.value)} />\n </Field>\n\n <Field id=\"city\" span={1} required label={t('crud.archetype.addresses.field.city')}>\n <Input id=\"address-city\" value={form.city} onChange={(e) => set('city', e.target.value)} />\n </Field>\n <Field id=\"state\" span={1} label={t('crud.archetype.addresses.field.state')}>\n <Input id=\"address-state\" value={form.state} onChange={(e) => set('state', e.target.value)}\n maxLength={2} placeholder=\"UF\" />\n </Field>\n\n <Field id=\"recipient\" span={1} label={t('crud.archetype.addresses.field.recipient')}>\n <Input id=\"address-recipient\" value={form.recipient} onChange={(e) => set('recipient', e.target.value)} />\n </Field>\n <Field id=\"phone\" span={1} label={t('crud.archetype.addresses.field.phone')}>\n <Input id=\"address-phone\" value={form.phone} onChange={(e) => set('phone', e.target.value)} />\n </Field>\n\n {ownerType === 'unit' ? (\n <div className=\"col-span-2 rounded-lg border border-border/70 bg-muted/20 p-3\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium\">Coordenadas da unidade</p>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n {geocodeState === 'resolved'\n ? 'Coordenadas capturadas deste dispositivo.'\n : geocodeState === 'notFound'\n ? 'Não encontramos este endereço. Confira os dados e tente novamente.'\n : geocodeState === 'failed'\n ? 'Não foi possível acessar sua localização. Confira a permissão do navegador.'\n : 'Na unidade, preencha o endereço e capture a localização deste dispositivo.'}\n </p>\n {form.latitude && form.longitude ? (\n <dl className=\"mt-2 flex flex-wrap gap-x-5 gap-y-1 text-xs\">\n <div className=\"flex gap-1.5\"><dt className=\"text-muted-foreground\">Latitude</dt><dd className=\"font-medium tabular-nums\">{form.latitude}</dd></div>\n <div className=\"flex gap-1.5\"><dt className=\"text-muted-foreground\">Longitude</dt><dd className=\"font-medium tabular-nums\">{form.longitude}</dd></div>\n </dl>\n ) : null}\n </div>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"shrink-0\"\n disabled={!canSave || geocoding} onClick={() => void handleGeocode()}>\n {geocoding ? <Loader2 className=\"mr-1.5 h-3.5 w-3.5 animate-spin\" /> : <MapPin className=\"mr-1.5 h-3.5 w-3.5\" />}\n {geocoding ? 'Localizando…' : 'Atualizar coordenadas'}\n </Button>\n </div>\n </div>\n ) : null}\n\n {!single && (\n <label className=\"col-span-2 flex items-center gap-2 text-sm\">\n <Checkbox checked={form.is_default} onChange={(checked) => set('is_default', checked)} />\n {t('crud.archetype.addresses.setDefault')}\n </label>\n )}\n </div>\n </div>\n\n <div className=\"flex items-center justify-end gap-2 border-t border-border p-3\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={onClose} disabled={saving}>\n {t('common.cancel')}\n </Button>\n <Button type=\"button\" size=\"sm\" onClick={() => void handleSave()} disabled={!canSave || saving}>\n {saving ? t('common.saving') : t('common.save')}\n </Button>\n </div>\n </ModalTask>\n )\n}\n","import React from 'react'\nimport { Card } from '@fayz-ai/ui'\n\n// ---------------------------------------------------------------------------\n// Esqueletos de carregamento das telas de CRUD.\n//\n// Um esqueleto tem UMA função: prometer a forma que vem a seguir, para a página\n// não saltar quando o dado chega. Por isso são dois e não um — ficha e\n// formulário não têm a mesma forma, e usar o da ficha no formulário promete um\n// herói com avatar e abas onde vão aparecer campos.\n//\n// Estavam escritos à mão dentro do CrudPage, duas vezes, e por serem JSX solto\n// nenhum plugin conseguia reaproveitá-los: a edição de produto do estoque\n// ficava com a área em branco enquanto carregava, que é a mesma tela sem a\n// promessa.\n// ---------------------------------------------------------------------------\n\nexport interface CrudSkeletonProps {\n /**\n * @deprecated Sem efeito. A migalha e as ações moram na barra da shell desde\n * que a barra passou a existir no celular; o esqueleto que as desenhava aqui\n * prometia, no corpo da página, uma forma que chega em outro lugar.\n */\n hideBreadcrumb?: boolean\n}\n\n/** The record's tab strip: the track, the open tab (\"Visão geral\" is always there) and a few more. */\nfunction TabStripSkeleton() {\n return (\n <div className=\"inline-flex h-10 items-center gap-1 rounded-button bg-muted p-1\">\n <div className=\"h-8 w-28 rounded-button bg-background\" />\n <div className=\"h-3 w-16 mx-3 rounded bg-muted-foreground/15\" />\n <div className=\"h-3 w-20 mx-3 rounded bg-muted-foreground/15\" />\n <div className=\"h-3 w-14 mx-3 rounded bg-muted-foreground/15\" />\n </div>\n )\n}\n\n/**\n * Ficha de um registro: abas e linhas de campo. O nome mora na barra da shell.\n */\nexport function CrudDetailSkeleton(_props: CrudSkeletonProps = {}) {\n return (\n <div className=\"space-y-6 animate-pulse\">\n <TabStripSkeleton />\n <Card>\n <div className=\"divide-y\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div key={i} className=\"grid grid-cols-3 gap-4 px-5 py-3\">\n <div className=\"h-4 w-20 rounded bg-muted\" />\n <div className=\"col-span-2 h-4 w-32 rounded bg-muted\" />\n </div>\n ))}\n </div>\n </Card>\n </div>\n )\n}\n\nexport interface CrudFormSkeletonProps extends CrudSkeletonProps {\n /** Quantas seções o formulário costuma ter. Default 2. */\n groups?: number\n /** Formulário de duas colunas (com trilha lateral). */\n twoColumn?: boolean\n /** Editing a record: the form opens under the record's tab strip. */\n tabs?: boolean\n}\n\n/**\n * Formulário: seções com pares rótulo+campo, na mesma largura em que o\n * formulário de verdade vai abrir.\n */\nexport function CrudFormSkeleton({ groups = 2, twoColumn, tabs }: CrudFormSkeletonProps = {}) {\n const section = (key: number, rows: number) => (\n <Card key={key} className=\"p-5\">\n <div className=\"mb-4 h-4 w-32 rounded bg-muted\" />\n <div className=\"fz-fields fz-fields-2 gap-4\">\n {Array.from({ length: rows }).map((_, i) => (\n <div key={i} className=\"space-y-1.5\">\n <div className=\"h-3 w-24 rounded bg-muted\" />\n <div className=\"h-9 w-full rounded-input bg-muted\" />\n </div>\n ))}\n </div>\n </Card>\n )\n\n const main = <div className=\"space-y-5\">{Array.from({ length: groups }).map((_, i) => section(i, i === 0 ? 4 : 2))}</div>\n\n return (\n <div className=\"w-full animate-pulse\">\n {tabs && <div className=\"mb-4\"><TabStripSkeleton /></div>}\n <div className={`fz-container mx-auto w-full space-y-5 ${twoColumn ? 'max-w-6xl' : 'max-w-3xl'}`}>\n {twoColumn ? (\n <div className=\"fz-split\">\n <div>{main}</div>\n <div className=\"space-y-5\">{section(99, 2)}</div>\n </div>\n ) : main}\n </div>\n </div>\n )\n}\n","// ---------------------------------------------------------------------------\n// O que o banco disse, em português.\n//\n// Um índice único recusa assim:\n//\n// duplicate key value violates unique constraint \"persons_tenant_customer_phone\"\n// Key (tenant_id, phone)=(1000…0104, 21998803190) already exists.\n//\n// Verdadeiro, e inútil para quem está com o cliente na linha: não diz QUAL\n// campo repetiu sem ler o nome do índice, e ainda entrega o id do tenant e o\n// valor alheio. Pior: quando a tela adivinha o campo (todo 23505 vira \"esse\n// e-mail já existe\"), ela mente na metade dos casos — foi o telefone.\n//\n// `Key (…)` nomeia as colunas exatamente. É de lá que a frase sai, e o nome do\n// índice é só o plano B para os transportes que não mandam `details`.\n// ---------------------------------------------------------------------------\n\n/** Colunas de escopo: repetem em todo índice multi-tenant e não são o conflito. */\nconst SCOPE_COLUMNS = new Set(['tenant_id', 'org_id', 'workspace_id', 'unit_id', 'account_id'])\n\nconst FIELD_LABELS: [RegExp, string][] = [\n [/e_?mail/iu, 'e-mail'],\n [/phone|telefone|whatsapp|celular/iu, 'telefone'],\n [/document|\\bcpf\\b|\\bcnpj\\b|tax_id/iu, 'CPF/CNPJ'],\n [/\\bsku\\b/iu, 'SKU'],\n [/slug/iu, 'endereço (slug)'],\n [/\\bcode\\b|codigo|barcode/iu, 'código'],\n [/\\bname\\b|nome/iu, 'nome'],\n]\n\nexport interface DuplicateWrite {\n /** As colunas que o índice cobre, sem as de escopo. */\n columns: string[]\n /** A primeira coluna reconhecida — o campo que a tela deve apontar. */\n field?: string\n /** Como chamar esse campo para quem está olhando. */\n label: string\n}\n\nfunction pgText(error: unknown): { code: string; message: string; details: string; constraint: string } {\n const e = (error ?? {}) as Record<string, unknown>\n return {\n code: String(e.code ?? ''),\n message: String(e.message ?? (typeof error === 'string' ? error : '')),\n details: String(e.details ?? ''),\n constraint: String(e.constraint ?? ''),\n }\n}\n\n/**\n * O índice único que recusou esta escrita — ou null, se a recusa foi outra.\n *\n * Reconhece pelo SQLSTATE quando ele chega, e pela frase quando o transporte o\n * perde (o mesmo par de portas que `isDuplicateEmail` já usava no shop).\n */\nexport function duplicateWrite(error: unknown): DuplicateWrite | null {\n const { code, message, details, constraint } = pgText(error)\n const isDuplicate = code === '23505' || /duplicate key value/iu.test(message)\n if (!isDuplicate) return null\n\n // \"Key (tenant_id, phone)=(…)\" — as colunas, na ordem do índice.\n const keyed = /Key\\s*\\(([^)]+)\\)/iu.exec(details) ?? /Key\\s*\\(([^)]+)\\)/iu.exec(message)\n const columns = (keyed?.[1] ?? '')\n .split(',')\n .map((c) => c.trim())\n .filter((c) => c && !SCOPE_COLUMNS.has(c))\n\n // Sem `details`, sobra o nome do índice: \"shop_customers_tenant_email_idx\".\n const haystack = columns.length ? columns.join(' ') : `${constraint} ${message}`\n const hit = FIELD_LABELS.find(([pattern]) => pattern.test(haystack))\n\n return {\n columns,\n field: columns[0],\n label: hit?.[1] ?? 'valor',\n }\n}\n\n/**\n * A mensagem que vai para a tela.\n *\n * Só reescreve o que sabe reescrever: qualquer outra falha volta com o texto\n * original, porque um erro que ninguém traduziu ainda é melhor do que um\n * \"algo deu errado\" que apaga a pista.\n */\nexport function humanizeWriteError(error: unknown): string {\n const duplicate = duplicateWrite(error)\n if (duplicate) return `Já existe outro cadastro com esse ${duplicate.label}.`\n const { message } = pgText(error)\n return message || 'Algo deu errado.'\n}\n","import { createContext, useContext } from 'react'\nimport { Plus } from 'lucide-react'\nimport type { LucideIcon } from 'lucide-react'\nimport { Button, Card, CardContent } from '@fayz-ai/ui'\n\n// ---------------------------------------------------------------------------\n// A casca dos campos que são uma LINHA DE OUTRA TABELA — endereço e conta\n// bancária hoje.\n//\n// Eles são grandes: endereço tem oito campos, conta bancária tem onze. Abertos\n// de saída, tomam a tela inteira de um cadastro cuja resposta, na maioria das\n// vezes, é «não tem» — e a recepção rola por dezenove caixas vazias para chegar\n// em Observações.\n//\n// Então o padrão é o inverso do resto do formulário: fechado até alguém pedir.\n// O botão de adicionar fica na LINHA DO TÍTULO, à direita, onde toda ação de\n// seção do produto mora; o cartão embaixo diz que não há nada, em vez de ficar\n// vazio. Preenchido, o cartão vira a linha lida em voz alta, com um lápis.\n//\n// O título vem do GRUPO, pelo contexto abaixo: um grupo cujo único campo é\n// destes não desenha o próprio cabeçalho — seria o mesmo título duas vezes, e\n// o botão não teria como chegar à linha dele.\n// ---------------------------------------------------------------------------\n\nexport interface AttachedSectionChrome {\n title?: string\n description?: string\n}\n\nconst ChromeContext = createContext<AttachedSectionChrome>({})\n\nexport const AttachedSectionProvider = ChromeContext.Provider\n\n/** O campo é uma linha anexa, e por isso desenha a própria seção. */\nexport function isAttachedFieldType(type: string): boolean {\n return type === 'address' || type === 'bank'\n}\n\nexport function AttachedFieldSection({\n present,\n addLabel,\n emptyLabel,\n emptyHint,\n emptyIcon: EmptyIcon,\n onAdd,\n children,\n}: {\n /**\n * O campo TEM um valor — nem que seja um objeto em branco.\n *\n * O «aberto» mora aqui, e não num `useState` local, porque a árvore deste\n * formulário remonta: na ficha de edição a aba Endereços carrega depois e\n * leva os irmãos junto, e a seção que o operador acabou de abrir fechava\n * sozinha, apagando o que ele tinha digitado. O valor do formulário não\n * remonta — então é ele quem lembra.\n */\n present: boolean\n /** «Adicionar endereço», «Adicionar conta bancária». */\n addLabel: string\n /** O título do vazio: «Nenhum endereço cadastrado». */\n emptyLabel: string\n /** A linha embaixo dele, que diz para que serve preencher. */\n emptyHint?: string\n /** O ícone do vazio — o mesmo que a seção da ficha usa. */\n emptyIcon?: LucideIcon\n /** Cria a linha em branco — é o clique no «+». */\n onAdd: () => void\n children: React.ReactNode\n}) {\n const chrome = useContext(ChromeContext)\n\n // Dois estados, e só dois. Uma versão anterior tinha um terceiro — o resumo\n // do que está gravado, com um lápis para abrir — e ele fechava a seção no\n // PRIMEIRO caractere digitado: bastava haver o que resumir. Duas linhas de\n // condição não valem a chance de tirar o formulário debaixo de quem digita.\n return (\n <div>\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"min-w-0\">\n {chrome.title && <h3 className=\"text-sm font-semibold text-foreground\">{chrome.title}</h3>}\n {chrome.description && (\n <p className=\"mt-0.5 text-xs text-muted-foreground\">{chrome.description}</p>\n )}\n </div>\n {/* A ação da seção mora na linha do título, à direita, onde as ações de\n seção do produto moram — e some assim que a seção existe. */}\n {!present && (\n <Button type=\"button\" size=\"sm\" className=\"h-8 shrink-0\" onClick={onAdd}>\n <Plus className=\"mr-1 h-3.5 w-3.5\" />\n {addLabel}\n </Button>\n )}\n </div>\n\n {/* O MESMO vazio das seções da ficha (Endereços, Documentos): ícone em\n círculo, o que falta, e para que serve preencher. Duas gramáticas de\n \"nada aqui\" na mesma tela leem-se como duas telas diferentes. */}\n <Card className=\"mt-1.5\">\n {present ? (\n <CardContent className=\"pt-4\">{children}</CardContent>\n ) : (\n <CardContent className=\"flex flex-col items-center justify-center py-12 text-center\">\n {EmptyIcon && (\n <div className=\"mb-3 flex h-12 w-12 items-center justify-center rounded-full bg-muted\">\n <EmptyIcon className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n )}\n <p className=\"text-sm font-medium\">{emptyLabel}</p>\n {emptyHint && <p className=\"mt-1 max-w-xs text-xs text-muted-foreground\">{emptyHint}</p>}\n </CardContent>\n )}\n </Card>\n </div>\n )\n}\n","import React from 'react'\nimport { Button } from '@fayz-ai/ui'\n\ninterface ActiveToggleProps {\n active: boolean\n onChange: (active: boolean) => void\n}\n\nexport function ActiveToggle({ active, onChange }: ActiveToggleProps) {\n return (\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={() => onChange(!active)} className=\"flex items-center gap-1.5 text-[length:inherit] font-normal\">\n <div className={`relative inline-flex h-5 w-9 items-center rounded-full transition-colors ${\n active ? 'bg-primary' : 'bg-muted-foreground/30'\n }`}>\n <span className={`pointer-events-none block h-4 w-4 rounded-full bg-white shadow-sm transition-transform ${\n active ? 'translate-x-[18px]' : 'translate-x-[2px]'\n }`} />\n </div>\n <span className={`text-xs font-medium ${active ? 'text-foreground' : 'text-muted-foreground'}`}>\n {active ? 'Active' : 'Inactive'}\n </span>\n </Button>\n )\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport { MapPin, Star, Pencil, Trash2, Plus } from 'lucide-react'\nimport {\n Card, CardContent, Badge, Button, ConfirmDialog,\n} from '@fayz-ai/ui'\nimport { getSupabaseClientOptional, useTranslation } from '@fayz-ai/core'\n\nimport { toast } from '../../components/notifications/ToastProvider'\nimport { AddressFormModal, type AddressRow } from './AddressFormModal'\n\nexport type { AddressRow } from './AddressFormModal'\n\n// ---------------------------------------------------------------------------\n// Addresses tab — generic on purpose. public.addresses is a CORE table (spine\n// migration @fayz-ai/db 017_core_addresses), so any app with a person record\n// gets this: a client's delivery addresses, a supplier's pickup point, a staff\n// member's home address. Nothing here is shop-specific.\n//\n// Rows are read by owner_id alone, without an owner_type filter, because a\n// person can be reached from two sides today: a core `people` row, or a\n// module's own customer row that mirrors it (the shop's plg_shop_customers\n// keeps the same id). Both resolve to the same address book. Rows WRITTEN here\n// are stamped 'person' — the spine's canonical owner kind.\n// ---------------------------------------------------------------------------\n\nfunction formatLine(a: AddressRow): string {\n // Rua, número — complemento · bairro · cidade/UF · CEP, skipping whatever is\n // missing so a partial address never renders stray commas.\n const streetLine = [a.street, a.number].filter(Boolean).join(', ')\n const withComplement = a.complement ? `${streetLine} — ${a.complement}` : streetLine\n return [withComplement, a.district, `${a.city}/${a.state}`, a.postal_code]\n .filter((part) => part && part !== '—' && part !== '/')\n .join(' · ')\n}\n\nexport interface AddressesTabProps {\n item?: unknown\n /**\n * Qual dono esta lista serve. `public.addresses` atende pessoa, unidade,\n * tenant e entidade legal pelo par (owner_type, owner_id) — o padrão é\n * 'person' porque é de onde este bloco nasceu.\n */\n ownerType?: string\n /**\n * UM endereço, não uma lista. É o caso da UNIDADE: uma loja tem um endereço,\n * e oferecer \"+ Adicionar\" ali convida a cadastrar um segundo que nenhuma\n * tela sabe ler. Some o botão depois do primeiro, e some também o rótulo, o\n * uso e a estrela de padrão — três perguntas que só fazem sentido quando há\n * mais de um para distinguir.\n */\n single?: boolean\n}\n\nexport function AddressesTab({ item, ownerType = 'person', single = false }: AddressesTabProps) {\n const t = useTranslation()\n const record = item as { id?: string } | undefined\n const [rows, setRows] = useState<AddressRow[]>([])\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n const [editing, setEditing] = useState<AddressRow | null>(null)\n const [formOpen, setFormOpen] = useState(false)\n const [deleting, setDeleting] = useState<AddressRow | null>(null)\n\n const ownerId = record?.id\n\n // getSupabaseClientOptional is loosely typed at this layer; the query shape is\n // asserted here rather than pulling supabase-js into the UI package.\n const db = () => getSupabaseClientOptional() as unknown as { from: (t: string) => any } | null\n\n const load = useCallback(async () => {\n const client = db()\n if (!client || !ownerId) { setLoading(false); return }\n setLoading(true)\n setError(null)\n // Sem filtro de `owner_type` para pessoa, DE PROPÓSITO: ela é alcançada\n // por dois lados (o `people` do núcleo e o espelho do módulo), e os dois\n // apontam para a mesma agenda. Qualquer outro dono é exato.\n let q = client.from('addresses').select('*').eq('owner_id', ownerId)\n if (ownerType !== 'person') q = q.eq('owner_type', ownerType)\n const { data, error: err } = await q.order('is_default', { ascending: false })\n if (err) setError(err.message)\n else setRows((data ?? []) as AddressRow[])\n setLoading(false)\n }, [ownerId, ownerType])\n\n useEffect(() => { void load() }, [load])\n\n const openCreate = () => { setEditing(null); setFormOpen(true) }\n const openEdit = (a: AddressRow) => { setEditing(a); setFormOpen(true) }\n\n const handleDelete = async () => {\n const client = db()\n if (!client || !deleting) return\n const { error: err } = await client.from('addresses').delete().eq('id', deleting.id)\n setDeleting(null)\n if (err) { toast.error(t('crud.archetype.addresses.deleteFailed'), { description: err.message }); return }\n await load()\n toast.success(t('crud.archetype.addresses.deleted'))\n }\n\n if (loading) {\n return (\n <Card><CardContent className=\"space-y-2 py-6\">\n <div className=\"h-4 w-56 animate-pulse rounded bg-muted/40\" />\n <div className=\"h-4 w-40 animate-pulse rounded bg-muted/30\" />\n </CardContent></Card>\n )\n }\n\n if (error) {\n return (\n <div className=\"rounded-lg border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-800\">\n <p className=\"font-medium\">{t('crud.archetype.addresses.loadFailed')}</p>\n <p className=\"mt-1 text-red-700\">{error}</p>\n </div>\n )\n }\n\n return (\n <div className=\"space-y-3\">\n {/* Same shape the documents tab uses: the section names itself on the\n left and its one CTA sits on the right. A button alone on a right-\n aligned row left the list looking like it belonged to whatever was\n above it. */}\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-sm font-semibold\">{t('crud.archetype.addresses.title')}</h3>\n {single && rows.length > 0 ? null : (\n <Button type=\"button\" size=\"sm\" className=\"h-8\" onClick={openCreate}>\n <Plus className=\"mr-1 h-3.5 w-3.5\" />\n {t('crud.archetype.addresses.add')}\n </Button>\n )}\n </div>\n\n {rows.length === 0 ? (\n <Card><CardContent className=\"flex flex-col items-center justify-center py-12 text-center\">\n <div className=\"mb-3 flex h-12 w-12 items-center justify-center rounded-full bg-muted\">\n <MapPin className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <p className=\"text-sm font-medium\">{t('crud.archetype.addresses.emptyTitle')}</p>\n <p className=\"mt-1 max-w-xs text-xs text-muted-foreground\">\n {t('crud.archetype.addresses.emptyDescription')}\n </p>\n </CardContent></Card>\n ) : (\n <div className=\"space-y-2\">\n {rows.map((a) => (\n <Card key={a.id}>\n <CardContent className=\"flex items-start gap-3 py-3\">\n <MapPin className=\"mt-0.5 h-4 w-4 shrink-0 text-muted-foreground\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-sm font-medium\">\n {a.label ?? t('crud.archetype.addresses.fallbackLabel')}\n </span>\n {!single && a.is_default && (\n <Badge variant=\"secondary\" className=\"gap-1 text-[10px]\">\n <Star className=\"h-2.5 w-2.5\" /> {t('crud.archetype.addresses.default')}\n </Badge>\n )}\n {!single && a.kind !== 'both' && (\n <Badge variant=\"secondary\" className=\"text-[10px]\">\n {t(`crud.archetype.addresses.kind.${a.kind}`)}\n </Badge>\n )}\n </div>\n <p className=\"mt-0.5 text-sm text-muted-foreground\">{formatLine(a)}</p>\n {(a.recipient || a.phone) && (\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n {[a.recipient, a.phone].filter(Boolean).join(' · ')}\n </p>\n )}\n </div>\n <div className=\"flex shrink-0 gap-1\">\n {/* Named for the ADDRESS, not just \"Editar\": the person\n detail header already owns a plain Editar/Excluir pair,\n and two identical accessible names on one screen is a\n coin flip for a screen reader user. */}\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => openEdit(a)}\n aria-label={t('crud.archetype.addresses.editTitle')}>\n <Pencil className=\"h-3.5 w-3.5\" />\n </Button>\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => setDeleting(a)}\n aria-label={t('crud.archetype.addresses.deleteTitle')}>\n <Trash2 className=\"h-3.5 w-3.5 text-destructive\" />\n </Button>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n )}\n\n {/* ModalTask, não RightRailPage: esta aba vive DENTRO de modais (o\n agendamento embute a ficha) e o rail abria ATRÁS deles. Num host\n (ModalTaskHost) o formulário toma a moldura do próprio modal; numa\n página comum, abre como modal. */}\n <AddressFormModal\n open={formOpen}\n onClose={() => setFormOpen(false)}\n editing={editing}\n ownerId={ownerId}\n ownerType={ownerType}\n single={single}\n onSaved={async (_row, edited) => {\n setFormOpen(false)\n await load()\n toast.success(edited ? t('crud.archetype.addresses.updated') : t('crud.archetype.addresses.created'))\n }}\n />\n\n <ConfirmDialog\n open={deleting !== null}\n variant=\"destructive\"\n title={t('crud.archetype.addresses.deleteTitle')}\n description={deleting ? formatLine(deleting) : ''}\n confirmLabel={t('common.delete')}\n cancelLabel={t('common.cancel')}\n onConfirm={() => void handleDelete()}\n onCancel={() => setDeleting(null)}\n />\n </div>\n )\n}\n\n/** O mesmo bloco, pelo nome do que ele é hoje: uma SEÇÃO da ficha e do\n * formulário de pessoa, não mais uma aba. */\nexport const AddressesSection = AddressesTab\n","import type { FieldDef } from '@fayz-ai/core'\nimport { FormFieldItem } from './CrudFormPage'\n\n// ---------------------------------------------------------------------------\n// Um FieldDef[] renderizado contra um OBJETO — o mesmo motor do formulário do\n// cadastro, só que o «registro» é o valor de um campo.\n//\n// Existe porque três telas pedem a mesma conta bancária (o campo do cadastro,\n// o diálogo da ficha, e o que vier) e cada uma estava escrevendo os seus\n// próprios inputs à mão. Escrito à mão, `visibleWhen` não vale, `required` não\n// vale, e as três discordam sobre o que perguntar — que é exatamente o que\n// aconteceu: uma pedia agência de quem paga por PIX.\n//\n// Aqui `visibleWhen` vale, `required` marca o asterisco, e o `segmented` do\n// meio de pagamento esconde o resto sozinho, como no cadastro de Contas.\n// ---------------------------------------------------------------------------\n\nexport function SubForm({\n fields,\n values,\n onChange,\n columns = 3,\n invalidKeys,\n}: {\n fields: FieldDef[]\n values: Record<string, any>\n onChange: (next: Record<string, any>) => void\n columns?: 1 | 2 | 3\n invalidKeys?: ReadonlySet<string>\n}) {\n const visible = fields.filter((f) => !f.visibleWhen || f.visibleWhen(values))\n // Um campo condicional que sumiu não deixa coluna vazia atrás de si — mesma\n // regra dos grupos do formulário grande.\n const cols = Math.min(columns, Math.max(visible.length, 1))\n return (\n <div className=\"fz-container\">\n <div className={`fz-fields ${cols >= 3 ? 'fz-fields-3' : cols >= 2 ? 'fz-fields-2' : ''}`}>\n {visible.map((field) => (\n <FormFieldItem\n key={field.key}\n field={field}\n value={values[field.key]}\n onChange={(val) => onChange({ ...values, [field.key]: val })}\n allValues={values}\n invalid={invalidKeys?.has(field.key)}\n />\n ))}\n </div>\n </div>\n )\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport { Landmark, Pencil, Plus, Star, Trash2 } from 'lucide-react'\nimport { getSupabaseClientOptional, getActiveTenantId, payeeAccountFields, payeeMethodOf, useTranslation } from '@fayz-ai/core'\nimport { Badge, Button, Card, CardContent, ConfirmDialog, ModalTask, Checkbox } from '@fayz-ai/ui'\nimport { toast } from '../../components/notifications/ToastProvider'\nimport { SubForm } from '../SubForm'\nimport { usePermissionOptional } from '../../permissions/context'\n\n// ---------------------------------------------------------------------------\n// As contas de quem a casa PAGA, na ficha da pessoa.\n//\n// Irmã da seção Endereços, e pelo mesmo motivo de forma: o formulário do\n// cadastro guarda UMA conta — a principal, a que a remessa usa — e aqui moram\n// TODAS. Uma pessoa tem mais de uma com frequência: a do CNPJ e a do sócio, a\n// corrente e a poupança do INSS, a que mudou de banco e a antiga que ainda\n// aparece em pagamento agendado.\n//\n// `public.payee_accounts` (migration 149), NÃO `plg_financial_accounts`. A\n// conta do fornecedor não é dinheiro da casa: é para onde o dinheiro sai. Duas\n// tabelas separadas é o que impede essa conta de aparecer no seletor de\n// «Receber em» e no saldo consolidado da empresa — dois leitores do razão que\n// não filtram por espécie.\n// ---------------------------------------------------------------------------\n\ninterface AccountRow {\n id: string\n label: string | null\n is_default: boolean\n bank_code: string | null\n bank_name: string | null\n agency_number: string | null\n agency_digit: string | null\n account_number: string | null\n account_digit: string | null\n account_type: string | null\n pix_key: string | null\n pix_key_type: string | null\n holder_name: string | null\n holder_document: string | null\n}\n\n/**\n * O formulário fala a língua da TELA (camelCase), porque os campos são os\n * mesmos `payeeAccountFields()` que o cadastro usa. A tradução para as colunas\n * acontece numa borda só, em `toRow`/`toForm` abaixo.\n */\ninterface AccountForm extends Record<string, unknown> {\n label: string\n is_default: boolean\n method?: string\n bankCode?: string; bankName?: string\n agencyNumber?: string; agencyDigit?: string\n accountNumber?: string; accountDigit?: string; accountType?: string\n pixKey?: string; pixKeyType?: string\n holderName?: string; holderDocument?: string\n}\n\nconst ACCOUNT_FIELDS = payeeAccountFields()\n\nconst EMPTY_FORM: AccountForm = { label: '', is_default: false, method: 'bank' }\n\nfunction toForm(a: AccountRow): AccountForm {\n return {\n label: a.label ?? '', is_default: a.is_default,\n method: payeeMethodOf({ pixKey: a.pix_key, accountNumber: a.account_number }),\n bankCode: a.bank_code ?? '', bankName: a.bank_name ?? '',\n agencyNumber: a.agency_number ?? '', agencyDigit: a.agency_digit ?? '',\n accountNumber: a.account_number ?? '', accountDigit: a.account_digit ?? '',\n accountType: a.account_type ?? '',\n pixKey: a.pix_key ?? '', pixKeyType: a.pix_key_type ?? '',\n holderName: a.holder_name ?? '', holderDocument: a.holder_document ?? '',\n }\n}\n\n/** A conta lida em voz alta: banco, agência com dígito, conta com dígito. */\nfunction formatLine(a: AccountRow): string {\n const ag = a.agency_number && `ag. ${[a.agency_number, a.agency_digit].filter(Boolean).join('-')}`\n const cc = a.account_number && `${[a.account_number, a.account_digit].filter(Boolean).join('-')}`\n return [[a.bank_code, a.bank_name].filter(Boolean).join(' '), ag, cc].filter(Boolean).join(' · ')\n}\n\nconst blank = (v: string | null) => (v == null || v.trim() === '' ? null : v.trim())\n\nexport function PayeeAccountsSection({\n item,\n ownerType = 'person',\n}: {\n item?: unknown\n ownerType?: string\n}) {\n const t = useTranslation()\n const record = item as { id?: string } | undefined\n const ownerId = record?.id\n\n const [rows, setRows] = useState<AccountRow[]>([])\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n const [editing, setEditing] = useState<AccountRow | null>(null)\n const [formOpen, setFormOpen] = useState(false)\n const [form, setForm] = useState<AccountForm>(EMPTY_FORM)\n const [saving, setSaving] = useState(false)\n const [deleting, setDeleting] = useState<AccountRow | null>(null)\n // Mirrors the payee_accounts policies (db 174).\n const can = usePermissionOptional()\n const canRead = can('financial', 'read')\n const canEdit = can('financial', 'edit')\n const canDelete = can('financial', 'delete')\n\n const db = () => getSupabaseClientOptional() as unknown as { from: (t: string) => any } | null\n\n const load = useCallback(async () => {\n const client = db()\n if (!client || !ownerId) { setLoading(false); return }\n setLoading(true); setError(null)\n const { data, error: err } = await client\n .from('payee_accounts').select('*')\n .eq('owner_type', ownerType).eq('owner_id', ownerId)\n .order('is_default', { ascending: false })\n if (err) setError(err.message)\n else setRows((data ?? []) as AccountRow[])\n setLoading(false)\n }, [ownerId, ownerType])\n\n useEffect(() => { void load() }, [load])\n\n const set = <K extends keyof AccountForm>(key: K, value: AccountForm[K]) =>\n setForm((prev) => ({ ...prev, [key]: value }))\n\n // O CHECK da 149: uma linha sem conta E sem PIX não é um dado. O botão de\n // salvar diz isso antes do banco.\n const canSave = !!blank(form.accountNumber ?? null) || !!blank(form.pixKey ?? null)\n\n const handleSave = async () => {\n const client = db()\n const tenantId = getActiveTenantId()\n if (!client || !ownerId || !tenantId || !canSave) return\n setSaving(true)\n try {\n // O meio ESCOLHIDO manda: trocar para PIX e salvar tem de apagar a\n // agência que ficou na tela, ou a linha guarda as duas respostas e a\n // leitura volta dizendo «conta bancária».\n const pix = form.method === 'pix'\n const b = (k: keyof AccountForm) => blank((form[k] as string) ?? null)\n const values = {\n label: blank(form.label), is_default: form.is_default,\n bank_code: pix ? null : b('bankCode'), bank_name: pix ? null : b('bankName'),\n agency_number: pix ? null : b('agencyNumber'), agency_digit: pix ? null : b('agencyDigit'),\n account_number: pix ? null : b('accountNumber'), account_digit: pix ? null : b('accountDigit'),\n account_type: pix ? null : b('accountType'),\n pix_key: pix ? b('pixKey') : null, pix_key_type: pix ? b('pixKeyType') : null,\n holder_name: b('holderName'), holder_document: b('holderDocument'),\n }\n // Uma principal por dono — é índice único no banco (149). Rebaixar as\n // outras ANTES evita que a gravação esbarre nele, e mantém a promessa de\n // que a tela e a remessa escolhem a mesma conta.\n if (form.is_default) {\n await client.from('payee_accounts').update({ is_default: false })\n .eq('owner_type', ownerType).eq('owner_id', ownerId)\n }\n const { error: err } = editing\n ? await client.from('payee_accounts').update(values).eq('id', editing.id)\n : await client.from('payee_accounts').insert({\n ...values, tenant_id: tenantId, owner_type: ownerType, owner_id: ownerId,\n })\n if (err) throw err\n setFormOpen(false)\n await load()\n toast.success(t('crud.archetype.payeeAccounts.saved'))\n } catch (e: any) {\n toast.error(t('crud.archetype.payeeAccounts.saveFailed'), { description: e?.message })\n } finally {\n setSaving(false)\n }\n }\n\n const handleDelete = async () => {\n const client = db()\n if (!client || !deleting) return\n const { error: err } = await client.from('payee_accounts').delete().eq('id', deleting.id)\n setDeleting(null)\n if (err) { toast.error(t('crud.archetype.payeeAccounts.deleteFailed'), { description: err.message }); return }\n await load()\n toast.success(t('crud.archetype.payeeAccounts.deleted'))\n }\n\n if (!canRead) return null\n\n if (loading) {\n return (\n <Card><CardContent className=\"space-y-2 py-6\">\n <div className=\"h-4 w-56 animate-pulse rounded bg-muted/40\" />\n <div className=\"h-4 w-40 animate-pulse rounded bg-muted/30\" />\n </CardContent></Card>\n )\n }\n\n if (error) {\n return (\n <div className=\"rounded-lg border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-800\">\n <p className=\"font-medium\">{t('crud.archetype.payeeAccounts.loadFailed')}</p>\n <p className=\"mt-1 text-red-700\">{error}</p>\n </div>\n )\n }\n\n return (\n <div className=\"space-y-3\">\n {/* A mesma forma da seção Endereços: a seção se nomeia à esquerda e a sua\n única ação fica à direita. */}\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-sm font-semibold\">{t('crud.archetype.payeeAccounts.title')}</h3>\n {canEdit && (\n <Button\n type=\"button\" size=\"sm\" className=\"h-8\"\n onClick={() => { setEditing(null); setForm({ ...EMPTY_FORM, is_default: rows.length === 0 }); setFormOpen(true) }}\n >\n <Plus className=\"mr-1 h-3.5 w-3.5\" />\n {t('crud.archetype.payeeAccounts.add')}\n </Button>\n )}\n </div>\n\n {rows.length === 0 ? (\n <Card><CardContent className=\"flex flex-col items-center justify-center py-12 text-center\">\n <div className=\"mb-3 flex h-12 w-12 items-center justify-center rounded-full bg-muted\">\n <Landmark className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <p className=\"text-sm font-medium\">{t('crud.archetype.payeeAccounts.emptyTitle')}</p>\n <p className=\"mt-1 max-w-xs text-xs text-muted-foreground\">\n {t('crud.archetype.payeeAccounts.emptyDescription')}\n </p>\n </CardContent></Card>\n ) : (\n <div className=\"space-y-2\">\n {rows.map((a) => (\n <Card key={a.id}>\n <CardContent className=\"flex items-start gap-3 py-3\">\n <Landmark className=\"mt-0.5 h-4 w-4 shrink-0 text-muted-foreground\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-sm font-medium\">\n {a.label ?? t('crud.archetype.payeeAccounts.fallbackLabel')}\n </span>\n {a.is_default && (\n <Badge variant=\"secondary\" className=\"gap-1 text-[10px]\">\n <Star className=\"h-2.5 w-2.5\" /> {t('crud.archetype.payeeAccounts.default')}\n </Badge>\n )}\n </div>\n {formatLine(a) && <p className=\"mt-0.5 text-sm text-muted-foreground\">{formatLine(a)}</p>}\n {a.pix_key && (\n <p className=\"mt-0.5 text-xs text-muted-foreground\">PIX · {a.pix_key}</p>\n )}\n {/* O titular sai junto porque é o que se confere ANTES de\n transferir: a conta raramente está no nome de quem presta\n o serviço. */}\n {(a.holder_name || a.holder_document) && (\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n {[a.holder_name, a.holder_document].filter(Boolean).join(' · ')}\n </p>\n )}\n </div>\n <div className=\"flex shrink-0 gap-1\">\n {canEdit && (\n <Button\n type=\"button\" variant=\"ghost\" size=\"sm\"\n onClick={() => { setEditing(a); setForm(toForm(a)); setFormOpen(true) }}\n aria-label={t('crud.archetype.payeeAccounts.editTitle')}\n >\n <Pencil className=\"h-3.5 w-3.5\" />\n </Button>\n )}\n {canDelete && (\n <Button\n type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => setDeleting(a)}\n aria-label={t('crud.archetype.payeeAccounts.deleteTitle')}\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </Button>\n )}\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n )}\n\n {/* O MESMO diálogo da seção Endereços (ModalTask), com os MESMOS campos\n do formulário do cadastro (payeeAccountFields). Escolher PIX esconde\n agência nos dois lugares porque é uma declaração só. */}\n <ModalTask\n title={editing\n ? t('crud.archetype.payeeAccounts.editTitle')\n : t('crud.archetype.payeeAccounts.add')}\n open={formOpen}\n onClose={() => setFormOpen(false)}\n width=\"max-w-2xl\"\n >\n <div className=\"min-h-0 flex-1 overflow-y-auto p-4\">\n <SubForm\n fields={ACCOUNT_FIELDS}\n values={form as unknown as Record<string, any>}\n onChange={(next) => setForm(next as unknown as AccountForm)}\n />\n <label className=\"mt-3 flex items-center gap-2 text-sm\">\n <Checkbox checked={form.is_default} onChange={(checked) => set('is_default', checked)} />\n {t('crud.archetype.payeeAccounts.setDefault')}\n </label>\n {!canSave && (\n <p className=\"mt-2 text-[11px] text-destructive\">{t('crud.bank.incomplete')}</p>\n )}\n </div>\n <div className=\"flex justify-end gap-2 border-t p-4\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => setFormOpen(false)}>\n {t('common.cancel')}\n </Button>\n <Button type=\"button\" size=\"sm\" disabled={!canSave || saving} onClick={() => void handleSave()}>\n {saving ? t('common.saving') : t('common.save')}\n </Button>\n </div>\n </ModalTask>\n\n <ConfirmDialog\n open={deleting !== null}\n variant=\"destructive\"\n title={t('crud.archetype.payeeAccounts.deleteTitle')}\n description={deleting ? (deleting.label ?? formatLine(deleting)) : ''}\n confirmLabel={t('common.delete')}\n cancelLabel={t('common.cancel')}\n onConfirm={() => void handleDelete()}\n onCancel={() => setDeleting(null)}\n />\n </div>\n )\n}\n","import React from 'react'\nimport { AttachedSectionProvider, isAttachedFieldType } from '../AttachedFieldSection'\nimport { User } from 'lucide-react'\nimport { Card, CardContent } from '@fayz-ai/ui'\nimport { ActiveToggle } from './ActiveToggle'\nimport { AddressesSection } from './AddressesTab'\nimport { PayeeAccountsSection } from './PayeeAccountsSection'\nimport type { FieldDef, FieldGroup } from '@fayz-ai/core'\n\ninterface PersonFormLayoutProps {\n fields: FieldDef[]\n fieldGroups: FieldGroup[]\n values: Record<string, any>\n onChange: (key: string, val: any) => void\n renderField: (field: FieldDef, value: any, onChange: (val: any) => void) => React.ReactNode\n compact?: boolean\n /** Id do registro sendo EDITADO. Ausente na criação — e a lista de endereços\n * precisa de um dono existente para gravar contra. */\n recordId?: string\n}\n\nconst IDENTITY_FIELDS = new Set(['name', 'dateOfBirth', 'documentNumber'])\nconst CONTACT_FIELDS = new Set(['email', 'phone'])\nconst ADDRESS_FIELDS = new Set(['address', 'city', 'state', 'country', 'postalCode'])\nconst SKIP_FIELDS = new Set(['isActive', 'status', 'tags', 'avatarUrl', 'notes'])\nconst ALL_PERSON_FIELDS = new Set([...IDENTITY_FIELDS, ...CONTACT_FIELDS, ...ADDRESS_FIELDS, ...SKIP_FIELDS])\n/** The ones the archetype renders in a section of its own — and therefore the\n * only ones an entity's explicit `group` can pull back out of it. */\nconst SECTION_FIELDS = new Set([...CONTACT_FIELDS, ...ADDRESS_FIELDS, 'notes'])\n\nfunction FieldItem({ field, value, values, onChange, renderField, colSpan, compact }: {\n field: FieldDef; value: any; values?: Record<string, any>; onChange: (val: any) => void\n renderField: PersonFormLayoutProps['renderField']; colSpan?: boolean; compact?: boolean\n}) {\n // O MESMO rótulo que o formulário genérico desenha, e pelas mesmas regras —\n // esta era a segunda implementação, e nela o `labelWhen` não valia. Justo na\n // ficha de pessoa, que é onde ele existe para funcionar: pessoa jurídica diz\n // «Razão Social» e «CNPJ» onde pessoa física diz «Nome» e «CPF».\n const label = (field.labelWhen && field.labelWhen(values ?? {})) || field.label\n // Booleano leva o texto ao lado da caixa; `address` desenha os próprios\n // rótulos. Nos dois, um rótulo aqui é o mesmo título escrito duas vezes.\n const ownLabel = field.type === 'boolean' || field.type === 'address' || field.type === 'bank'\n return (\n <div className={`${compact ? 'space-y-1' : 'space-y-1.5'} ${colSpan ? 'fz-field-wide' : ''}`}>\n {!ownLabel && (\n <label className={`font-medium ${compact ? 'text-xs' : 'text-sm'}`}>\n {label}{field.required && <span className=\"text-destructive ml-0.5\">*</span>}\n </label>\n )}\n {renderField(field, value, onChange)}\n {field.hint && <p className=\"text-[10px] text-muted-foreground\">{field.hint}</p>}\n </div>\n )\n}\n\nexport function PersonFormLayout({ fields: allFields, fieldGroups, values, onChange, renderField, compact, recordId }: PersonFormLayoutProps) {\n // `visibleWhen` VALE AQUI TAMBÉM.\n //\n // O formulário genérico filtrava; este layout não — e por isso «Unidades\n // selecionadas» aparecia numa parceria marcada como «Todas as unidades», e\n // «Inscrição estadual» continuava na ficha de um prestador pessoa física.\n // Um campo que a entidade declarou como inaplicável não pode depender de\n // QUAL layout desenhou a tela para sumir.\n const fields = allFields.filter((f) => !f.visibleWhen || f.visibleWhen(values))\n // O cabeçalho do arquétipo desenha os próprios rótulos, e por isso precisa\n // do `labelWhen` como qualquer outro campo: era o último lugar onde «CPF»\n // continuava escrito depois de o operador marcar «Pessoa jurídica».\n const labelOf = (f: FieldDef) => (f.labelWhen && f.labelWhen(values)) || f.label\n const nameField = fields.find((f) => f.key === 'name')\n const docField = fields.find((f) => f.key === 'documentNumber')\n const dobField = fields.find((f) => f.key === 'dateOfBirth')\n // The archetype buckets by key, but only for fields that did not say where\n // they go. An entity that put `email` in its own \"Contato\" group meant it —\n // hijacking it into the archetype's section split one group into two, one of\n // them under a heading the entity never wrote.\n const unassigned = (f: FieldDef) => !f.group\n const contactFields = fields.filter((f) => CONTACT_FIELDS.has(f.key) && unassigned(f))\n const addressFields = fields.filter((f) => ADDRESS_FIELDS.has(f.key) && unassigned(f))\n const notesField = fields.find((f) => f.key === 'notes' && unassigned(f))\n const hasActive = fields.some((f) => f.key === 'isActive')\n\n // Project-specific fields\n const projectFields = fields.filter(\n (f) => !ALL_PERSON_FIELDS.has(f.key) || (!!f.group && SECTION_FIELDS.has(f.key)),\n )\n\n const groupFieldMap = new Map<string, FieldDef[]>()\n const ungroupedProject: FieldDef[] = []\n for (const field of projectFields) {\n if (field.group) {\n const existing = groupFieldMap.get(field.group) ?? []\n existing.push(field)\n groupFieldMap.set(field.group, existing)\n } else {\n ungroupedProject.push(field)\n }\n }\n\n const gap = compact ? 'gap-2.5' : 'gap-3'\n const cardPad = compact ? 'pt-3' : 'pt-4'\n const sectionLabel = compact ? 'text-xs font-semibold text-foreground' : 'text-sm font-semibold text-foreground'\n\n // An entity whose identity does not use these keys (a shop customer is\n // firstName/lastName) rendered this card empty — an avatar box and nothing\n // beside it.\n const hasIdentity = !!nameField || !!docField || !!dobField || hasActive\n\n return (\n <div className={compact ? 'space-y-2.5' : 'space-y-5'}>\n {/* Identity card — avatar + name + dob + doc + active toggle */}\n {hasIdentity && (\n <Card>\n <CardContent className={cardPad}>\n <div className={`flex ${compact ? 'gap-3' : 'gap-5'}`}>\n <div className={`flex shrink-0 items-center justify-center rounded-2xl bg-primary/10 text-primary ${compact ? 'h-10 w-10' : 'h-16 w-16'}`}>\n <User className={compact ? 'h-4 w-4' : 'h-6 w-6'} />\n </div>\n <div className={`flex-1 ${compact ? 'space-y-2' : 'space-y-4'}`}>\n {/* Row 1: Name + Document + Active toggle */}\n <div className={`flex items-start ${gap}`}>\n <div className={`flex-1 fz-fields fz-fields-2 ${gap}`}>\n {nameField && (\n <div className={`${compact ? 'space-y-1' : 'space-y-1.5'} ${!docField ? 'sm:col-span-2' : ''}`}>\n <label className={`font-medium ${compact ? 'text-xs' : 'text-sm'}`}>{labelOf(nameField)}{nameField.required && <span className=\"text-destructive ml-0.5\">*</span>}</label>\n {renderField(nameField, values[nameField.key], (val) => onChange(nameField.key, val))}\n </div>\n )}\n {docField && (\n <div className={compact ? 'space-y-1' : 'space-y-1.5'}>\n <label className={`font-medium ${compact ? 'text-xs' : 'text-sm'}`}>{labelOf(docField)}{docField.required && <span className=\"text-destructive ml-0.5\">*</span>}</label>\n {renderField(docField, values[docField.key], (val) => onChange(docField.key, val))}\n </div>\n )}\n </div>\n {hasActive && (\n <div className={`shrink-0 ${compact ? 'mt-4' : 'mt-6'}`}>\n <ActiveToggle active={values.isActive ?? true} onChange={(v) => onChange('isActive', v)} />\n </div>\n )}\n </div>\n {/* Row 2: Date of birth */}\n {dobField && (\n <div className={`fz-fields fz-fields-2 ${gap}`}>\n <FieldItem field={dobField} value={values[dobField.key]} values={values} onChange={(val) => onChange(dobField.key, val)} renderField={renderField} compact={compact} />\n </div>\n )}\n </div>\n </div>\n </CardContent>\n </Card>\n )}\n\n {/* Project-specific grouped fields */}\n {fieldGroups.map((group) => {\n const gFields = groupFieldMap.get(group.id)\n if (!gFields || gFields.length === 0) return null\n const cols = group.columns ?? 2\n // Um grupo cujo ÚNICO campo é uma linha anexa (endereço, conta\n // bancária) não desenha cabeçalho nem cartão: o campo desenha os dois,\n // porque é ele que tem o botão «+ Adicionar», e a ação de uma seção\n // mora na linha do título dela. Sem isto sai cartão dentro de cartão.\n // No EDITAR, a seção completa lá embaixo já cuida disto — e melhor:\n // ela lista todas as linhas, edita e exclui, enquanto o campo só sabe\n // a principal. Duas seções «Endereço» na mesma tela é o que o founder\n // viu. No CRIAR ela não pode existir (não há id ainda), e é exatamente\n // aí que o campo ganha o seu: cadastrar em UMA tela.\n if (recordId && gFields.every((f) => isAttachedFieldType(f.type))) return null\n if (gFields.length === 1 && isAttachedFieldType(gFields[0].type)) {\n const f = gFields[0]\n return (\n <AttachedSectionProvider key={group.id} value={{ title: group.label, description: group.description }}>\n {renderField(f, values[f.key], (val) => onChange(f.key, val))}\n </AttachedSectionProvider>\n )\n }\n return (\n <div key={group.id}>\n <h3 className={sectionLabel}>{group.label}</h3>\n {group.description && <p className={`text-muted-foreground ${compact ? 'text-[10px] mt-0.5 mb-1.5' : 'text-xs mt-0.5 mb-3'}`}>{group.description}</p>}\n <Card className=\"mt-1\">\n <CardContent className={cardPad}>\n <div className={`fz-fields ${gap} ${cols >= 3 ? 'fz-fields-3' : cols >= 2 ? 'fz-fields-2' : ''}`}>\n {gFields.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} values={values} onChange={(val) => onChange(field.key, val)} renderField={renderField} colSpan={field.span === 2} compact={compact} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )\n })}\n\n {/* Ungrouped project fields */}\n {ungroupedProject.length > 0 && (\n <Card>\n <CardContent className={cardPad}>\n <div className={`fz-fields fz-fields-2 ${gap}`}>\n {ungroupedProject.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} values={values} onChange={(val) => onChange(field.key, val)} renderField={renderField} colSpan={field.span === 2} compact={compact} />\n ))}\n </div>\n </CardContent>\n </Card>\n )}\n\n {/* Contact */}\n {contactFields.length > 0 && (\n <div>\n <h3 className={sectionLabel}>Contact</h3>\n <Card className=\"mt-1\">\n <CardContent className={cardPad}>\n <div className={`fz-fields fz-fields-2 ${gap}`}>\n {contactFields.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} values={values} onChange={(val) => onChange(field.key, val)} renderField={renderField} compact={compact} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Address */}\n {addressFields.length > 0 && (\n <div>\n <h3 className={sectionLabel}>Address</h3>\n <Card className=\"mt-1\">\n <CardContent className={cardPad}>\n <div className={`fz-fields fz-fields-2 ${gap}`}>\n {addressFields.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} values={values} onChange={(val) => onChange(field.key, val)} renderField={renderField} colSpan={field.key === 'address'} compact={compact} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Endereços — a mesma seção da visão geral, aqui em modo de edição.\n Grava sozinha (linhas de `public.addresses`, não campos deste\n formulário), então só aparece quando já existe um dono: na criação não\n há id contra o qual gravar. */}\n {recordId && (\n <div>\n <AddressesSection item={{ id: recordId }} />\n {allFields.some((f) => f.type === 'bank') && (\n <div className=\"mt-5\">\n <PayeeAccountsSection item={{ id: recordId }} />\n </div>\n )}\n </div>\n )}\n\n {/* Notes */}\n {notesField && (\n <Card>\n <CardContent className={cardPad}>\n <FieldItem field={notesField} value={values[notesField.key]} values={values} onChange={(val) => onChange(notesField.key, val)} renderField={renderField} compact={compact} />\n </CardContent>\n </Card>\n )}\n </div>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { Badge, SearchSelect, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, toast } from '@fayz-ai/ui'\nimport { describeError } from '@fayz-ai/core'\nimport { usePermissionOptional } from '../permissions/context'\nimport { getSupabaseClientOptional, getActiveTenantId } from '@fayz-ai/core'\nimport type { FieldRelation } from '@fayz-ai/core'\n\n// Relation field support for the CRUD engine: load a select's options from a\n// table at runtime so a foreign-key column stores a real id (e.g. uuid) instead\n// of a static string. Shared by the form input (RelationSelect) and the table\n// cell (RelationCell). Options are cached per (schema, table, fields, tenant,\n// filter) so the list + every cell reuse one query.\n\ntype Option = { value: string; label: string; price?: number }\n\nconst cache = new Map<string, Promise<Option[]>>()\n\nfunction keyOf(r: FieldRelation): string {\n const tenant = r.tenantScoped !== false ? (getActiveTenantId() ?? '') : ''\n return JSON.stringify([\n r.schema ?? 'public', r.table, r.valueField ?? 'id',\n r.labelFields ?? r.labelField ?? 'name',\n tenant, r.filter ?? null, r.priceField ?? null,\n ])\n}\n\nasync function fetchOptions(r: FieldRelation): Promise<Option[]> {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return []\n const valueField = r.valueField ?? 'id'\n const labelFields = r.labelFields ?? [r.labelField ?? 'name']\n const priceField = r.priceField\n // Ordena pela primeira coluna do rótulo: num plano de contas é o código, e é\n // ele que põe 10.1 antes de 10.2 em vez de alfabetar os nomes.\n const sortField = labelFields[0]\n let q = (r.schema ? supabase.schema(r.schema) : supabase)\n .from(r.table)\n .select([valueField, ...labelFields, ...(priceField ? [priceField] : [])].join(', '))\n if (r.tenantScoped !== false) {\n const tid = getActiveTenantId()\n if (tid) q = q.eq('tenant_id', tid)\n }\n if (r.filter) for (const [k, v] of Object.entries(r.filter)) q = q.eq(k, v)\n q = q.order(sortField, { ascending: true })\n const { data } = await q\n return (data ?? []).map((row: any) => {\n const label = labelFields.map((f) => row[f]).filter((v) => v != null && v !== '').join(' ')\n return {\n value: String(row[valueField]),\n label: label || String(row[valueField]),\n ...(priceField ? { price: Number(row[priceField]) || 0 } : {}),\n }\n })\n}\n\nexport function loadRelationOptions(r: FieldRelation): Promise<Option[]> {\n const k = keyOf(r)\n if (!cache.has(k)) {\n cache.set(k, fetchOptions(r).catch(() => { cache.delete(k); return [] }))\n }\n return cache.get(k)!\n}\n\n/** Drop cached relation options (call after creating/editing a related row). */\nexport function invalidateRelationOptions(): void {\n cache.clear()\n}\n\nexport function useRelationOptions(r: FieldRelation | undefined): {\n options: Option[]\n loading: boolean\n labelFor: (value: any) => string\n} {\n const [options, setOptions] = useState<Option[]>([])\n const [loading, setLoading] = useState(true)\n const dep = r ? keyOf(r) : 'none'\n useEffect(() => {\n let alive = true\n if (!r) { setLoading(false); return }\n setLoading(true)\n loadRelationOptions(r).then((opts) => {\n if (alive) { setOptions(opts); setLoading(false) }\n })\n return () => { alive = false }\n }, [dep]) // eslint-disable-line react-hooks/exhaustive-deps\n const labelFor = (value: any) => options.find((o) => o.value === String(value))?.label ?? ''\n return { options, loading, labelFor }\n}\n\nasync function createOption(r: FieldRelation, label: string): Promise<string> {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) throw new Error('no client')\n const valueField = r.valueField ?? 'id'\n const row: Record<string, unknown> = {\n ...(r.filter ?? {}),\n ...(r.create?.defaults ?? {}),\n [(r.labelFields ?? [r.labelField ?? 'name'])[0]]: label,\n }\n if (r.tenantScoped !== false) row.tenant_id = getActiveTenantId()\n const { data, error } = await (r.schema ? supabase.schema(r.schema) : supabase)\n .from(r.table).insert(row).select(valueField).single()\n if (error) throw error\n invalidateRelationOptions()\n return String(data[valueField])\n}\n\n/** The relation as a searchable field that can add the option it lacks. */\nfunction CreatableRelationSelect({ relation, value, onChange, required, placeholder }: {\n relation: FieldRelation\n value: any\n onChange: (value: any) => void\n required?: boolean\n placeholder?: string\n}) {\n const [created, setCreated] = useState<Option[]>([])\n const { options } = useRelationOptions(relation)\n const all = [...options, ...created.filter((c) => !options.some((o) => o.value === c.value))]\n return (\n <SearchSelect\n value={value ? String(value) : undefined}\n displayValue={all.find((o) => o.value === String(value))?.label}\n required={required}\n placeholder={placeholder}\n minChars={0}\n noResultsLabel=\"Nada encontrado\"\n searchingLabel=\"Buscando…\"\n createLabel=\"Cadastrar\"\n clearLabel=\"Limpar\"\n allowCreate\n onSearch={(query) => {\n const q = query.trim().toLowerCase()\n return all.filter((o) => !q || o.label.toLowerCase().includes(q)).map((o) => ({ id: o.value, label: o.label }))\n }}\n onChange={(id) => onChange(id || null)}\n onCreate={async (query) => {\n const label = query.trim()\n if (!label) return\n try {\n const id = await createOption(relation, label)\n setCreated((prev) => [...prev, { value: id, label }])\n onChange(id)\n } catch (err) {\n toast.error(describeError(err))\n }\n }}\n />\n )\n}\n\nexport function RelationSelect({\n relation,\n value,\n onChange,\n className,\n required,\n placeholder,\n}: {\n relation?: FieldRelation\n value: any\n onChange: (value: any) => void\n className?: string\n required?: boolean\n placeholder?: string\n}) {\n const { options, loading } = useRelationOptions(relation)\n const can = usePermissionOptional()\n const mayCreate = !!relation?.create\n && (!relation.create.permission || can(relation.create.permission.feature, relation.create.permission.action ?? 'edit'))\n if (relation && mayCreate) {\n return <CreatableRelationSelect relation={relation} value={value} onChange={onChange} required={required} placeholder={placeholder} />\n }\n // O <select> DO NAVEGADOR AO LADO DO RESTO DO PRODUTO.\n //\n // O campo de escolha estática já é o do design system (ver o `case 'select'`\n // do CrudFormPage); este, que é a MESMA pergunta lida de uma tabela, tinha\n // ficado nativo — e a seta dupla do sistema operacional ao lado da seta do\n // DS, na mesma coluna da ficha, é o que faz a tela parecer remendada.\n //\n // `value={undefined}` e não `''`: o Radix lê string vazia como \"sem opção\" e\n // recusa um item com esse valor — o vazio é a AUSÊNCIA de valor, e quem o\n // desenha é o placeholder.\n return (\n <Select\n value={value ? String(value) : undefined}\n onValueChange={(v: string) => onChange(v || null)}\n >\n <SelectTrigger className={className} aria-required={required || undefined}>\n <SelectValue placeholder={loading ? 'Carregando…' : (placeholder ?? 'Selecione...')} />\n </SelectTrigger>\n <SelectContent>\n {options.map((o) => (\n <SelectItem key={o.value} value={o.value}>{o.label}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n )\n}\n\nexport function RelationCell({ relation, value }: { relation?: FieldRelation; value: any }) {\n const { labelFor, loading } = useRelationOptions(relation)\n if (value == null || value === '') return <span className=\"text-muted-foreground\">—</span>\n const label = labelFor(value)\n return <Badge variant=\"secondary\">{label || (loading ? '…' : String(value))}</Badge>\n}\n\n// ---------------------------------------------------------------------------\n// O FILTRO QUE A LINHA RESPONDE.\n//\n// `relation.filterFrom` diz que uma coluna do catálogo é decidida por um campo\n// da MESMA linha — o «Tipo» do item de um pacote escolhendo entre serviço e\n// produto. Resolver aqui, e não na tela, é o que mantém a tela genérica: ela\n// entrega a linha e recebe a relação já estreitada.\n// ---------------------------------------------------------------------------\nexport function resolveRelation(\n relation: FieldRelation | undefined,\n row: Record<string, unknown> | null | undefined,\n): FieldRelation | undefined {\n if (!relation?.filterFrom) return relation\n const extra: Record<string, unknown> = {}\n for (const [column, from] of Object.entries(relation.filterFrom)) {\n const answer = row?.[from.field]\n if (answer == null || answer === '') continue\n extra[column] = from.map?.[String(answer)] ?? answer\n }\n return { ...relation, filter: { ...(relation.filter ?? {}), ...extra } }\n}\n","import * as React from 'react'\nimport { Copy, Plus, X } from 'lucide-react'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { Button, Card, CardContent, CurrencyInput, DataTable, ICON_MAP, Input, SearchSelect, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, toast } from '@fayz-ai/ui'\nimport { resolveDataProvider, errorMessage } from '@fayz-ai/core'\nimport type { EntityDef, FieldDef, RelatedList } from '@fayz-ai/core'\nimport { CrudRecordModal } from './CrudRecordModal'\nimport { RelationCell, loadRelationOptions, resolveRelation, useRelationOptions } from './relation-field'\nimport { formatMoney } from '../lib/currency'\n\n// Marks the unsaved row the grid appends while a new child is being typed in.\nconst DRAFT_ROW: Record<string, any> = {}\n\n// ---------------------------------------------------------------------------\n// Um filho como SEÇÃO, e não como aba.\n//\n// A aba (`relatedLists`) é para o filho que é um assunto: as etapas de um funil\n// são o funil, e merecem a tela inteira. Já \"para quem este funil serve\" são\n// duas ou três linhas — uma aba própria esconde atrás de um clique o que cabe\n// abaixo dos campos, e o leitor tem de abrir as duas para saber o que\n// configurou.\n//\n// É a forma que o endereço do cliente já tinha (`AddressesTab` montada como\n// seção na visão geral e dentro do formulário), generalizada: aquilo era um\n// componente que sabia da tabela `addresses`, e por isso só servia a pessoa.\n//\n// SEM ROTA. O filho grava por modal e não por sub-rota, porque a seção aparece\n// nos dois lugares — na visão geral e no meio de um formulário em edição — e um\n// \"Adicionar\" que navega abandonaria o formulário aberto com o que já foi\n// digitado.\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// AS LINHAS QUE NASCEM ANTES DO DONO.\n//\n// Uma seção de filhos grava direto, e por isso só aparecia na EDIÇÃO: na\n// criação não há id contra o qual gravar. Só que montar um pacote é dizer o que\n// entra nele — mandar a pessoa salvar um pacote vazio, reabrir e só então\n// listar os serviços é pedir que ela faça o trabalho em duas voltas, e a\n// primeira grava um preço que ainda não é o preço.\n//\n// Então, na criação, a grade guarda as linhas em memória e o FORMULÁRIO as\n// descarrega assim que o pai nasce. A seção registra como gravar; quem sabe\n// quando o pai existe é quem o criou.\n// ---------------------------------------------------------------------------\ntype FlushPendingChildren = (parentId: string) => Promise<void>\n\nconst PendingChildrenContext = React.createContext<{\n register: (flush: FlushPendingChildren) => () => void\n} | null>(null)\n\n/** O lado do FORMULÁRIO: recolhe as seções e as descarrega depois do insert. */\nexport function usePendingChildren(): {\n provider: { register: (flush: FlushPendingChildren) => () => void }\n flush: FlushPendingChildren\n} {\n const pending = React.useRef(new Set<FlushPendingChildren>())\n const provider = React.useMemo(() => ({\n register: (f: FlushPendingChildren) => {\n pending.current.add(f)\n return () => { pending.current.delete(f) }\n },\n }), [])\n const flush = React.useCallback(async (parentId: string) => {\n // Em série: são poucas linhas, e um erro no meio tem de parar o resto em\n // vez de deixar metade do pacote gravada sem ninguém saber qual metade.\n for (const f of [...pending.current]) await f(parentId)\n }, [])\n return { provider, flush }\n}\n\nexport function PendingChildrenProvider({ value, children }: {\n value: { register: (flush: FlushPendingChildren) => () => void }\n children: React.ReactNode\n}) {\n return <PendingChildrenContext.Provider value={value}>{children}</PendingChildrenContext.Provider>\n}\n\n/**\n * O campo de catálogo da grade: BUSCA, com o preço à direita.\n *\n * Um `<select>` não serve aqui — o catálogo de uma clínica tem 600 serviços, e\n * uma lista nativa com 600 itens é uma rolagem atrás de um nome que quem digita\n * já sabe de cor. O preço vai junto porque escolher entre dois serviços num\n * pacote é escolher também entre dois preços.\n */\nfunction GridRelationCell({ field, value, row, onChange }: {\n field: FieldDef\n value: unknown\n row?: Record<string, any> | null\n onChange: (next: unknown, price?: number) => void\n}) {\n const relation = React.useMemo(() => resolveRelation(field.relation, row), [field.relation, row])\n const { labelFor } = useRelationOptions(relation)\n const label = value ? labelFor(value) : ''\n return (\n <SearchSelect\n value={value ? String(value) : undefined}\n displayValue={label || undefined}\n placeholder={`${field.label}…`}\n minChars={0}\n loadOnOpen\n className=\"h-8 text-xs\"\n onChange={(id, opt) => onChange(id || null, (opt?.data as { price?: number } | undefined)?.price)}\n onSearch={async (q) => {\n if (!relation) return []\n const options = await loadRelationOptions(relation)\n const termo = q.trim().toLowerCase()\n return options\n .filter((o) => !termo || o.label.toLowerCase().includes(termo))\n .slice(0, 50)\n .map((o) => ({ id: o.value, label: o.label, data: o }))\n }}\n renderOption={(opt) => (\n <div className=\"flex min-w-0 flex-1 items-center justify-between gap-3\">\n <span className=\"truncate text-sm\">{opt.label}</span>\n {(opt.data as { price?: number } | undefined)?.price != null && (\n <span className=\"shrink-0 text-xs tabular-nums text-muted-foreground\">\n {formatMoney((opt.data as { price?: number }).price!, 'BRL')}\n </span>\n )}\n </div>\n )}\n />\n )\n}\n\n/** A coluna que uma chave de campo escreve — `columnMap` primeiro, camelCase→snake depois. */\nfunction columnOf(entity: EntityDef<any>, key: string): string {\n return entity.data?.columnMap?.[key] ?? key.replace(/[A-Z]/g, (c) => '_' + c.toLowerCase())\n}\n\nexport function RelatedSection({ parentId, related, compact }: {\n /** Vazio = o pai ainda não nasceu: as linhas esperam em memória. */\n parentId: string\n related: RelatedList\n compact?: boolean\n}) {\n const orfa = !parentId\n const pendentes = React.useContext(PendingChildrenContext)\n const fkColumn = columnOf(related.entity, related.foreignKey)\n const label = related.label ?? related.entity.namePlural ?? related.entity.name\n const Icon = related.icon ? (ICON_MAP[related.icon] ?? null) : null\n\n // O filho recortado no pai: o filtro estreita a LEITURA e o default carimba a\n // ESCRITA. Sem o segundo, \"Adicionar\" criaria um órfão que some da própria\n // seção que o criou.\n const child = React.useMemo<EntityDef<any>>(() => ({\n ...related.entity,\n fields: related.entity.fields.filter((f: FieldDef) => f.key !== related.foreignKey),\n data: related.entity.data\n ? {\n ...related.entity.data,\n filters: { ...(related.entity.data.filters ?? {}), [fkColumn]: parentId },\n defaults: { ...(related.entity.data.defaults ?? {}), [fkColumn]: parentId },\n }\n : undefined,\n }), [related, parentId, fkColumn])\n\n // `cache: false`: a seção existe para mostrar o que ACABOU de ser escrito, e\n // uma leitura pelo cache devolveria a lista sem a linha nova.\n const provider = React.useMemo(() => resolveDataProvider(child, [], { cache: false }), [child])\n\n const [rows, setRows] = React.useState<Record<string, any>[]>([])\n const [loading, setLoading] = React.useState(true)\n const [error, setError] = React.useState<string | null>(null)\n const [adding, setAdding] = React.useState(false)\n /** A linha em digitação na grade — ainda não é registro. `null` = nenhuma. */\n const [draft, setDraft] = React.useState<Record<string, any> | null>(null)\n\n const load = React.useCallback(async () => {\n // Sem pai não há o que ler: as linhas desta tela são as que ela mesma\n // acumulou, e perguntar ao banco devolveria as de outro pacote.\n if (orfa) { setLoading(false); return }\n setLoading(true)\n try {\n const result = await provider.list({ page: 1, pageSize: related.pageSize ?? 100 })\n setRows((result?.data ?? []) as Record<string, any>[])\n setError(null)\n } catch (e) {\n // A tabela que a migration ainda não criou chega aqui. Dizer isso é\n // melhor do que uma seção vazia, que se lê como \"não configurou nada\".\n setError(errorMessage(e))\n } finally {\n setLoading(false)\n }\n }, [provider, orfa, related.pageSize])\n\n React.useEffect(() => { void load() }, [load])\n\n const [runningAction, setRunningAction] = React.useState<string | null>(null)\n async function runAction(action: NonNullable<RelatedList['actions']>[number]) {\n setRunningAction(action.id)\n try {\n const message = await action.run(parentId)\n if (message) toast.success(message)\n await load()\n } catch (e) {\n toast.error(errorMessage(e))\n } finally {\n setRunningAction(null)\n }\n }\n const actionButtons = !orfa && related.actions?.length\n ? related.actions.map((action) => {\n const ActionIcon = action.icon ? (ICON_MAP[action.icon] ?? null) : null\n return (\n <Button key={action.id} type=\"button\" size=\"sm\" variant=\"ghost\" className=\"h-8\"\n disabled={runningAction !== null}\n onClick={() => { void runAction(action) }}>\n {ActionIcon && <ActionIcon className=\"mr-1 h-3.5 w-3.5\" />}\n {action.label}\n </Button>\n )\n })\n : null\n\n // O rascunho guardado numa ref, e não só no estado: o formulário chama o\n // flush DEPOIS do insert, de fora do ciclo de render desta seção.\n const guardadas = React.useRef<Record<string, any>[]>([])\n guardadas.current = rows\n\n React.useEffect(() => {\n if (!orfa || !pendentes) return\n return pendentes.register(async (novoPai: string) => {\n if (!guardadas.current.length) return\n for (const linha of guardadas.current) {\n const { id: _descartado, ...dados } = linha\n await provider.create({ ...dados, [related.foreignKey]: novoPai } as any)\n }\n })\n }, [orfa, pendentes, provider, related.foreignKey])\n\n async function remove(id: string) {\n if (orfa) { setRows((prev) => prev.filter((r) => r.id !== id)); return }\n try {\n await provider.remove(id)\n setRows((prev) => prev.filter((r) => r.id !== id))\n } catch (e) {\n toast.error(errorMessage(e))\n }\n }\n\n // O que a linha MOSTRA: os campos que o filho marcou para a tabela. Numa\n // linha de vínculo isso é um campo só, e é por isso que ela cabe numa\n // pastilha em vez de numa grade.\n const shown = child.fields.filter((f: FieldDef) => f.showInTable !== false)\n\n // ---------------------------------------------------------------------------\n // A GRADE EDITÁVEL — a linha se corrige onde ela é lida.\n //\n // A pastilha serve ao vínculo, que é um nome só. A linha de composição tem\n // três respostas (qual serviço, quantas vezes, em que ordem) e todas mudam\n // com frequência: montar um pacote é justamente mexer nelas até fechar. Em\n // pastilha, trocar uma quantidade custava abrir outra tela, voltar e conferir.\n //\n // Grava a cada campo, direto no provider — não há \"Salvar\" porque não há\n // formulário: cada célula é a própria linha da outra tabela.\n // ---------------------------------------------------------------------------\n // Repeated lines of the same item (see `duplicable`) usually take the same\n // edit; the cell just edited offers to copy its value to its siblings.\n const groupKey = related.duplicable\n ? child.fields.find((f: FieldDef) => f.type === 'relation')?.key\n : undefined\n const [lastEdit, setLastEdit] = React.useState<{ id: string; key: string } | null>(null)\n\n function siblingsToSync(row: Record<string, any>, key: string): Record<string, any>[] {\n if (!groupKey || key === groupKey || row[groupKey] == null) return []\n return rows.filter((r) => r.id !== row.id && r[groupKey] === row[groupKey] && r[key] !== row[key])\n }\n\n async function applyToSiblings(row: Record<string, any>, key: string) {\n const alvos = siblingsToSync(row, key)\n if (!alvos.length) return\n const value = row[key]\n const ids = new Set(alvos.map((r) => r.id))\n const antes = rows\n setRows((prev) => prev.map((r) => ids.has(r.id) ? { ...r, [key]: value } : r))\n setLastEdit(null)\n if (orfa) return\n try {\n await Promise.all(alvos.map((r) => provider.update(r.id, { [key]: value } as any)))\n } catch (e) {\n setRows(antes)\n toast.error(errorMessage(e))\n }\n }\n\n async function patch(id: string, key: string, value: unknown, price?: number) {\n const antes = rows.find((r) => r.id === id)\n if (!antes) return\n if (key !== groupKey) setLastEdit({ id, key })\n const mudanca = { [key]: value, ...heranca(key, price, { ...antes, [key]: value }) }\n if (Object.entries(mudanca).every(([k, v]) => antes[k] === v)) return\n // Otimista: a grade é digitação, e esperar a rede a cada tecla devolveria o\n // valor velho no meio da edição.\n setRows((prev) => prev.map((r) => r.id === id ? { ...r, ...mudanca } : r))\n // Sem pai gravado, a linha vive na tela até o formulário salvar.\n if (orfa) return\n queueWrite(id, mudanca, antes)\n }\n\n // The currency cell reports every keystroke; one request per key raced and the\n // database kept whichever landed last (120 → 1,20). Writes per row coalesce\n // and run one at a time.\n const escritas = React.useRef(new Map<string, {\n mudanca: Record<string, any>; antes: Record<string, any>; timer?: ReturnType<typeof setTimeout>; fila: Promise<void>\n }>())\n\n function queueWrite(id: string, mudanca: Record<string, any>, antes: Record<string, any>) {\n const atual = escritas.current.get(id)\n const entry = atual ?? { mudanca: {}, antes, fila: Promise.resolve() }\n entry.mudanca = { ...entry.mudanca, ...mudanca }\n if (entry.timer) clearTimeout(entry.timer)\n entry.timer = setTimeout(() => flushWrite(id), 400)\n escritas.current.set(id, entry)\n }\n\n function flushWrite(id: string) {\n const entry = escritas.current.get(id)\n if (!entry || !Object.keys(entry.mudanca).length) return\n const { mudanca, antes } = entry\n entry.mudanca = {}\n entry.timer = undefined\n entry.fila = entry.fila.then(async () => {\n try {\n await provider.update(id, mudanca as any)\n } catch (e) {\n setRows((prev) => prev.map((r) => r.id === id ? antes : r))\n toast.error(errorMessage(e))\n }\n })\n const fila = entry.fila\n void fila.then(() => {\n const e = escritas.current.get(id)\n if (e && e.fila === fila && !e.timer) escritas.current.delete(id)\n })\n }\n\n React.useEffect(() => () => {\n for (const [id, e] of escritas.current) { if (e.timer) { clearTimeout(e.timer); flushWrite(id) } }\n }, [])\n\n // A LINHA NOVA NASCE VAZIA NA GRADE, e só vira registro quando tem o que o\n // banco exige. \"Adicionar\" abrindo um modal era a mesma interrupção da\n // sub-rota, um passo mais curta.\n const required = child.fields.filter((f: FieldDef) => f.required)\n const criando = React.useRef(false)\n async function commitDraft(key: string, next: Record<string, any>, price?: number) {\n const completo = { ...next, ...heranca(key, price, next) }\n setDraft(completo)\n // Os padrões da entidade entram ANTES do teste: a quantidade de um item de\n // pacote é 1 e o tipo é «serviço» sem ninguém dizer, e cobrá-los como\n // resposta que falta prendia a linha num rascunho que nunca fechava.\n const defaults = Object.fromEntries(\n child.fields\n .filter((f: FieldDef) => f.defaultValue !== undefined && completo[f.key] === undefined)\n .map((f: FieldDef) => [f.key, f.defaultValue]),\n )\n const pronto = { ...defaults, ...completo }\n if (required.some((f: FieldDef) => pronto[f.key] == null || pronto[f.key] === '')) return\n // A price typed while the first insert is in flight must not insert the row twice.\n if (criando.current) return\n // Sem pai gravado, a linha entra na grade e espera: o formulário a\n // descarrega quando o pacote nascer (ver PendingChildrenContext).\n if (orfa) {\n setRows((prev) => [...prev, { id: `draft-${prev.length}-${completo[key]}`, ...pronto }])\n setDraft(null)\n return\n }\n criando.current = true\n try {\n await provider.create(pronto as any)\n setDraft(null)\n await load()\n } catch (e) {\n toast.error(errorMessage(e))\n } finally {\n criando.current = false\n }\n }\n\n async function duplicate(row: Record<string, any>) {\n const copia = Object.fromEntries(\n child.fields.filter((f: FieldDef) => row[f.key] !== undefined).map((f: FieldDef) => [f.key, row[f.key]]),\n )\n if (orfa) {\n setRows((prev) => [...prev, { ...copia, id: `draft-${prev.length}-copy` }])\n return\n }\n try {\n await provider.create(copia as any)\n await load()\n } catch (e) {\n toast.error(errorMessage(e))\n }\n }\n\n /** O que uma escolha de catálogo preenche junto — ver FieldDef.fillFrom. */\n function heranca(fieldKey: string, price: number | undefined, linha: Record<string, any>): Record<string, any> {\n if (price == null) return {}\n const out: Record<string, any> = {}\n for (const f of child.fields as FieldDef[]) {\n if (f.fillFrom?.field !== fieldKey || f.fillFrom.source !== 'price') continue\n const atual = linha[f.key]\n if (atual == null || atual === '' || Number(atual) === 0) out[f.key] = price\n }\n return out\n }\n\n function cell(\n field: FieldDef,\n value: unknown,\n onChange: (next: unknown, price?: number) => void,\n row?: Record<string, any> | null,\n ) {\n if (field.type === 'relation') {\n return (\n <GridRelationCell\n // A busca recarrega quando o TIPO da linha muda: a chave leva o\n // filtro resolvido, senão o campo continuaria oferecendo o catálogo\n // da resposta anterior.\n key={JSON.stringify(resolveRelation(field.relation, row)?.filter ?? null)}\n field={field}\n value={value}\n row={row}\n onChange={onChange}\n />\n )\n }\n if (field.type === 'select') {\n return (\n <Select value={value ? String(value) : undefined} onValueChange={(v: string) => onChange(v || null)}>\n <SelectTrigger className=\"h-8 text-xs\"><SelectValue placeholder={`${field.label}…`} /></SelectTrigger>\n <SelectContent>\n {(field.options ?? []).map((o: any) => {\n const option = typeof o === 'string' ? { value: o, label: o } : o\n return <SelectItem key={option.value} value={option.value}>{option.label}</SelectItem>\n })}\n </SelectContent>\n </Select>\n )\n }\n // DINHEIRO É CAMPO DE DINHEIRO, na grade como no formulário. Um\n // `type=\"number\"` aceita «1200» e mostra «1200» — sem separador, sem\n // centavos e sem o R$ —, e quem digita um preço de tabela num cadastro\n // inteiro não tem como conferir o que escreveu de relance.\n if (field.type === 'currency') {\n return (\n <CurrencyInput\n value={Number(value) || 0}\n onChange={(n) => { if (n !== value) onChange(n) }}\n symbol={field.currencySymbol}\n locale={field.currencyLocale}\n currencyCode={field.currency}\n className=\"h-8 text-xs\"\n />\n )\n }\n if (field.type === 'number') {\n return (\n <Input\n type=\"number\"\n className=\"h-8 rounded-md bg-background px-2 text-xs tabular-nums\"\n defaultValue={value == null ? '' : String(value)}\n min={field.min}\n max={field.max}\n onBlur={(e) => {\n const n = e.target.value === '' ? null : Number(e.target.value)\n if (n !== value) onChange(n)\n }}\n />\n )\n }\n return (\n <Input\n className=\"h-8 rounded-md bg-background px-2 text-xs\"\n defaultValue={value == null ? '' : String(value)}\n onBlur={(e) => { if (e.target.value !== value) onChange(e.target.value || null) }}\n />\n )\n }\n\n // Columns stay stable across renders (a new cell renderer would remount the\n // row's inputs and drop focus on Tab); the renderers read live state from here.\n const grid = React.useRef({ draft, cell, patch, commitDraft, remove, setDraft, duplicate, lastEdit, siblingsToSync, applyToSiblings })\n grid.current = { draft, cell, patch, commitDraft, remove, setDraft, duplicate, lastEdit, siblingsToSync, applyToSiblings }\n const gridColumns = React.useMemo<ColumnDef<Record<string, any>>[]>(() => [\n ...child.fields\n .filter((f: FieldDef) => f.showInTable !== false)\n .map((f: FieldDef): ColumnDef<Record<string, any>> => ({\n id: f.key,\n header: f.label,\n cell: ({ row: { original: row } }) => {\n const { draft, cell, patch, commitDraft, lastEdit, siblingsToSync, applyToSiblings } = grid.current\n return row === DRAFT_ROW\n ? cell(\n f,\n draft?.[f.key] ?? f.defaultValue,\n (next, price) => { void commitDraft(f.key, { ...draft, [f.key]: next }, price) },\n { ...Object.fromEntries(child.fields.map((x: FieldDef) => [x.key, x.defaultValue])), ...draft },\n )\n : <>\n {cell(f, row[f.key], (next, price) => { void patch(row.id, f.key, next, price) }, row)}\n {lastEdit?.id === row.id && lastEdit?.key === f.key && siblingsToSync(row, f.key).length > 0 && (\n <Button\n variant=\"bare\"\n size=\"bare\"\n type=\"button\"\n onClick={() => { void applyToSiblings(row, f.key) }}\n className=\"mt-1 text-[11px] font-medium text-primary hover:underline\"\n >\n Aplicar para todos ({siblingsToSync(row, f.key).length})\n </Button>\n )}\n </>\n },\n })),\n {\n id: '__remove__',\n header: '',\n meta: { className: related.duplicable ? 'w-16 whitespace-nowrap text-right' : 'w-10 text-right' },\n cell: ({ row: { original: row } }) => (\n <>\n {related.duplicable && row !== DRAFT_ROW && (\n <Button\n variant=\"bare\"\n size=\"bare\"\n type=\"button\"\n aria-label={`${label}: duplicar`}\n title=\"Duplicar\"\n onClick={() => { void grid.current.duplicate(row) }}\n className=\"rounded-md p-1 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n <Copy className=\"h-3.5 w-3.5\" />\n </Button>\n )}\n <Button\n variant=\"bare\"\n size=\"bare\"\n type=\"button\"\n aria-label={row === DRAFT_ROW ? `${label}: cancelar` : `${label}: remover`}\n onClick={() => { if (row === DRAFT_ROW) grid.current.setDraft(null); else void grid.current.remove(row.id) }}\n className={`rounded-md p-1 text-muted-foreground transition-colors hover:bg-muted ${row === DRAFT_ROW ? 'hover:text-foreground' : 'hover:text-destructive'}`}\n >\n <X className=\"h-3.5 w-3.5\" />\n </Button>\n </>\n ),\n },\n ], [child, label, related.duplicable])\n\n if (related.display === 'grid') {\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"flex items-center gap-1.5 text-sm font-semibold\">\n {Icon && <Icon className=\"h-3.5 w-3.5 text-muted-foreground\" />}\n {label}\n </h3>\n <div className=\"flex items-center gap-1\">\n {actionButtons}\n <Button\n type=\"button\" size=\"sm\" variant=\"outline\" className=\"h-8\"\n disabled={draft !== null}\n onClick={() => setDraft({})}\n >\n <Plus className=\"mr-1 h-3.5 w-3.5\" />\n {related.entity.name}\n </Button>\n </div>\n </div>\n\n {error ? (\n <p className=\"rounded-lg border border-destructive/30 bg-destructive-soft px-3 py-2 text-xs text-destructive-soft-foreground\">\n {error}\n </p>\n ) : loading ? (\n <div className=\"h-8 w-40 animate-pulse rounded bg-muted/40\" />\n ) : rows.length === 0 && draft === null ? (\n <Card><CardContent className={compact ? 'py-3' : 'py-4'}>\n <p className=\"text-xs text-muted-foreground\">{related.emptyHint ?? '—'}</p>\n </CardContent></Card>\n ) : (\n <Card><CardContent className=\"p-0\">\n <DataTable\n variant=\"bare\"\n compact\n columns={gridColumns}\n data={draft !== null ? [...rows, DRAFT_ROW] : rows}\n getRowId={(row) => (row === DRAFT_ROW ? '__draft__' : String(row.id))}\n rowClassName={(row) => (row === DRAFT_ROW ? 'bg-muted/20' : undefined)}\n />\n {/* O QUE AS LINHAS SOMAM. É a resposta que se procura depois de\n montar as outras — o V1 a põe embaixo da grade por isso. */}\n {related.footer && rows.length > 0 && (\n <div className=\"flex flex-wrap items-center justify-end gap-x-6 gap-y-1 border-t bg-muted/20 px-3 py-2 text-xs\">\n {related.footer(rows).map((t) => (\n <span key={t.label} className=\"whitespace-nowrap\">\n <span className=\"mr-2 text-[10px] uppercase tracking-wide text-muted-foreground\">{t.label}</span>\n <span className={`font-semibold tabular-nums ${t.tone === 'positive' ? 'text-success' : ''}`}>{t.value}</span>\n </span>\n ))}\n </div>\n )}\n </CardContent></Card>\n )}\n </div>\n )\n }\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"flex items-center gap-1.5 text-sm font-semibold\">\n {Icon && <Icon className=\"h-3.5 w-3.5 text-muted-foreground\" />}\n {label}\n </h3>\n <Button type=\"button\" size=\"sm\" variant=\"outline\" className=\"h-8\" onClick={() => setAdding(true)}>\n <Plus className=\"mr-1 h-3.5 w-3.5\" />\n {related.entity.name}\n </Button>\n </div>\n\n {error ? (\n <p className=\"rounded-lg border border-destructive/30 bg-destructive-soft px-3 py-2 text-xs text-destructive-soft-foreground\">\n {error}\n </p>\n ) : loading ? (\n <div className=\"h-8 w-40 animate-pulse rounded bg-muted/40\" />\n ) : rows.length === 0 ? (\n <Card><CardContent className={compact ? 'py-3' : 'py-4'}>\n <p className=\"text-xs text-muted-foreground\">{related.emptyHint ?? '—'}</p>\n </CardContent></Card>\n ) : (\n <div className=\"flex flex-wrap gap-1.5\">\n {rows.map((row) => (\n <span key={row.id} className=\"inline-flex items-center gap-1 rounded-full border border-border bg-card py-1 pl-2 pr-1 text-xs\">\n {shown.map((f: FieldDef) => (\n f.type === 'relation'\n ? <RelationCell key={f.key} relation={f.relation} value={row[f.key]} />\n : <span key={f.key}>{String(row[f.key] ?? '')}</span>\n ))}\n <Button\n variant=\"bare\"\n size=\"bare\"\n type=\"button\"\n aria-label={`${label}: remover`}\n onClick={() => { void remove(row.id) }}\n className=\"rounded-full p-0.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n <X className=\"h-3 w-3\" />\n </Button>\n </span>\n ))}\n </div>\n )}\n\n <CrudRecordModal\n open={adding}\n onClose={() => setAdding(false)}\n entityDef={child}\n mode=\"create\"\n save={async (data) => { await provider.create(data as any); await load() }}\n onSaved={() => setAdding(false)}\n />\n </div>\n )\n}\n\n/** Copies a parent's related rows onto another parent (used by list \"Duplicate\"). */\nexport async function copyRelatedRows(related: RelatedList, fromParentId: string, toParentId: string): Promise<void> {\n const data = related.entity.data\n if (!data) return\n const fk = columnOf(related.entity, related.foreignKey)\n const reader = resolveDataProvider(\n { ...related.entity, data: { ...data, filters: { ...(data.filters ?? {}), [fk]: fromParentId } } },\n [], { cache: false },\n )\n const writer = resolveDataProvider(\n { ...related.entity, data: { ...data, defaults: { ...(data.defaults ?? {}), [fk]: toParentId } } },\n [], { cache: false },\n )\n const result = await reader.list({ page: 1, pageSize: 500 })\n const keys = related.entity.fields.map((f: FieldDef) => f.key).filter((k: string) => k !== related.foreignKey)\n for (const row of (result?.data ?? []) as Record<string, any>[]) {\n const copia = Object.fromEntries(keys.filter((k: string) => row[k] !== undefined).map((k: string) => [k, row[k]]))\n await writer.create({ ...copia, [related.foreignKey]: toParentId } as any)\n }\n}\n","import React from 'react'\nimport { Package } from 'lucide-react'\nimport { Card, CardContent, Input } from '@fayz-ai/ui'\nimport { ActiveToggle } from './ActiveToggle'\nimport type { FieldDef, FieldGroup } from '@fayz-ai/core'\n\ninterface ProductFormLayoutProps {\n fields: FieldDef[]\n fieldGroups: FieldGroup[]\n values: Record<string, any>\n onChange: (key: string, val: any) => void\n renderField: (field: FieldDef, value: any, onChange: (val: any) => void) => React.ReactNode\n}\n\nconst PRICING_FIELDS = new Set(['price', 'cost', 'currency', 'unit'])\nconst STOCK_FIELDS = new Set(['stock', 'minStock'])\nconst SKIP_FIELDS = new Set(['status', 'isActive', 'tags', 'imageUrl', 'name', 'description', 'sku', 'category'])\n\nfunction FieldItem({ field, value, onChange, renderField, colSpan }: {\n field: FieldDef; value: any; onChange: (val: any) => void\n renderField: ProductFormLayoutProps['renderField']; colSpan?: boolean\n}) {\n return (\n <div className={`space-y-1.5 ${colSpan ? 'fz-field-wide' : ''}`}>\n <label className=\"text-sm font-medium\">\n {field.label}{field.required && <span className=\"text-destructive ml-0.5\">*</span>}\n </label>\n {renderField(field, value, onChange)}\n </div>\n )\n}\n\nexport function ProductFormLayout({ fields, fieldGroups, values, onChange, renderField }: ProductFormLayoutProps) {\n const nameField = fields.find((f) => f.key === 'name')\n const descField = fields.find((f) => f.key === 'description')\n const skuField = fields.find((f) => f.key === 'sku')\n const categoryField = fields.find((f) => f.key === 'category')\n const imageField = fields.find((f) => f.key === 'imageUrl')\n const pricingFields = fields.filter((f) => PRICING_FIELDS.has(f.key))\n const stockFields = fields.filter((f) => STOCK_FIELDS.has(f.key))\n const statusField = fields.find((f) => f.key === 'status')\n const hasActive = fields.some((f) => f.key === 'isActive')\n\n // Project-specific fields\n const projectFields = fields.filter((f) => !SKIP_FIELDS.has(f.key) && !PRICING_FIELDS.has(f.key) && !STOCK_FIELDS.has(f.key))\n\n const groupFieldMap = new Map<string, FieldDef[]>()\n const ungroupedProject: FieldDef[] = []\n for (const field of projectFields) {\n if (field.group) {\n const existing = groupFieldMap.get(field.group) ?? []\n existing.push(field)\n groupFieldMap.set(field.group, existing)\n } else {\n ungroupedProject.push(field)\n }\n }\n\n return (\n <div className=\"space-y-6\">\n {/* Identity card — image + name + category + active */}\n <Card>\n <CardContent className=\"pt-5\">\n <div className=\"flex gap-5\">\n {/* Product image or placeholder */}\n <div className=\"shrink-0 space-y-2\">\n {values.imageUrl ? (\n <img src={values.imageUrl} alt=\"\" className=\"h-24 w-24 rounded-2xl object-cover\" />\n ) : (\n <div className=\"flex h-24 w-24 items-center justify-center rounded-2xl bg-primary/10 text-primary\">\n <Package className=\"h-8 w-8\" />\n </div>\n )}\n {imageField && (\n <div className=\"w-24\">\n <Input\n type=\"text\"\n value={values.imageUrl ?? ''}\n onChange={(e) => onChange('imageUrl', e.target.value)}\n placeholder=\"Image URL\"\n className=\"h-auto bg-background px-2 py-1 text-[10px] text-muted-foreground shadow-none placeholder:text-muted-foreground/50 focus-visible:ring-1 focus-visible:ring-offset-0\"\n />\n </div>\n )}\n </div>\n\n <div className=\"flex-1 space-y-4\">\n {/* Name + active toggle */}\n <div className=\"flex items-start gap-4\">\n {nameField && (\n <div className=\"flex-1 space-y-1.5\">\n <label className=\"text-sm font-medium\">{nameField.label}{nameField.required && <span className=\"text-destructive ml-0.5\">*</span>}</label>\n {renderField(nameField, values[nameField.key], (val) => onChange(nameField.key, val))}\n </div>\n )}\n {(hasActive || statusField) && (\n <div className=\"mt-6 shrink-0\">\n <ActiveToggle\n active={hasActive ? (values.isActive ?? true) : statusField ? values[statusField.key] === 'active' || values[statusField.key] === 'available' : true}\n onChange={(v) => {\n if (hasActive) onChange('isActive', v)\n if (statusField) {\n const opts = statusField.options?.map((o: any) => typeof o === 'string' ? o : o.value) ?? []\n const activeVal = opts.find((o: string) => o === 'active' || o === 'available') ?? 'active'\n const inactiveVal = opts.find((o: string) => o === 'inactive' || o === 'sold_out' || o === 'hidden') ?? 'inactive'\n onChange(statusField.key, v ? activeVal : inactiveVal)\n }\n }}\n />\n </div>\n )}\n </div>\n\n {/* Category + SKU */}\n <div className=\"fz-fields fz-fields-2 gap-4\">\n {categoryField && <FieldItem field={categoryField} value={values[categoryField.key]} onChange={(val) => onChange(categoryField.key, val)} renderField={renderField} />}\n {skuField && <FieldItem field={skuField} value={values[skuField.key]} onChange={(val) => onChange(skuField.key, val)} renderField={renderField} />}\n </div>\n\n {/* Description */}\n {descField && <FieldItem field={descField} value={values[descField.key]} onChange={(val) => onChange(descField.key, val)} renderField={renderField} colSpan />}\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Pricing */}\n {pricingFields.length > 0 && (\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">Pricing</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"pt-5\">\n <div className=\"fz-fields fz-fields-2 gap-4\">\n {pricingFields.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Stock */}\n {stockFields.length > 0 && (\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">Inventory</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"pt-5\">\n <div className=\"fz-fields fz-fields-2 gap-4\">\n {stockFields.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Project-specific grouped fields */}\n {fieldGroups.map((group) => {\n const gFields = groupFieldMap.get(group.id)\n if (!gFields || gFields.length === 0) return null\n const cols = group.columns ?? 2\n return (\n <div key={group.id}>\n <h3 className=\"text-sm font-semibold text-foreground\">{group.label}</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"pt-5\">\n <div className={`fz-fields gap-4 ${cols >= 2 ? 'fz-fields-2' : ''}`}>\n {gFields.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} colSpan={field.span === 2} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )\n })}\n\n {/* Ungrouped project fields */}\n {ungroupedProject.length > 0 && (\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">Details</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"pt-5\">\n <div className=\"fz-fields fz-fields-2 gap-4\">\n {ungroupedProject.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} colSpan={field.span === 2} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n </div>\n )\n}\n","import React from 'react'\nimport { Briefcase } from 'lucide-react'\nimport { Card, CardContent } from '@fayz-ai/ui'\nimport { ActiveToggle } from './ActiveToggle'\nimport type { FieldDef, FieldGroup } from '@fayz-ai/core'\nimport { tl } from '@fayz-ai/core'\n\ninterface ServiceFormLayoutProps {\n fields: FieldDef[]\n fieldGroups: FieldGroup[]\n values: Record<string, any>\n onChange: (key: string, val: any) => void\n renderField: (field: FieldDef, value: any, onChange: (val: any) => void) => React.ReactNode\n}\n\nconst IDENTITY_FIELDS = new Set(['name', 'description', 'imageUrl', 'category'])\nconst PRICING_FIELDS = new Set(['price', 'cost', 'currency', 'durationMinutes'])\nconst SKIP_FIELDS = new Set(['status', 'isActive', 'tags'])\n\nfunction FieldItem({ field, value, onChange, renderField, colSpan }: {\n field: FieldDef; value: any; onChange: (val: any) => void\n renderField: ServiceFormLayoutProps['renderField']; colSpan?: boolean\n}) {\n return (\n <div className={`space-y-1.5 ${colSpan ? 'fz-field-wide' : ''}`}>\n <label className=\"text-sm font-medium\">\n {field.label}{field.required && <span className=\"text-destructive ml-0.5\">*</span>}\n </label>\n {renderField(field, value, onChange)}\n </div>\n )\n}\n\nexport function ServiceFormLayout({ fields, fieldGroups, values, onChange, renderField }: ServiceFormLayoutProps) {\n const nameField = fields.find((f) => f.key === 'name')\n const descField = fields.find((f) => f.key === 'description')\n const otherIdentity = fields.filter((f) => IDENTITY_FIELDS.has(f.key) && f.key !== 'name' && f.key !== 'description')\n const pricingFields = fields.filter((f) => PRICING_FIELDS.has(f.key))\n const statusField = fields.find((f) => f.key === 'status')\n const hasActive = fields.some((f) => f.key === 'isActive')\n\n const allKnown = new Set([...IDENTITY_FIELDS, ...PRICING_FIELDS, ...SKIP_FIELDS])\n const projectFields = fields.filter((f) => !allKnown.has(f.key))\n\n const groupFieldMap = new Map<string, FieldDef[]>()\n const ungroupedProject: FieldDef[] = []\n for (const field of projectFields) {\n if (field.group) {\n const existing = groupFieldMap.get(field.group) ?? []\n existing.push(field)\n groupFieldMap.set(field.group, existing)\n } else {\n ungroupedProject.push(field)\n }\n }\n\n return (\n <div className=\"space-y-6\">\n {/* Identity */}\n <Card>\n <CardContent className=\"pt-5\">\n <div className=\"flex gap-5\">\n <div className=\"flex h-20 w-20 shrink-0 items-center justify-center rounded-2xl bg-primary/10 text-primary\">\n <Briefcase className=\"h-8 w-8\" />\n </div>\n <div className=\"flex-1 space-y-4\">\n {/* Name + active toggle */}\n <div className=\"flex items-start gap-4\">\n {nameField && (\n <div className=\"flex-1 space-y-1.5\">\n <label className=\"text-sm font-medium\">{nameField.label}{nameField.required && <span className=\"text-destructive ml-0.5\">*</span>}</label>\n {renderField(nameField, values[nameField.key], (val) => onChange(nameField.key, val))}\n </div>\n )}\n {(hasActive || statusField) && (\n <div className=\"mt-6 shrink-0\">\n <ActiveToggle\n active={hasActive ? (values.isActive ?? true) : statusField ? values[statusField.key] === 'active' : true}\n onChange={(v) => {\n if (hasActive) onChange('isActive', v)\n if (statusField) onChange(statusField.key, v ? 'active' : 'inactive')\n }}\n />\n </div>\n )}\n </div>\n {/* Description */}\n {descField && <FieldItem field={descField} value={values[descField.key]} onChange={(val) => onChange(descField.key, val)} renderField={renderField} colSpan />}\n {/* Other identity */}\n {otherIdentity.length > 0 && (\n <div className=\"fz-fields fz-fields-2 gap-4\">\n {otherIdentity.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} />\n ))}\n </div>\n )}\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Pricing & Duration */}\n {pricingFields.length > 0 && (\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">{tl('Price & duration', 'Preço e duração')}</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"pt-5\">\n <div className=\"fz-fields fz-fields-2 gap-4\">\n {pricingFields.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Project-specific grouped fields */}\n {fieldGroups.map((group) => {\n const gFields = groupFieldMap.get(group.id)\n if (!gFields || gFields.length === 0) return null\n const cols = group.columns ?? 2\n return (\n <div key={group.id}>\n <h3 className=\"text-sm font-semibold text-foreground\">{group.label}</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"pt-5\">\n <div className={`fz-fields gap-4 ${cols >= 2 ? 'fz-fields-2' : ''}`}>\n {gFields.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} colSpan={field.span === 2} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )\n })}\n\n {/* Ungrouped project fields */}\n {ungroupedProject.length > 0 && (\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">{tl('Details', 'Detalhes')}</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"pt-5\">\n <div className=\"fz-fields fz-fields-2 gap-4\">\n {ungroupedProject.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} colSpan={field.span === 2} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n </div>\n )\n}\n","import React from 'react'\nimport { MapPin } from 'lucide-react'\nimport { Card, CardContent, Checkbox } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { ActiveToggle } from './ActiveToggle'\nimport { AddressesSection } from './AddressesTab'\nimport type { FieldDef, FieldGroup } from '@fayz-ai/core'\n\ninterface LocationFormLayoutProps {\n fields: FieldDef[]\n fieldGroups: FieldGroup[]\n values: Record<string, any>\n onChange: (key: string, val: any) => void\n renderField: (field: FieldDef, value: any, onChange: (val: any) => void) => React.ReactNode\n /** Só na edição: o endereço mora em `public.addresses` e precisa de um dono\n * com id. Numa unidade nova ele aparece depois de salvar. */\n recordId?: string\n}\n\nconst IDENTITY_FIELDS = new Set(['name'])\nconst CONTACT_FIELDS = new Set(['phone', 'email'])\n// O ENDEREÇO SAIU DAQUI.\n//\n// Eram cinco campos planos gravados em `metadata` da unidade, e o resultado\n// estava à vista: uma conta migrada do V1 guardava ali o objeto inteiro em\n// STRING, e a tela mostrava `{\"city\": \"Rio de Janeiro\", \"state\": \"RJ\", ...}`\n// dentro de um input de uma linha. Endereço já é uma tabela — `public.addresses`,\n// a mesma da ficha da pessoa, que aceita `owner_type = 'unit'` — com CEP que se\n// consulta sozinho, número, complemento e bairro.\n//\n// Continuam neste conjunto para NÃO serem renderizados como campo solto: a\n// unidade ainda os LÊ da view (a lista mostra a cidade), mas quem os escreve é\n// o bloco de endereço.\nconst ADDRESS_FIELDS = new Set(['address', 'city', 'state', 'country', 'postalCode'])\nconst SKIP_FIELDS = new Set(['isActive', 'status', 'tags', 'notes', 'isHeadquarters'])\nconst ALL_LOCATION_FIELDS = new Set([...IDENTITY_FIELDS, ...CONTACT_FIELDS, ...ADDRESS_FIELDS, ...SKIP_FIELDS])\n\nfunction FieldItem({ field, value, onChange, renderField, colSpan }: {\n field: FieldDef; value: any; onChange: (val: any) => void\n renderField: LocationFormLayoutProps['renderField']; colSpan?: boolean\n}) {\n return (\n <div className={`space-y-1.5 ${colSpan ? 'fz-field-wide' : ''}`}>\n <label className=\"text-sm font-medium\">\n {field.label}{field.required && <span className=\"text-destructive ml-0.5\">*</span>}\n </label>\n {renderField(field, value, onChange)}\n </div>\n )\n}\n\nexport function LocationFormLayout({ fields, fieldGroups, values, onChange, renderField, recordId }: LocationFormLayoutProps) {\n const t = useTranslation()\n const nameField = fields.find((f) => f.key === 'name')\n const contactFields = fields.filter((f) => CONTACT_FIELDS.has(f.key))\n const notesField = fields.find((f) => f.key === 'notes')\n const hasActive = fields.some((f) => f.key === 'isActive')\n const hqField = fields.find((f) => f.key === 'isHeadquarters')\n\n // Project-specific fields\n const projectFields = fields.filter((f) => !ALL_LOCATION_FIELDS.has(f.key))\n\n const groupFieldMap = new Map<string, FieldDef[]>()\n const ungroupedProject: FieldDef[] = []\n for (const field of projectFields) {\n if (field.group) {\n const existing = groupFieldMap.get(field.group) ?? []\n existing.push(field)\n groupFieldMap.set(field.group, existing)\n } else {\n ungroupedProject.push(field)\n }\n }\n\n return (\n <div className=\"space-y-6\">\n {/* Identity — icon + name + active */}\n <Card>\n <CardContent className=\"pt-5\">\n <div className=\"flex gap-5\">\n <div className=\"flex h-20 w-20 shrink-0 items-center justify-center rounded-2xl bg-primary/10 text-primary\">\n <MapPin className=\"h-8 w-8\" />\n </div>\n <div className=\"flex-1 space-y-4\">\n <div className=\"flex items-start gap-4\">\n {nameField && (\n <div className=\"flex-1 space-y-1.5\">\n <label className=\"text-sm font-medium\">{nameField.label}{nameField.required && <span className=\"text-destructive ml-0.5\">*</span>}</label>\n {renderField(nameField, values[nameField.key], (val) => onChange(nameField.key, val))}\n </div>\n )}\n <div className=\"mt-6 flex items-center gap-3 shrink-0\">\n {hasActive && (\n <ActiveToggle active={values.isActive ?? true} onChange={(v) => onChange('isActive', v)} />\n )}\n </div>\n </div>\n {hqField && (\n <label className=\"flex items-center gap-2.5 cursor-pointer text-sm\">\n <Checkbox\n checked={!!values.isHeadquarters}\n onChange={(checked) => onChange('isHeadquarters', checked)}\n />\n Headquarters\n </label>\n )}\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Address — uma unidade, um endereço. */}\n {recordId ? (\n <AddressesSection item={{ id: recordId }} ownerType=\"unit\" single />\n ) : (\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">{t('crud.archetype.addresses.title')}</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"py-6 text-center text-xs text-muted-foreground\">\n {t('crud.archetype.addresses.afterSave')}\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Contact */}\n {contactFields.length > 0 && (\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">Contact</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"pt-5\">\n <div className=\"fz-fields fz-fields-2 gap-4\">\n {contactFields.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Project-specific grouped fields */}\n {fieldGroups.map((group) => {\n const gFields = groupFieldMap.get(group.id)\n if (!gFields || gFields.length === 0) return null\n const cols = group.columns ?? 2\n return (\n <div key={group.id}>\n <h3 className=\"text-sm font-semibold text-foreground\">{group.label}</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"pt-5\">\n <div className={`fz-fields gap-4 ${cols >= 2 ? 'fz-fields-2' : ''}`}>\n {gFields.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} colSpan={field.span === 2} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )\n })}\n\n {/* Ungrouped project fields */}\n {ungroupedProject.length > 0 && (\n <Card>\n <CardContent className=\"pt-5\">\n <div className=\"fz-fields fz-fields-2 gap-4\">\n {ungroupedProject.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} colSpan={field.span === 2} />\n ))}\n </div>\n </CardContent>\n </Card>\n )}\n\n {/* Notes */}\n {notesField && (\n <Card>\n <CardContent className=\"pt-5\">\n <FieldItem field={notesField} value={values[notesField.key]} onChange={(val) => onChange(notesField.key, val)} renderField={renderField} />\n </CardContent>\n </Card>\n )}\n </div>\n )\n}\n","import React, { useState, useEffect, useRef, useCallback } from 'react'\nimport { Search, Plus, X, User, Loader2, Check } from 'lucide-react'\nimport { Input } from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { getSupabaseClientOptional } from '@fayz-ai/core'\nimport { useOrganizationStore } from '../../org'\n\ninterface Person {\n id: string\n name: string\n email?: string\n phone?: string\n kind: string\n}\n\ninterface PersonPickerProps {\n value?: string | null\n onChange: (personId: string | null, person?: Person) => void\n personKind?: string\n label?: string\n placeholder?: string\n onPersonData?: (data: { name: string; phone?: string; email?: string }) => void\n}\n\nexport function PersonPicker({\n value,\n onChange,\n personKind = 'customer',\n label = 'Person',\n placeholder = 'Search or type a name to add...',\n onPersonData,\n}: PersonPickerProps) {\n const [open, setOpen] = useState(false)\n const [query, setQuery] = useState('')\n const [results, setResults] = useState<Person[]>([])\n const [searching, setSearching] = useState(false)\n const [selected, setSelected] = useState<Person | null>(null)\n const [showCreate, setShowCreate] = useState(false)\n const [creating, setCreating] = useState(false)\n const searchTimer = useRef<ReturnType<typeof setTimeout> | null>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n\n // New person form\n const [newPhone, setNewPhone] = useState('')\n const [newEmail, setNewEmail] = useState('')\n\n const tenantId = useOrganizationStore((s) => s.currentOrg?.id)\n\n // Load selected person on mount\n useEffect(() => {\n if (value && !selected) {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return\n supabase\n .from('people')\n .select('id, name, email, phone, kind')\n .eq('id', value)\n .single()\n .then(({ data }: any) => {\n if (data) setSelected(data as Person)\n })\n }\n }, [value])\n\n // Close on outside click\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setOpen(false)\n setShowCreate(false)\n }\n }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [])\n\n const doSearch = useCallback(async (term: string) => {\n if (!term.trim() || !tenantId) { setResults([]); return }\n setSearching(true)\n try {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return\n const { data } = await supabase\n .from('people')\n .select('id, name, email, phone, kind')\n .eq('tenant_id', tenantId)\n .ilike('name', `%${term}%`)\n .limit(6)\n setResults((data ?? []) as Person[])\n } finally {\n setSearching(false)\n }\n }, [tenantId])\n\n const handleInput = (val: string) => {\n setQuery(val)\n setShowCreate(false)\n if (!open) setOpen(true)\n if (searchTimer.current) clearTimeout(searchTimer.current)\n searchTimer.current = setTimeout(() => doSearch(val), 250)\n }\n\n const handleSelect = (person: Person) => {\n setSelected(person)\n onChange(person.id, person)\n onPersonData?.({ name: person.name, phone: person.phone, email: person.email })\n setOpen(false)\n setQuery('')\n setResults([])\n setShowCreate(false)\n }\n\n const handleStartCreate = () => {\n setShowCreate(true)\n setNewPhone('')\n setNewEmail('')\n }\n\n const handleCreate = async () => {\n if (!query.trim() || !tenantId) return\n setCreating(true)\n try {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return\n const { data, error } = await supabase\n .from('people')\n .insert({\n tenant_id: tenantId,\n kind: personKind,\n name: query.trim(),\n phone: newPhone.trim() || null,\n email: newEmail.trim() || null,\n is_active: true,\n })\n .select('id, name, email, phone, kind')\n .single()\n if (error) throw error\n handleSelect(data as Person)\n } finally {\n setCreating(false)\n }\n }\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation()\n setSelected(null)\n setQuery('')\n onChange(null)\n onPersonData?.({ name: '', phone: '', email: '' })\n setTimeout(() => inputRef.current?.focus(), 50)\n }\n\n const noResults = query.trim().length > 1 && !searching && results.length === 0\n\n return (\n <div ref={containerRef} className=\"relative\">\n {/* Selected state */}\n {selected && !open ? (\n <Button\n variant=\"bare\"\n size=\"bare\"\n type=\"button\"\n onClick={() => { setOpen(true); setQuery(''); setTimeout(() => inputRef.current?.focus(), 50) }}\n className=\"flex items-center gap-3 w-full rounded-lg border px-3 py-2.5 text-left hover:bg-muted bg-card shadow-button active:shadow-button-inset transition-colors justify-start whitespace-normal text-[length:inherit] font-normal\"\n >\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-primary/10 text-primary\">\n <User className=\"h-4 w-4\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium truncate\">{selected.name}</p>\n <p className=\"text-xs text-muted-foreground truncate\">\n {[selected.phone, selected.email].filter(Boolean).join(' · ') || 'No contact info'}\n </p>\n </div>\n <div className=\"flex items-center gap-1 shrink-0\" onClick={(e) => e.stopPropagation()}>\n <span className=\"text-[10px] text-muted-foreground\">Change</span>\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={handleClear} className=\"p-1 text-muted-foreground hover:text-destructive rounded\">\n <X className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n </Button>\n ) : (\n /* Search input */\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground pointer-events-none\" />\n <Input\n ref={inputRef}\n type=\"text\"\n value={query}\n onChange={(e) => handleInput(e.target.value)}\n onFocus={() => { if (query) setOpen(true) }}\n placeholder={placeholder}\n className=\"h-10 bg-background pl-10 py-2 shadow-sm\"\n />\n {/* Positioning on the wrapper, spin on the icon: `animate-spin`'s\n keyframe sets a bare `transform: rotate(...)` that replaces the\n composed transform `-translate-y-1/2` lives in, and the two end up\n interpolating the translation away instead of rotating. */}\n {searching && (\n <span className=\"pointer-events-none absolute inset-y-0 right-3 flex items-center\">\n <Loader2 className=\"h-4 w-4 animate-spin text-muted-foreground\" />\n </span>\n )}\n </div>\n )}\n\n {/* Dropdown */}\n {open && (query.trim().length > 0 || showCreate) && (\n <div className=\"fayz-glass-surface absolute z-50 mt-1 w-full rounded-lg border bg-popover shadow-lg overflow-hidden\">\n {/* Results */}\n {results.length > 0 && (\n <div className=\"max-h-52 overflow-y-auto\">\n {results.map((person) => (\n <Button\n variant=\"bare\"\n size=\"bare\"\n key={person.id}\n type=\"button\"\n onClick={() => handleSelect(person)}\n className=\"flex items-center gap-3 w-full px-3 py-2.5 text-left hover:bg-muted/50 transition-colors justify-start whitespace-normal text-[length:inherit] font-normal rounded-none\"\n >\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-muted\">\n <User className=\"h-3.5 w-3.5 text-muted-foreground\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <p className=\"text-sm font-medium truncate\">{person.name}</p>\n <span className=\"inline-flex items-center rounded-full bg-muted px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground capitalize shrink-0\">\n {person.kind}\n </span>\n </div>\n <p className=\"text-xs text-muted-foreground truncate\">\n {[person.phone, person.email].filter(Boolean).join(' · ')}\n </p>\n </div>\n {person.id === value && <Check className=\"h-4 w-4 text-primary shrink-0\" />}\n </Button>\n ))}\n </div>\n )}\n\n {/* No results — prompt to create */}\n {noResults && !showCreate && (\n <Button\n variant=\"bare\"\n size=\"bare\"\n type=\"button\"\n onClick={handleStartCreate}\n className=\"flex items-center gap-3 w-full px-3 py-3 text-left hover:bg-muted/50 transition-colors border-t border-dashed justify-start whitespace-normal text-[length:inherit] font-normal rounded-none\"\n >\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-primary/10 text-primary\">\n <Plus className=\"h-4 w-4\" />\n </div>\n <div>\n <p className=\"text-sm font-medium\">Add \"<span className=\"text-primary\">{query.trim()}</span>\"</p>\n <p className=\"text-xs text-muted-foreground\">Create a new {label.toLowerCase()} with this name</p>\n </div>\n </Button>\n )}\n\n {/* Also show create option when there ARE results */}\n {results.length > 0 && !showCreate && (\n <Button\n variant=\"bare\"\n size=\"bare\"\n type=\"button\"\n onClick={handleStartCreate}\n className=\"flex items-center gap-2 w-full px-3 py-2 text-left hover:bg-muted/50 transition-colors border-t text-xs text-muted-foreground justify-start whitespace-normal font-normal rounded-none\"\n >\n <Plus className=\"h-3 w-3\" />\n Add \"<span className=\"font-medium text-foreground\">{query.trim()}</span>\" as new {label.toLowerCase()}\n </Button>\n )}\n\n {/* Inline create form */}\n {showCreate && (\n <div className=\"p-3 border-t space-y-3 bg-muted/20\">\n <div className=\"flex items-center gap-2\">\n <div className=\"flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-primary/10 text-primary\">\n <Plus className=\"h-3 w-3\" />\n </div>\n <p className=\"text-xs font-medium\">New {label}: <span className=\"text-primary\">{query.trim()}</span></p>\n </div>\n <div className=\"fz-fields fz-fields-2 gap-2\">\n <Input\n value={newPhone}\n onChange={(e) => setNewPhone(e.target.value)}\n placeholder=\"Phone\"\n className=\"h-8 text-xs\"\n />\n <Input\n value={newEmail}\n onChange={(e) => setNewEmail(e.target.value)}\n placeholder=\"Email\"\n type=\"email\"\n className=\"h-8 text-xs\"\n />\n </div>\n <div className=\"flex justify-end gap-2\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" className=\"h-7 text-xs\" onClick={() => setShowCreate(false)}>\n Cancel\n </Button>\n <Button type=\"button\" size=\"sm\" className=\"h-7 text-xs\" onClick={handleCreate} disabled={creating}>\n {creating ? <Loader2 className=\"h-3 w-3 mr-1 animate-spin\" /> : <Check className=\"h-3 w-3 mr-1\" />}\n {creating ? 'Saving...' : 'Save & Select'}\n </Button>\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n )\n}\n","import React from 'react'\nimport { Heart } from 'lucide-react'\nimport { Card, CardContent, getLucideIcon } from '@fayz-ai/ui'\nimport { ActiveToggle } from './ActiveToggle'\nimport { PersonPicker } from './PersonPicker'\nimport type { FieldDef, FieldGroup } from '@fayz-ai/core'\n\ninterface SubjectFormLayoutProps {\n fields: FieldDef[]\n allFields?: FieldDef[]\n fieldGroups: FieldGroup[]\n values: Record<string, any>\n onChange: (key: string, val: any) => void\n renderField: (field: FieldDef, value: any, onChange: (val: any) => void) => React.ReactNode\n entityIcon?: string\n}\n\nconst OWNER_FIELDS = new Set(['tutorName', 'tutorPhone', 'tutorId'])\nconst REFERRAL_FIELDS = new Set(['referringVetId', 'referringClinicId'])\nconst SKIP_FIELDS = new Set(['isActive', 'notes', 'tags', 'metadata'])\n\nfunction FieldItem({ field, value, onChange, renderField, colSpan }: {\n field: FieldDef; value: any; onChange: (val: any) => void\n renderField: SubjectFormLayoutProps['renderField']; colSpan?: boolean\n}) {\n return (\n <div className={`space-y-1.5 ${colSpan ? 'fz-field-wide' : ''}`}>\n <label className=\"text-sm font-medium\">\n {field.label}{field.required && <span className=\"text-destructive ml-0.5\">*</span>}\n </label>\n {renderField(field, value, onChange)}\n </div>\n )\n}\n\nexport function SubjectFormLayout({ fields, allFields, fieldGroups, values, onChange, renderField, entityIcon }: SubjectFormLayoutProps) {\n const all = allFields ?? fields\n const nameField = fields.find((f) => f.key === 'name')\n const hasActive = fields.some((f) => f.key === 'isActive')\n const notesField = fields.find((f) => f.key === 'notes')\n const hasOwnerPicker = all.some((f) => f.key === 'tutorId' || f.key === 'tutorName')\n const referralFields = fields.filter((f) => REFERRAL_FIELDS.has(f.key))\n\n // Main subject fields = everything except name, owner, referral, skip\n const allSkip = new Set([...OWNER_FIELDS, ...REFERRAL_FIELDS, ...SKIP_FIELDS, 'name'])\n const subjectFields = fields.filter((f) => !allSkip.has(f.key))\n\n // Group subject fields\n const groupFieldMap = new Map<string, FieldDef[]>()\n const ungrouped: FieldDef[] = []\n for (const field of subjectFields) {\n if (field.group) {\n const existing = groupFieldMap.get(field.group) ?? []\n existing.push(field)\n groupFieldMap.set(field.group, existing)\n } else {\n ungrouped.push(field)\n }\n }\n\n const IconComponent = getLucideIcon(entityIcon ?? 'Heart') ?? Heart\n\n return (\n <div className=\"space-y-6\">\n {/* Identity — icon + name + active */}\n <Card>\n <CardContent className=\"pt-5\">\n <div className=\"flex gap-5\">\n <div className=\"flex h-20 w-20 shrink-0 items-center justify-center rounded-2xl bg-primary/10 text-primary\">\n {React.createElement(IconComponent, { className: 'h-8 w-8' })}\n </div>\n <div className=\"flex-1 space-y-4\">\n <div className=\"flex items-start gap-4\">\n {nameField && (\n <div className=\"flex-1 space-y-1.5\">\n <label className=\"text-sm font-medium\">{nameField.label}{nameField.required && <span className=\"text-destructive ml-0.5\">*</span>}</label>\n {renderField(nameField, values[nameField.key], (val) => onChange(nameField.key, val))}\n </div>\n )}\n {hasActive && (\n <div className=\"mt-6 shrink-0\">\n <ActiveToggle active={values.isActive ?? true} onChange={(v) => onChange('isActive', v)} />\n </div>\n )}\n </div>\n {/* Ungrouped fields inline */}\n {ungrouped.length > 0 && (\n <div className=\"fz-fields fz-fields-3 gap-4\">\n {ungrouped.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} />\n ))}\n </div>\n )}\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Grouped subject fields */}\n {fieldGroups.map((group) => {\n const gFields = groupFieldMap.get(group.id)\n if (!gFields || gFields.length === 0) return null\n const cols = group.columns ?? 2\n return (\n <div key={group.id}>\n <h3 className=\"text-sm font-semibold text-foreground\">{group.label}</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"pt-5\">\n <div className={`fz-fields gap-4 ${cols >= 3 ? 'fz-fields-3' : cols >= 2 ? 'fz-fields-2' : ''}`}>\n {gFields.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} colSpan={field.span === 2} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )\n })}\n\n {/* Owner / Tutor — person picker */}\n {hasOwnerPicker && (\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">Owner / Tutor</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"pt-5\">\n <PersonPicker\n value={values.tutorId}\n onChange={(personId) => onChange('tutorId', personId)}\n personKind=\"customer\"\n label=\"Tutor\"\n placeholder=\"Search or type a name to add...\"\n />\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Referral */}\n {referralFields.length > 0 && (\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">Referral</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"pt-5\">\n <div className=\"fz-fields fz-fields-2 gap-4\">\n {referralFields.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Notes */}\n {notesField && (\n <Card>\n <CardContent className=\"pt-5\">\n <FieldItem field={notesField} value={values[notesField.key]} onChange={(val) => onChange(notesField.key, val)} renderField={renderField} />\n </CardContent>\n </Card>\n )}\n </div>\n )\n}\n","import * as React from 'react'\nimport { Eye } from 'lucide-react'\nimport type { LucideIcon } from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\nimport { Badge, SubpageHeader, TabsList, TabsTrigger, getLucideIcon } from '@fayz-ai/ui'\nimport { useMyPersonId } from '../org/self'\n\n// The top of a record, shared by the page that reads it and the form that\n// edits it. Two separate drawings is how the same record came to have a hero\n// in one mode, none in the other, and its tabs at two different heights.\n\n/** @internal exported for tests — resolves `DetailTab.icon` against lucide. */\n// Resolved through the SDK's icon registry (@fayz-ai/ui `getLucideIcon`), not\n// a namespace import: that pulled all of lucide (~500 KB) into every app.\n// An app needing a name outside the set adds it with `registerIcons`.\nexport function resolveTabIcon(name: string): LucideIcon | null {\n return getLucideIcon(name) ?? null\n}\n\n/** The human label of a `status`, read from the field's `options`. */\nexport function statusLabel(entityDef: EntityDef, value: unknown): React.ReactNode {\n const options = entityDef.fields.find((f) => f.key === 'status')?.options\n if (Array.isArray(options)) {\n for (const option of options as Array<string | { value: string; label: string }>) {\n if (typeof option === 'string') {\n if (option === value) return option\n } else if (option.value === value) {\n return option.label\n }\n }\n }\n return typeof value === 'string' ? value.charAt(0).toUpperCase() + value.slice(1) : (value as React.ReactNode)\n}\n\nexport interface RecordHeaderProps {\n entityDef: EntityDef\n /** The record as the screen currently shows it (drafts and form values included). */\n item: Record<string, any>\n /** The record's name. It is the page's ONE title: the bar says it, nothing below repeats it. */\n title: string\n parentLabel?: string\n onBack?: () => void\n /** Extra facts about the record that live on no field (a membership role). */\n badges?: React.ReactNode\n /** Rendered at the right of the bar. The read page portals its own. */\n actions?: React.ReactNode\n}\n\nexport function RecordHeader({ entityDef, item, title, parentLabel, onBack, badges, actions }: RecordHeaderProps) {\n const t = useTranslation()\n const myPersonId = useMyPersonId(entityDef.layout === 'person')\n const isMyRecord = Boolean(myPersonId) && myPersonId === item.id\n\n const imageValue = entityDef.image?.get(item) ?? (entityDef.imageField ? item[entityDef.imageField] : null)\n // A custom avatar is drawn at its own size (a card's face); it cannot be\n // shrunk into the bar, so it keeps a row of its own below.\n const customAvatar = entityDef.renderAvatar ? entityDef.renderAvatar(item) : null\n const subtitle = entityDef.subtitleField ? item[entityDef.subtitleField] : null\n const activeValue: boolean | undefined = item.isActive ?? item.is_active\n // Only where the entity DECLARES a `status` field: there it is a real state,\n // not the echo of the active switch.\n const showStatus = Boolean(item.status) && entityDef.fields.some((f) => f.key === 'status')\n const hasChips = isMyRecord || showStatus || activeValue !== undefined || Boolean(badges)\n\n const chips = hasChips ? (\n <>\n {isMyRecord && <Badge variant=\"secondary\" className=\"shrink-0\">{t('common.you')}</Badge>}\n {showStatus && <Badge variant=\"secondary\" className=\"shrink-0\">{statusLabel(entityDef, item.status)}</Badge>}\n {activeValue !== undefined && (\n <Badge variant={activeValue ? 'success' : 'destructive'} className=\"shrink-0\">\n {activeValue ? t('common.active') : t('common.inactive')}\n </Badge>\n )}\n {badges}\n </>\n ) : null\n\n const thumb = !customAvatar && imageValue\n ? <img src={imageValue} alt=\"\" className=\"mr-0.5 h-6 w-6 rounded-md object-cover\" />\n : undefined\n\n const trailing = subtitle || chips ? (\n <>\n {subtitle && <span className=\"truncate text-muted-foreground\">{subtitle}</span>}\n {chips}\n </>\n ) : undefined\n\n return (\n <>\n <SubpageHeader\n title={title}\n parentLabel={parentLabel}\n onBack={onBack}\n actions={actions}\n titleLeading={thumb}\n titleTrailing={trailing}\n />\n {customAvatar && <div className=\"mb-4 flex items-center\">{customAvatar}</div>}\n {/* The phone's bar holds the name alone, centred; what sat beside it goes here. */}\n {(thumb || trailing) && (\n <div className=\"mb-3 flex flex-wrap items-center gap-2 text-sm md:hidden\">\n {thumb}\n {trailing}\n </div>\n )}\n </>\n )\n}\n\nexport interface RecordTabItem {\n id: string\n label: string\n icon?: string\n count?: number\n}\n\n/** The record's tab strip. Must sit inside a `<Tabs>` root; \"overview\" is always first. */\nexport function RecordTabStrip({ tabs, compact }: { tabs: RecordTabItem[]; compact?: boolean }) {\n const t = useTranslation()\n const trigger = `gap-1.5 ${compact ? 'text-xs px-2 py-1' : ''}`\n const iconSize = compact ? 'h-3 w-3' : 'h-3.5 w-3.5'\n return (\n <TabsList className={`max-w-full justify-start overflow-x-auto scrollbar-none${compact ? ' h-8' : ''}`}>\n <TabsTrigger value=\"overview\" className={trigger}>\n <Eye className={iconSize} />\n {t('common.overview')}\n </TabsTrigger>\n {tabs.map((tab) => {\n const translated = t(`crud.tabs.${tab.id}`)\n const label = translated.startsWith('crud.tabs.') ? tab.label : translated\n const TabIcon = tab.icon ? resolveTabIcon(tab.icon) : null\n return (\n <TabsTrigger key={tab.id} value={tab.id} className={trigger}>\n {TabIcon && <TabIcon className={iconSize} />}\n {label}\n {/* Zero is not a badge: it says what the empty tab says on opening. */}\n {tab.count ? (\n <span className={`rounded-full bg-muted px-1.5 tabular-nums text-muted-foreground ${compact ? 'text-[9px]' : 'text-[10px]'}`}>\n {tab.count}\n </span>\n ) : null}\n </TabsTrigger>\n )\n })}\n </TabsList>\n )\n}\n","import type { EntityDef } from '@fayz-ai/core'\n\n/**\n * The id a detail page's widget zones are namespaced under\n * (`<id>.detail.tabs`, `<id>.detail.header.actions`).\n *\n * It reads `data.table` and NOT `name`, because `name` is the display label:\n * apps write it as `tl('Client', 'Cliente')`, so the zone came out\n * `cliente.detail.*` under pt-BR and `client.detail.*` under English. A plugin\n * declaring a widget can only name one string, so half the fleet's widgets\n * landed in a zone nobody rendered — and a zone that nobody rendered says\n * nothing at all. The failure looked like \"the button just isn't there\".\n *\n * `data.table` is the entity's real identity: it does not translate, and it is\n * what a plugin author can actually look up.\n */\nexport function entityZoneId(entityDef: Pick<EntityDef, 'name' | 'data'>): string {\n return slug(entityDef.data?.table ?? entityDef.name)\n}\n\n/** The pre-0.11 label-derived id, still rendered so existing widgets survive. */\nexport function legacyEntityZoneId(entityDef: Pick<EntityDef, 'name'>): string {\n return slug(entityDef.name)\n}\n\nfunction slug(value: string): string {\n return value.toLowerCase().replace(/\\s+/g, '-')\n}\n","import React from 'react'\nimport type { EntityDef, FieldDef } from '@fayz-ai/core'\nimport { Badge, PersonAvatar, Switch } from '@fayz-ai/ui'\nimport { RelationCell } from './relation-field'\nimport {\n formatCurrency as formatCurrencyLocale,\n formatDate as formatDateLocale,\n formatDateTime as formatDateTimeLocale,\n} from '@fayz-ai/core'\n\nfunction formatCurrency(value: any, currency?: string): string {\n const num = typeof value === 'number' ? value : parseFloat(value)\n if (isNaN(num)) return '—'\n return formatCurrencyLocale(num, currency)\n}\n\nfunction formatDate(value: any): string {\n if (!value) return '—'\n return formatDateLocale(value)\n}\n\nfunction formatDateTime(value: any): string {\n if (!value) return '—'\n return formatDateTimeLocale(value)\n}\n\nexport interface ColumnDef {\n key: string\n label: string\n sortable: boolean\n render: (value: any, row: any) => React.ReactNode\n /** Where the column lands on a phone card — see `DataTable.mobileLayout`. */\n mobile?: 'badge'\n}\n\nexport interface FieldToColumnsOptions {\n /** Callback for inline field updates (e.g. toggle active) */\n onInlineUpdate?: (id: string, field: string, value: any) => void\n}\n\n/**\n * O interruptor de «Ativo» — o MESMO na lista e no formulário.\n *\n * Exportado porque o formulário desenhava uma caixa de seleção para o mesmo\n * campo que a lista desenha como interruptor: dois controles para a mesma\n * pergunta, na mesma tela, um ao lado do outro. Um interruptor diz «ligado ou\n * desligado», que é o que «Ativo» é; uma caixa diz «marque se concorda».\n */\nexport function InlineToggle({ checked, onChange }: { checked: boolean; onChange: (val: boolean) => void }) {\n return <Switch size=\"md\" checked={checked} onCheckedChange={onChange} />\n}\n\nexport function fieldToColumns(fields: FieldDef[], options?: FieldToColumnsOptions): ColumnDef[] {\n return fields\n .filter((f) => f.showInTable !== false)\n .map((field): ColumnDef => {\n const sortable = field.sortable ?? ['text', 'number', 'currency', 'date', 'datetime', 'email'].includes(field.type)\n\n const render = field.renderCell ?? ((value: any, row: any): React.ReactNode => {\n if (value == null || value === '') return <span className=\"text-muted-foreground\">—</span>\n\n switch (field.type) {\n // ESCOLHA: a coluna mostra o RÓTULO, não o valor gravado.\n //\n // Sem este ramo, `role: 'produce'` chegava assim na tabela — e a\n // régua do porte é explícita: *nenhum valor de banco chega cru à\n // tela*. O detalhe e a visão geral já traduziam pelas `options`\n // (`CrudDetailPage`, `EntityOverview`); a LISTA era a única das três\n // que não traduzia, então a mesma entidade dizia «produce» numa tela\n // e «Produção» na outra.\n //\n // Sem correspondência, mostra o valor — melhor o enum do que um\n // traço, porque aí quem lê sabe que existe algo ali que ninguém\n // nomeou.\n case 'select':\n case 'segmented':\n case 'multiselect': {\n const opcoes = (field.options ?? []).map((o) => (\n typeof o === 'string' ? { label: o, value: o } : o\n ))\n const rotulo = (v: unknown) =>\n opcoes.find((o) => o.value === v)?.label ?? String(v)\n return <span>{Array.isArray(value) ? value.map(rotulo).join(', ') : rotulo(value)}</span>\n }\n case 'currency':\n return <span>{formatCurrency(value, field.currency)}</span>\n case 'date':\n return <span>{formatDate(value)}</span>\n case 'datetime':\n return <span>{formatDateTime(value)}</span>\n case 'boolean':\n if (field.inlineToggle && options?.onInlineUpdate) {\n const handler = options.onInlineUpdate\n return (\n <InlineToggle\n checked={!!value}\n onChange={(val) => handler(row.id, field.key, val)}\n />\n )\n }\n return value ? (\n <svg className=\"h-4 w-4 text-success\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n ) : (\n <span className=\"text-muted-foreground\">—</span>\n )\n case 'color':\n return (\n <span className=\"inline-flex items-center gap-1.5\">\n <span className=\"h-4 w-4 rounded border border-border shrink-0\" style={{ backgroundColor: String(value) }} />\n <span className=\"text-xs text-muted-foreground\">{String(value)}</span>\n </span>\n )\n case 'relation':\n return <RelationCell relation={field.relation} value={value} />\n case 'select':\n return <Badge variant=\"secondary\">{String(value)}</Badge>\n case 'number':\n return <span>{typeof value === 'number' ? value.toLocaleString() : value}</span>\n default:\n return <span>{String(value)}</span>\n }\n })\n\n // The on/off of a record is a state, not a property: on a card it sits\n // in the corner, in the same spot on every row.\n const mobile = field.type === 'boolean' && /^(is_?)?active$/i.test(field.key) ? 'badge' as const : undefined\n return { key: field.key, label: field.label, sortable, render, mobile }\n })\n}\n\n/** The list's name cell: bold, and for people the portrait (or initials) beside it. */\nexport function renderDisplayCell(entityDef: EntityDef, value: unknown, rendered: React.ReactNode, row: any): React.ReactNode {\n const name = <span className=\"font-medium text-foreground\">{rendered}</span>\n // Only people get a face beside the name; a product list keeps its own image column.\n if (entityDef.layout !== 'person' || !(entityDef.imageField || entityDef.image)) return name\n const src = entityDef.image?.get(row) ?? (entityDef.imageField ? row[entityDef.imageField] : null)\n return (\n <span className=\"flex min-w-0 items-center gap-2.5\">\n <PersonAvatar name={typeof value === 'string' ? value : ''} src={src} size=\"md\" />\n {name}\n </span>\n )\n}\n","import React from 'react'\nimport { Package, Pencil } from 'lucide-react'\nimport { Button, Card, getLucideIcon } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport type { FieldDef, EntityDef } from '@fayz-ai/core'\nimport { formatCurrency, formatDate } from '@fayz-ai/core'\n\ninterface CrudCardGridProps<T> {\n items: T[]\n entityDef: EntityDef<T>\n onEdit: (item: T) => void\n onDelete: (item: T) => void\n /** Abre o registro já em EDIÇÃO. Ausente = sem lápis (lista só de leitura). */\n onEditRecord?: (item: T) => void\n}\n\nfunction formatValue(field: FieldDef, value: any): React.ReactNode {\n if (value == null || value === '') return null\n // A saída declarada tem precedência aqui como tem na tabela: uma entidade\n // que já diz como desenhar a célula não precisa dizer duas vezes.\n if (field.renderCell) return field.renderCell(value, {})\n\n switch (field.type) {\n case 'currency': {\n const num = typeof value === 'number' ? value : parseFloat(value)\n if (isNaN(num)) return null\n return formatCurrency(num, field.currency)\n }\n case 'date':\n try { return formatDate(value) }\n catch { return String(value) }\n case 'boolean':\n // Em PORTUGUÊS. Estava «Yes»/«No» — texto de biblioteca vazando para um\n // produto inteiro em pt-BR, no cartão de qualquer entidade.\n return value ? 'Sim' : 'Não'\n case 'select':\n case 'segmented':\n case 'multiselect': {\n // O RÓTULO, não o valor gravado. `role: 'produce'` aparecia assim no\n // cartão — e a régua do porte é explícita: nenhum valor de banco chega\n // cru à tela. Sem correspondência mostra o valor, porque o enum ainda\n // diz mais que um traço.\n const opcoes = (field.options ?? []).map((o) => (\n typeof o === 'string' ? { label: o, value: o } : o\n ))\n const rotulo = (v: unknown) => opcoes.find((o) => o.value === v)?.label ?? String(v)\n const texto = Array.isArray(value) ? value.map(rotulo).join(', ') : rotulo(value)\n return <Badge variant=\"secondary\" className=\"text-[10px]\">{texto}</Badge>\n }\n case 'image':\n return null\n default:\n return String(value)\n }\n}\n\nexport function CrudCardGrid<T extends { id: string }>({ items, entityDef, onEdit, onDelete, onEditRecord}: CrudCardGridProps<T>) {\n const displayField = entityDef.displayField ?? entityDef.fields[0]?.key ?? 'id'\n const imageField = entityDef.imageField\n const entityIcon = entityDef.icon\n const IconComponent = getLucideIcon(entityDef.card?.icon ?? entityIcon) ?? Package\n const visibleFields = entityDef.fields.filter(\n (f) => f.showInTable !== false && f.key !== displayField && f.key !== imageField && f.type !== 'image'\n )\n\n return (\n <div className=\"fz-cards gap-3\">\n {items.map((item) => {\n const record = item as any\n const card = entityDef.card\n const imageUrl = card?.icon ? null : (imageField ? record[imageField] : null)\n const subtitulo = card?.subtitle?.(record)\n ?? (entityDef.subtitleField ? record[entityDef.subtitleField] : undefined)\n const selo = card?.badge?.(record)\n const caixas = card?.tiles?.(record) ?? []\n const nota = card?.note?.(record)\n const acoes = card?.actions ?? []\n\n return (\n <Card\n key={record.id}\n className=\"flex flex-col gap-3 p-4 cursor-pointer hover:bg-muted/30 transition-colors\"\n onClick={() => onEdit(item)}\n >\n <div className=\"flex items-start gap-3\">\n {/* Thumbnail or icon */}\n {imageUrl ? (\n <img\n src={imageUrl}\n alt={record[displayField] ?? ''}\n className=\"h-14 w-14 shrink-0 rounded-lg object-cover\"\n />\n ) : (\n <div className=\"flex h-14 w-14 shrink-0 items-center justify-center rounded-lg bg-muted/50\">\n <IconComponent className=\"h-6 w-6 text-muted-foreground/40\" />\n </div>\n )}\n\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"truncate text-sm font-semibold\">\n {record[displayField] ?? record.id}\n </h3>\n {/* O que a coisa É, sob o nome. */}\n {subtitulo && <p className=\"truncate text-xs text-muted-foreground\">{subtitulo}</p>}\n </div>\n {/* O ESTADO no canto: é o que se lê antes do resto, e por isso não\n divide espaço com os números lá embaixo. */}\n {selo && (\n <Badge variant={selo.tone === 'default' ? 'default' : 'secondary'} className=\"shrink-0\">\n {selo.label}\n </Badge>\n )}\n </div>\n\n {/* Os números PAREADOS, cada um na sua caixa. A caixa existe para\n destacar; por isso são dois ou três, e não a ficha inteira. */}\n {caixas.length > 0 && (\n <div className=\"grid gap-2\" style={{ gridTemplateColumns: `repeat(${Math.min(caixas.length, 3)}, minmax(0, 1fr))` }}>\n {caixas.map((t: { label: string; value: string }) => (\n <div key={t.label} className=\"rounded-lg bg-muted/40 px-3 py-2\">\n <p className=\"truncate text-[11px] text-muted-foreground\">{t.label}</p>\n <p className=\"truncate text-sm font-semibold\">{t.value}</p>\n </div>\n ))}\n </div>\n )}\n\n {/* A frase sobre o que falta. «Nenhum item associado.» é a diferença\n entre um cartão que informa e um que só enfeita. */}\n {nota && <p className=\"text-xs text-muted-foreground\">{nota}</p>}\n\n {/* A FICHA: rótulo à esquerda, valor à direita.\n Antes eram os valores soltos, um ao lado do outro — «Chapa\n Produção Sim» —, e um cartão que enfileira valores sem dizer do\n que são obriga a adivinhar. É o desenho do V1, onde cada tela da\n cozinha mostra Função · Estado · Tempo-meta · Ordem, cada um com\n o seu nome. Quatro linhas: além disso o cartão vira tabela, e\n quem precisa de tabela troca a visão. */}\n {caixas.length === 0 && visibleFields.length > 0 && (\n <dl className=\"space-y-1 text-xs\">\n {visibleFields.slice(0, 4).map((field) => {\n const val = formatValue(field, record[field.key])\n return (\n <div key={field.key} className=\"flex items-baseline justify-between gap-3\">\n <dt className=\"shrink-0 text-muted-foreground\">{field.label}</dt>\n <dd className=\"min-w-0 truncate text-right font-medium\">\n {/* Vazio se escreve, e não se some: um campo em branco é\n informação («não tem tempo-meta»), e sumir com a\n linha muda a altura de cada cartão da grade. */}\n {val ?? <span className=\"text-muted-foreground\">—</span>}\n </dd>\n </div>\n )\n })}\n </dl>\n )}\n\n {/* As AÇÕES. A primeira ocupa a largura — é o que se veio fazer; as\n outras ficam ao lado, como ícone, para não disputarem com ela. */}\n {(acoes.length > 0 || onEditRecord) && (\n <div className=\"mt-auto flex items-center gap-2 pt-1\">\n {acoes.map((a: NonNullable<typeof entityDef.card>['actions'] extends (infer U)[] | undefined ? U : never, i: number) => {\n const Icone = a.icon ? getLucideIcon(a.icon) : null\n return (\n <Button\n key={a.id}\n variant={a.variant === 'outline' || i > 0 ? 'outline' : 'default'}\n size=\"sm\"\n className={i === 0 ? 'flex-1' : 'shrink-0'}\n aria-label={a.iconOnly ? a.label : undefined}\n onClick={(e: React.MouseEvent) => { e.stopPropagation(); a.onAction(item) }}\n >\n {Icone && <Icone className={a.iconOnly ? 'h-4 w-4' : 'mr-1.5 h-4 w-4'} />}\n {!a.iconOnly && a.label}\n </Button>\n )\n })}\n {/* O LÁPIS, pequeno e à direita do CTA. Vai direto para a\n edição: quem o toca já sabe o que quer mudar, e passar pela\n leitura antes é um toque a mais em todo ajuste. */}\n {onEditRecord && (\n <Button\n variant=\"outline\" size=\"sm\" className=\"shrink-0\"\n aria-label={`Editar ${record[displayField] ?? ''}`.trim()}\n onClick={(e: React.MouseEvent) => { e.stopPropagation(); onEditRecord(item) }}\n >\n <Pencil className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n )}\n </Card>\n )\n })}\n </div>\n )\n}\n","import * as React from 'react'\nimport type { PermissionAction } from '@fayz-ai/core'\nimport { usePermissionOptional } from './context'\n\ninterface PermissionGateProps {\n feature: string\n action: PermissionAction\n children: React.ReactNode\n fallback?: React.ReactNode\n}\n\n/** Renders children only when the current user has the given feature+action. */\nexport function PermissionGate({ feature, action, children, fallback }: PermissionGateProps) {\n const can = usePermissionOptional()\n if (!can(feature, action)) return <>{fallback ?? null}</>\n return <>{children}</>\n}\n","import * as React from 'react'\nimport { UpgradePrompt } from './UpgradePrompt'\nimport { useAccessOptional, useLimit, useUpgradeModalStore } from './access-contract'\n\n// ---------------------------------------------------------------------------\n// EntitlementGate — plan-level gate. Renders children only when the current\n// plan entitles `feature`; otherwise the fallback (default: an inline\n// UpgradePrompt). Role gating stays with the native PermissionGate — this is\n// strictly the plan axis.\n// ---------------------------------------------------------------------------\n\nexport interface EntitlementGateProps {\n feature: string\n children: React.ReactNode\n fallback?: React.ReactNode\n}\n\nexport function EntitlementGate({ feature, children, fallback }: EntitlementGateProps) {\n const access = useAccessOptional()\n if (access.entitled(feature)) return <>{children}</>\n return <>{fallback ?? <UpgradePrompt inline feature={feature} />}</>\n}\n\n// ---------------------------------------------------------------------------\n// LimitGate — quantity cap gate for \"+ Add\" style actions. When the limit is\n// reached, the children are dimmed and any click is intercepted (capture phase)\n// to open the global UpgradeModal instead of firing the underlying handler.\n// Below the cap it's a transparent pass-through.\n// ---------------------------------------------------------------------------\n\nexport interface LimitGateProps {\n limitKey: string\n children: React.ReactNode\n className?: string\n}\n\nexport function LimitGate({ limitKey, children, className }: LimitGateProps) {\n const limit = useLimit(limitKey)\n const openModal = useUpgradeModalStore((s) => s.open)\n\n if (!limit.atLimit) return <>{children}</>\n\n const intercept = (e: React.MouseEvent) => {\n e.preventDefault()\n e.stopPropagation()\n openModal({ limitKey })\n }\n\n return (\n <span\n className={className}\n onClickCapture={intercept}\n style={{ cursor: 'not-allowed' }}\n // Dim to signal the cap while keeping the trigger discoverable.\n data-limit-reached=\"\"\n >\n <span className=\"pointer-events-none opacity-60\" aria-disabled>\n {children}\n </span>\n </span>\n )\n}\n","import { create } from 'zustand'\nimport { useUnitStore } from './store'\n\nexport interface UnitSwitchTarget {\n /** `undefined` = \"todas as unidades\", que é uma escolha como outra qualquer. */\n unitId: string | undefined\n /** O nome que a transição mostra — o único fato que a torna concreta. */\n unitName: string\n}\n\nexport interface UnitSwitchingStore {\n /** A unidade sendo entrada, enquanto a transição está na tela. */\n target: UnitSwitchTarget | null\n /** Grava a escolha, levanta a transição e termina num reload. */\n begin: (target: UnitSwitchTarget) => void\n cancel: () => void\n}\n\n/**\n * Trocar de unidade, como a troca de workspace: decidir agora, reconstruir do\n * outro lado de um reload.\n *\n * TROCAR NO LUGAR NÃO FUNCIONA, e é a mesma razão de `switching.store` do org.\n * `setActive` troca a unidade ativa e limpa o cache de leitura do core — mas a\n * agenda, o estoque, o financeiro e a tela aberta seguem com as linhas da\n * unidade ANTERIOR nos seus próprios stores, que ninguém invalida centralmente.\n * O resultado é uma casca que diz \"Américas Shopping\" com uma grade embaixo\n * listando os profissionais da Copacabana: para quem lê a tela isso é um\n * vazamento de escopo, mesmo que o banco não tenha entregado uma linha a mais.\n *\n * E sem cobertura o reload lê como travamento: a tela apaga, volta, e os\n * números mudaram. A transição diz o que está acontecendo, então o segundo que\n * isso custa é gasto à vista em vez de sob suspeita.\n */\nexport const useUnitSwitchingStore = create<UnitSwitchingStore>((set) => ({\n target: null,\n\n begin: (target) => {\n // ANTES do reload, e nesta ordem:\n // `setActive` grava o pino no servidor (`set_entry_unit`) e pinta o\n // retrato local — é o que faz a escolha sobreviver ao reload que vem a\n // seguir. Sem isto a transição devolveria a pessoa à unidade anterior,\n // que é pior do que não ter transição nenhuma.\n useUnitStore.getState().setActive(target.unitId, 'manual')\n set({ target })\n },\n\n cancel: () => set({ target: null }),\n}))\n","import * as React from 'react'\nimport { Building2 } from 'lucide-react'\nimport type { ListFilterDef } from '@fayz-ai/ui'\nimport { useUnitStore } from './store'\nimport type { Unit } from './data'\nimport { useUnitBootstrap } from './useUnitBootstrap'\nimport { useUnitSwitchingStore } from './switching.store'\nimport { useTranslation } from '../hooks/useTranslation'\nimport { usePermissionOptional } from '../permissions/context'\nimport { navigateApp } from '@fayz-ai/core'\n\nexport interface UnitFilterOption {\n id: string\n name: string\n}\n\nexport interface UnitFilter {\n /** False when the tenant has no unit mode, or the person reaches one unit or\n * none: a filter with a single option is a control that lies. */\n visible: boolean\n /** `undefined` = every unit the person reaches (never the whole tenant: the\n * database fences the rest). */\n value: string | undefined\n setValue: (unitId: string | undefined) => void\n options: UnitFilterOption[]\n label: string\n allLabel: string\n /** Ready for `ListFilterBar.filters`; null when not `visible`. */\n def: ListFilterDef | null\n}\n\nfunction label(t: (k: string) => string, key: string, fallback: string): string {\n const v = t(key)\n return !v || v === key ? fallback : v\n}\n\n/** The units a person may pick: the ones they reach, branches only (a region\n * is a grouping, not somewhere rows live), active, by name. Same fallback as\n * the switcher when the pool predates per-person reach. */\nexport function unitFilterOptions(units: Unit[], myUnitIds: string[]): UnitFilterOption[] {\n const byId = new Map(units.map((u) => [u.id, u]))\n const ids = myUnitIds.length > 0 ? myUnitIds : units.map((u) => u.id)\n return ids\n .map((id) => byId.get(id))\n .filter((u): u is Unit => Boolean(u) && u!.kind !== 'region' && u!.isActive !== false)\n .map((u) => ({ id: u.id, name: u.name }))\n .sort((a, b) => a.name.localeCompare(b.name))\n}\n\n/** A unit the person no longer reaches falls back to \"all of mine\" rather\n * than an empty list that reads as missing data. */\nexport function standableUnit(raw: string | undefined, options: UnitFilterOption[]): string | undefined {\n return raw && options.some((u) => u.id === raw) ? raw : undefined\n}\n\nexport function unitFilterVisible(unitMode: boolean, options: UnitFilterOption[]): boolean {\n return unitMode && options.length > 1\n}\n\n/**\n * The \"Unidade\" filter every list shows under unit mode.\n *\n * - `scope: 'list'` (default) — the V1 behaviour: the list starts on the unit\n * the person is standing in, can be pointed at another reachable unit or at\n * all of them, and snaps back when the active unit changes. The caller\n * narrows its own query with `value`.\n * - `scope: 'global'` — for lists whose provider already narrows by the active\n * unit (the generic CRUD): picking here switches the active unit itself.\n *\n * Options are only the units the person reaches. This narrows, it never\n * grants: RLS decides what is readable, so a stale or forged value can hide\n * rows, never reveal one.\n */\nexport function useUnitFilter(options: { scope?: 'list' | 'global' } = {}): UnitFilter {\n const scope = options.scope ?? 'list'\n useUnitBootstrap()\n const { t } = useTranslation()\n const unitMode = useUnitStore((s) => s.unitMode)\n const units = useUnitStore((s) => s.units)\n const byId = useUnitStore((s) => s.byId)\n const myUnitIds = useUnitStore((s) => s.myUnitIds)\n const activeUnitId = useUnitStore((s) => s.activeUnitId)\n const beginSwitch = useUnitSwitchingStore((s) => s.begin)\n const can = usePermissionOptional()\n // Same gate as the units table's write policies (units.manage).\n const canManageUnits = can('units', 'manage')\n\n const reachable = React.useMemo(() => unitFilterOptions(units, myUnitIds), [units, myUnitIds])\n\n const [local, setLocal] = React.useState<string | undefined>(activeUnitId)\n // Switching unit in the shell re-anchors every list on the new one — the\n // same reset V1 did when `currentUnit` changed.\n React.useEffect(() => { setLocal(activeUnitId) }, [activeUnitId])\n\n const raw = scope === 'global' ? activeUnitId : local\n const value = standableUnit(raw, reachable)\n\n const filterLabel = label(t, 'units.filterLabel', 'Unidade')\n const allLabel = label(t, 'units.filterAll', 'Todas as minhas unidades')\n\n const setValue = React.useCallback((next: string | undefined) => {\n if (scope === 'global') {\n if (next === activeUnitId) return\n beginSwitch({ unitId: next, unitName: next ? (byId[next]?.name ?? '') : allLabel })\n return\n }\n setLocal(next)\n }, [scope, activeUnitId, beginSwitch, byId, allLabel])\n\n const visible = unitFilterVisible(unitMode, reachable)\n\n const def = React.useMemo<ListFilterDef | null>(() => visible ? {\n id: 'unit',\n label: filterLabel,\n icon: Building2,\n allLabel,\n options: reachable.map((u) => ({ value: u.id, label: u.name })),\n value,\n onChange: setValue,\n // Unit names are typed, not scrolled for — search even for a short list.\n searchable: true,\n searchPlaceholder: label(t, 'units.search', 'Buscar unidade'),\n manage: canManageUnits\n ? { label: label(t, 'units.manage', 'Gerenciar unidades'), onSelect: () => { navigateApp('#/settings/locations') } }\n : undefined,\n } : null, [visible, filterLabel, allLabel, reachable, value, setValue, canManageUnits, t])\n\n return { visible, value: visible ? value : (unitMode ? activeUnitId : undefined), setValue, options: reachable, label: filterLabel, allLabel, def }\n}\n","import React, { useMemo, useState } from 'react'\nimport { AlertTriangle, ArrowDown, ArrowUp, ArrowUpDown, Check, Download, Inbox, RefreshCw, Search, Trash2, Upload } from 'lucide-react'\nimport type { ColumnDef as TanStackColumnDef } from '@tanstack/react-table'\nimport { getScopedResource, useTranslation } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\nimport { Card, Input } from '@fayz-ai/ui'\nimport { PageActions, type PageAction } from '../plugins/PageActions'\nimport { Button, RefreshButton, getLucideIcon } from '@fayz-ai/ui'\nimport { DataTable, type DataTableGroupBy } from '@fayz-ai/ui'\nimport { Dropdown, DropdownTrigger, DropdownContent, DropdownItem, DropdownLabel, DropdownSeparator } from '@fayz-ai/ui'\nimport { BulkActionBar, ListFilterBar, Pagination, PageHeaderActions, PageTabs, Hint, StatTiles, cn, useRowSelection, type HeaderTab, type RowBulkAction, type StatTileData } from '@fayz-ai/ui'\nimport { fieldToColumns, renderDisplayCell } from './fieldToColumn'\nimport { CrudCardGrid } from './CrudCardGrid'\nimport { PermissionGate } from '../permissions/PermissionGate'\nimport { usePermissionOptional } from '../permissions/context'\nimport { LimitGate } from '../components/billing/gates'\nimport { QuickActionsButton } from '../plugins/QuickActionsButton'\nimport { askAI, type AskAIIntro } from '../components/AskAI'\nimport { useUnitFilter } from '../units/useUnitFilter'\nimport type { PluginQuickAction } from '../types/plugins'\n\n/** A resolved facet: a field plus the options to render. */\nexport interface CrudFacet {\n field: string\n options: { value: string; label: string }[]\n allLabel?: string\n /** Nome acessível do filtro (\"Status\"). A pastilha mostra o VALOR escolhido,\n * então sem isto um leitor de tela anunciaria só \"Ativo\". */\n label?: string\n /**\n * SEM EFEITO desde que os status desceram para a linha da busca: toda faceta\n * é pastilha. A faixa de abas ficou para as abas de VISTA (navTabs), que\n * trocam o que se está vendo — um filtro não faz isso. Mantido porque\n * manifestos de app ainda o declaram; declarar 'tabs' hoje não muda nada.\n */\n display?: 'pills' | 'tabs'\n}\n\n/**\n * \"Criar com IA\" on a list, and what the assistant knows while it is open.\n *\n * `instructions` and `uniqueFields` are what turn a generic create into one\n * that can actually finish: the first says how THIS entity is filled, the\n * second publishes the values already taken so an invented identifier does not\n * collide with a row that exists.\n */\nexport interface CrudAiCreate {\n hint?: string\n description?: string\n intro?: AskAIIntro\n /** Guidance appended to the generic create guidance while the list is open. */\n instructions?: string\n /** Field keys that must not repeat (a coupon code, a slug). */\n uniqueFields?: string[]\n}\n\n/**\n * A sibling list this one sits beside — rendered in the header strip next to (or\n * instead of) the facet tabs, as a link rather than a filter. This is what turns\n * Clientes / Grupos / Segmentos into one destination with three views instead of\n * three unrelated sidebar entries.\n */\nexport interface CrudNavTab {\n id: string\n label: string\n icon?: React.ComponentType<{ className?: string }>\n /** Fires when the tab is picked. The active tab's handler is never called. */\n onSelect: () => void\n}\n\n/** Sentinel for the facet tab that clears the filter — no field value is ''. */\nconst ALL_TAB = '__all__'\n\n/**\n * One entry in the bar that appears when rows are ticked. It receives the\n * selected ROWS, not their ids: an action that has to go back to the store to\n * learn what it is acting on is an action that can act on stale data.\n *\n * The same shape a plugin's own ListView takes — one contract for both.\n */\nexport type CrudBulkAction<T> = RowBulkAction<T>\n\n/** The entity's own lucide icon, for its empty state. Resolved by name off the\n * lucide export map rather than a curated table: every EntityDef already\n * carries an icon name, and a second hand-maintained map is a second place for\n * a new entity to silently fall back to a generic box. */\nfunction getEntityIcon(name: string): React.ComponentType<{ className?: string; strokeWidth?: number }> {\n // The SDK's icon registry, not a namespace import of lucide (~500 KB in\n // every app). A name outside it is added with `registerIcons`.\n return (getLucideIcon(name) ?? Inbox) as React.ComponentType<{ className?: string; strokeWidth?: number }>\n}\n\nexport interface CrudListViewProps<T extends { id: string }> {\n entityDef: EntityDef<T>\n /** TanStack columns. When omitted, derived from entityDef.fields (no actions column). */\n columns?: TanStackColumnDef<T, any>[]\n /** null = initial load (skeleton); [] = empty state. */\n items: T[] | null\n total: number\n /** O total é aproximado — a contagem exata não coube no prazo. O rodapé diz. */\n totalIsEstimate?: boolean\n /** 1-based current page. Together with `total` it drives the table footer. */\n page?: number\n /** Rows per page — must match what the caller asked the provider for, or the\n * footer's \"1–50 de 1.234\" would describe a page that isn't on screen. */\n pageSize?: number\n /** With it, the pager offers how many rows a page shows. */\n onPageSizeChange?: (size: number) => void\n /** Renders the pager. Without it the footer still reports the count. */\n onPageChange?: (page: number) => void\n display?: 'table' | 'cards'\n /** Search box — rendered when onSearchChange is provided. */\n search?: string\n onSearchChange?: (value: string) => void\n searchPlaceholder?: string\n /** Facet pills below the search box. */\n facets?: CrudFacet[]\n activeFilters?: Record<string, string | undefined>\n onFacetChange?: (field: string, value: string | undefined) => void\n onNew?: () => void\n addLabel?: string\n onRowClick?: (row: T) => void\n /**\n * A frase do vazio, quando a entidade tem uma melhor que a genérica.\n *\n * O texto padrão («O que você cadastrar aparece aqui») descreve o\n * mecanismo; uma lista relacionada costuma saber dizer a CONSEQUÊNCIA —\n * «sem regra, esta tela não recebe nada». Declarada em\n * `RelatedList.emptyHint`, e até aqui era descartada quando a lista\n * aparecia como ABA, porque só a seção a lia.\n */\n emptyHint?: string\n /** Abre o registro já em EDIÇÃO — o lápis do cartão. */\n onEditRecord?: (row: T) => void\n /** Delete action for the card grid (table actions live in the columns). */\n onDelete?: (row: T) => void\n /** Actions offered for a selection of rows. Their presence is what turns the\n * checkbox column on — a list nobody can act on in bulk gets no checkboxes. */\n bulkActions?: CrudBulkAction<T>[]\n /** Appends the standard destructive Delete to the bulk bar, RBAC-gated. */\n onBulkDelete?: (rows: T[]) => void\n onImport?: () => void\n onExport?: () => void\n /**\n * Offer \"Criar com IA\" in the create menu.\n *\n * OPT-IN, not automatic, and the reason is honesty: the assistant reaches a\n * record through the data primitives, which only see entities a plugin\n * published in `queryEntities`. Turn it on where the entity IS reachable —\n * elsewhere the door would open on an assistant that cannot do the thing.\n */\n aiCreate?: CrudAiCreate\n feature?: string\n readOnly?: boolean\n /** Esta lista é uma SEÇÃO de outra tela, não a tela. Mantém as ações no\n * corpo em vez de mandá-las para a barra, que pertence à tela de fora. */\n embedded?: boolean\n emptyMessage?: string\n /** Sibling views shown as header tabs. `activeNavTab` marks which is this one. */\n navTabs?: CrudNavTab[]\n activeNavTab?: string\n /** Extra controls placed in the header action row, before the New button. */\n headerActions?: React.ReactNode\n /** Summary tiles between the header and the table. */\n stats?: StatTileData[]\n /** Refetch the list. Renders the toolbar's refresh button when provided;\n * return the fetch promise so the button can spin until it settles. */\n onRefresh?: () => void | Promise<void>\n /** True when the rows on screen were answered from the local cache. The\n * refresh button changes tone to say so — the merchant can tell a cached\n * list from a live one at a glance, and the way out is one click. */\n refreshFromCache?: boolean\n /** Sort by a field key. Called again with the same key to flip direction. */\n onSort?: (field: string) => void\n /** Pick the sort FIELD without touching the direction. Falls back to onSort. */\n onSortField?: (field: string) => void\n /** Set the direction explicitly (the menu says \"Crescente\"/\"Decrescente\"). */\n onSortDir?: (dir: 'asc' | 'desc') => void\n sortBy?: string\n sortDir?: 'asc' | 'desc'\n /** Last read failure. Renders a banner above the table so a broken list is\n * never mistaken for an empty one. */\n error?: string | null\n /** Groups table rows under collapsible headers with a per-group count. */\n groupBy?: DataTableGroupBy<T>\n /** Rows on a phone: stacked cards by default; `table` keeps the scrolling grid. */\n mobileLayout?: 'table' | 'cards'\n}\n\n/**\n * The canonical generic list — header (count + New + import/export), search,\n * faceted filter pills, and a DataTable/card grid. Decoupled from data and\n * routing: feed it `items` and callbacks. Used by CrudPage (store-backed) and by\n * plugins that own their data/routing (e.g. the inventory product list).\n */\nexport function CrudListView<T extends { id: string }>({\n entityDef,\n columns,\n items,\n total,\n totalIsEstimate,\n page = 1,\n pageSize = 50,\n onPageSizeChange,\n onPageChange,\n display = 'table',\n search,\n onSearchChange,\n searchPlaceholder,\n facets,\n activeFilters,\n onFacetChange,\n onNew,\n addLabel,\n onRowClick,\n onEditRecord,\n emptyHint,\n onDelete,\n bulkActions,\n onBulkDelete,\n onImport,\n onExport,\n aiCreate,\n feature,\n readOnly,\n embedded,\n emptyMessage,\n navTabs,\n activeNavTab,\n headerActions,\n stats,\n onRefresh,\n refreshFromCache,\n onSort,\n onSortField,\n onSortDir,\n sortBy,\n sortDir,\n error,\n groupBy,\n mobileLayout = 'cards',\n}: CrudListViewProps<T>) {\n const t = useTranslation()\n // Translatable or nothing: `namePlural` is the same raw literal `name` is, and\n // \"Buscar locations...\" / \"Nenhum(a) locations ainda\" is the same bug the add\n // button had. `crud.list.*` all read correctly with a generic noun.\n // An entity that declares a translatable noun gets sentences built around it;\n // one that does not gets sentences written without a noun, rather than a\n // pt-BR frame wrapped around an English word.\n const pluralKey = entityDef.namePluralKey ?? entityDef.nameKey\n const namePlural = pluralKey ? t(pluralKey) : null\n const ts = (key: string, params?: Record<string, string>) =>\n namePlural ? t(`crud.list.${key}`, { entities: namePlural.toLowerCase(), ...params }) : t(`crud.list.${key}Generic`)\n const displayField = entityDef.displayField ?? entityDef.fields[0]?.key ?? 'id'\n\n const derivedColumns = useMemo<TanStackColumnDef<T, any>[]>(() => {\n return fieldToColumns(entityDef.fields).map((col) => ({\n accessorKey: col.key,\n header: col.label,\n // A ordenação NÃO mora na coluna. Com uma setinha por cabeçalho, a linha\n // de títulos vira uma fileira de controles e ainda assim só ordena pelo\n // que está visível — o dropdown de ordenar ao lado da busca lista todos\n // os campos e diz a direção com todas as letras.\n enableSorting: false,\n meta: { truncate: true, mobile: col.key === displayField ? 'title' : col.mobile },\n cell: ({ row }: any) => {\n const value = row.original[col.key]\n const rendered = col.render(value, row.original)\n return col.key === displayField ? renderDisplayCell(entityDef, value, rendered, row.original) : rendered\n },\n }))\n }, [entityDef, displayField])\n\n const tanColumns = columns ?? derivedColumns\n\n const isInitialLoad = items === null\n const isEmpty = items !== null && items.length === 0\n const hasImportExport = Boolean(onImport || onExport)\n\n // --- Selection -----------------------------------------------------------\n // State and pruning rules live in useRowSelection, shared with ListView; what\n // is CRUD-specific is only the delete action and its permission gate.\n const can = usePermissionOptional()\n const canBulkDelete = Boolean(onBulkDelete) && !readOnly && (!feature || can(feature, 'delete'))\n const rowActions = useMemo<RowBulkAction<T>[]>(() => [\n ...(bulkActions ?? []),\n ...(canBulkDelete\n ? [{\n id: '__delete__',\n label: t('crud.list.bulkDelete'),\n icon: Trash2,\n destructive: true,\n onSelect: (rows: T[]) => onBulkDelete!(rows),\n }]\n : []),\n ], [bulkActions, canBulkDelete, onBulkDelete, t])\n const selection = useRowSelection<T>({\n rows: items,\n actions: rowActions,\n // Table display only: the card grid has no row to hang a checkbox off.\n enabled: display === 'table',\n })\n const { selectedIds, barActions, selectable, hasSelection } = selection\n\n // The header strip. Sibling views (navTabs) outrank a status facet for the\n // slot: they change WHAT you're looking at, the facet only narrows it, and\n // stacking both would put two tab strips in one header. A list with both\n // keeps the facet as pills in the body, where it already lived.\n // A faixa é só das ABAS DE VISTA (Pedidos / Assinaturas): elas trocam O QUE\n // você está vendo. Um status é FILTRO — estreita a mesma lista —, e filtro\n // mora na linha da busca, dentro do card, com tudo o mais que age sobre as\n // mesmas linhas. Um status promovido a banda gastava uma faixa inteira da\n // página para dizer o que uma pastilha diz ao lado do campo de busca.\n const headerTabs: HeaderTab[] | null = navTabs?.length\n ? navTabs.map((t) => ({ value: t.id, label: t.label, icon: t.icon }))\n : null\n const headerTabValue = activeNavTab ?? navTabs?.[0]?.id ?? ALL_TAB\n const onHeaderTabChange = (next: string) => {\n navTabs?.find((t) => t.id === next)?.onSelect()\n }\n // TODAS as facetas viram pastilha ao lado da busca — inclusive a que pedia\n // `display: 'tabs'`, que deixou de ter efeito (ver CrudFacet.display).\n const pillFacets = facets\n\n // Same rule the provider uses (core/data/resolve.ts): the database registry\n // says which tables carry a unit, and an entity may opt out. The provider\n // already narrows these by the active unit, so the filter switches it.\n const unitScoped = entityDef.data?.unitScoped ?? Boolean(getScopedResource(entityDef.data?.table))\n const unitFilter = useUnitFilter({ scope: 'global' })\n const unitDef = unitScoped ? unitFilter.def : null\n\n // The noun is used only when the entity offers a TRANSLATABLE one. `name` is\n // a raw literal from whoever declared the entity, and 31 of them are English,\n // so interpolating it into a pt-BR sentence read \"Adicionar Location\". With\n // no key the button just says \"Adicionar\" — which is complete, because the\n // screen above it already names what is being listed.\n const entityNoun = entityDef.nameKey ? t(entityDef.nameKey) : null\n const newLabel = addLabel ?? (entityNoun ? t('crud.list.addEntity', { entity: entityNoun }) : t('common.add'))\n const plainNewLabel = newLabel\n\n // Create, import and describe-it are ONE control with the routes inside, not\n // three buttons and a divider: they all answer \"get records in here\", and\n // split across the corner they read as rival primary actions. With only one\n // route there is no menu to open — the button just does the thing.\n const createRoutes: PluginQuickAction[] = []\n if (onNew && !readOnly) {\n if (aiCreate) {\n createRoutes.push({\n id: 'ai',\n label: t('assistant.askAI'),\n description: aiCreate.description ?? t('crud.list.aiHint', { entity: entityDef.name }),\n icon: 'WandSparkles',\n highlight: true,\n action: () => askAI({\n hint: aiCreate.hint ?? t('crud.list.aiPlaceholder', { entity: entityDef.name }),\n intro: aiCreate.intro,\n }),\n })\n }\n createRoutes.push({ id: 'new', label: plainNewLabel, description: t('crud.list.newHint'), icon: 'Plus', action: onNew })\n }\n if (onImport) {\n createRoutes.push({ id: 'import', label: t('crud.import.action'), description: t('crud.import.hint'), icon: 'Upload', action: onImport })\n }\n\n // One declared set, rendered by the shell's contract. This used to build the\n // button here and wrap it in its own PermissionGate/LimitGate pair — the same\n // gating every other screen re-implemented slightly differently.\n const createActions = React.useMemo<PageAction[]>(() => {\n const out: PageAction[] = createRoutes.map((qa, i) => ({\n id: qa.id,\n label: qa.label,\n description: qa.description,\n icon: qa.icon ? getLucideIcon(qa.icon) : undefined,\n // Create is the primary even when the assistant route is listed first:\n // the menu's order is about emphasis, the button is about the default.\n intent: qa.id === 'new' ? 'primary' : 'secondary',\n ai: qa.id === 'ai',\n creates: true,\n // A spreadsheet import needs a file picker and a column mapping — a job\n // a phone cannot finish, so the phone is not offered it.\n desktopOnly: qa.id === 'import',\n onSelect: () => qa.action(),\n permission: feature ? { feature, action: 'create' as const } : undefined,\n limitKey: entityDef.limitKey,\n }))\n // Nothing to create, but records can still be brought in.\n if (out.length === 0 && onImport) {\n out.push({\n id: 'import',\n label: t('crud.import.action'),\n icon: Upload,\n intent: 'primary',\n desktopOnly: true,\n onSelect: onImport,\n permission: feature ? { feature, action: 'create' as const } : undefined,\n limitKey: entityDef.limitKey,\n })\n }\n if (!out.some((a) => a.intent === 'primary') && out.length > 0) out[0].intent = 'primary'\n return out\n }, [createRoutes, feature, entityDef.limitKey, onImport, t])\n\n const gatedNewButton = createActions.length > 0 ? <PageActions actions={createActions} /> : null\n\n // Composed the same way the shell does everywhere else: RBAC hides, a plan\n // cap keeps the control and opens the upgrade path. Kept here for the EMPTY\n // state below, which still draws its own single button.\n const gate = (node: React.ReactNode) => {\n const roleGated = feature\n ? <PermissionGate feature={feature} action=\"create\">{node}</PermissionGate>\n : node\n return entityDef.limitKey\n ? <LimitGate limitKey={entityDef.limitKey}>{roleGated}</LimitGate>\n : roleGated\n }\n const gatedCreateButton = onNew && !readOnly\n ? gate(<Button onClick={onNew}>{newLabel}</Button>)\n : null\n\n // An empty list is the screen a merchant sees FIRST, on every entity, before\n // they have done anything. A one-line \"no results\" in a table cell wastes it;\n // this says what the thing is and offers the one action that fixes it.\n // A facet sitting on its declared default (\"Ativos\") is how the list opens,\n // not a search the person made: counting it made every empty list say\n // \"Nenhum resultado para esta busca\" and hid the create button.\n const facetDefaults = new Map((entityDef.facets ?? []).map((f) => [f.field, f.defaultValue]))\n const isFiltered = Boolean(search?.trim()) ||\n Object.entries(activeFilters ?? {}).some(([k, v]) => v != null && String(v) !== String(facetDefaults.get(k)))\n const EmptyIcon = getEntityIcon(entityDef.icon)\n const emptyState = (\n <div className=\"flex flex-col items-center gap-1 py-6\">\n <EmptyIcon className=\"mb-2 h-9 w-9 text-muted-foreground/40\" strokeWidth={1.5} />\n <p className=\"text-base font-semibold text-foreground\">\n {emptyMessage ?? (isFiltered\n ? ts('emptyFiltered')\n : ts('empty'))}\n </p>\n {/* Under a filter the fix is to clear it, not to create a record — so the\n create button stays out of the way there. */}\n {!isFiltered && (\n <>\n <p className=\"max-w-sm text-sm text-muted-foreground\">\n {emptyHint ?? ts('emptyHint')}\n </p>\n {gatedCreateButton && <div className=\"mt-3\">{gatedCreateButton}</div>}\n </>\n )}\n </div>\n )\n\n // Only page-level acts up here. Export, refresh and sort are NOT — they act on\n // the rows in front of you, so they live in the table toolbar next to the\n // search that filters them.\n const actions = (headerActions || gatedNewButton) ? (\n <div className=\"flex items-center gap-2\">\n {headerActions}\n {gatedNewButton}\n </div>\n ) : null\n\n // Ordenável ≠ visível. Enquanto a ordenação morava no cabeçalho da tabela as\n // duas coisas eram a mesma — só dava para ordenar pelo que estava desenhado.\n // Fora do cabeçalho, esconder uma coluna não tem por que tirar o campo do\n // menu; e \"criado em\"/\"última edição\", que quase nenhuma lista mostra, são\n // justamente por onde mais se quer ordenar.\n const sortableColumns = useMemo(() => {\n const declared = entityDef.fields\n .filter((f) => f.sortable !== false)\n .map((f) => ({ key: f.key, label: f.label }))\n const has = new Set(declared.map((f) => f.key))\n\n // Só oferecidos se o registro REALMENTE os carrega — um item do menu que\n // não muda a ordem é pior que a ausência dele.\n const sample = items?.[0] as Record<string, unknown> | undefined\n const implicit = [\n { key: 'createdAt', label: t('crud.list.sortCreatedAt') },\n { key: 'updatedAt', label: t('crud.list.sortUpdatedAt') },\n ].filter((f) => !has.has(f.key) && sample != null && sample[f.key] != null)\n\n return [...declared, ...implicit]\n }, [entityDef.fields, items, t])\n\n // The list's own utilities — sort, refresh, export. They act on what is\n // SHOWN, so they stay with the list rather than moving to the page header\n // (see PageToolbar's note on that split). What they did not have was the\n // shared button: this was a hand-written ghost at 32px, which is both a\n // fourth icon-button look and under the touch floor. `fz-tap` grows it to\n // 44px on a coarse pointer and leaves the desktop size alone.\n const iconBtn = 'fz-tap text-muted-foreground'\n\n const searchBox = onSearchChange ? (\n <div className=\"relative\">\n <Search className=\"pointer-events-none absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground\" />\n <Input\n type=\"text\"\n placeholder={searchPlaceholder ?? ts('search')}\n value={search ?? ''}\n onChange={(e) => onSearchChange(e.target.value)}\n // Borderless on purpose: the card already draws the boundary, and a\n // second box inside it would be a frame inside a frame.\n variant=\"bare\"\n className=\"py-1.5 pl-8 pr-3 text-sm\"\n />\n </div>\n ) : null\n\n // A MESMA barra de filtro de todas as listas do produto — ver ListFilterBar.\n // Era uma fileira de pastilhas SEMPRE abertas, uma por faceta, valendo ou\n // não: com quatro facetas a busca perdia metade da linha para controles que\n // ninguém tinha tocado. Agora o que está valendo aparece como pastilha e o\n // resto mora atrás do ícone de filtro, encostado à direita.\n //\n // Um filtro sem opções não filtra nada: a barra o descarta sozinha.\n // The unit is where the person stands, not an optional narrowing: it stays\n // out of the active count and \"Limpar\" never resets it.\n const facetActive = (pillFacets ?? []).filter((f) => activeFilters?.[f.field] != null && activeFilters[f.field] !== '').length\n const facetChips = (pillFacets && pillFacets.length > 0) || unitDef ? (\n <ListFilterBar\n className=\"ml-auto\"\n label={t('crud.list.filters')}\n clearLabel={t('crud.list.clearFilters')}\n filters={[\n ...(unitDef ? [unitDef] : []),\n ...(pillFacets ?? []).map((facet) => ({\n id: facet.field,\n label: facet.label ?? facet.field,\n allLabel: facet.allLabel ?? t('crud.list.allFacet'),\n options: facet.options,\n value: activeFilters?.[facet.field],\n onChange: (next: string | undefined) => onFacetChange?.(facet.field, next),\n })),\n ]}\n activeCount={facetActive}\n onClear={onFacetChange && pillFacets\n ? () => { for (const f of pillFacets) if (activeFilters?.[f.field] != null) onFacetChange(f.field, undefined) }\n : undefined}\n />\n ) : null\n\n const tableTools = (onSort || onRefresh || onExport) ? (\n <div className=\"flex shrink-0 items-center gap-0.5\">\n {onSort && sortableColumns.length > 0 && (\n <Dropdown>\n <DropdownTrigger asChild>\n <Hint label={t('crud.list.sort')}>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label={t('crud.list.sort')}\n className={cn(iconBtn, sortBy && 'text-foreground')}\n >\n {/* O ícone já mostra a direção em vigor: com a ordenação escondida\n num menu, um ↕ neutro deixaria \"ordenado por quê, para que\n lado\" invisível até abrir o menu. */}\n {sortBy\n ? (sortDir === 'desc' ? <ArrowDown className=\"h-4 w-4\" /> : <ArrowUp className=\"h-4 w-4\" />)\n : <ArrowUpDown className=\"h-4 w-4\" />}\n </Button>\n </Hint>\n </DropdownTrigger>\n <DropdownContent align=\"end\">\n <DropdownLabel>{t('crud.list.sortBy')}</DropdownLabel>\n {sortableColumns.map((f) => (\n <DropdownItem key={f.key} onClick={() => onSortField?.(f.key)}>\n {f.label}\n {sortBy === f.key && <Check className=\"ml-auto h-3.5 w-3.5 shrink-0 pl-1\" />}\n </DropdownItem>\n ))}\n {sortBy && (\n <>\n <DropdownSeparator />\n {/* Ascendente/descendente escrito, não um símbolo: \"↑\" não diz\n se é A→Z ou Z→A para quem chega na tela. */}\n <DropdownItem onClick={() => onSortDir?.('asc')}>\n <ArrowUp className=\"mr-2 h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n {t('crud.list.sortAsc')}\n {sortDir !== 'desc' && <Check className=\"ml-auto h-3.5 w-3.5 shrink-0 pl-1\" />}\n </DropdownItem>\n <DropdownItem onClick={() => onSortDir?.('desc')}>\n <ArrowDown className=\"mr-2 h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n {t('crud.list.sortDesc')}\n {sortDir === 'desc' && <Check className=\"ml-auto h-3.5 w-3.5 shrink-0 pl-1\" />}\n </DropdownItem>\n </>\n )}\n </DropdownContent>\n </Dropdown>\n )}\n {onRefresh && (\n <RefreshButton\n onRefresh={onRefresh}\n fromCache={refreshFromCache}\n label={t('crud.list.refresh')}\n labelCached={t('crud.list.refreshCached')}\n className={iconBtn}\n />\n )}\n {onExport && (\n <Hint label={t('crud.export.action')}>\n {/* A spreadsheet export lands in a phone's downloads and goes nowhere. */}\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" aria-label={t('crud.export.action')} onClick={onExport} className={cn(iconBtn, 'hidden md:inline-flex')}>\n <Download className=\"h-4 w-4\" />\n </Button>\n </Hint>\n )}\n </div>\n ) : null\n\n // O rodapé da tabela: quantos registros existem, e por onde se anda entre eles.\n //\n // As duas coisas juntas por necessidade. A lista sempre pediu uma página de 50\n // linhas ao provider e nunca desenhou um paginador — numa base com 1.200\n // clientes ela mostrava 50 e não havia NADA na tela dizendo que os outros 1.150\n // existiam. `total` já chegava aqui pronto (o provider conta), e era descartado.\n //\n // Contagem à esquerda, paginador à direita: um diz onde você está no conjunto,\n // o outro move. Sem linhas na tela não há rodapé — abaixo de um estado vazio\n // ele seria uma régua para um conjunto que não existe.\n const rows = items?.length ?? 0\n // `total` é a contagem do conjunto FILTRADO; se o provider foi chamado com\n // countMode 'none' ele vem 0, e aí a página que está na mão é tudo que dá para\n // afirmar.\n const totalItems = total > 0 ? total : rows\n // A PÁGINA CHEIA é a única prova de que há mais, e ela não depende do total.\n //\n // Quando o total é estimativa, ele erra: o planejador chutou ~953 num\n // conjunto de 3.545, e um paginador que confia nele para em 20 páginas e\n // deixa 2.500 clientes inalcançáveis — o mesmo defeito de antes, com outra\n // roupa. Se a página voltou cheia, existe pelo menos mais uma.\n const podeHaverMais = rows >= pageSize\n // The product's one pager (`Pagination` in @fayz-ai/ui). With no page\n // handler the strip is only the count.\n const tableFooter = !isInitialLoad && !isEmpty ? (\n <Pagination\n page={page}\n pageSize={pageSize}\n total={totalItems}\n onPageChange={onPageChange}\n onPageSizeChange={onPageSizeChange}\n noun={(namePlural ?? t('crud.list.records')).toLowerCase()}\n // No count at all (countMode 'none') is as unknown as an estimate.\n totalIsEstimate={totalIsEstimate || total <= 0}\n hasMore={podeHaverMais && (totalIsEstimate || total <= 0)}\n />\n ) : null\n\n return (\n <div className=\"space-y-6\">\n {/* No <h1> here, and no action row either. The shell's top bar already\n names the page from the active nav entry, and now it also carries the\n page's actions — Importar/Novo were spending a whole row of the body\n to sit where the bar had empty space, and every screen chose that row's\n height for itself. */}\n {actions && (embedded\n // Encaixada dentro de outra tela (um cadastro que é UMA seção de uma aba\n // de configurações, entre várias): a barra do topo é da tela de fora, e\n // mandar \"Adicionar embalagem\" para lá promove a sublista a ação\n // principal da página. Aqui ela fica ao lado do que governa.\n ? <div className=\"flex flex-wrap items-center justify-end gap-3\">{actions}</div>\n : <PageHeaderActions>{actions}</PageHeaderActions>)}\n {headerTabs && (\n // The same band a module's sub-nav draws, closed by the hairline that\n // crosses the page. Alunos ▸ Equipe and Financeiro ▸ Mensalidades are\n // the same kind of move — switching what the page shows — so they are\n // the same object on screen.\n <PageTabs\n className=\"mb-0\"\n tabs={headerTabs}\n value={headerTabValue}\n onChange={onHeaderTabChange}\n aria-label={namePlural ?? undefined}\n />\n )}\n\n {error && (\n <div className=\"flex items-start gap-2 rounded-lg border border-destructive/30 bg-destructive/5 px-4 py-3 text-sm\">\n <AlertTriangle className=\"mt-0.5 h-4 w-4 shrink-0 text-destructive\" />\n <div className=\"min-w-0\">\n <p className=\"font-medium text-foreground\">\n {ts('loadFailed')}\n </p>\n {/* The raw message, not a euphemism: \"relation does not exist\" and\n \"permission denied\" need completely different fixes, and only\n the real text tells you which one you have. */}\n <p className=\"mt-0.5 break-words text-muted-foreground\">{error}</p>\n </div>\n {onRefresh && (\n <Button variant=\"outline\" size=\"sm\" className=\"ml-auto shrink-0\" onClick={onRefresh}>\n {t('crud.list.refresh')}\n </Button>\n )}\n </div>\n )}\n\n {stats && stats.length > 0 && <StatTiles tiles={stats} loading={isInitialLoad} />}\n\n {display === 'cards' ? (\n // The card grid keeps the search box floating above it: there is no\n // table chrome for a toolbar to sit flush against.\n <>\n {(searchBox || facetChips) && (\n <div className=\"flex flex-wrap items-center gap-2\">\n {searchBox && <div className=\"min-w-0 max-w-sm flex-1\">{searchBox}</div>}\n {facetChips}\n </div>\n )}\n {isInitialLoad ? (\n <div className=\"fz-cards\">\n {Array.from({ length: 2 }).map((_, i) => (\n <Card key={i} className=\"overflow-hidden\">\n <div className=\"p-5 space-y-3\">\n <div className=\"h-5 w-2/3 animate-pulse rounded bg-muted\" />\n <div className=\"space-y-2\">\n <div className=\"flex justify-between\"><div className=\"h-4 w-20 animate-pulse rounded bg-muted\" /><div className=\"h-4 w-16 animate-pulse rounded bg-muted\" /></div>\n <div className=\"flex justify-between\"><div className=\"h-4 w-24 animate-pulse rounded bg-muted\" /><div className=\"h-4 w-12 animate-pulse rounded bg-muted\" /></div>\n </div>\n </div>\n </Card>\n ))}\n </div>\n ) : (\n <CrudCardGrid\n items={items ?? []}\n entityDef={entityDef as EntityDef<any>}\n onEdit={(item) => onRowClick?.(item as T)}\n onEditRecord={onEditRecord ? (item) => onEditRecord(item as T) : undefined}\n onDelete={(item) => onDelete?.(item as T)}\n />\n )}\n {tableFooter}\n </>\n ) : (\n /* Search, table tools and the table are ONE surface. They act on the\n same rows, so a search box floating on the page background above a\n separate table card read as two unrelated controls. */\n // `clip`, not `hidden`: a scroll container here would hold the table's sticky header.\n <Card style={{ overflow: 'clip' }}>\n {(searchBox || facetChips || tableTools || hasSelection) && (\n <div className=\"flex flex-wrap items-center gap-2 border-b border-border px-3 py-2\">\n {/* Uma seleção ativa TOMA a linha da busca em vez de abrir uma\n faixa acima dela: o Excluir fica na mesma linha das linhas\n sobre as quais age, e nada na página se desloca. Buscar com\n seleção em pé não existe — o filtro derruba a seleção. */}\n {hasSelection ? (\n <BulkActionBar\n variant=\"inline\"\n count={selectedIds.length}\n total={items?.length ?? 0}\n onSelectAll={selection.selectAll}\n onClear={selection.clear}\n actions={barActions}\n />\n ) : (\n <>\n <div className=\"min-w-[10rem] flex-1\">{searchBox}</div>\n {facetChips}\n {tableTools}\n </>\n )}\n </div>\n )}\n <DataTable\n variant=\"bare\"\n // A seta no cabeçalho é o rastro do menu de ordenar: ele fecha e,\n // sem ela, nada na tela dizia por qual coluna a lista foi ordenada.\n sortIndicator={sortBy ? { columnId: sortBy, dir: sortDir ?? 'asc' } : undefined}\n selectable={selectable}\n selectedIds={selectedIds}\n onSelectedIdsChange={selection.setSelectedIds}\n columns={tanColumns}\n data={isInitialLoad || isEmpty ? [] : (items ?? [])}\n loading={isInitialLoad}\n skeletonRows={isInitialLoad ? 3 : undefined}\n emptyMessage={emptyState}\n onRowClick={(row) => onRowClick?.(row as T)}\n groupBy={groupBy}\n mobileLayout={mobileLayout}\n />\n {tableFooter}\n </Card>\n )}\n </div>\n )\n}\n","import * as React from 'react'\nimport type { EntityDef, PluginAITool } from '@fayz-ai/core'\nimport { useAgentSurface } from '../hooks/useAgentSurface'\nimport { duplicateWrite, humanizeWriteError } from './write-errors'\nimport type { AgentSurfaceContribution } from '../lib/agent-surface'\n\n// ---------------------------------------------------------------------------\n// \"Cria um aqui\" — a list lending the assistant its own write path.\n//\n// The agent's global data primitives resolve a target by TABLE, from what a\n// plugin published in `queryEntities`. That covers a lot and misses the case\n// this exists for: an entity that has no table of its own because it lives\n// behind a provider (the shop's products, on a commerce API). For those, the\n// only thing that knows how to create one is the list the user is looking at.\n//\n// So the surface lends its store. Same call the form makes on Save, same\n// validation, same refresh — a record created by conversation and one created\n// by typing are the same record.\n//\n// ONE list at a time is the assumption. Two mounted at once would both claim\n// the tool name and the first to unmount would take the handler with it; lists\n// do not nest today, and `aiCreate` is opt-in per screen, so the case does not\n// arise. If it ever does, key the name by entity.\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Por que existe uma instrução, e não só a descrição da ferramenta.\n//\n// Sem ela o assistente PARA e pergunta campo a campo — \"qual o nome interno?\",\n// \"qual o código?\", \"ativo ou rascunho?\" — inclusive depois de o lojista\n// responder \"pode inventar\". Ele está certo em não inventar um FATO (um preço,\n// um prazo, um destinatário) e errado em tratar um RÓTULO como fato: o nome\n// interno e o código existem para o registro poder existir, e quem pediu o\n// cadastro não tem opinião sobre eles até vê-los.\n// ---------------------------------------------------------------------------\n\nconst CREATE_GUIDANCE = `\nEsta tela é uma lista de cadastro, e você pode criar um registro nela com \\`createRecordHere\\`.\n\nComo preencher:\n· O que o usuário disse manda. O resto você DERIVA do que ele disse — rótulo, nome interno, código, título são seus para escrever, não perguntas para fazer. \"Pode inventar\" já foi dito antes mesmo de ele digitar.\n· Prazo relativo vira data (\"até o fim da semana\" → o domingo desta semana). Você sabe a data de hoje.\n· Campo opcional que ninguém mencionou: deixe FORA. Vazio custa menos que errado — e o usuário abre o registro e completa.\n· Só pergunte o que muda o EFEITO do registro e que só o usuário sabe (um valor, um destinatário, um prazo que ele não disse). Uma pergunta, não três, e só se o registro não puder existir sem a resposta.\n· Valor que a lista marca como já em uso (\\`taken\\`) não se repete: escolha outro.\n\nDepois de criar, diga em uma linha o que ficou registrado — inclusive o que VOCÊ escolheu, para o usuário poder corrigir.\n`.trim()\n\nconst CREATE_HERE_TOOL: PluginAITool = {\n id: 'crud.createRecordHere',\n name: 'createRecordHere',\n description:\n 'Creates a record in the list the user currently has open. The surface state names the entity and lists its fields with types, hints and options — send `values` keyed by those field keys, and only those. '\n + 'Fill what the user said, what follows from it, and any NAME or CODE the record needs in order to exist — those are yours to write, not questions to ask. '\n + 'Leave out only what changes what the record DOES and that nobody but the user can know. For a select field use one of its listed options, verbatim.',\n icon: 'Plus',\n mode: 'persist',\n execution: { plane: 'client' },\n category: 'Records',\n parameters: {\n type: 'object',\n properties: {\n values: {\n type: 'object',\n description: 'Field key → value, using the keys from the surface state.',\n },\n },\n required: ['values'],\n },\n}\n\ninterface CrudStoreLike {\n create: (data: Record<string, unknown>) => Promise<{ id: string }>\n /** Rows currently loaded — read only to publish what a unique field already\n * holds, never as the list of everything that exists. */\n items?: Array<Record<string, unknown>> | null\n}\n\n/** What the loaded rows already hold for each unique field. Capped: this is a\n * collision guard, not the list, and the page in front of the user is the only\n * thing the surface can see anyway. */\nfunction takenValues(\n items: Array<Record<string, unknown>> | null | undefined,\n fields: string[],\n): Record<string, string[]> {\n const out: Record<string, string[]> = {}\n for (const key of fields) {\n const values = (items ?? [])\n .map((row) => row?.[key])\n .filter((v): v is string => typeof v === 'string' && v.trim() !== '')\n .slice(0, 200)\n if (values.length) out[key] = values\n }\n return out\n}\n\nexport interface CrudSurfaceInput {\n entityDef: EntityDef<any>\n store: CrudStoreLike\n /** Screen-specific guidance, appended to CREATE_GUIDANCE. */\n instructions?: string\n /** Field keys whose values must not repeat. */\n uniqueFields?: string[]\n /**\n * Where the record just written can be opened. Supplied by the page, because\n * this kind of entity has no archetype and no table — the chat's route map\n * has nothing to derive a destination from, and a reply about a record you\n * cannot click through to is a dead end.\n */\n recordPath?: (id: string) => string\n}\n\n/** What the row calls itself, for the chip under the reply. */\nfunction labelOf(record: Record<string, unknown>, def: EntityDef<any>): string {\n const display = (def as { displayField?: string }).displayField\n for (const key of [display, 'name', 'title', 'code', 'full_name'].filter(Boolean) as string[]) {\n const value = record?.[key]\n if (typeof value === 'string' && value.trim()) return value.trim()\n }\n return def.name\n}\n\n/**\n * The contribution itself, built from a GETTER so the component can re-render\n * without re-registering and the snapshot still reads the live list. Exported\n * because what the assistant is told is worth testing without a DOM.\n */\nexport function buildCrudSurfaceContribution(\n read: () => CrudSurfaceInput,\n): AgentSurfaceContribution {\n const ref = { get current() { return read() } }\n return {\n id: 'crud.list',\n describe: () => {\n const { entityDef: def, store: live, uniqueFields: unique } = ref.current\n return {\n title: `Lista — ${def.namePlural ?? def.name}`,\n state: {\n entity: def.name,\n fields: (def.fields ?? [])\n // A computed or read-only field is not something a create can set;\n // offering it invites the model to send a value that is dropped.\n .filter((f: any) => !f.readOnly && !f.computed)\n .map((f: any) => ({\n key: f.key,\n label: f.label,\n type: f.type,\n required: Boolean(f.required),\n // The merchant-facing hint is the field's own documentation —\n // it already says what a coupon code is for and who reads it.\n ...(f.hint ? { hint: f.hint } : {}),\n ...(f.options ? { options: f.options } : {}),\n })),\n ...(unique?.length ? { taken: takenValues(live.items, unique) } : {}),\n },\n }\n },\n instructions: [CREATE_GUIDANCE, ref.current.instructions?.trim()].filter(Boolean).join('\\n\\n'),\n tools: [{\n tool: CREATE_HERE_TOOL,\n execute: async (args: Record<string, unknown>) => {\n const { store: live, entityDef: def } = ref.current\n const values = (args.values ?? {}) as Record<string, unknown>\n const known = new Set((def.fields ?? []).map((f: any) => f.key))\n const clean: Record<string, unknown> = {}\n const ignored: string[] = []\n for (const [key, value] of Object.entries(values)) {\n if (known.has(key)) clean[key] = value\n else ignored.push(key)\n }\n if (Object.keys(clean).length === 0) {\n return { ok: false, error: 'no_known_field', ignored, fields: [...known] }\n }\n try {\n const created = await live.create(clean)\n const record = (created ?? {}) as Record<string, unknown>\n const id = typeof record.id === 'string' ? record.id : undefined\n const path = id ? ref.current.recordPath?.(id) : undefined\n return {\n ok: true,\n id,\n entity: def.name,\n fields: Object.keys(clean),\n ignored,\n // The record and its `ref` are what put a chip under the reply and\n // let the model confirm what it actually wrote — including the\n // fields it chose itself, which is the half worth correcting.\n record,\n ...(id\n ? { ref: { id, label: labelOf(record, def), ...(path ? { path } : {}) } }\n : {}),\n }\n } catch (e) {\n // A unique index refusing the row, told the way the form tells it —\n // naming the field. Said plainly the model picks another value and\n // retries; said as a Postgres string it apologizes and gives up.\n const clash = duplicateWrite(e)\n if (clash) {\n return {\n ok: false,\n error: 'duplicate_value',\n field: clash.field,\n hint: `Já existe um registro com esse ${clash.label}. Escolha outro e chame de novo, sem perguntar ao usuário.`,\n }\n }\n return { ok: false, error: humanizeWriteError(e) }\n }\n },\n }],\n }\n}\n\nexport function CrudAgentSurface(props: CrudSurfaceInput) {\n const ref = React.useRef(props)\n ref.current = props\n\n // Built once: the getter keeps every call reading the current props.\n const contribution = React.useMemo(\n () => buildCrudSurfaceContribution(() => ref.current),\n [],\n )\n\n useAgentSurface(contribution)\n return null\n}\n","import { exportCSV } from '@fayz-ai/core'\nimport type { CSVColumn } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\n\nexport function exportToCSV<T extends Record<string, any>>(\n items: T[],\n entityDef: EntityDef,\n): void {\n const columns: CSVColumn[] = entityDef.fields\n .filter((f) => f.showInTable !== false)\n .map((f) => ({ key: f.key, label: f.label }))\n\n const namePlural = entityDef.namePlural ?? entityDef.name + 's'\n const filename = `${namePlural.toLowerCase().replace(/\\s+/g, '-')}-export`\n\n exportCSV(columns, items, filename)\n}\n","import type { FieldDef, EntityFieldRules } from '../types/crud'\n\n/** Merge tenant field-rule overrides into static FieldDef[]. Pure & testable. */\nexport function applyFieldRules(\n fields: FieldDef[],\n rules: EntityFieldRules | undefined,\n): FieldDef[] {\n if (!rules) return fields\n return fields.map((f) => {\n const override = rules[f.key]\n if (!override) return f\n return { ...f, ...override }\n })\n}\n","import { useEffect, useMemo, useState } from 'react'\nimport { useActiveUnitId } from '@fayz-ai/core'\nimport { useOrganizationStore } from '../stores/organization.store'\nimport { applyFieldRules } from '../lib/apply-field-rules'\nimport { resolveFieldRules, rulesToOverrides, type FieldRuleState } from '../lib/field-rules-db'\nimport type { FieldDef } from '../types/crud'\n\n/** The account's field rules for a CRUD entity, from `public.field_rules` only:\n * what the account (or its V1 import) decided, never a value fixed in code. */\nexport function useFieldRules(entityKey: string) {\n const tenantId = useOrganizationStore((s) => s.currentOrg?.id)\n const unitId = useActiveUnitId()\n\n const [dbRules, setDbRules] = useState<Array<{ field_key: string; state: FieldRuleState }>>([])\n useEffect(() => {\n if (!tenantId) return\n let cancelled = false\n // People also carry the per-profile hiding the database masks in v_people\n // (\"Ocultação de dados\"); the form hides what the read already blanks.\n const reads = [resolveFieldRules(entityKey, 'main_form', unitId)]\n if (entityKey.startsWith('person')) {\n reads.push(resolveFieldRules('person', 'person', unitId).then((rows) => rows\n .filter((r) => r.state === 'hidden')\n // The mask is keyed by column (document_number); the form by FieldDef key.\n .map((r) => ({ ...r, field_key: r.field_key.replace(/_([a-z])/g, (_, c: string) => c.toUpperCase()) }))))\n }\n // A failed read leaves the form on its own defaults rather than blocking it.\n Promise.all(reads)\n .then(([form, masked = []]) => { if (!cancelled) setDbRules([...form, ...masked]) })\n .catch(() => { if (!cancelled) setDbRules([]) })\n return () => { cancelled = true }\n }, [entityKey, tenantId, unitId])\n\n return useMemo(() => {\n const rules = rulesToOverrides(dbRules)\n return {\n rules,\n applyRules: (fields: FieldDef[]) => applyFieldRules(fields, rules),\n }\n }, [dbRules])\n}\n","import React, { useEffect, useState, useRef, useCallback, useMemo } from 'react'\nimport { Copy, Pencil, Trash2 } from 'lucide-react'\nimport type { ColumnDef as TanStackColumnDef } from '@tanstack/react-table'\nimport { useOrganizationStore } from '../org'\nimport { emitDataChanged, useTranslation, describeError, navigateApp, currentAppPath, onAppPathChange } from '@fayz-ai/core'\nimport { Card, usePageSize } from '@fayz-ai/ui'\nimport { Button, ConfirmDialog, RowActions, type PageActionItem } from '@fayz-ai/ui'\nimport { PageHeader, usePageTrailParent, navigateToCrumb } from '@fayz-ai/ui'\nimport { CrudFormPage } from './CrudFormPage'\nimport { CrudDetailSkeleton, CrudFormSkeleton } from './CrudSkeletons'\nimport { CrudListView, type CrudAiCreate, type CrudFacet, type CrudNavTab } from './CrudListView'\nimport { CrudAgentSurface } from './CrudAgentSurface'\nimport type { StatTileData } from '@fayz-ai/ui'\nimport { CrudDetailPage } from './CrudDetailPage'\nimport { useRelationOptions } from './relation-field'\nimport { DeleteConfirmDialog } from './DeleteConfirmDialog'\nimport { copyRelatedRows } from './RelatedSection'\n// Lazy: the import wizard (CSV parsing + mapping UI, ~23 KB src) is rarely\n// opened — keep it out of the entry chunk.\nconst ImportWizard = React.lazy(() =>\n import('./ImportWizard').then((m) => ({ default: m.ImportWizard })),\n)\nimport { exportToCSV } from './csv-export'\nimport { fieldToColumns, renderDisplayCell } from './fieldToColumn'\nimport { PermissionGate } from '../permissions/PermissionGate'\nimport { usePermissionOptional } from '../permissions/context'\nimport { useLimitGuard } from '../access/context'\nimport { invalidateLimit } from '../access/limits-registry'\nimport { useFieldRules } from '../hooks/useFieldRules'\nimport { deriveEntityKey, useDataChanged } from '@fayz-ai/core'\nimport { toast } from '@fayz-ai/ui'\nimport { getSupabaseClientOptional } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\nimport type { CrudStore } from '../stores/createCrudStore'\nimport type { ImportRowError } from './ImportWizard'\n\ntype CrudDisplay = 'table' | 'cards'\n\n/**\n * Quantas linhas a lista pede por vez.\n *\n * Declarado aqui e enviado na query em vez de deixado no default do provider:\n * o rodapé escreve \"1–50 de 1.234\" com ESTE número, e se ele fosse só uma\n * suposição sobre o que o provider faz, a frase erraria no dia em que o default\n * mudasse — dizendo à pessoa que ela está vendo linhas que não estão na tela.\n */\nconst PAGE_SIZE = 50\n\ninterface CrudPageProps<T extends { id: string }> {\n entityDef: EntityDef<T>\n useStore: () => CrudStore<T>\n basePath: string\n display: CrudDisplay\n feature?: string\n /** If true, hides create/edit/delete actions — list and detail view only */\n readOnly?: boolean\n /** Sibling lists shown as header tabs (see CrudListView). List view only. */\n navTabs?: CrudNavTab[]\n activeNavTab?: string\n /** Summary tiles for the list, derived from the rows currently loaded. */\n stats?: (items: T[] | null, total: number) => StatTileData[]\n /**\n * Offer \"Criar com IA\" on this list, and publish a tool that can actually do\n * it.\n *\n * The tool writes through THIS list's store — the same provider the form\n * uses — which is what lets a provider-backed entity (the shop's products,\n * behind a commerce API with no table of its own) be created by conversation\n * at all. The agent's global data primitives cannot reach those; they resolve\n * a target by table.\n */\n aiCreate?: CrudAiCreate\n /** Este CRUD é uma SEÇÃO de outra tela (um cadastro dentro de uma aba de\n * configurações). Ver CrudListView.embedded. */\n embedded?: boolean\n /** Ver `CrudListView.emptyHint`. */\n emptyHint?: string\n}\n\nfunction getRouteDepth(sub: string): number {\n if (sub === '' || sub === '/') return 0 // list\n if (sub === '/new') return 1 // create\n if (sub.endsWith('/edit')) return 2 // edit\n return 1 // detail\n}\n\nfunction normalizeCrudBasePath(basePath: string): string {\n const normalized = `/${basePath}`.replace(/\\/+/g, '/')\n return normalized.length > 1 ? normalized.replace(/\\/+$/, '') : normalized\n}\n\nfunction crudPath(basePath: string, ...parts: Array<string | undefined>): string {\n return normalizeCrudBasePath([basePath, ...parts.filter(Boolean)].join('/'))\n}\n\nfunction setCrudHash(basePath: string, ...parts: Array<string | undefined>): void {\n navigateApp(crudPath(basePath, ...parts))\n}\n\nfunction useSubRoute(basePath: string) {\n const normalizedBasePath = normalizeCrudBasePath(basePath)\n const getSub = () => {\n const hash = normalizeCrudBasePath(currentAppPath())\n if (hash === normalizedBasePath) return ''\n return hash.startsWith(`${normalizedBasePath}/`) ? hash.slice(normalizedBasePath.length) : ''\n }\n\n // Estar DENTRO deste cadastro é diferente de estar na tela que o hospeda: um\n // painel de plugin cuja única aba é a de cadastros mostra a lista já na rota\n // da aba, e ali a lista não é um nível a mais — não pode desenhar uma migalha\n // cujo voltar não sai do lugar.\n const getInside = () => {\n const hash = normalizeCrudBasePath(currentAppPath())\n return hash === normalizedBasePath || hash.startsWith(`${normalizedBasePath}/`)\n }\n\n const [sub, setSub] = useState(getSub)\n const [inside, setInside] = useState(getInside)\n const [direction, setDirection] = useState<'forward' | 'back'>('forward')\n const prevDepthRef = useRef(getRouteDepth(getSub()))\n\n useEffect(() => {\n const handler = () => {\n const next = getSub()\n const nextDepth = getRouteDepth(next)\n setDirection(nextDepth > prevDepthRef.current ? 'forward' : 'back')\n prevDepthRef.current = nextDepth\n setSub(next)\n setInside(getInside())\n }\n return onAppPathChange(handler)\n }, [normalizedBasePath])\n\n return { sub, inside, direction }\n}\n\n/** Convert our FieldDef-based columns to TanStack ColumnDef for DataTable */\nfunction useCrudColumns<T extends { id: string }>(\n entityDef: EntityDef<T>,\n options?: {\n basePath?: string\n onDelete?: (item: T) => void\n onDuplicate?: (item: T) => void\n onInlineUpdate?: (id: string, field: string, value: any) => void\n feature?: string\n readOnly?: boolean\n },\n): TanStackColumnDef<T, any>[] {\n const displayField = entityDef.displayField ?? entityDef.fields[0]?.key ?? 'id'\n const cols = fieldToColumns(entityDef.fields, { onInlineUpdate: options?.onInlineUpdate })\n // `RowActions` recebe as ações já resolvidas, então a permissão é perguntada\n // aqui em vez de embrulhar cada botão num `PermissionGate` — um item oculto\n // não pode ocupar lugar no menu de estouro.\n const t = useTranslation()\n const can = usePermissionOptional()\n\n return useMemo(() => {\n const tanCols: TanStackColumnDef<T, any>[] = cols.map((col) => ({\n accessorKey: col.key,\n header: col.label,\n // Ordenar é ato da barra de ferramentas, não do cabeçalho: uma seta por\n // coluna transformava a linha de títulos numa fileira de botões e ainda\n // só alcançava as colunas visíveis. Ver o dropdown em CrudListView.\n enableSorting: false,\n meta: { truncate: true, mobile: col.key === displayField ? 'title' : col.mobile },\n cell: ({ row }: any) => {\n const value = row.original[col.key]\n const rendered = col.render(value, row.original)\n return col.key === displayField ? renderDisplayCell(entityDef, value, rendered, row.original) : rendered\n },\n }))\n\n // Actions column\n if (!options?.readOnly && options?.basePath) {\n tanCols.push({\n id: 'actions',\n header: '',\n enableSorting: false,\n // O que se pode fazer com UMA linha é `RowActions`, como no resto do\n // produto. Aqui viviam um lápis e uma lixeira nus, lado a lado e sem\n // nome acessível — a lixeira a um pixel do lápis, repetida linha após\n // linha. É exatamente o que `RowActions` existe para não deixar\n // acontecer: ela nunca põe destrutivo inline, e cada ícone ganha\n // rótulo. Toda tela de cadastro passa por aqui, então a correção é uma\n // só para todas.\n cell: ({ row }: any) => {\n const id = row.original.id\n const acoes: PageActionItem[] = [\n {\n id: 'edit', label: t('common.edit'), icon: Pencil,\n onSelect: () => setCrudHash(options.basePath!, id, 'edit'),\n hidden: options.feature ? !can(options.feature, 'edit') : false,\n },\n ...(options.onDuplicate ? [{\n id: 'duplicate', label: t('crud.list.duplicate'), icon: Copy,\n onSelect: () => options.onDuplicate!(row.original),\n hidden: options.feature ? !can(options.feature, 'create') : false,\n }] : []),\n ...(options.onDelete ? [{\n id: 'delete', label: t('common.delete'), icon: Trash2, intent: 'danger' as const,\n onSelect: () => options.onDelete!(row.original),\n hidden: options.feature ? !can(options.feature, 'delete') : false,\n }] : []),\n ]\n return <RowActions actions={acoes} />\n },\n })\n }\n\n return tanCols\n }, [cols, entityDef, displayField, options?.basePath, options?.onDelete, options?.onDuplicate, options?.feature, options?.readOnly, t, can])\n}\n\nexport function CrudPage<T extends { id: string }>({ entityDef: rawEntityDef, useStore, basePath, display, feature, readOnly, navTabs, activeNavTab, stats, embedded, emptyHint, aiCreate }: CrudPageProps<T>) {\n const store = useStore()\n const t = useTranslation()\n const normalizedBasePath = normalizeCrudBasePath(basePath)\n const { sub, inside, direction } = useSubRoute(normalizedBasePath)\n\n // Apply tenant field-rule overrides (required / visibility) before passing down\n const entityKey = deriveEntityKey(rawEntityDef)\n const { applyRules } = useFieldRules(entityKey)\n const entityDef = useMemo(() => ({\n ...rawEntityDef,\n fields: applyRules(rawEntityDef.fields),\n }), [rawEntityDef, applyRules]) as EntityDef<T>\n const [deleteItem, setDeleteItem] = useState<T | null>(null)\n // The rows the bulk bar asked to delete, held until the confirm is answered.\n const [bulkDelete, setBulkDelete] = useState<T[] | null>(null)\n const [bulkDeleting, setBulkDeleting] = useState(false)\n const [searchInput, setSearchInput] = useState('')\n const [importOpen, setImportOpen] = useState(false)\n // Com que recorte a lista ABRE. Toda lista de cadastro do V1 abre em\n // «Ativos», e é o que dá sentido a inativar: sem isto o registro inativado\n // continua na frente de quem usa, só com outro selo. Ver EntityDef.facets.\n const initialFilters = () => {\n const seed: Record<string, string | undefined> = {}\n for (const f of rawEntityDef.facets ?? []) if (f.defaultValue != null) seed[f.field] = f.defaultValue\n return seed\n }\n const [activeFilters, setActiveFilters] = useState<Record<string, string | undefined>>(initialFilters)\n const activeFiltersRef = useRef<Record<string, string | undefined>>(initialFilters())\n // Buscar, filtrar e ordenar voltam para a página 1: o conjunto mudou, e a\n // \"página 3\" do conjunto anterior não é a página 3 de nada. Sem isso, filtrar\n // estando na página 3 devolvia uma lista vazia com o paginador dizendo 3/1.\n const [page, setPage] = useState(1)\n const [pageSize, setPageSize] = usePageSize(`crud.${entityDef.name}`, PAGE_SIZE)\n\n // Kept a plain string here: this one is threaded into form/detail children\n // that render it inline (\"Voltar para …\"), where a generic noun reads fine.\n const pluralKey = entityDef.namePluralKey ?? entityDef.nameKey\n // Two different jobs, so two different fallbacks. In a SENTENCE an\n // untranslated noun is ungrammatical (\"Adicionar Location\"), so it degrades to\n // a generic word. In a BACK LINK the noun names the destination — \"← Serviços\"\n // — and even an untranslated name beats \"← registros\", which tells you\n // nothing about where you are going.\n const namePlural = pluralKey ? t(pluralKey) : t('crud.list.records')\n const navLabel = pluralKey ? t(pluralKey) : (entityDef.namePlural ?? entityDef.name)\n const displayField = entityDef.displayField ?? entityDef.fields[0]?.key ?? 'id'\n // Uma ficha pode se chamar pelo que APONTA — a linha de um pacote é o serviço\n // que ela traz. Sem resolver a relação, a caixa de «Excluir?» perguntava\n // «Tem certeza que deseja excluir \"07cfbc2b-7138-…\"?»: a pergunta certa sobre\n // um nome que ninguém reconhece.\n const displayRelation = entityDef.fields.find((f) => f.key === displayField && f.type === 'relation')?.relation\n const { labelFor: displayLabelFor } = useRelationOptions(displayRelation)\n const displayLabelOf = (row: unknown): string | undefined => {\n const raw = (row as Record<string, unknown> | null)?.[displayField]\n if (!displayRelation) return raw as string | undefined\n return displayLabelFor(raw) || undefined\n }\n\n // Resolve declared facets (entityDef.facets) into pill options from each field.\n const resolvedFacets = useMemo<CrudFacet[]>(() => {\n return (entityDef.facets ?? []).map((f) => {\n const field = entityDef.fields.find((x) => x.key === f.field)\n // Campo booleano não tem `options` — e sem elas o filtro aparecia com uma\n // única entrada (\"Todas\") e nada para escolher. Sim/Não são as opções de\n // um booleano; não havia por que o entity ter de escrevê-las.\n // A faceta pode nomear as próprias opções — ver EntityDef.facets.options.\n const options = f.options\n ?? (field?.type === 'boolean'\n ? [{ value: 'true', label: t('common.yes') }, { value: 'false', label: t('common.no') }]\n : (field?.options ?? []).map((o) =>\n typeof o === 'string' ? { value: o, label: o } : { value: o.value, label: o.label },\n ))\n // O rótulo do campo vira o nome acessível da pastilha: ela mostra o VALOR\n // (\"Ativo\"), então sem isto um leitor de tela não diria de que filtro é.\n return { field: f.field, options, allLabel: f.allLabel, display: f.display, label: field?.label }\n })\n }, [entityDef, t])\n\n const handleFacetChange = useCallback((field: string, value: string | undefined) => {\n const next = { ...activeFiltersRef.current }\n if (value == null) delete next[field]\n else next[field] = value\n activeFiltersRef.current = next\n setActiveFilters(next)\n setPage(1)\n store.setQuery({ filters: next, page: 1 })\n }, [store])\n\n const handlePageChange = useCallback((next: number) => {\n setPage(next)\n store.setQuery({ page: next })\n }, [store])\n\n // A new size starts from the first page: page 4 of 25 rows is not page 4 of 100.\n const handlePageSizeChange = useCallback((next: number) => {\n setPageSize(next)\n setPage(1)\n store.setQuery({ page: 1, pageSize: next })\n }, [store, setPageSize])\n\n // Sort lives here, not in the table: the store owns the query, so picking a\n // column from the toolbar and clicking a column header have to end up in the\n // same place or the two controls would disagree about what is sorted.\n const [sort, setSort] = useState<{ by?: string; dir: 'asc' | 'desc' }>({\n by: entityDef.defaultSort,\n dir: entityDef.defaultSortDir ?? 'asc',\n })\n const handleSort = useCallback((field: string) => {\n setSort((prev) => {\n // Re-picking the active field flips direction; a new field starts ascending.\n const next: { by?: string; dir: 'asc' | 'desc' } = prev.by === field\n ? { by: field, dir: prev.dir === 'asc' ? 'desc' : 'asc' }\n : { by: field, dir: 'asc' }\n setPage(1)\n store.setQuery({ sortBy: next.by, sortDir: next.dir, page: 1 })\n return next\n })\n }, [store])\n\n // Campo e direção viraram duas escolhas separadas porque no menu elas SÃO\n // duas linhas: reclicar o campo ativo ali significaria \"escolhi este de novo\",\n // não \"inverta\" — e a lista viraria de cabeça para baixo sem ninguém pedir.\n const handleSortField = useCallback((field: string) => {\n setSort((prev) => {\n const next = { by: field, dir: prev.dir }\n setPage(1)\n store.setQuery({ sortBy: next.by, sortDir: next.dir, page: 1 })\n return next\n })\n }, [store])\n\n const handleSortDir = useCallback((dir: 'asc' | 'desc') => {\n setSort((prev) => {\n const next = { by: prev.by, dir }\n setPage(1)\n store.setQuery({ sortBy: next.by, sortDir: next.dir, page: 1 })\n return next\n })\n }, [store])\n\n const searchTimer = useRef<ReturnType<typeof setTimeout> | null>(null)\n const handleInlineUpdate = useCallback(async (id: string, field: string, value: any) => {\n await store.update(id, { [field]: value } as any)\n }, [store])\n const handleDuplicate = useCallback(async (row: T) => {\n try {\n const display = entityDef.displayField ?? entityDef.fields[0]?.key\n const copia: Record<string, any> = Object.fromEntries(\n entityDef.fields\n .filter((f) => f.showInForm !== false && (row as any)[f.key] !== undefined)\n .map((f) => [f.key, (row as any)[f.key]]),\n )\n if (display && typeof copia[display] === 'string') copia[display] = `${copia[display]} ${t('crud.list.copySuffix')}`\n const created = await store.create(copia)\n for (const related of entityDef.relatedSections ?? []) {\n await copyRelatedRows(related, (row as any).id, (created as any).id)\n }\n toast.success(t('crud.list.duplicated', { entity: entityDef.name }))\n setCrudHash(normalizedBasePath, (created as any).id, 'edit')\n } catch (err) {\n toast.error(describeError(err))\n }\n }, [entityDef, store, t, normalizedBasePath])\n const tanColumns = useCrudColumns(entityDef, {\n basePath: normalizedBasePath,\n onDelete: readOnly ? undefined : (item) => setDeleteItem(item),\n onDuplicate: readOnly || !entityDef.duplicable ? undefined : (item) => { void handleDuplicate(item) },\n onInlineUpdate: handleInlineUpdate, feature, readOnly,\n })\n const currentOrgId = useOrganizationStore((s) => s.currentOrg?.id)\n const guardImport = useLimitGuard(entityDef.limitKey ?? '')\n\n useEffect(() => {\n // setQuery já dispara o fetch — o tamanho da página entra na query aqui para\n // que o provider e o rodapé falem do mesmo recorte desde a primeira leitura.\n if (currentOrgId) store.setQuery({ page: 1, pageSize, filters: activeFiltersRef.current })\n }, [currentOrgId])\n\n // Read failures used to be swallowed by the store, so a missing table or an\n // RLS denial looked exactly like an empty list. Keyed on `errorAt`, not on the\n // message, so the same failure repeating still tells the user.\n // Chegou por link num registro que a página carregada não tem — favorito,\n // link colado, ou a cópia que uma ação de ficha acabou de criar. Busca a\n // linha sozinha em vez de dizer \"não encontrado\" sobre algo que existe.\n const detailId = sub.startsWith('/') && sub.length > 1 && !sub.endsWith('/edit') && sub !== '/new'\n ? sub.slice(1).split('/')[0]\n : null\n useEffect(() => {\n if (!detailId || store.items === null) return\n if (store.getById(detailId)) return\n void store.fetchById(detailId)\n }, [detailId, store.items])\n\n useEffect(() => {\n if (!store.error) return\n toast.error(t('crud.list.loadFailed', { entities: namePlural.toLowerCase() }))\n console.warn(`[crud] failed to load ${namePlural}`, store.error)\n }, [store.errorAt])\n\n // Someone else wrote to this table — the assistant, another tab, a webhook.\n // The list is showing that data right now, so it reloads itself instead of\n // waiting for the user to discover the screen is stale.\n useDataChanged(\n { table: entityDef.data?.table, entityKey: deriveEntityKey(entityDef), archetype: entityDef.data?.archetype },\n () => { if (currentOrgId) store.fetch() },\n [currentOrgId],\n )\n\n const navigateToList = () => { setCrudHash(normalizedBasePath) }\n const animClass = direction === 'forward' ? 'saas-nav-forward' : 'saas-nav-back'\n\n // Um cadastro aberto DENTRO de outra tela (as zonas dentro de Entrega, as\n // categorias dentro do Financeiro) é um nível de navegação, e até agora era o\n // único sem cabeçalho: a barra continuava dizendo o nome da tela de cima e o\n // cadastro escrevia o próprio \"← voltar\" à mão, logo abaixo — dois\n // cabeçalhos, duas setas. Quem não tem trilha (uma página do menu, como\n // /store/products) segue sem migalha: lá a barra já a nomeia pela rota.\n // `embedded` fica de fora: um cadastro montado DENTRO de outra tela — a aba\n // \"Tables\" da ficha de uma zona — não é um nível de navegação, é uma seção\n // dela. Desenhando a própria migalha, ele portava uma SEGUNDA para a mesma\n // barra, e o topo saía \"← Zones / Balcão← Mesas / registros\": duas setas,\n // dois caminhos de volta, um deles para lugar nenhum.\n const parentCrumb = usePageTrailParent(normalizedBasePath)\n const trailParent = inside && !embedded ? parentCrumb : undefined\n const goToParent = useCallback(\n () => { if (trailParent) navigateToCrumb(trailParent) },\n [trailParent],\n )\n\n const handleImport = useCallback(async (\n rows: Record<string, any>[],\n onProgress: (processed: number, total: number) => void,\n ): Promise<{ success: number; errors: ImportRowError[] }> => {\n // Guard: refuse import if not connected to Supabase (would silently go to mock)\n if (!getSupabaseClientOptional() as any) {\n return {\n success: 0,\n errors: [{ row: 0, message: t('crud.import.noConnection') }],\n }\n }\n\n // Plan quantity guard BEFORE the batch insert: adding `rows.length` rows must\n // stay within the plan cap. When it would exceed, the guard opens the global\n // UpgradeModal; we also surface a clear toast + a wizard error row and abort.\n if (entityDef.limitKey && (await guardImport(rows.length)) === 'blocked') {\n toast.error(t('crud.import.limitExceeded'))\n return {\n success: 0,\n errors: [{ row: 0, message: t('crud.import.limitExceeded') }],\n }\n }\n\n const { success, results } = await store.createMany(rows, {\n batchSize: 10,\n onProgress,\n })\n\n // Refresh the live count so gates/banners reflect the imported rows.\n if (success > 0 && entityDef.limitKey) invalidateLimit(entityDef.limitKey)\n\n const errors: ImportRowError[] = []\n for (let i = 0; i < results.length; i++) {\n if (results[i].error) {\n errors.push({ row: i + 2, message: results[i].error! })\n }\n }\n\n if (success > 0) {\n toast.success(t('crud.import.toastSuccess', { count: String(success) }))\n }\n return { success, errors }\n }, [store, t, guardImport, entityDef.limitKey])\n\n const handleExport = useCallback(() => {\n const items = store.items\n if (!items || items.length === 0) {\n toast.error(t('crud.export.noData'))\n return\n }\n exportToCSV(items as any, entityDef)\n toast.success(t('crud.export.toastSuccess', { count: String(items.length) }))\n }, [store.items, entityDef, t])\n\n // Determine which view to show\n let viewKey = 'list'\n let content: React.ReactNode = null\n\n if (sub === '/new' && !readOnly) {\n viewKey = 'new'\n content = (\n <CrudFormPage\n entityDef={entityDef}\n mode=\"create\"\n // EMBUTIDO desce até aqui. Sem isto, o formulário de uma lista\n // relacionada desenhava o PRÓPRIO cabeçalho dentro de uma tela que já\n // tem o dela, e a trilha saía com duas setas:\n //\n // ← Telas KDS / Chapa← Roteamento / Novo(a) Regra de roteamento\n //\n // É o mesmo defeito que o comentário do `trailParent` acima descreve\n // («← Zones / Balcão← Mesas»), corrigido lá na LISTA e esquecido aqui\n // no formulário — que é justamente onde se chega ao clicar «Novo».\n embedded={embedded}\n namePlural={navLabel}\n onCancel={navigateToList}\n onSubmit={(data) => store.create(data)}\n // Navegar é a ÚLTIMA coisa: entre o insert e ela ainda descem as linhas\n // que a tela montou antes do registro existir, e sair da página levaria\n // a seção que as guarda junto.\n //\n // Salvar abre a FICHA do que acabou de ser criado, não a lista. Criar um\n // registro quase nunca é o fim do trabalho — falta a foto, o endereço, o\n // acesso — e voltar para a lista fazia a pessoa procurar na tela a linha\n // que ela mesma tinha acabado de escrever. Provider que não devolve a\n // linha criada (um create atrás de uma API que só confirma) cai na\n // lista, como antes.\n onSaved={(created) => {\n if (created?.id) setCrudHash(normalizedBasePath, created.id)\n else navigateToList()\n }}\n />\n )\n } else if (sub === '/new' && readOnly) {\n // readOnly — redirect back to list\n navigateToList()\n // `/<id>/edit` only: a child list inside a tab routes `/<id>/<tab>/<child>/<childId>/edit`,\n // and matching any `/edit` suffix opened the PARENT's form for the child's edit.\n } else if (/^\\/[^/]+\\/edit$/.test(sub) && !readOnly) {\n const id = sub.slice(1, -5)\n const item = store.getById(id)\n viewKey = `edit-${id}`\n\n if (!item && store.items === null) {\n // Esqueleto de FORMULÁRIO: é para um formulário que esta tela vai abrir.\n // Antes usava o esqueleto da ficha — herói com avatar e abas — e a página\n // prometia uma forma e entregava outra.\n content = <CrudFormSkeleton twoColumn={entityDef.formColumns === 2} tabs />\n } else if (!item) {\n content = (\n <div className=\"space-y-6\">\n <nav className=\"flex items-center gap-1.5 text-sm text-muted-foreground\">\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={navigateToList} className=\"hover:text-foreground transition-colors text-[length:inherit] font-normal\">{namePlural}</Button>\n <span>/</span>\n <span className=\"text-foreground font-medium\">{t('common.notFound')}</span>\n </nav>\n <div className=\"text-center py-12\">\n <p className=\"text-muted-foreground mb-4\">{t('crud.detail.notFound', { entity: entityDef.name })}</p>\n <Button onClick={navigateToList}>{t('crud.detail.backTo', { entities: namePlural })}</Button>\n </div>\n </div>\n )\n } else {\n content = (\n <CrudFormPage\n entityDef={entityDef}\n mode=\"edit\"\n initialData={item as any}\n embedded={embedded}\n namePlural={navLabel}\n onCancel={() => { setCrudHash(normalizedBasePath, id) }}\n onRecordTab={(tab) => { setCrudHash(normalizedBasePath, id, tab) }}\n onSubmit={async (data) => {\n await store.update(id, data as Partial<T>)\n setCrudHash(normalizedBasePath, id)\n }}\n />\n )\n }\n } else if (/^\\/[^/]+\\/edit$/.test(sub) && readOnly) {\n // readOnly — redirect to detail view\n const id = sub.slice(1, -5)\n setCrudHash(normalizedBasePath, id)\n } else if (sub.startsWith('/') && sub.length > 1) {\n // Parse /uuid, /uuid/tab-name, or /uuid/tab-name/<what the tab owns>\n const subParts = sub.slice(1).split('/')\n const id = subParts[0]\n const initialTab = subParts[1]?.split('?')[0] || undefined\n // Anything past the tab id belongs to the TAB. A recording, a document, a\n // thread — things that live inside a record and used to need a top-level\n // route to be linkable, which then replaced the whole page and took the\n // record's name, its other tabs and the way back with it.\n const tabPath = subParts.slice(2).map((part) => part.split('?')[0]).filter(Boolean)\n const item = store.getById(id)\n viewKey = `detail-${id}`\n\n if (!item && store.items === null) {\n content = <CrudDetailSkeleton />\n } else if (!item) {\n content = (\n <div className=\"space-y-6\">\n <nav className=\"flex items-center gap-1.5 text-sm text-muted-foreground\">\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={navigateToList} className=\"hover:text-foreground transition-colors text-[length:inherit] font-normal\">{namePlural}</Button>\n <span>/</span>\n <span className=\"text-foreground font-medium\">{t('common.notFound')}</span>\n </nav>\n <div className=\"text-center py-12\">\n <p className=\"text-muted-foreground mb-4\">{t('crud.detail.notFound', { entity: entityDef.name })}</p>\n <Button onClick={navigateToList}>{t('crud.detail.backTo', { entities: namePlural })}</Button>\n </div>\n </div>\n )\n } else {\n content = (\n <CrudDetailPage\n entityDef={entityDef}\n item={item as any}\n namePlural={navLabel}\n // EMBUTIDO desce aqui também. Era o terceiro irmão do mesmo defeito\n // — a lista o corrigiu no `trailParent`, o formulário no `embedded`,\n // e a FICHA ficou de fora: abrir uma linha de uma lista relacionada\n // portava uma segunda migalha para a barra que já tinha a do pai:\n //\n // ← Pacotes / Pacote Psicoterapia← Serviços do pacote / 07cfbc2b…\n embedded={embedded}\n basePath={normalizedBasePath}\n initialTab={initialTab}\n tabPath={tabPath}\n onBack={navigateToList}\n onEdit={readOnly ? undefined : () => { setCrudHash(normalizedBasePath, id, 'edit') }}\n onDelete={readOnly ? undefined : () => setDeleteItem(item)}\n // Same path as the table's inline edit: one field, one update.\n onFieldSave={readOnly ? undefined : (key, value) => handleInlineUpdate(item.id, key, value)}\n // A ficha junta as edições inline num rascunho e salva pela ilha da\n // shell: três campos corrigidos viram UM update, não três.\n onFieldsSave={readOnly ? undefined : async (values) => { await store.update(item.id, values as any) }}\n feature={feature}\n />\n )\n }\n } else {\n // List view — delegated to the shared CrudListView (header, search, facet\n // pills, table/cards). Data + routing stay here (store-backed).\n const handleSearch = (value: string) => {\n setSearchInput(value)\n if (searchTimer.current) clearTimeout(searchTimer.current)\n searchTimer.current = setTimeout(() => {\n setPage(1)\n store.setQuery({ search: value || undefined, page: 1 })\n }, 350)\n }\n\n const hasSearch = entityDef.fields.some((f) => f.searchable)\n\n content = (\n <>\n {trailParent && (\n <PageHeader title={navLabel} parentLabel={trailParent.label} onBack={goToParent} />\n )}\n {aiCreate ? (\n <CrudAgentSurface\n entityDef={entityDef}\n store={store}\n instructions={aiCreate.instructions}\n uniqueFields={aiCreate.uniqueFields}\n recordPath={(id) => crudPath(normalizedBasePath, id)}\n />\n ) : null}\n <CrudListView\n entityDef={entityDef}\n columns={tanColumns}\n items={store.items}\n total={store.total}\n totalIsEstimate={store.totalIsEstimate}\n page={page}\n pageSize={pageSize}\n onPageChange={handlePageChange}\n onPageSizeChange={handlePageSizeChange}\n display={display}\n emptyHint={emptyHint}\n search={searchInput}\n onSearchChange={hasSearch ? handleSearch : undefined}\n facets={resolvedFacets}\n activeFilters={activeFilters}\n onFacetChange={handleFacetChange}\n onNew={() => setCrudHash(normalizedBasePath, 'new')}\n onRowClick={(row) => setCrudHash(normalizedBasePath, (row as any).id)}\n // O lápis do cartão vai DIRETO para a edição, e não para a ficha:\n // quem clicou nele já sabe o que quer mudar, e passar pela leitura\n // primeiro é um toque a mais em todo ajuste.\n onEditRecord={readOnly ? undefined : (row) => setCrudHash(normalizedBasePath, (row as any).id, 'edit')}\n onDelete={(item) => setDeleteItem(item)}\n onBulkDelete={readOnly ? undefined : (rows) => setBulkDelete(rows)}\n onImport={() => setImportOpen(true)}\n onExport={handleExport}\n feature={feature}\n readOnly={readOnly}\n embedded={embedded}\n navTabs={navTabs}\n activeNavTab={activeNavTab}\n stats={stats?.(store.items, store.total)}\n aiCreate={aiCreate}\n error={store.error}\n // A hard refresh, not a re-read: clear the shared read cache for\n // this table first (emitDataChanged also reaches the v_ sibling and\n // any plugin funnel on the same prefix), or the button hands back\n // the very cache entry the user is trying to get past.\n onRefresh={() => {\n // Entities with no physical table (bespoke-provider bridges) clear\n // the whole cache — coarse, but a refresh that hands back the very\n // entry the user is escaping is a button that does nothing.\n emitDataChanged(entityDef.data?.table ? { table: entityDef.data.table, op: 'unknown' } : { op: 'unknown' })\n return store.refresh()\n }}\n refreshFromCache={store.fromCache}\n onSort={handleSort}\n onSortField={handleSortField}\n onSortDir={handleSortDir}\n sortBy={sort.by}\n sortDir={sort.dir}\n />\n </>\n )\n }\n\n // ONE request for the whole selection where the provider supports it — see\n // store.removeMany. Rows that fail are counted, not swallowed: a permission\n // denial on 3 of 10 must not be reported as ten deletions.\n const handleBulkDeleteConfirm = async () => {\n const ids = (bulkDelete ?? []).map((row) => (row as any).id as string)\n setBulkDeleting(true)\n // Em lote vale a mesma regra: quarenta linhas desligadas, não apagadas.\n if (softDelete) {\n let ok = 0\n const bad: string[] = []\n for (const id of ids) {\n try { await store.update(id, { isActive: false } as any); ok++ } catch { bad.push(id) }\n }\n setBulkDeleting(false)\n setBulkDelete(null)\n if (ok > 0) toast.success(t('crud.list.bulkDeactivateDone', { count: String(ok) }))\n if (bad.length > 0) toast.error(t('crud.list.bulkDeleteFailed', { count: String(bad.length) }))\n return\n }\n const { removed, failed } = await store.removeMany(ids)\n setBulkDeleting(false)\n setBulkDelete(null)\n if (removed > 0) toast.success(t('crud.list.bulkDeleteDone', { count: String(removed) }))\n if (failed.length > 0) {\n console.warn('[crud] bulk delete failed', failed)\n toast.error(t('crud.list.bulkDeleteFailed', { count: String(failed.length) }))\n }\n if (removed > 0 && entityDef.limitKey) invalidateLimit(entityDef.limitKey)\n }\n\n // A LIXEIRA DE UM CADASTRO DESLIGA. Ver EntityDef.deleteMode: um cadastro é\n // referenciado por histórico que não pode perder o nome, e apagar a linha ou\n // quebra a referência ou é recusado pelo banco. Quem clicou queria tirar da\n // frente — e é isso que `isActive` faz, com o filtro «Ativos» já respeitando.\n const softDelete = entityDef.deleteMode\n ? entityDef.deleteMode === 'soft'\n : entityDef.fields.some((f) => f.key === 'isActive' && f.type === 'boolean')\n\n const handleDeleteConfirm = async () => {\n if (!deleteItem) return\n const id = (deleteItem as any).id\n setDeleteItem(null)\n if (softDelete) {\n try {\n await store.update(id, { isActive: false } as any)\n toast.success(t('crud.list.deactivated', { entity: entityDef.name }))\n } catch (err) {\n console.error('[crud] deactivate failed', err)\n toast.error(t('crud.list.deleteFailed', {\n entity: entityDef.name.toLowerCase(),\n reason: describeError(err),\n }))\n } finally {\n navigateToList()\n }\n return\n }\n // Await the removal so the (cache-invalidated) list refetch completes and the\n // deleted row is gone before we settle on the list view — previously this was\n // fire-and-forget and raced with navigation, leaving a ghost row behind.\n //\n // A FALHA PRECISA APARECER. Sem o `catch` o erro subia como rejeição não\n // tratada: o diálogo fechava, a linha continuava lá e a tela não dizia\n // nada — de onde saiu \"não consigo excluir o cliente\", sem motivo nenhum\n // na tela para quem atende. A recusa costuma ser permissão ou um vínculo\n // que o banco protege, e a mensagem dele é a única que explica qual.\n try {\n await store.remove(id)\n } catch (err) {\n console.error('[crud] delete failed', err)\n toast.error(t('crud.list.deleteFailed', {\n entity: entityDef.name.toLowerCase(),\n reason: describeError(err),\n }))\n } finally {\n navigateToList()\n }\n }\n\n return (\n <>\n <div key={viewKey} className={animClass}>\n {content}\n </div>\n <ConfirmDialog\n open={bulkDelete !== null}\n variant=\"destructive\"\n loading={bulkDeleting}\n title={t('crud.list.bulkDeleteTitle', {\n count: String(bulkDelete?.length ?? 0),\n entities: namePlural.toLowerCase(),\n })}\n description={t('crud.list.bulkDeleteConfirm', { count: String(bulkDelete?.length ?? 0) })}\n confirmLabel={t('common.delete')}\n cancelLabel={t('common.cancel')}\n onCancel={() => { if (!bulkDeleting) setBulkDelete(null) }}\n onConfirm={handleBulkDeleteConfirm}\n />\n <DeleteConfirmDialog\n open={deleteItem !== null}\n onClose={() => setDeleteItem(null)}\n onConfirm={handleDeleteConfirm}\n entityName={entityDef.name}\n displayValue={deleteItem ? displayLabelOf(deleteItem) : undefined}\n mode={softDelete ? 'deactivate' : 'delete'}\n />\n <React.Suspense fallback={null}>\n <ImportWizard\n open={importOpen}\n onClose={() => setImportOpen(false)}\n entityDef={entityDef as EntityDef<any>}\n onImport={handleImport}\n />\n </React.Suspense>\n </>\n )\n}\n","// ---------------------------------------------------------------------------\n// Quem mais senta na faixa de abas de uma lista.\n// ---------------------------------------------------------------------------\n// Clientes é do cadastro padrão (plugin-crm). Grupos e Segmentos são recortes\n// DAQUELAS pessoas, e quem os escreve é a loja (plugin-shop). Os três são o\n// mesmo assunto e pertencem à mesma faixa — mas nenhum dos dois plugins pode\n// importar o outro, e quem monta a página não conhece quem contribui.\n//\n// Então a página não pergunta a ninguém: ela declara a PRÓPRIA rota, e quem\n// quiser sentar ali se registra por essa rota. É a mesma costura de\n// `registerTimelineSource` e `registerEntityPath` — o registro é o ponto de\n// encontro, e o acoplamento fica em zero dos dois lados.\n//\n// Registre no corpo da fábrica do plugin, não em escopo de módulo: um plugin\n// desligado não deve deixar aba de herança numa lista que ficou sem a tela.\n// ---------------------------------------------------------------------------\nimport type { CrudNavTab } from './CrudListView'\n\n/** A rota sem barra final — `/customers` e `/customers/` são a mesma lista. */\nconst normalize = (route: string): string =>\n route.length > 1 && route.endsWith('/') ? route.slice(0, -1) : route\n\nconst CONTRIBUTIONS = new Map<string, Array<() => CrudNavTab[]>>()\n\n/**\n * Oferece abas à lista servida por `route`.\n *\n * Preguiçoso de propósito: a aba navega, e a primitiva de navegação não existe\n * no escopo de módulo onde as páginas são definidas.\n *\n * Idempotente por função: registrar a MESMA referência duas vezes não duplica a\n * faixa, que é o que acontecia quando a fábrica do plugin rodava de novo sob\n * hot reload.\n */\nexport function registerCrudNavTabs(route: string, tabs: () => CrudNavTab[]): void {\n const key = normalize(route)\n const list = CONTRIBUTIONS.get(key) ?? []\n if (!list.includes(tabs)) list.push(tabs)\n CONTRIBUTIONS.set(key, list)\n}\n\n/**\n * As abas oferecidas a `route`, na ordem de registro.\n *\n * Nunca estoura: uma contribuição que falha some da faixa em vez de derrubar a\n * lista inteira — a aba é navegação, e perder a navegação de um vizinho não\n * pode custar a tela que o usuário pediu.\n */\nexport function getCrudNavTabs(route: string): CrudNavTab[] {\n const list = CONTRIBUTIONS.get(normalize(route))\n if (!list?.length) return []\n const seen = new Set<string>()\n const out: CrudNavTab[] = []\n for (const contribute of list) {\n let tabs: CrudNavTab[]\n try {\n tabs = contribute()\n } catch {\n continue\n }\n for (const tab of tabs) {\n if (seen.has(tab.id)) continue\n seen.add(tab.id)\n out.push(tab)\n }\n }\n return out\n}\n\n/** Só para teste: esquece tudo que foi registrado. */\nexport function __resetCrudNavTabs(): void {\n CONTRIBUTIONS.clear()\n}\n","import { getSupabaseClientOptional } from '@fayz-ai/core'\n\n/**\n * A trilha de auditoria de qualquer cadastro.\n *\n * Escrita a partir do store de CRUD — o único ponto por onde criar, editar e\n * excluir passam em todos os apps. É isso que faz \"auditoria funciona pra\n * qualquer cadastro\" ser verdade por construção: um registry novo não precisa\n * declarar nada, não ganha migração e não pode esquecer. Se ele grava pelo\n * store, ele é auditado.\n *\n * A alternativa era um gatilho por tabela no banco. Pega também as escritas\n * fora do app, mas cobra uma migração por cadastro — e cadastro que ninguém\n * lembrou de migrar fica silenciosamente sem rastro, que é o pior estado\n * possível para uma auditoria: a ausência de linha parecendo ausência de ação.\n *\n * O que NÃO vai para cá: valor de campo. Só o NOME dos campos que mudaram.\n * Copiar valores significaria a anamnese de um cliente existir também em\n * `audit_logs`, uma tabela com outra política de acesso e outra retenção — a\n * trilha vazaria o dado que a ficha protege. \"Telefone e e-mail alterados\"\n * responde à pergunta que a linha do tempo faz; o valor de antes é outra\n * funcionalidade, com outras consequências.\n */\n\nexport type AuditAction = 'created' | 'updated' | 'deleted' | 'imported'\n\nexport interface AuditEntry {\n /** `getActiveTenantId()` devolve `undefined` sem tenant resolvido; sem ele\n * não há linha a gravar. */\n tenantId: string | null | undefined\n /** A chave do cadastro (`clients`, `services`), não a tabela física: é o que\n * o app usa para se referir ao registro em todo o resto do sistema. */\n entityType: string\n entityId?: string\n action: AuditAction\n /** Nome legível no momento do ato — em especial numa exclusão, onde depois\n * dela não há mais linha de onde tirá-lo. */\n recordName?: string\n entityLabel?: string\n /** Campos tocados numa edição. Só os nomes. */\n fields?: string[]\n /** Quantas linhas, numa importação. */\n count?: number\n}\n\n/**\n * Grava e engole a falha.\n *\n * Deliberado: a auditoria é um efeito colateral do cadastro, não uma condição\n * dele. Se a política de RLS negar ou a rede cair, o cliente já foi salvo —\n * derrubar a operação inteira (ou mostrar um erro) transformaria um problema de\n * registro num problema de trabalho. Fica no console para quem investiga.\n */\nexport async function recordAudit(entry: AuditEntry): Promise<void> {\n return recordAuditMany([entry])\n}\n\n/**\n * A trilha de um ato em lote — UMA linha por registro, num INSERT só.\n *\n * Uma linha por registro porque a pergunta que a trilha responde é \"quem apagou\n * ESTE cliente?\", e uma linha única dizendo \"40 excluídos\" não a responde. Um\n * INSERT só porque quarenta requisições para gravar o rastro de uma ação são\n * quarenta chances de a rede estragar o que já aconteceu no banco.\n */\nexport async function recordAuditMany(entries: AuditEntry[]): Promise<void> {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return\n\n const rows = entries\n .filter((entry) => entry.tenantId)\n .map((entry) => {\n const metadata: Record<string, unknown> = {}\n if (entry.recordName) metadata.record_name = entry.recordName\n if (entry.entityLabel) metadata.entity_label = entry.entityLabel\n if (entry.fields?.length) metadata.fields = entry.fields\n if (typeof entry.count === 'number') metadata.count = entry.count\n return {\n tenant_id: entry.tenantId,\n // `user_id` fica de fora: o gatilho do banco o preenche com auth.uid()\n // (026_audit_trail.sql). Mandá-lo daqui seria deixar o cliente escolher\n // quem assinou a ação.\n action: `record.${entry.action}`,\n entity_type: entry.entityType,\n entity_id: entry.entityId ?? null,\n metadata,\n }\n })\n if (!rows.length) return\n\n const first = entries[0]!\n try {\n const { error } = await supabase.from('audit_logs').insert(rows)\n if (error) console.warn('[audit] failed to record', first.action, first.entityType, error.message)\n } catch (err) {\n console.warn('[audit] failed to record', first.action, first.entityType, err)\n }\n}\n\n/** Os campos que uma edição tocou. Metadado de linha não conta como edição. */\nexport function changedFields(data: Record<string, unknown> | undefined): string[] {\n if (!data) return []\n const IGNORED = new Set(['id', 'tenantId', 'createdAt', 'updatedAt', 'createdBy'])\n return Object.keys(data).filter((key) => !IGNORED.has(key))\n}\n","import { errorMessage } from '@fayz-ai/core'\nimport { create } from 'zustand'\nimport type { BulkRemoveResult, DataProvider, CrudQuery } from '@fayz-ai/core'\nimport { bulkRemove, emitDomainEvent, entityEventKey, getActiveTenantId } from '@fayz-ai/core'\nimport { recordAudit, recordAuditMany, changedFields } from './audit'\n\nexport interface CrudState<T> {\n items: T[] | null\n total: number\n /** O total veio como estimativa (a contagem exata não coube no prazo). */\n totalIsEstimate?: boolean\n loading: boolean\n query: CrudQuery\n /**\n * Last read failure, or null. These used to be swallowed entirely — a missing\n * table, an RLS denial or a malformed select all rendered as a cheerful\n * \"nothing here yet\", which is the same screen an empty store shows, so a\n * broken list was indistinguishable from a new one.\n *\n * `errorAt` bumps on every failure so a repeat of the SAME message still\n * reads as a new event to whoever is watching it.\n */\n error: string | null\n errorAt: number\n /** True when the rows on screen were answered locally (read cache or offline\n * snapshot) rather than by the network. Screens tint their refresh control\n * with it; `refresh()` is the way out. */\n fromCache: boolean\n}\n\nexport interface ImportBatchResult<T> {\n item?: T\n error?: string\n}\n\nexport interface CrudActions<T> {\n fetch: () => Promise<void>\n /** Hard refresh: drops the store's freshness window and refetches. Callers\n * that also want to bypass the shared read cache clear it first (the CRUD\n * page does, via emitDataChanged). */\n refresh: () => Promise<void>\n create: (data: any) => Promise<T>\n /** Batch create without per-item list refetch. Calls onProgress after each batch. Single fetch at the end. */\n createMany: (\n rows: any[],\n options?: { batchSize?: number; onProgress?: (processed: number, total: number) => void },\n ) => Promise<{ success: number; results: ImportBatchResult<T>[] }>\n update: (id: string, data: Partial<T>) => Promise<T>\n remove: (id: string) => Promise<void>\n /** Delete many in one round-trip where the provider allows it, with a single\n * audit write and a single list refetch. */\n removeMany: (ids: string[]) => Promise<BulkRemoveResult>\n setQuery: (query: Partial<CrudQuery>) => void\n getById: (id: string) => T | undefined\n /**\n * Traz UMA linha que não está na página carregada.\n *\n * `getById` só enxerga o que a lista já buscou, e a lista busca uma página.\n * Isso fazia toda chegada por link direto — um favorito, um link colado, a\n * cópia que uma ação acabou de criar — cair em \"não encontrado\" para qualquer\n * registro fora das primeiras linhas. Aqui a busca é pelo id, uma linha só.\n */\n fetchById: (id: string) => Promise<T | undefined>\n}\n\nexport type CrudStore<T> = CrudState<T> & CrudActions<T>\n\n/**\n * Identidade do cadastro, para o evento saber de quem está falando.\n *\n * Opcional porque nem todo store é um cadastro do app (o painel de plugins\n * monta stores para listas internas). Sem ela o store funciona igual e não\n * emite — melhor calar do que emitir `registry.undefined.created`.\n */\nexport interface CrudStoreEntity {\n entityKey: string\n label: string\n}\n\nexport function createCrudStore<T extends { id: string }>(\n dataProvider: DataProvider<T>,\n entity?: CrudStoreEntity,\n) {\n // ---------------------------------------------------------------------------\n // O ponto onde todo cadastro do sistema passa.\n //\n // Cliente, fornecedor, produto, profissional: em todos os apps, criar e\n // editar chegam aqui. Emitir daqui é o que faz \"cliente cadastrado\" existir\n // para automações, webhooks e auditoria sem que cada app se lembre de avisar.\n //\n // O envelope não leva a linha inteira de propósito — só id, nome e qual\n // cadastro. Ver a nota em core/entity/events.ts.\n //\n // A trilha de auditoria sai DAQUI pelo mesmo motivo, e não de um gatilho por\n // tabela: aqui um cadastro novo já nasce auditado, sem declarar nada e sem\n // migração. Ver stores/audit.ts.\n // ---------------------------------------------------------------------------\n function emit(\n action: 'created' | 'updated' | 'deleted' | 'imported',\n payload: Record<string, unknown>,\n audit?: { fields?: string[]; count?: number },\n ) {\n if (!entity) return\n const id = typeof payload.record_id === 'string' ? payload.record_id : undefined\n const tenantId = getActiveTenantId()\n\n emitDomainEvent(\n entityEventKey(entity.entityKey, action),\n { entity_label: entity.label, ...payload },\n {\n tenantId,\n subject: id ? { type: entity.entityKey, id } : null,\n },\n )\n\n // Sem await: gravar a trilha não pode atrasar a tela que já salvou. Ver a\n // nota sobre engolir a falha em stores/audit.ts.\n void recordAudit({\n tenantId,\n entityType: entity.entityKey,\n entityId: id,\n action,\n recordName: typeof payload.record_name === 'string' ? payload.record_name : undefined,\n entityLabel: entity.label,\n fields: audit?.fields,\n count: audit?.count,\n })\n }\n\n /** O nome que a pessoa reconhece na linha do tempo. Cada cadastro guarda o\n * seu num campo diferente, e um evento sem nome legível vira \"registro\". */\n function displayName(item: any): string {\n return item?.name ?? item?.title ?? item?.fullName ?? item?.full_name ?? item?.id ?? ''\n }\n\n // Dedup: track the current in-flight fetch to avoid duplicate requests\n let inflightFetch: Promise<void> | null = null\n let lastQueryKey = ''\n // When the last identical query SETTLED. The in-flight check alone only\n // catches overlapping calls; it misses the very common pattern of two mounts\n // in quick succession (React StrictMode's double-effect in dev, a remount on\n // org resolve, a data-changed event landing right after the initial load),\n // where the first request finishes before the second starts. That produced\n // the duplicate request per page. A short freshness window collapses those\n // into one without making the list feel stale — writes invalidate it\n // explicitly, so this never serves data the user just changed.\n let lastSettledAt = 0\n const FRESH_MS = 1500\n\n function queryKey(query: CrudQuery): string {\n return JSON.stringify(query)\n }\n\n function invalidate() {\n inflightFetch = null\n lastQueryKey = ''\n lastSettledAt = 0\n }\n\n return create<CrudStore<T>>((set, get) => ({\n items: null,\n total: 0,\n totalIsEstimate: false,\n loading: false,\n query: {},\n error: null,\n errorAt: 0,\n fromCache: false,\n\n async fetch() {\n const currentKey = queryKey(get().query)\n\n // Same query already in flight — ride along instead of firing a second.\n if (inflightFetch && currentKey === lastQueryKey) {\n return inflightFetch\n }\n // Same query answered a moment ago and we already hold the rows.\n if (\n currentKey === lastQueryKey &&\n get().items !== null &&\n Date.now() - lastSettledAt < FRESH_MS\n ) {\n return\n }\n\n lastQueryKey = currentKey\n set({ loading: true })\n\n const promise = (async () => {\n try {\n const result = await dataProvider.list(get().query)\n set({\n items: result.data,\n total: result.total,\n totalIsEstimate: result.totalIsEstimate ?? false,\n loading: false,\n error: null,\n fromCache: Boolean(result.cached || result.stale),\n })\n } catch (err) {\n // Keep whatever rows we had — a failed refresh should not blank a\n // list that was fine a second ago — but say that it failed.\n set({\n items: get().items ?? [],\n loading: false,\n error: errorMessage(err),\n errorAt: Date.now(),\n })\n } finally {\n inflightFetch = null\n lastSettledAt = Date.now()\n }\n })()\n\n inflightFetch = promise\n return promise\n },\n\n async refresh() {\n invalidate()\n return get().fetch()\n },\n\n async create(data) {\n const item = await dataProvider.create(data)\n emit('created', { record_id: item?.id, record_name: displayName(item) })\n invalidate()\n await get().fetch()\n return item\n },\n\n async createMany(rows, options) {\n const batchSize = options?.batchSize ?? 10\n let success = 0\n const results: ImportBatchResult<T>[] = new Array(rows.length)\n\n for (let i = 0; i < rows.length; i += batchSize) {\n const batch = rows.slice(i, i + batchSize)\n const settled = await Promise.allSettled(\n batch.map((row) => dataProvider.create(row)),\n )\n for (let j = 0; j < settled.length; j++) {\n const r = settled[j]\n if (r.status === 'fulfilled' && r.value?.id) {\n success++\n results[i + j] = { item: r.value }\n } else {\n const msg = r.status === 'rejected' ? (r.reason?.message ?? 'Error') : 'No record returned'\n results[i + j] = { error: msg }\n }\n }\n options?.onProgress?.(Math.min(i + batch.length, rows.length), rows.length)\n }\n\n // UM evento para a planilha inteira, não um por linha. Uma importação é\n // um ato — e um catálogo de 5.000 clientes não pode virar 5.000\n // boas-vindas porque alguém subiu um CSV.\n if (success > 0) emit('imported', { record_count: String(success) }, { count: success })\n\n // Single list refresh after all inserts\n invalidate()\n await get().fetch()\n\n return { success, results }\n },\n\n async update(id, data) {\n const item = await dataProvider.update(id, data)\n // O patch É o conjunto de campos tocados — a edição inline manda um campo\n // só, o formulário manda os que mudaram. Não há como derivar isso depois,\n // então a auditoria tem que sair daqui, onde ele ainda existe.\n emit('updated', { record_id: id, record_name: displayName(item) }, { fields: changedFields(data as Record<string, unknown>) })\n invalidate()\n await get().fetch()\n return item\n },\n\n async remove(id) {\n // O nome é lido ANTES da exclusão: depois dela a linha não existe mais, e\n // uma auditoria que só diz \"registro 8f14e45f foi excluído\" não responde\n // a pergunta que alguém vai fazer meses depois.\n const removed = get().items?.find((item) => item.id === id)\n await dataProvider.remove(id)\n emit('deleted', { record_id: id, record_name: displayName(removed) })\n // Optimistically drop the row so the list updates immediately. withCache\n // invalidates the table on remove() and the refetch below reconciles, but\n // the optimistic update guarantees the deleted row never lingers as a\n // \"ghost\" until a hard reload — even if the refetch is momentarily served\n // a stale, in-flight cached list.\n set((s) => ({\n items: s.items ? s.items.filter((item) => item.id !== id) : s.items,\n total: Math.max(0, s.total - 1),\n }))\n invalidate()\n await get().fetch()\n },\n\n // Excluir 40 linhas custava 40 DELETEs, 40 eventos, 40 linhas de auditoria e\n // 40 releituras da lista — ~160 requisições para um clique. Aqui é UM DELETE\n // (quando o provider sabe), UM insert de auditoria, e UMA releitura.\n //\n // O evento continua sendo um POR REGISTRO: \"cliente excluído\" é um fato\n // sobre um cliente, e uma automação que reage a ele tem de ver os quarenta.\n // O que mudou foi o custo — o log de eventos junta o que sai no mesmo tick.\n async removeMany(ids) {\n if (!ids.length) return { removed: 0, failed: [] }\n\n // Os nomes são lidos ANTES: depois do DELETE não há linha de onde tirá-los,\n // e uma trilha que diz só o id não responde \"quem apagou o fulano?\".\n const before = get().items ?? []\n const names = new Map(ids.map((id) => [id, displayName(before.find((item) => item.id === id))]))\n\n const result = await bulkRemove(dataProvider, ids)\n const failedIds = new Set(result.failed.map((f) => f.id))\n const deleted = ids.filter((id) => !failedIds.has(id))\n\n if (entity && deleted.length > 0) {\n const tenantId = getActiveTenantId()\n for (const id of deleted) {\n emitDomainEvent(\n entityEventKey(entity.entityKey, 'deleted'),\n { entity_label: entity.label, record_id: id, record_name: names.get(id) ?? '' },\n { tenantId, subject: { type: entity.entityKey, id } },\n )\n }\n void recordAuditMany(deleted.map((id) => ({\n tenantId,\n entityType: entity.entityKey,\n entityId: id,\n action: 'deleted' as const,\n recordName: names.get(id) || undefined,\n entityLabel: entity.label,\n })))\n }\n\n if (deleted.length > 0) {\n const dropped = new Set(deleted)\n set((s) => ({\n items: s.items ? s.items.filter((item) => !dropped.has(item.id)) : s.items,\n total: Math.max(0, s.total - deleted.length),\n }))\n invalidate()\n await get().fetch()\n }\n\n return result\n },\n\n setQuery(partial) {\n set((s) => ({ query: { ...s.query, ...partial } }))\n queueMicrotask(() => get().fetch())\n },\n\n getById(id) {\n return (get().items ?? []).find((item) => item.id === id)\n },\n\n async fetchById(id) {\n const loaded = get().getById(id)\n if (loaded) return loaded\n try {\n const result = await dataProvider.list({ page: 1, pageSize: 1, filters: { id } } as CrudQuery)\n const row = result.data?.[0]\n // Anexa em vez de substituir: a lista carregada continua sendo a página\n // que o usuário estava vendo, e trocá-la faria o botão \"voltar\" chegar\n // numa lista de um item.\n if (row) set((s) => ({ items: [...(s.items ?? []), row as T] }))\n return row as T | undefined\n } catch {\n // Silencioso de propósito: o chamador já desenha \"não encontrado\", e um\n // toast de erro sobre uma busca que o usuário não pediu é ruído.\n return undefined\n }\n },\n }))\n}\n","import React, { useMemo } from 'react'\nimport { CrudPage } from './CrudPage'\nimport type { CrudAiCreate, CrudNavTab } from './CrudListView'\nimport { getCrudNavTabs } from './navTabRegistry'\nimport type { StatTileData } from '@fayz-ai/ui'\nimport { createCrudStore } from '../stores/createCrudStore'\nimport { resolveDataProvider } from '@fayz-ai/core'\nimport { registerEntity, deriveEntityKey } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\nimport type { DataProvider } from '@fayz-ai/core'\n\ninterface CreateCrudPageOptions<T extends { id: string }> {\n mockData?: T[]\n dataProvider?: DataProvider<T>\n /** List display mode: 'table' (default) or 'cards' */\n display?: 'table' | 'cards'\n /** Feature ID for permission gating on CRUD actions */\n feature?: string\n /**\n * Sibling lists this one heads a tab strip with (Clientes / Grupos /\n * Segmentos). Built lazily per render so a tab can navigate — the routing\n * primitive isn't available at module scope, where the page is defined.\n */\n navTabs?: () => CrudNavTab[]\n /** Which of `navTabs` is this page. */\n activeNavTab?: string\n /** If true, hides create/edit/delete actions — list and detail view only. */\n readOnly?: boolean\n /** Summary tiles for the list, derived from the rows currently loaded. */\n stats?: (items: T[] | null, total: number) => StatTileData[]\n /** Offer \"Criar com IA\" on the list and lend the assistant this store's write\n * path. See CrudPage.aiCreate / CrudAgentSurface. */\n aiCreate?: CrudAiCreate\n /** This CRUD is a SECTION of another screen (a related list on a detail page,\n * a cadastro inside a settings tab). See CrudListView.embedded. */\n embedded?: boolean\n /** Ver `CrudListView.emptyHint`. */\n emptyHint?: string\n}\n\nexport function createCrudPage<T extends { id: string }>(\n entityDef: EntityDef<T>,\n options?: CreateCrudPageOptions<T>,\n): React.ComponentType & { __crudBasePath?: string } {\n const display = options?.display ?? 'table'\n\n // A identidade que os eventos de cadastro carregam. Vem da MESMA função que\n // nomeia a entidade no registro, para que o evento emitido e o evento\n // declarado no catálogo nunca falem de chaves diferentes.\n const storeEntity = { entityKey: deriveEntityKey(entityDef), label: entityDef.name }\n\n // If an explicit dataProvider was given, use it eagerly (no lazy resolution needed)\n let eagerStore: ReturnType<typeof createCrudStore<T>> | null = null\n if (options?.dataProvider) {\n eagerStore = createCrudStore(options.dataProvider, storeEntity)\n }\n\n const GeneratedCrudPage: React.FC & { __crudBasePath?: string } = () => {\n // Lazy provider resolution — runs at render time when Supabase is already initialized\n const useStore = useMemo(() => {\n if (eagerStore) return eagerStore\n const provider = resolveDataProvider(entityDef, options?.mockData)\n return createCrudStore(provider, storeEntity)\n }, [])\n\n const basePath = GeneratedCrudPage.__crudBasePath ?? '/'\n // As abas da própria página primeiro, depois as que outros plugins\n // ofereceram a esta rota. Uma lista pode ser a cabeça de uma faixa sem\n // saber quem mais senta nela — ver navTabRegistry.\n const own = options?.navTabs?.() ?? []\n const contributed = getCrudNavTabs(basePath)\n const ids = new Set(own.map((t) => t.id))\n const navTabs = [...own, ...contributed.filter((t) => !ids.has(t.id))]\n return (\n <CrudPage\n entityDef={entityDef as EntityDef<any>}\n useStore={useStore as any}\n basePath={basePath}\n display={display}\n emptyHint={options?.emptyHint}\n feature={options?.feature}\n readOnly={options?.readOnly}\n navTabs={navTabs.length ? navTabs : undefined}\n activeNavTab={options?.activeNavTab}\n stats={options?.stats}\n aiCreate={options?.aiCreate}\n embedded={options?.embedded}\n />\n )\n }\n\n GeneratedCrudPage.displayName = `CrudPage(${entityDef.name})`\n ;(GeneratedCrudPage as any).__isCrudPage = true\n ;(GeneratedCrudPage as any).__entityDef = entityDef\n\n registerEntity({\n entityKey: deriveEntityKey(entityDef),\n label: entityDef.name,\n labelPlural: entityDef.namePlural ?? entityDef.name,\n icon: entityDef.icon,\n fields: entityDef.fields,\n source: 'app',\n archetype: entityDef.data?.archetype,\n entityDef: entityDef as EntityDef,\n mockData: options?.mockData as Array<{ id: string }> | undefined,\n })\n\n return GeneratedCrudPage\n}\n","import * as React from 'react'\nimport type { EntityDef, FieldDef, RelatedList } from '@fayz-ai/core'\nimport { createCrudPage } from './createCrudPage'\nimport { currentAppPath, onAppPathChange } from '@fayz-ai/core'\n\n/**\n * A child list, on the parent's detail page.\n *\n * The generic half of `EntityDef.relatedLists`: whatever the pairing is, the\n * work is the same — take the child entity, narrow it to the rows pointing at\n * this record, and hand it to the CRUD engine as an embedded section.\n *\n * Two things are derived rather than configured, because getting either wrong\n * produces a list that reads right and behaves wrong:\n *\n * - `data.filters` narrows the READ, so the tab shows this parent's children\n * and not the whole table.\n * - `data.defaults` stamps the WRITE, so \"Adicionar\" from inside the tab\n * creates a row that belongs to the parent you opened it from. Without it a\n * child would be created orphaned and vanish from the tab that made it.\n *\n * Both are keyed by COLUMN, not by field key — unlike a query filter, which the\n * provider maps for you, these two go straight to PostgREST. `zoneId` there\n * comes back as \"column plg_tables_tables.zoneId does not exist\".\n *\n * The foreign key is also dropped from the form: the answer is already known,\n * and offering it invites picking a different parent from inside this one.\n */\n\n/** The column a field key writes to — `columnMap` first, camelCase→snake after. */\nfunction columnOf(entity: EntityDef<any>, key: string): string {\n return entity.data?.columnMap?.[key] ?? key.replace(/[A-Z]/g, (c) => '_' + c.toLowerCase())\n}\nexport function RelatedListTab({ item, related, parentTabId }: {\n item: unknown\n entityDef: EntityDef\n related: RelatedList\n /**\n * The detail tab this list sits INSIDE, when it is not a tab of its own — two\n * child lists sharing one tab (the unit's \"Locais\": rooms and stock\n * locations). Each list then routes under `/<parentTabId>/<related id>`, so\n * \"Adicionar\" in one opens its form without the other list reading the same\n * `/new`.\n */\n parentTabId?: string\n}) {\n const parentId = (item as { id?: string } | null)?.id\n // The child CRUD routes off ITS OWN base, and here that base is this tab's\n // URL. Left unset it falls back to '/', so \"Adicionar\" and a row click\n // navigated to `/new` and `/{id}` at the app root — a 404 with the parent\n // forgotten.\n //\n // Read from the hash, like `useSubRoute` in CrudPage does, and NOT from\n // `useRouter().usePathname()`: the global adapter is the window one here, so\n // it answers `/` for every hash route in the app.\n const pathname = useHashPath()\n\n const Page = React.useMemo(() => {\n if (!parentId) return null\n const child = related.entity\n const fkColumn = columnOf(child, related.foreignKey)\n const scoped: EntityDef<any> = {\n ...child,\n fields: child.fields.filter((f: FieldDef) => f.key !== related.foreignKey),\n data: child.data\n ? {\n ...child.data,\n filters: { ...(child.data.filters ?? {}), [fkColumn]: parentId },\n defaults: { ...(child.data.defaults ?? {}), [fkColumn]: parentId },\n }\n : undefined,\n }\n // A frase do vazio vem da DECLARAÇÃO, e não do texto genérico: quem\n // declara uma lista relacionada costuma saber dizer a consequência de ela\n // estar vazia, e «O que você cadastrar aparece aqui» não diz nada.\n const page = createCrudPage(scoped, {\n display: 'table', embedded: true, emptyHint: related.emptyHint,\n })\n // A base é a rota DA ABA, e não o hash de agora.\n //\n // Atribuir `pathname` direto parece certo e se desfaz no primeiro clique:\n // \"Adicionar\" navega para `${base}/new`, o hash muda, este memo recalcula, e\n // a base passa a ser `.../setores-da-noite/new`. Relativo a ELA a sub-rota é\n // vazia, então o motor desenha a LISTA de novo — o formulário nunca aparece\n // e a URL fica em `/new` mentindo que apareceu.\n //\n // Cortar no segmento da aba dá uma base estável, seja qual for o que vier\n // depois (`/new`, `/{id}`, `/{id}/edit`).\n page.__crudBasePath = parentTabId\n ? nestedBasePath(pathname, parentTabId, relatedListTabId(related))\n : tabBasePath(pathname, relatedListTabId(related))\n return page\n }, [parentId, related, pathname, parentTabId])\n\n // A record that has not loaded has no children to scope to yet.\n if (!Page) return null\n return <Page />\n}\n\n/** O hash cortado no segmento da aba — tudo que vier depois é sub-rota do CRUD. */\nfunction tabBasePath(pathname: string, tabId: string): string {\n const marker = `/${tabId}`\n const at = pathname.lastIndexOf(marker)\n return at >= 0 ? pathname.slice(0, at + marker.length) : pathname\n}\n\n/** `.../<parentTab>/<child>` — stable whatever comes after (`/new`, `/{id}/edit`). */\nfunction nestedBasePath(pathname: string, parentTabId: string, childId: string): string {\n const full = `/${parentTabId}/${childId}`\n // LAST occurrence: the tab id can repeat a segment of the page route\n // (`/settings/locations/<id>/locations`).\n const at = pathname.lastIndexOf(full)\n if (at >= 0) return pathname.slice(0, at + full.length)\n // On the bare tab (or the detail root, where the tab is the default one) the\n // child segment is not in the URL yet: append it.\n const tab = pathname.lastIndexOf(`/${parentTabId}`)\n const isTabSegment = tab >= 0 && pathname.slice(tab + parentTabId.length + 1).replace(/\\/$/, '') === ''\n const base = isTabSegment ? pathname.slice(0, tab) : pathname.replace(/\\/$/, '')\n return `${base}${full}`\n}\n\n/** The current hash route, the way the CRUD engine reads it. */\nfunction useHashPath(): string {\n const read = () => currentAppPath()\n const [path, setPath] = React.useState(read)\n React.useEffect(() => {\n const handler = () => setPath(read())\n return onAppPathChange(handler)\n }, [])\n return path\n}\n\n/**\n * The tab id a related list answers to, in the route and in `initialTab`.\n *\n * SEM ACENTO, mesmo quando o nome tem.\n *\n * O id derivado vira SEGMENTO DE URL, e o navegador percent-encoda o hash:\n * «Serviços do pacote» virava `/servi%C3%A7os-do-pacote` na barra e\n * `/serviços-do-pacote` aqui. `tabBasePath` procurava o segundo dentro do\n * primeiro, não achava, e caía no caminho inteiro — com `/new` junto. Relativo\n * a essa base a sub-rota some, e o motor redesenhava a LISTA com a URL dizendo\n * `/new`: clicar em «Adicionar» não abria formulário nenhum.\n *\n * Normalizar e tirar os diacríticos faz o id bater com o que a barra mostra.\n * O id explícito continua mandando — é como se escreve a rota em inglês.\n */\nexport function relatedListTabId(related: RelatedList): string {\n if (related.id) return related.id\n return (related.entity.namePlural || related.entity.name)\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase()\n .replace(/\\s+/g, '-')\n}\n","import { useEffect, useRef, useState } from 'react'\nimport { X } from 'lucide-react'\nimport { getSupabaseClientOptional, useTranslation } from '@fayz-ai/core'\nimport { Button, Input } from '@fayz-ai/ui'\n\n// ---------------------------------------------------------------------------\n// Etiquetas livres — o tageamento do Notion, num campo de cadastro.\n//\n// A diferença para `multiselect` é quem decide a lista: lá alguém declarou as\n// opções antes; aqui quem cadastra INVENTA a etiqueta ao digitá-la, e as que a\n// casa já usou viram sugestão para as próximas.\n//\n// Isso importa porque toda casa recorta os próprios cadastros de um jeito que\n// o produto não pode prever — «cliente VIP», «coorte-3-dono-com-a-dor», «paga\n// sempre atrasado». Sem etiqueta, isso vai para Observações, onde não filtra,\n// não conta e não aparece em lista nenhuma.\n//\n// A FORMA é a do Notion e não a de uma lista de caixas: as escolhidas ficam\n// DENTRO do campo, e as disponíveis só aparecem quando alguém clica. Despejar\n// as vinte etiquetas do tenant embaixo do campo — que foi a primeira versão —\n// transforma o rail num índice de etiquetas, e a pergunta («quais são as\n// DESTE registro?») fica ilegível no meio da resposta de outra.\n// ---------------------------------------------------------------------------\n\nconst suggestionCache = new Map<string, string[]>()\n\nfunction useSuggestions(table: string | undefined): string[] {\n const [tags, setTags] = useState<string[]>(() => (table ? suggestionCache.get(table) ?? [] : []))\n useEffect(() => {\n if (!table || suggestionCache.has(table)) return\n const client = getSupabaseClientOptional() as any\n if (!client) return\n let alive = true\n // Uma página basta: sugestão é atalho, não inventário. Quem quiser uma\n // etiqueta que não apareceu continua digitando-a.\n void client.from(table).select('tags').not('tags', 'is', null).limit(500)\n .then(({ data }: { data: Array<{ tags: string[] | null }> | null }) => {\n const all = new Set<string>()\n for (const r of data ?? []) for (const t of r.tags ?? []) all.add(t)\n const list = [...all].sort()\n suggestionCache.set(table, list)\n if (alive) setTags(list)\n })\n .catch(() => { suggestionCache.set(table, []) })\n return () => { alive = false }\n }, [table])\n return tags\n}\n\n/**\n * A cor de uma etiqueta, DERIVADA do nome.\n *\n * Sem cadastro de cor e sem seletor: a mesma etiqueta tem a mesma cor em toda\n * tela, em todo cadastro e para todo usuário, porque a cor é uma função do\n * texto. Escolher cor à mão seria uma pergunta a mais no momento em que a\n * pessoa só queria etiquetar — e duas casas com «VIP» em cores diferentes não\n * ganham nada com isso.\n *\n * Tons claros de propósito: a etiqueta é um selo ao lado do texto, não um\n * botão; ela precisa se distinguir das vizinhas sem gritar mais que o campo.\n */\nconst TAG_TONES = [\n 'bg-red-100 text-red-800', 'bg-orange-100 text-orange-800', 'bg-amber-100 text-amber-800',\n 'bg-lime-100 text-lime-800', 'bg-emerald-100 text-emerald-800', 'bg-teal-100 text-teal-800',\n 'bg-sky-100 text-sky-800', 'bg-indigo-100 text-indigo-800', 'bg-violet-100 text-violet-800',\n 'bg-fuchsia-100 text-fuchsia-800', 'bg-rose-100 text-rose-800', 'bg-stone-200 text-stone-800',\n]\n\nexport function tagTone(tag: string): string {\n let h = 0\n for (let i = 0; i < tag.length; i++) h = (h * 31 + tag.charCodeAt(i)) | 0\n return TAG_TONES[Math.abs(h) % TAG_TONES.length]\n}\n\nexport function TagChip({ tag, onRemove }: { tag: string; onRemove?: () => void }) {\n return (\n <span className={`inline-flex max-w-full items-center gap-1 rounded px-1.5 py-0.5 text-xs ${tagTone(tag)}`}>\n <span className=\"truncate\">{tag}</span>\n {onRemove && (\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={onRemove} className=\"shrink-0 opacity-60 hover:opacity-100\" aria-label={tag}>\n <X className=\"h-3 w-3\" />\n </Button>\n )}\n </span>\n )\n}\n\nexport function TagsField({\n value,\n onChange,\n table,\n placeholder,\n}: {\n value: string[] | undefined\n onChange: (next: string[]) => void\n /** De onde vêm as sugestões — a tabela do próprio cadastro. */\n table?: string\n placeholder?: string\n}) {\n const t = useTranslation()\n const [draft, setDraft] = useState('')\n const [open, setOpen] = useState(false)\n const boxRef = useRef<HTMLDivElement>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const tags = value ?? []\n const suggestions = useSuggestions(table).filter(\n (s) => !tags.includes(s) && (!draft || s.toLowerCase().includes(draft.toLowerCase())),\n )\n\n // Fechar ao clicar fora, e não ao perder o foco: o clique numa sugestão\n // tira o foco do campo ANTES de chegar no item, e fechar no blur matava a\n // própria escolha.\n useEffect(() => {\n if (!open) return\n const onDown = (e: MouseEvent) => {\n if (!boxRef.current?.contains(e.target as Node)) setOpen(false)\n }\n document.addEventListener('mousedown', onDown)\n return () => document.removeEventListener('mousedown', onDown)\n }, [open])\n\n const add = (raw: string) => {\n const tag = raw.trim()\n // Duplicada não entra, e não é erro: quem digitou de novo queria que\n // estivesse lá, e está.\n if (!tag || tags.includes(tag)) { setDraft(''); return }\n onChange([...tags, tag])\n setDraft('')\n inputRef.current?.focus()\n }\n\n const isNew = draft.trim() && !suggestions.some((s) => s.toLowerCase() === draft.trim().toLowerCase())\n\n return (\n <div ref={boxRef} className=\"relative\">\n {/* As escolhidas moram DENTRO do campo, como no Notion — a caixa inteira\n é o controle, e clicar em qualquer parte dela começa a digitar. */}\n <div\n onClick={() => { setOpen(true); inputRef.current?.focus() }}\n className=\"flex min-h-9 w-full cursor-text flex-wrap items-center gap-1 rounded-input border border-input bg-background px-3 py-1.5 focus-within:ring-1 focus-within:ring-ring\"\n >\n {tags.map((tag) => (\n <TagChip key={tag} tag={tag} onRemove={() => onChange(tags.filter((x) => x !== tag))} />\n ))}\n <Input\n ref={inputRef}\n value={draft}\n onFocus={() => setOpen(true)}\n onChange={(e) => { setDraft(e.target.value); setOpen(true) }}\n onKeyDown={(e) => {\n // Enter e vírgula fecham a etiqueta; Backspace no vazio apaga a\n // última, que é como todo campo de chips do mundo se comporta.\n if (e.key === 'Enter' || e.key === ',') { e.preventDefault(); add(draft) }\n else if (e.key === 'Backspace' && !draft && tags.length) onChange(tags.slice(0, -1))\n else if (e.key === 'Escape') setOpen(false)\n }}\n placeholder={tags.length === 0 ? (placeholder ?? t('crud.tags.placeholder')) : ''}\n variant=\"bare\"\n wrapperClassName=\"min-w-[6rem] flex-1\"\n className=\"text-sm\"\n />\n </div>\n\n {open && (suggestions.length > 0 || isNew) && (\n <div className=\"absolute z-50 mt-1 max-h-52 w-full overflow-y-auto rounded-md border bg-popover p-1 shadow-md\">\n {isNew && (\n <Button\n variant=\"bare\"\n size=\"bare\"\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => add(draft)}\n className=\"flex w-full items-center gap-2 rounded px-2 py-1.5 text-left text-sm hover:bg-muted justify-start whitespace-normal font-normal\"\n >\n <span className=\"text-xs text-muted-foreground\">{t('crud.tags.create')}</span>\n <TagChip tag={draft.trim()} />\n </Button>\n )}\n {suggestions.map((s) => (\n <Button\n variant=\"bare\"\n size=\"bare\"\n key={s}\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => add(s)}\n className=\"flex w-full items-center rounded px-2 py-1.5 text-left hover:bg-muted justify-start\"\n >\n <TagChip tag={s} />\n </Button>\n ))}\n </div>\n )}\n </div>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { Loader2, Pencil, X } from 'lucide-react'\nimport { Badge, Button, Input, Markdown, PhoneLink, Switch, Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@fayz-ai/ui'\nimport { formatCurrency } from '@fayz-ai/core'\nimport type { FieldDef } from '@fayz-ai/core'\nimport { RelationCell } from './relation-field'\n\n// Radix Select cannot hold an empty value; this stands for \"nothing picked\".\nconst NO_OPTION = '__none__'\nimport { TagChip } from './TagsField'\n\nexport function formatFieldValue(field: FieldDef, value: any, t?: (key: string) => string, row?: Record<string, any>): React.ReactNode {\n if (value == null || value === '') return <span className=\"text-muted-foreground/50\">—</span>\n\n // A LINHA inteira, não um objeto vazio: metade das células desenha olhando\n // para os irmãos do campo — a foto ao lado do nome, o mínimo embaixo do\n // saldo, o «sem classificação» que só se sabe lendo os sete interruptores.\n // Com `{}` elas caíam todas no caso degenerado, e a ficha mostrava uma coisa\n // enquanto a lista mostrava outra.\n if (field.renderCell) return field.renderCell(value, row ?? {})\n\n switch (field.type) {\n case 'boolean':\n return (\n <Badge variant={value ? 'default' : 'secondary'}>\n {value ? (t?.('common.yes') ?? 'Yes') : (t?.('common.no') ?? 'No')}\n </Badge>\n )\n case 'currency': {\n const num = typeof value === 'number' ? value : parseFloat(value)\n return isNaN(num) ? value : formatCurrency(num, field.currency)\n }\n case 'color':\n return (\n <span className=\"inline-flex items-center gap-2\">\n <span className=\"h-5 w-5 rounded border border-border shrink-0\" style={{ backgroundColor: String(value) }} />\n <span className=\"text-xs font-mono text-muted-foreground\">{String(value)}</span>\n </span>\n )\n case 'date':\n // A bare `YYYY-MM-DD` parses as UTC midnight: west of UTC it printed the day before.\n if (typeof value === 'string' && /^\\d{4}-\\d{2}-\\d{2}$/.test(value)) {\n const [y, m, d] = value.split('-').map(Number)\n return new Date(y, m - 1, d).toLocaleDateString()\n }\n try { return new Date(value).toLocaleDateString() } catch { return value }\n case 'datetime':\n try { return new Date(value).toLocaleString() } catch { return value }\n // As TRÊS espécies de escolha, e não só `select`.\n //\n // `segmented` e `multiselect` caíam no ramo genérico e mostravam o valor\n // gravado: a mesma entidade dizia «Produção» na lista e «produce» na\n // ficha. Escolha é escolha — o que muda entre elas é o controle do\n // formulário, não o que o leitor vê.\n case 'select':\n case 'segmented':\n case 'multiselect': {\n const options = (field.options ?? []).map((o) => typeof o === 'string' ? { label: o, value: o } : o)\n const rotulo = (v: unknown) => options.find((o) => o.value === v)?.label ?? String(v)\n if (Array.isArray(value)) {\n return <>{value.map((v) => <Badge key={String(v)} variant=\"secondary\" className=\"mr-1\">{rotulo(v)}</Badge>)}</>\n }\n return <Badge variant=\"secondary\">{rotulo(value)}</Badge>\n }\n // Chave estrangeira é escolha como as outras — o que a ficha tem de mostrar\n // é o NOME da linha apontada. Sem este ramo ela caía no `default` e\n // imprimia o uuid cru, enquanto a mesma coluna na lista já dizia\n // «Pertinho do Céu» (a lista passa por RelationCell desde sempre).\n case 'relation':\n return <RelationCell relation={field.relation} value={value} />\n case 'image':\n return value ? (\n <img src={value} alt=\"\" className=\"h-16 w-16 rounded-lg object-cover\" />\n ) : null\n case 'email':\n return <a href={`mailto:${value}`} className=\"text-primary hover:underline\">{value}</a>\n case 'phone':\n return <PhoneLink phone={String(value)} className=\"text-primary\" />\n case 'url':\n return <a href={value} target=\"_blank\" rel=\"noopener noreferrer\" className=\"text-primary hover:underline\">{value}</a>\n // Endereço é um OBJETO, e o ramo genérico imprimia `[object Object]` —\n // o valor certo no banco, ilegível na tela. Uma linha, na ordem em que se\n // lê um endereço em voz alta.\n case 'address': {\n const a = value as Record<string, string> | null\n if (!a) return null\n const rua = [a.street, a.number].filter(Boolean).join(', ')\n const linha = [rua, a.complement, a.district].filter(Boolean).join(' · ')\n const cidade = [a.city, a.state].filter(Boolean).join('/')\n return <>{[linha, cidade, a.postalCode].filter(Boolean).join(' · ') || null}</>\n }\n // Etiqueta se lê como etiqueta — com a MESMA cor do formulário, que é\n // derivada do nome e por isso não precisa viajar junto com o dado.\n case 'tags': {\n const list = Array.isArray(value) ? (value as string[]) : []\n if (list.length === 0) return null\n return <span className=\"flex flex-wrap gap-1\">{list.map((tag) => <TagChip key={tag} tag={tag} />)}</span>\n }\n case 'textarea':\n return <p className=\"whitespace-pre-wrap\">{value}</p>\n case 'markdown':\n return value ? <Markdown source={String(value)} /> : null\n default:\n return String(value)\n }\n}\n\n// Inline field editing.\n//\n// Fixing one mistyped email meant opening the whole form, finding the field\n// among twenty, saving everything. A form exists to FILL a record; for one\n// field it is the wrong instrument — and that cost is why small wrong data\n// stays wrong.\n//\n// Only types that fit on a line. `image` and `markdown` stay in the form: a\n// markdown editor inside a read cell is a form in disguise.\n//\n// UMA ALTERAÇÃO NÃO É UM SALVAMENTO. Cada célula tinha o seu próprio ✓, e\n// corrigir sexo, estado civil e escolaridade da mesma ficha eram três cliques\n// de confirmação, três escritas e três avisos — com três células abertas ao\n// mesmo tempo na tela, cada uma pedindo a sua. Ninguém edita uma ficha um\n// campo de cada vez; edita-se o que estiver errado e salva-se no fim.\n//\n// Então o editor só ENCOSTA o valor no rascunho da ficha, e quem salva é a\n// ilha de «Alterações não salvas» da shell — a mesma do formulário, no mesmo\n// canto, com o mesmo Cmd+Enter. O que fecha a célula é o gesto natural de\n// terminar de digitar: Enter, ou sair do campo. Esc desfaz a célula.\n\nconst INLINE_EDITABLE: ReadonlySet<string> = new Set([\n 'text', 'email', 'phone', 'url', 'number', 'currency', 'date', 'textarea', 'select', 'boolean',\n])\n\nexport function isInlineEditable(field: FieldDef): boolean {\n return (\n INLINE_EDITABLE.has(field.type) &&\n field.showInForm !== false &&\n field.key !== 'id'\n )\n}\n\nexport function InlineEditor({\n field,\n value,\n onCancel,\n onSave,\n cancelLabel = 'Cancel',\n}: {\n field: FieldDef\n value: any\n onCancel: () => void\n /** Encosta o valor — quem escreve de verdade é a ilha de salvar da shell. */\n onSave: (next: unknown) => Promise<void>\n cancelLabel?: string\n}) {\n const [draft, setDraft] = useState<any>(value ?? '')\n const [saving, setSaving] = useState(false)\n const inputRef = React.useRef<HTMLInputElement | HTMLTextAreaElement | null>(null)\n\n useEffect(() => {\n inputRef.current?.focus()\n if (inputRef.current instanceof HTMLInputElement) inputRef.current.select()\n }, [])\n\n const commit = async () => {\n if (saving) return\n // No change, no write: a reflex Enter should not produce an update.\n if ((draft ?? '') === (value ?? '')) return onCancel()\n setSaving(true)\n try {\n await onSave(field.type === 'number' || field.type === 'currency' ? Number(draft) : draft)\n onCancel()\n } finally {\n setSaving(false)\n }\n }\n\n // Esc undoes the cell, not the surface around it. A dialog listens on the\n // document in capture phase, before React sees the key — so only a window\n // capture listener gets there first.\n const cancelRef = React.useRef(onCancel)\n cancelRef.current = onCancel\n useEffect(() => {\n const onEscape = (event: KeyboardEvent) => {\n if (event.key !== 'Escape') return\n event.preventDefault()\n event.stopPropagation()\n cancelRef.current()\n }\n window.addEventListener('keydown', onEscape, true)\n return () => window.removeEventListener('keydown', onEscape, true)\n }, [])\n\n const onKeyDown = (event: React.KeyboardEvent) => {\n // Enter saves, except in a textarea where it is a newline.\n if (event.key === 'Enter' && field.type !== 'textarea') {\n event.preventDefault()\n void commit()\n }\n }\n\n const options = (field.options ?? []).map((o) => (typeof o === 'string' ? { label: o, value: o } : o))\n\n return (\n <div className=\"flex items-center gap-1.5\">\n {field.type === 'boolean' ? (\n <Switch\n checked={Boolean(draft)}\n onCheckedChange={(next: boolean) => {\n setDraft(next)\n void onSave(next).then(onCancel)\n }}\n />\n ) : field.type === 'select' ? (\n // Picking is the whole gesture: the list opens at once, and closing it,\n // with a pick or without, closes the cell.\n <Select\n defaultOpen\n value={String(draft ?? '') || NO_OPTION}\n onValueChange={(v) => { const next = v === NO_OPTION ? '' : v; setDraft(next); void onSave(next).then(onCancel) }}\n onOpenChange={(open) => { if (!open) onCancel() }}\n >\n <SelectTrigger className=\"h-8 min-w-0 flex-1 px-2\"><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value={NO_OPTION}>—</SelectItem>\n {options.map((o) => (\n <SelectItem key={String(o.value)} value={String(o.value)}>{o.label}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : field.type === 'textarea' ? (\n <textarea\n ref={inputRef as React.RefObject<HTMLTextAreaElement>}\n value={String(draft ?? '')}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={onKeyDown}\n onBlur={() => void commit()}\n rows={3}\n className=\"min-w-0 flex-1 rounded-input border border-input bg-background px-2 py-1.5 text-sm\"\n />\n ) : (\n <Input\n ref={inputRef as React.RefObject<HTMLInputElement>}\n type={field.type === 'number' || field.type === 'currency' ? 'number' : field.type === 'date' ? 'date' : 'text'}\n value={String(draft ?? '')}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={onKeyDown}\n onBlur={() => void commit()}\n className=\"h-8 min-w-0 flex-1 text-sm\"\n />\n )}\n\n {/* Só a saída. O ✓ virava a ilha de «Alterações não salvas» — terminar de\n digitar é Enter ou sair do campo, e confirmar duas vezes o mesmo valor\n não é confirmação, é cerimônia.\n `mousedown` barrado: sem isso o clique no × tiraria o foco primeiro,\n o `blur` encostaria o valor, e o botão de desfazer desfaria nada. */}\n {field.type !== 'boolean' && field.type !== 'select' && (\n <Button\n variant=\"ghost\" size=\"sm\" className=\"h-7 w-7 shrink-0 p-0\"\n aria-label={cancelLabel} title={cancelLabel}\n onMouseDown={(e) => e.preventDefault()}\n onClick={onCancel}\n disabled={saving}\n >\n {saving ? <Loader2 className=\"h-3.5 w-3.5 animate-spin\" /> : <X className=\"h-3.5 w-3.5\" />}\n </Button>\n )}\n </div>\n )\n}\n\nexport interface InlineFieldProps {\n field: FieldDef\n value: any\n /** O registro inteiro — só para o `labelWhen`, que lê os campos vizinhos. */\n row?: Record<string, any>\n t?: (key: string) => string\n compact?: boolean\n /** Absent means read-only. Whatever it does with the value (stage it, write\n * it) is the caller's; the cell closes when it resolves. */\n onSave?: (value: unknown) => Promise<void>\n /** Este valor está no rascunho e ainda não foi gravado. */\n pending?: boolean\n /** `row`: label beside value (the record page). `stacked`: label above value\n * (narrow side columns). `bare`: no label — a headline that edits in place. */\n layout?: 'row' | 'stacked' | 'bare'\n className?: string\n /** Replaces the formatted value in read mode, e.g. a headline's own typography. */\n display?: React.ReactNode\n}\n\n/** One field of a record: reads as its formatted value, edits in place from the\n * pencil that shows on hover. The same cell the CRUD record page uses. */\nexport function InlineField({\n field, value, row, t, compact, onSave, pending, layout = 'row', className, display,\n}: InlineFieldProps) {\n const [editing, setEditing] = useState(false)\n const editable = !!onSave && isInlineEditable(field)\n // A ficha de uma pessoa jurídica diz «CNPJ» onde a de uma pessoa física diz\n // «CPF», e é a mesma coluna. Ver FieldDef.labelWhen.\n const label = (field.labelWhen && field.labelWhen(row ?? {})) || field.label\n const editLabel = `${t?.('common.edit') ?? 'Edit'} ${label}`\n\n const content = editing && onSave ? (\n <InlineEditor\n field={field}\n value={value}\n onCancel={() => setEditing(false)}\n onSave={onSave}\n cancelLabel={t?.('common.cancel') ?? 'Cancel'}\n />\n ) : (\n <>\n {/* O valor encostado tem de SE VER. Sem marca, a ficha volta ao\n modo de leitura mostrando um dado que o banco ainda não tem, e\n quem sai da tela sem salvar jura ter salvado. */}\n <span className={`min-w-0 ${pending ? 'rounded-sm bg-warning/10 px-1 font-medium text-warning' : ''}`}>\n {display ?? formatFieldValue(field, value, t, row)}\n </span>\n {editable && (\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => setEditing(true)}\n aria-label={editLabel}\n title={editLabel}\n // `focus:` keeps the shortcut from existing only for mouse.\n className=\"font-normal whitespace-normal inline-flex h-6 w-6 shrink-0 items-center justify-center rounded-md text-muted-foreground opacity-0 transition-opacity hover:bg-muted hover:text-foreground focus:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring group-hover:opacity-100\"\n >\n <Pencil className=\"h-3 w-3\" />\n </Button>\n )}\n </>\n )\n\n if (layout === 'bare') {\n return <div className={`group flex min-w-0 items-center gap-1 ${className ?? ''}`}>{content}</div>\n }\n if (layout === 'stacked') {\n return (\n <div className={`group space-y-0.5 ${className ?? ''}`}>\n <p className=\"text-[11px] font-medium text-muted-foreground\">{label}</p>\n <div className=\"flex min-h-6 items-center gap-1.5 text-sm\">{content}</div>\n </div>\n )\n }\n return (\n <div className={`group grid grid-cols-3 gap-4 ${compact ? 'py-1.5' : 'py-3'} ${className ?? ''}`}>\n <dt className={`font-medium text-muted-foreground ${compact ? 'text-xs' : 'text-sm'}`}>{label}</dt>\n <dd className={`col-span-2 flex items-center gap-2 text-foreground ${compact ? 'text-xs' : 'text-sm'}`}>{content}</dd>\n </div>\n )\n}\n\nexport const FieldRow = InlineField\n","import { useEffect, useState } from 'react'\nimport { getActiveTenantId } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// QUANTOS, ANTES DO CLIQUE.\n//\n// O V1 põe o número na própria aba (`countKey` em `BASE_TAB_META`), e é o que\n// responde a pergunta do balcão sem abrir nada: \"essa paciente tem evolução?\",\n// \"tem exame guardado?\". Sem o número, descobrir que uma aba está vazia custa\n// um clique e uma consulta — por aba, toda vez.\n//\n// Registro de módulo pelo mesmo motivo da linha do tempo (ver timeline/registry):\n// quem sabe contar documento é o plugin de formulários, e o core não pode nomear\n// `plg_forms_*`. Num pool sem o plugin, ninguém registrou, e as abas\n// simplesmente não têm número.\n//\n// Um provedor devolve VÁRIAS abas de uma vez, de propósito: Registros e\n// Arquivos saem da mesma tabela, e contá-los em duas consultas seria pagar dobrado\n// por um `group by`.\n// ---------------------------------------------------------------------------\n\nexport interface TabCountArgs {\n tenantId: string\n personId: string\n}\n\nexport interface TabCountProvider {\n /** Único. Um segundo registro com o mesmo id substitui o primeiro (HMR). */\n id: string\n /** `{ documents: 12, files: 3 }` — a chave é o id da aba. */\n fetch(args: TabCountArgs): Promise<Record<string, number>>\n}\n\nconst providers = new Map<string, TabCountProvider>()\n\nexport function registerTabCountProvider(provider: TabCountProvider): void {\n providers.set(provider.id, provider)\n}\n\nexport function unregisterTabCountProvider(id: string): void {\n providers.delete(id)\n}\n\nexport function getTabCountProviders(): TabCountProvider[] {\n return Array.from(providers.values())\n}\n\n/**\n * \"Contei errado, conta de novo.\"\n *\n * Quem grava é o plugin; quem mostra o número é a barra de abas, que está fora\n * dele. Sem este aviso, salvar uma anamnese deixava o badge dizendo o número de\n * antes até a próxima troca de ficha — e um contador que mente é pior do que\n * contador nenhum.\n */\nconst listeners = new Set<() => void>()\n\nexport function invalidateTabCounts(): void {\n for (const fn of listeners) fn()\n}\n\n/**\n * Os números das abas desta pessoa.\n *\n * Devolve `{}` enquanto carrega, e o rótulo aparece sem badge — a aba não pode\n * piscar um zero que ela não sabe se é verdade. Um provedor que falha é\n * ignorado: uma aba sem número continua sendo uma aba.\n */\nexport function usePersonTabCounts(personId: string | undefined): Record<string, number> {\n const [counts, setCounts] = useState<Record<string, number>>({})\n const [nonce, setNonce] = useState(0)\n\n useEffect(() => {\n const bump = () => setNonce((n) => n + 1)\n listeners.add(bump)\n return () => { listeners.delete(bump) }\n }, [])\n\n useEffect(() => {\n const tenantId = getActiveTenantId()\n const list = getTabCountProviders()\n if (!personId || !tenantId || list.length === 0) {\n setCounts({})\n return\n }\n let alive = true\n void Promise.all(\n list.map((p) => p.fetch({ tenantId, personId }).catch(() => ({} as Record<string, number>))),\n ).then((results) => {\n if (!alive) return\n const merged: Record<string, number> = {}\n for (const result of results) {\n for (const [tabId, n] of Object.entries(result)) {\n if (typeof n === 'number' && Number.isFinite(n)) merged[tabId] = n\n }\n }\n setCounts(merged)\n })\n return () => { alive = false }\n }, [personId, nonce])\n\n return counts\n}\n","import { create } from 'zustand'\nimport type { Invite } from '../types/invite'\n\ninterface InviteStore {\n invites: Invite[]\n loading: boolean\n setInvites: (invites: Invite[]) => void\n setLoading: (loading: boolean) => void\n reset: () => void\n}\n\nexport const useInviteStore = create<InviteStore>((set) => ({\n invites: [],\n loading: false,\n setInvites: (invites) => set({ invites }),\n setLoading: (loading) => set({ loading }),\n reset: () => set({ invites: [], loading: false }),\n}))\n","import * as React from 'react'\nimport { Badge, Button } from '@fayz-ai/ui'\nimport { Settings2 } from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { usePermissionsStore } from '../../permissions/store'\nimport { useSystemPermission } from '../../hooks/useSystemPermission'\nimport { navigateTo } from '../../app/routing'\nimport type { FeatureDeclaration, PermissionAction, SystemPermission } from '../../types/permissions'\n\nconst ACTIONS: PermissionAction[] = ['read', 'create', 'edit', 'delete']\nconst SYSTEM_PERMISSIONS: { id: SystemPermission; key: string }[] = [\n { id: 'manage_team', key: 'organization.permissions.manageTeam' },\n { id: 'manage_billing', key: 'organization.permissions.manageBilling' },\n { id: 'manage_settings', key: 'organization.permissions.manageSettings' },\n { id: 'manage_permissions', key: 'organization.permissions.managePermissions' },\n]\n\n/** Read-only view of what a role reaches. Editing stays on the roles screen, so one role never has two editors. */\nexport function RoleSummary({ roleId }: { roleId: string | null | undefined }) {\n const t = useTranslation()\n const profile = usePermissionsStore((s) => s.profiles.find((p) => p.id === roleId))\n const features = usePermissionsStore((s) => s.features)\n const canEditRoles = useSystemPermission()('manage_permissions')\n\n const groups = React.useMemo(() => {\n const map = new Map<string, { granted: { feature: FeatureDeclaration; actions: PermissionAction[] }[]; denied: FeatureDeclaration[] }>()\n for (const feature of features) {\n const group = feature.group ?? t('crud.archetype.access.generalGroup')\n if (!map.has(group)) map.set(group, { granted: [], denied: [] })\n const held = profile?.grants[feature.id] ?? []\n // `manage` is the wildcard profileHasPermission honours; listing it literally hid \"Edit\" from owners.\n const actions = ACTIONS.filter((a) => held.includes(a) || held.includes('manage'))\n if (actions.length) map.get(group)!.granted.push({ feature, actions })\n else map.get(group)!.denied.push(feature)\n }\n return [...map.entries()]\n }, [features, profile, t])\n\n if (!profile) return null\n const system = SYSTEM_PERMISSIONS.filter((sp) => profile.systemPermissions?.includes(sp.id))\n\n return (\n <div className=\"space-y-4 border-t border-border pt-4\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium\">{t('crud.archetype.access.summaryTitle', { role: profile.name })}</p>\n {profile.description && <p className=\"text-xs text-muted-foreground\">{profile.description}</p>}\n </div>\n {canEditRoles && (\n <Button variant=\"ghost\" size=\"sm\" onClick={() => navigateTo('/settings/permissions')}>\n <Settings2 className=\"mr-1.5 h-4 w-4\" />\n {t('crud.archetype.access.editRole')}\n </Button>\n )}\n </div>\n\n {system.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {system.map((sp) => <Badge key={sp.id} variant=\"secondary\" className=\"text-xs\">{t(sp.key)}</Badge>)}\n </div>\n )}\n\n <div className=\"divide-y divide-border rounded-lg border border-border\">\n {groups.map(([group, { granted, denied }]) => (\n <div key={group} className=\"space-y-2 p-3\">\n <p className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">{group}</p>\n {granted.map(({ feature, actions }) => (\n <div key={feature.id} className=\"flex flex-wrap items-center justify-between gap-2\">\n <span className=\"text-sm\">{feature.label}</span>\n <span className=\"flex flex-wrap gap-1\">\n {actions.map((a) => (\n <Badge key={a} variant=\"outline\" className=\"text-[11px]\">{t(`crud.archetype.access.action.${a}`)}</Badge>\n ))}\n </span>\n </div>\n ))}\n {denied.length > 0 && (\n <p className=\"text-xs text-muted-foreground\">\n {t('crud.archetype.access.noAccessTo', { list: denied.map((f) => f.label).join(', ') })}\n </p>\n )}\n </div>\n ))}\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport { KeyRound, Loader2, Mail, ShieldCheck, UserMinus, UserX } from 'lucide-react'\nimport {\n Card, CardContent, Badge, Button, Input, Skeleton, ConfirmDialog,\n Select, SelectTrigger, SelectValue, SelectContent, SelectItem,\n} from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useAuthStore } from '@fayz-ai/auth'\nimport { toast } from '../../components/notifications/ToastProvider'\nimport { useOrganizationStore } from '../../stores/organization.store'\nimport { usePermissionsStore } from '../../permissions'\nimport { useInviteStore } from '../../stores/invite.store'\nimport { useOrgAdapterOptional as useNativeOrgAdapter } from '../../org'\nimport type { OrgAdapter } from '../../types/org-adapter'\nimport { fetchPersonAccess, setPersonEmail, type PersonAccess } from '../../org/self'\nimport { useSystemPermission } from '../../hooks/useSystemPermission'\nimport { useLimitGuard } from '../../access/context'\nimport { invalidateLimit } from '../../access/limits-registry'\nimport { RoleSummary } from './RoleSummary'\n\n// ---------------------------------------------------------------------------\n// \"Acesso\" na ficha de quem trabalha aqui.\n//\n// Dar acesso a uma colaboradora era uma viagem: abrir Configurações → Equipe,\n// achar de novo a pessoa que já estava aberta na tela anterior, digitar o\n// e-mail dela de memória num diálogo que não sabia de quem se tratava. E o\n// e-mail digitado ali é o que decide se o convite aceito vira A MESMA pessoa ou\n// uma segunda ficha: `app.person_for_login` casa o login novo com uma ficha\n// existente pelo e-mail. Errar o e-mail não dava erro nenhum — dava um\n// duplicado que ninguém ia procurar.\n//\n// Por isso o formulário vive AQUI, na ficha, já sabendo de quem é: o e-mail\n// vem preenchido da própria pessoa, e o que for digitado é gravado na ficha\n// antes de o convite sair.\n// ---------------------------------------------------------------------------\n\nconst useOrgAdapterOptional = () => useNativeOrgAdapter() as unknown as OrgAdapter | null\n\ninterface PersonItem {\n id?: string\n name?: string\n email?: string\n metadata?: { access?: { suggested_role_id?: string } } | null\n}\n\nfunction isEmail(value: string): boolean {\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value.trim())\n}\n\nexport function AccessTab({ item }: { item: unknown }) {\n const t = useTranslation()\n const person = item as PersonItem | undefined\n const personId = person?.id\n\n const adapter = useOrgAdapterOptional()\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n const profiles = usePermissionsStore((s) => s.profiles)\n const invites = useInviteStore((s) => s.invites)\n const setInvites = useInviteStore((s) => s.setInvites)\n const { user } = useAuthStore()\n const hasSystemPermission = useSystemPermission()\n const canManageTeam = hasSystemPermission('manage_team')\n const guardSeats = useLimitGuard('users')\n\n const [access, setAccess] = React.useState<PersonAccess | null | undefined>(undefined)\n const [email, setEmail] = React.useState(person?.email ?? '')\n const [roleId, setRoleId] = React.useState('')\n const [busy, setBusy] = React.useState(false)\n const [confirmRemove, setConfirmRemove] = React.useState(false)\n\n // O papel sugerido, nesta ordem:\n // 1. o que a ficha diz que a pessoa tinha (`metadata.access.suggested_role_id`\n // — o porte de outro sistema grava ali o perfil de origem; sem isso, quem\n // era \"Profissional II\" no V1 chegava sugerido como \"Financeiro\");\n // 2. o segundo da lista, pela mesma razão do diálogo de convite: o primeiro\n // costuma ser \"owner\", que não é o que se dá a quem acabou de entrar.\n const suggestedRoleId = person?.metadata?.access?.suggested_role_id\n React.useEffect(() => {\n if (roleId || !profiles.length) return\n const sugerido = suggestedRoleId ? profiles.find((p) => p.id === suggestedRoleId) : undefined\n setRoleId(sugerido ? sugerido.id : (profiles[1]?.id ?? profiles[0]!.id))\n }, [profiles, roleId, suggestedRoleId])\n\n React.useEffect(() => { setEmail(person?.email ?? '') }, [person?.email])\n\n const reload = React.useCallback(async () => {\n if (!personId) return\n setAccess(await fetchPersonAccess(personId))\n }, [personId])\n\n React.useEffect(() => { void reload() }, [reload])\n\n // Os convites são do workspace, não desta ficha — se a tela de equipe já os\n // carregou, esta reaproveita; senão pede uma vez.\n React.useEffect(() => {\n if (!adapter || !currentOrg || invites.length > 0) return\n adapter.listInvites(currentOrg.id).then(setInvites).catch(() => {})\n }, [adapter, currentOrg?.id])\n\n const pendingInvite = React.useMemo(() => {\n const target = (person?.email ?? '').trim().toLowerCase()\n if (!target) return undefined\n return invites.find((i) => i.status === 'pending' && i.email.toLowerCase() === target)\n }, [invites, person?.email])\n\n async function refreshInvites() {\n if (!adapter || !currentOrg) return\n setInvites(await adapter.listInvites(currentOrg.id))\n }\n\n async function handleGrant() {\n if (!adapter || !currentOrg || !user || !personId) return\n const value = email.trim()\n if (!isEmail(value)) {\n toast.error(t('crud.archetype.access.emailInvalid'))\n return\n }\n if ((await guardSeats(1)) === 'blocked') return\n setBusy(true)\n try {\n // A ficha primeiro, o convite depois: é o e-mail GRAVADO que o banco vai\n // usar para reconhecer esta pessoa quando ela aceitar.\n if (value.toLowerCase() !== (person?.email ?? '').trim().toLowerCase()) {\n await setPersonEmail(personId, value)\n }\n await adapter.createInvite(currentOrg.id, value, roleId, user.id)\n await refreshInvites()\n invalidateLimit('users')\n toast.success(t('crud.archetype.access.granted', { email: value }))\n } catch (err: any) {\n toast.error(t('crud.archetype.access.grantFailed'), { description: err?.message })\n } finally {\n setBusy(false)\n }\n }\n\n async function handleRole(nextRole: string) {\n if (!adapter || !currentOrg || !access) return\n setBusy(true)\n try {\n await adapter.updateMemberProfile(currentOrg.id, access.memberId, nextRole)\n await reload()\n } catch (err: any) {\n toast.error(t('crud.archetype.access.roleFailed'), { description: err?.message })\n } finally {\n setBusy(false)\n }\n }\n\n async function handleRemove() {\n if (!adapter || !currentOrg || !access) return\n setBusy(true)\n try {\n await adapter.removeMember(currentOrg.id, access.memberId)\n await reload()\n invalidateLimit('users')\n toast.success(t('crud.archetype.access.removed'))\n } catch (err: any) {\n toast.error(t('crud.archetype.access.removeFailed'), { description: err?.message })\n } finally {\n setBusy(false)\n setConfirmRemove(false)\n }\n }\n\n if (!personId || access === undefined) {\n return (\n <Card>\n <CardContent className=\"space-y-2 py-6\">\n <Skeleton className=\"h-9 w-full\" />\n <Skeleton className=\"h-9 w-2/3\" />\n </CardContent>\n </Card>\n )\n }\n\n // ── Já entra no sistema ──────────────────────────────────────────────────\n if (access) {\n const isSelf = access.userId === user?.id\n const roleName = profiles.find((p) => p.id === access.role)?.name ?? access.role ?? ''\n return (\n <Card>\n <CardContent className=\"space-y-5 py-6\">\n <div className=\"flex items-start gap-3\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-success/10\">\n <ShieldCheck className=\"h-5 w-5 text-success\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium\">\n {t('crud.archetype.access.hasAccess')}\n {isSelf && <span className=\"ml-1 text-muted-foreground\">{t('organization.team.you')}</span>}\n </p>\n {/* `profiles` pode não ter linha para o colega (contas anteriores\n ao gatilho), e aí o e-mail da própria ficha diz a mesma coisa\n melhor do que uma frase genérica. */}\n <p className=\"truncate text-xs text-muted-foreground\">\n {access.email ?? person?.email ?? access.name ?? t('crud.archetype.access.loginUnknown')}\n </p>\n {access.joinedAt && (\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {t('crud.archetype.access.since', { date: new Date(access.joinedAt).toLocaleDateString() })}\n </p>\n )}\n </div>\n </div>\n\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium\">{t('crud.archetype.access.roleLabel')}</label>\n {canManageTeam && !isSelf ? (\n <Select value={access.role ?? undefined} onValueChange={(v: string) => void handleRole(v)}>\n <SelectTrigger className=\"h-9 w-full max-w-xs text-sm\" disabled={busy}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {profiles.map((p) => (\n <SelectItem key={p.id} value={p.id}>{p.name}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : (\n <div><Badge variant=\"secondary\" className=\"text-xs\">{roleName}</Badge></div>\n )}\n <p className=\"text-xs text-muted-foreground\">{t('crud.archetype.access.roleHint')}</p>\n </div>\n\n <RoleSummary roleId={access.role} />\n\n {/* Em QUE unidades ela trabalha é a aba ao lado, nesta mesma ficha —\n repetir aqui daria duas respostas para a mesma pergunta, uma\n delas por cima da outra num painel. */}\n {canManageTeam && !isSelf && (\n <div className=\"border-t border-border pt-4\">\n <Button variant=\"ghost\" size=\"sm\" className=\"text-destructive hover:text-destructive\"\n disabled={busy} onClick={() => setConfirmRemove(true)}>\n <UserMinus className=\"mr-1.5 h-4 w-4\" />\n {t('crud.archetype.access.remove')}\n </Button>\n </div>\n )}\n\n <ConfirmDialog\n open={confirmRemove}\n onCancel={() => setConfirmRemove(false)}\n loading={busy}\n title={t('crud.archetype.access.removeTitle')}\n description={t('crud.archetype.access.removeDescription', { name: person?.name ?? '' })}\n confirmLabel={t('crud.archetype.access.remove')}\n variant=\"destructive\"\n onConfirm={() => { void handleRemove() }}\n />\n </CardContent>\n </Card>\n )\n }\n\n // ── Convite já enviado, esperando ela aceitar ────────────────────────────\n if (pendingInvite) {\n return (\n <Card>\n <CardContent className=\"space-y-4 py-6\">\n <div className=\"flex items-start gap-3\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-muted\">\n <Mail className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium\">\n {t('crud.archetype.access.pendingTitle', { email: pendingInvite.email })}\n </p>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {t('crud.archetype.access.pendingDescription')}\n </p>\n <Badge variant=\"secondary\" className=\"mt-2 text-xs\">\n {profiles.find((p) => p.id === pendingInvite.profileId)?.name ?? pendingInvite.profileName}\n </Badge>\n </div>\n </div>\n {canManageTeam && adapter && currentOrg && (\n <div className=\"flex flex-wrap gap-2 border-t border-border pt-4\">\n <Button variant=\"outline\" size=\"sm\" disabled={busy} onClick={async () => {\n setBusy(true)\n try {\n await adapter.resendInvite(currentOrg.id, pendingInvite.id)\n await refreshInvites()\n toast.success(t('organization.team.inviteResent'))\n } catch (err: any) {\n toast.error(t('organization.team.inviteActionFailed'), { description: err?.message })\n } finally { setBusy(false) }\n }}>\n {t('organization.team.resend')}\n </Button>\n <Button variant=\"ghost\" size=\"sm\" className=\"text-destructive hover:text-destructive\"\n disabled={busy} onClick={async () => {\n setBusy(true)\n try {\n await adapter.revokeInvite(currentOrg.id, pendingInvite.id)\n await refreshInvites()\n toast.success(t('organization.team.inviteRevoked'))\n } catch (err: any) {\n toast.error(t('organization.team.inviteActionFailed'), { description: err?.message })\n } finally { setBusy(false) }\n }}>\n {t('organization.team.revoke')}\n </Button>\n </div>\n )}\n </CardContent>\n </Card>\n )\n }\n\n // ── Ainda não entra ──────────────────────────────────────────────────────\n return (\n <Card>\n <CardContent className=\"space-y-5 py-6\">\n <div className=\"flex items-start gap-3\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-muted\">\n <UserX className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium\">{t('crud.archetype.access.noneTitle')}</p>\n <p className=\"mt-1 text-xs text-muted-foreground\">{t('crud.archetype.access.noneDescription')}</p>\n </div>\n </div>\n\n {!canManageTeam ? (\n <p className=\"rounded-lg border border-border bg-muted/40 p-3 text-xs text-muted-foreground\">\n {t('crud.archetype.access.readOnly')}\n </p>\n ) : (\n <>\n <div className=\"space-y-3 border-t border-border pt-4\">\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium\">{t('crud.archetype.access.emailLabel')}</label>\n <Input\n type=\"email\"\n className=\"max-w-md\"\n value={email}\n placeholder=\"pessoa@exemplo.com\"\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setEmail(e.target.value)}\n />\n <p className=\"text-xs text-muted-foreground\">{t('crud.archetype.access.emailHint')}</p>\n </div>\n\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium\">{t('crud.archetype.access.roleLabel')}</label>\n <Select value={roleId} onValueChange={setRoleId}>\n <SelectTrigger className=\"h-9 w-full max-w-xs text-sm\">\n <SelectValue placeholder={t('organization.invite.rolePlaceholder')} />\n </SelectTrigger>\n <SelectContent>\n {profiles.map((p) => (\n <SelectItem key={p.id} value={p.id}>{p.name}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <Button disabled={busy || !email.trim() || !roleId} onClick={() => { void handleGrant() }}>\n {busy ? <Loader2 className=\"mr-1.5 h-4 w-4 animate-spin\" /> : <KeyRound className=\"mr-1.5 h-4 w-4\" />}\n {t('crud.archetype.access.grant')}\n </Button>\n </div>\n\n </>\n )}\n </CardContent>\n </Card>\n )\n}\n","import * as React from 'react'\nimport { useDataVersion } from '@fayz-ai/core'\nimport {\n Card, CardContent, Button, Skeleton, Checkbox,\n Select, SelectTrigger, SelectValue, SelectContent, SelectItem,\n} from '@fayz-ai/ui'\nimport { AlertTriangle, Building2, UserX } from 'lucide-react'\nimport { usePermissionsStore } from '../permissions'\nimport { toast } from '../components/notifications/ToastProvider'\nimport { useUnitStore } from './store'\nimport { useUnitBootstrap } from './useUnitBootstrap'\nimport { bindUserToUnit, fetchMemberUnits, fetchUserIdForPerson, unbindUserFromUnit, UNIT_ACCESS_CHANGED } from './data'\n\n// ---------------------------------------------------------------------------\n// \"Unidades\" on a staff record.\n//\n// Same single row as the unit roster and the team sheet — three doors into one\n// fact, because each of the three is where a different person naturally goes.\n// Whoever is looking at a professional's file wants to answer \"where does she\n// work\" right there, not by leaving for Settings.\n//\n// A checkbox list rather than an add/remove flow: the question is \"which of\n// our units\", the answer is usually most or one, and a list you can read in a\n// glance beats a list you have to assemble.\n// ---------------------------------------------------------------------------\n\nconst NO_EXTRA_ROLE = '__none__'\n\nexport function PersonUnitsTab({ item }: { item: unknown }) {\n useUnitBootstrap()\n const person = item as { id?: string; name?: string } | undefined\n const personId = person?.id\n\n const units = useUnitStore((s) => s.units)\n const unitMode = useUnitStore((s) => s.unitMode)\n const profiles = usePermissionsStore((s) => s.profiles)\n\n const [userId, setUserId] = React.useState<string | null | undefined>(undefined)\n const [bindings, setBindings] = React.useState<Record<string, string | null>>({})\n const [busy, setBusy] = React.useState<string | null>(null)\n // A mesma pessoa pode ser mexida pela tela de equipe ou pelo painel da\n // direita; a ficha dela não pode ser a última a saber.\n const bindingsVersion = useDataVersion(UNIT_ACCESS_CHANGED)\n\n React.useEffect(() => {\n if (!personId) return\n let alive = true\n void fetchUserIdForPerson(personId).then((uid) => { if (alive) setUserId(uid) })\n return () => { alive = false }\n }, [personId])\n\n const reload = React.useCallback(async (uid: string) => {\n const rows = await fetchMemberUnits(uid)\n setBindings(Object.fromEntries(rows.map((r) => [r.locationId, r.role])))\n }, [])\n\n React.useEffect(() => {\n if (userId) void reload(userId)\n }, [userId, reload, bindingsVersion])\n\n async function toggle(unitId: string, on: boolean) {\n if (!userId) return\n setBusy(unitId)\n try {\n if (on) await bindUserToUnit(unitId, userId, null)\n else await unbindUserFromUnit(unitId, userId)\n await reload(userId)\n } catch (err: any) {\n toast.error(on ? 'Não deu para dar o acesso' : 'Não deu para tirar o acesso', { description: err?.message })\n } finally {\n setBusy(null)\n }\n }\n\n async function setRole(unitId: string, role: string) {\n if (!userId) return\n setBusy(unitId)\n try {\n await bindUserToUnit(unitId, userId, role === NO_EXTRA_ROLE ? null : role)\n await reload(userId)\n } catch (err: any) {\n toast.error('Não deu para mudar a função', { description: err?.message })\n } finally {\n setBusy(null)\n }\n }\n\n if (userId === undefined) {\n return <Card><CardContent className=\"space-y-2 py-6\"><Skeleton className=\"h-9 w-full\" /><Skeleton className=\"h-9 w-full\" /></CardContent></Card>\n }\n\n // No login means nothing to bind: access is a property of a person who signs\n // in, and half a salon's staff list never does.\n if (userId === null) {\n return (\n <Card>\n <CardContent className=\"flex flex-col items-center justify-center py-10 text-center\">\n <div className=\"mb-3 flex h-12 w-12 items-center justify-center rounded-full bg-muted\">\n <UserX className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <p className=\"text-sm font-medium\">Esta ficha não está ligada a nenhum login</p>\n <p className=\"mt-1 max-w-sm text-xs text-muted-foreground\">\n Acesso por unidade é propriedade de quem entra no sistema, e metade de uma equipe de\n salão nunca entra. Se {person?.name ?? 'esta pessoa'} já acessa e o sistema ainda não\n sabe que é a mesma pessoa, ela liga as duas em Configurações → Perfil; se ainda não\n acessa, convide em Configurações → Equipe.\n </p>\n </CardContent>\n </Card>\n )\n }\n\n const bound = Object.keys(bindings)\n\n return (\n <Card>\n <CardContent className=\"space-y-4 py-6\">\n {!unitMode && (\n <p className=\"rounded-lg border border-border bg-muted/40 p-3 text-xs text-muted-foreground\">\n A gestão por unidades está desligada — estes vínculos ficam guardados e passam a valer\n no dia em que ela for ligada.\n </p>\n )}\n\n {unitMode && bound.length === 0 && (\n <div className=\"flex gap-3 rounded-lg border border-amber-400/40 bg-amber-400/10 p-3 text-sm\">\n <AlertTriangle className=\"mt-0.5 h-4 w-4 shrink-0 text-amber-600 dark:text-amber-400\" />\n <p>Sem nenhuma unidade marcada, esta pessoa não vê agendamentos, pedidos nem caixa de lugar nenhum.</p>\n </div>\n )}\n\n {units.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">Nenhuma unidade cadastrada ainda.</p>\n ) : (\n <div className=\"space-y-1\">\n {units.map((u) => {\n const on = u.id in bindings\n return (\n <div key={u.id} className=\"flex items-center gap-3 rounded-lg px-2 py-2 hover:bg-muted/50\">\n <Checkbox\n checked={on}\n disabled={busy === u.id}\n onChange={(v: boolean) => void toggle(u.id, v)}\n aria-label={u.name}\n />\n <Building2 className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm\">{u.name}</div>\n <div className=\"text-xs text-muted-foreground\">\n {u.kind === 'region'\n ? 'região — alcança as unidades dentro dela'\n : [u.city, u.isHeadquarters ? 'matriz' : null].filter(Boolean).join(' · ') || ' '}\n </div>\n </div>\n {on && (\n <Select\n value={bindings[u.id] ?? NO_EXTRA_ROLE}\n onValueChange={(v: string) => void setRole(u.id, v)}\n >\n <SelectTrigger className=\"h-8 w-44 text-xs\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={NO_EXTRA_ROLE}>sem função extra</SelectItem>\n {profiles.map((p) => (\n <SelectItem key={p.id} value={p.id}>{p.name} nesta unidade</SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n </div>\n )\n })}\n </div>\n )}\n\n <p className=\"text-xs text-muted-foreground\">\n A função escolhida ao lado de uma unidade <strong>soma</strong> à função que a pessoa tem na\n organização, e vale só ali. É assim que se faz um gerente de uma unidade só.\n </p>\n </CardContent>\n </Card>\n )\n}\n","import * as React from 'react'\nimport { Building2, Globe2 } from 'lucide-react'\nimport { getSupabaseClientOptional } from '@fayz-ai/core'\nimport { Button, Card, CardContent, Checkbox, Skeleton } from '@fayz-ai/ui'\nimport { toast } from '../components/notifications/ToastProvider'\n\ninterface UnitOption {\n id: string\n name: string\n city?: string | null\n}\n\n/**\n * Where a person record is available operationally.\n *\n * This is deliberately different from PersonUnitsTab: that tab grants a login\n * access to units, while this one distributes a business record that may never\n * sign in (supplier, customer, contact). No grants means organization-wide;\n * one or more grants narrows the record to exactly those units.\n */\nexport function PersonAvailabilityTab({ item }: { item: unknown }) {\n const person = item as { id?: string; name?: string; unitId?: string | null } | undefined\n const personId = person?.id\n const [units, setUnits] = React.useState<UnitOption[]>([])\n const [selected, setSelected] = React.useState<Set<string>>(new Set())\n const [loading, setLoading] = React.useState(true)\n const [busy, setBusy] = React.useState(false)\n const [availabilityReady, setAvailabilityReady] = React.useState(true)\n\n const db = () => getSupabaseClientOptional() as any\n\n const load = React.useCallback(async () => {\n const client = db()\n if (!client || !personId) { setLoading(false); return }\n setLoading(true)\n try {\n const [{ data: unitRows, error: unitError }, { data: unitIds, error: grantError }] = await Promise.all([\n client.from('v_units').select('id,name,city').eq('is_active', true).order('name'),\n client.rpc('people_available_unit_ids', { p_person: personId }),\n ])\n if (unitError) throw unitError\n setUnits((unitRows ?? []) as UnitOption[])\n if (grantError) {\n const missingRpc = grantError.code === 'PGRST202'\n || String(grantError.message ?? '').includes('people_available_unit_ids')\n if (!missingRpc) throw grantError\n setSelected(new Set())\n setAvailabilityReady(false)\n return\n }\n setSelected(new Set((unitIds ?? []).map((unitId: unknown) => String(unitId))))\n setAvailabilityReady(true)\n } catch (error: any) {\n toast.error('Não foi possível carregar as unidades', { description: error?.message })\n } finally {\n setLoading(false)\n }\n }, [personId])\n\n React.useEffect(() => { void load() }, [load])\n\n async function makeOrganizationWide() {\n const client = db()\n if (!client || !personId || busy) return\n setBusy(true)\n try {\n const { error } = await client.rpc('people_set_available_units', {\n p_person: personId,\n p_unit_ids: [],\n })\n if (error) throw error\n setSelected(new Set())\n toast.success('Disponível em todas as unidades.')\n } catch (error: any) {\n toast.error('Não foi possível atualizar as unidades', { description: error?.message })\n } finally {\n setBusy(false)\n }\n }\n\n async function toggle(unitId: string, enabled: boolean) {\n const client = db()\n if (!client || !personId || busy) return\n setBusy(true)\n try {\n const next = new Set(selected)\n if (enabled) next.add(unitId)\n else next.delete(unitId)\n const { error } = await client.rpc('people_set_available_units', {\n p_person: personId,\n p_unit_ids: Array.from(next),\n })\n if (error) throw error\n await load()\n toast.success('Unidades atualizadas.')\n } catch (error: any) {\n toast.error('Não foi possível atualizar as unidades', { description: error?.message })\n } finally {\n setBusy(false)\n }\n }\n\n if (loading) {\n return <Card><CardContent className=\"space-y-2 py-6\"><Skeleton className=\"h-10 w-full\" /><Skeleton className=\"h-10 w-full\" /></CardContent></Card>\n }\n\n const organizationWide = selected.size === 0\n\n return (\n <Card>\n <CardContent className=\"space-y-4 py-6\">\n <div className=\"flex flex-wrap gap-2\">\n <Button type=\"button\" variant={organizationWide ? 'default' : 'outline'} size=\"sm\" onClick={() => void makeOrganizationWide()} disabled={busy || !availabilityReady}>\n <Globe2 className=\"mr-2 h-4 w-4\" /> Todas as unidades\n </Button>\n <span className=\"self-center text-xs text-muted-foreground\">\n Marque uma unidade abaixo para restringir este cadastro.\n </span>\n </div>\n\n {!availabilityReady ? (\n <p role=\"status\" className=\"rounded-lg border border-warning/40 bg-warning/5 p-3 text-xs text-muted-foreground\">\n As unidades estão visíveis, mas a distribuição deste cadastro ficará disponível após a atualização do banco.\n </p>\n ) : null}\n\n {person?.unitId ? (\n <p className=\"rounded-lg border border-warning/40 bg-warning/5 p-3 text-xs text-muted-foreground\">\n Este cadastro nasceu dentro de uma unidade. A unidade de origem continua prevalecendo sobre a distribuição da rede.\n </p>\n ) : null}\n\n {units.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">Nenhuma unidade cadastrada.</p>\n ) : (\n <div className=\"divide-y rounded-lg border\">\n {units.map((unit) => (\n <label key={unit.id} className=\"flex cursor-pointer items-center gap-3 px-3 py-2.5 hover:bg-muted/40\">\n <Checkbox\n checked={selected.has(unit.id)}\n disabled={busy || !availabilityReady}\n onChange={(next: boolean) => void toggle(unit.id, next)}\n aria-label={unit.name}\n />\n <Building2 className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0\">\n <span className=\"block truncate text-sm font-medium\">{unit.name}</span>\n {unit.city ? <span className=\"block truncate text-xs text-muted-foreground\">{unit.city}</span> : null}\n </span>\n </label>\n ))}\n </div>\n )}\n\n <p className=\"text-xs text-muted-foreground\">\n Sem nenhuma seleção, o cadastro é da organização e aparece em todas as unidades. Com seleções, aparece somente nas unidades marcadas.\n </p>\n </CardContent>\n </Card>\n )\n}\n","import React from 'react'\nimport { Clock, FileText, CalendarDays } from 'lucide-react'\nimport { Card, CardContent } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\n// Lazy: the schedule editor is a heavy leaf (~33 KB src) only needed on the\n// schedule tab — keep it out of the entry chunk.\nconst ScheduleEditor = React.lazy(() =>\n import('./ScheduleEditor').then((m) => ({ default: m.ScheduleEditor })),\n)\n// Lazy pelo mesmo motivo, e por um a mais: o `import` do módulo é o que\n// REGISTRA as fontes do core (ver timeline/PersonTimeline.tsx). Carregá-lo só quando a\n// aba abre mantém quatro consultas fora do caminho de quem nunca a abriu.\nconst PersonTimeline = React.lazy(() =>\n import('../../timeline/PersonTimeline').then((m) => ({ default: m.PersonTimeline })),\n)\nimport { AccessTab } from './AccessTab'\nimport { useTranslation } from '@fayz-ai/core'\nimport { PersonUnitsTab } from '../../units/PersonUnitsTab'\nimport { PersonAvailabilityTab } from '../../units/PersonAvailabilityTab'\nimport { usePluginRuntimeOptional as usePluginsOptional } from '@fayz-ai/core'\nimport { getWidgetsForZone } from '@fayz-ai/core'\n\nfunction ComingSoon({ icon: Icon, title, description }: { icon: React.ElementType; title: string; description: string }) {\n const t = useTranslation()\n return (\n <Card>\n <CardContent className=\"flex flex-col items-center justify-center py-12 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-3\">\n <Icon className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <p className=\"text-sm font-medium\">{title}</p>\n <p className=\"text-xs text-muted-foreground mt-1 max-w-xs\">{description}</p>\n <Badge variant=\"secondary\" className=\"mt-3 text-[10px]\">{t('crud.archetype.comingSoon')}</Badge>\n </CardContent>\n </Card>\n )\n}\n\n/**\n * O que aconteceu com esta pessoa — todas as fontes, uma lista só.\n *\n * `PersonTimeline` existe em `packages/admin/src/timeline` com sete fontes\n * registradas (cadastro, pedidos, pagamentos, agendamentos, documentos, CRM,\n * gravações) e, até aqui, só o `beauty-saas` a montava: o arquétipo mostrava um\n * \"em breve\" para uma tela pronta. Ler o que já existe é a aba inteira.\n */\nexport function ActivityTab({ item, recordPath }: { item?: any; recordPath?: string }) {\n const t = useTranslation()\n if (!item?.id) {\n return (\n <ComingSoon\n icon={Clock}\n title={t('crud.archetype.activity.title')}\n description={t('crud.archetype.activity.description')}\n />\n )\n }\n return (\n <React.Suspense fallback={null}>\n <PersonTimeline personId={item.id} recordPath={recordPath} />\n </React.Suspense>\n )\n}\n\nexport function DocumentsTab({ item }: { item?: any }) {\n const t = useTranslation()\n const runtime = usePluginsOptional()\n\n // Check if a plugin provides a documents widget (e.g., custom_forms)\n const widgets = runtime ? getWidgetsForZone(runtime, 'person.detail.documents') : []\n\n if (widgets.length > 0 && item) {\n const w = widgets[0]\n const Widget = w.component as React.ComponentType<any>\n return (\n <Widget\n item={item}\n config={w.config}\n runtime={runtime?.context}\n plugin={w.plugin}\n widget={w}\n />\n )\n }\n\n return (\n <ComingSoon\n icon={FileText}\n title={t('crud.archetype.documents.title')}\n description={t('crud.archetype.documents.description')}\n />\n )\n}\n\n/**\n * O ARMÁRIO: foto e anexo, fora do prontuário.\n *\n * Separada de Registros porque são perguntas diferentes — \"o que foi\n * registrado sobre esta pessoa\" e \"que arquivo dela eu guardei\". Estavam na\n * mesma lista, e a anamnese disputava rolagem com a foto do documento. O V1\n * nunca as misturou.\n *\n * `requiresWidgetZone` mantém a honestidade do arquétipo: num app sem o plugin\n * de formulários a aba não existe, em vez de existir vazia.\n */\nexport function FilesTab({ item }: { item?: any }) {\n const runtime = usePluginsOptional()\n const widgets = runtime ? getWidgetsForZone(runtime, 'person.detail.files') : []\n if (widgets.length > 0 && item) {\n const w = widgets[0]\n const Widget = w.component as React.ComponentType<any>\n return (\n <Widget item={item} config={w.config} runtime={runtime?.context} plugin={w.plugin} widget={w} />\n )\n }\n return null\n}\n\nexport function FinancialTab({ item }: { item?: any }) {\n const runtime = usePluginsOptional()\n const widgets = runtime ? getWidgetsForZone(runtime, 'person.detail.financial') : []\n if (widgets.length > 0 && item) {\n const w = widgets[0]\n const Widget = w.component as React.ComponentType<any>\n return (\n <Widget\n item={item}\n config={w.config}\n runtime={runtime?.context}\n plugin={w.plugin}\n widget={w}\n />\n )\n }\n return null\n}\n\nexport function FinancialSettingsTab({ item }: { item?: any }) {\n const runtime = usePluginsOptional()\n const widgets = runtime ? getWidgetsForZone(runtime, 'person.detail.financial-settings') : []\n if (widgets.length > 0 && item) {\n const w = widgets[0]\n const Widget = w.component as React.ComponentType<any>\n return (\n <Widget\n item={item}\n config={w.config}\n runtime={runtime?.context}\n plugin={w.plugin}\n widget={w}\n />\n )\n }\n return null\n}\n\n/**\n * O que já foi FEITO com esta pessoa.\n *\n * Mesma forma da aba financeira: a tela é do plugin que sabe responder, e o\n * núcleo só oferece o lugar. Sem widget na zona, a aba nem aparece — é a regra\n * do `requiresWidgetZone`, e aqui ela é honestidade: uma aba de atendimentos\n * vazia num app que não tem prontuário afirma que a pessoa nunca foi atendida.\n */\nexport function AttendanceTab({ item }: { item?: any }) {\n const runtime = usePluginsOptional()\n const widgets = runtime ? getWidgetsForZone(runtime, 'person.detail.attendance') : []\n if (widgets.length > 0 && item) {\n const w = widgets[0]\n const Widget = w.component as React.ComponentType<any>\n return (\n <Widget item={item} config={w.config} runtime={runtime?.context} plugin={w.plugin} widget={w} />\n )\n }\n return null\n}\n\n/**\n * The SERVICES this person carries — V1's \"Serviços\" tab.\n *\n * A different question from \"Atendimentos\", which is chronological: this one\n * is per service, and it answers what the front desk is actually asked at the\n * counter — *how many sessions of this did she buy, how many are left*. The\n * answer lives across sessions that a chronological list never adds up.\n */\nexport function PersonServicesTab({ item }: { item?: any }) {\n const runtime = usePluginsOptional()\n const widgets = runtime ? getWidgetsForZone(runtime, 'person.detail.services') : []\n if (widgets.length > 0 && item) {\n const w = widgets[0]\n const Widget = w.component as React.ComponentType<any>\n return (\n <Widget item={item} config={w.config} runtime={runtime?.context} plugin={w.plugin} widget={w} />\n )\n }\n return null\n}\n\nexport function ScheduleTab({ item }: { item: any }) {\n const t = useTranslation()\n if (!item?.id) {\n return (\n <ComingSoon\n icon={CalendarDays}\n title={t('crud.archetype.schedule.title')}\n description={t('crud.archetype.schedule.description')}\n />\n )\n }\n return (\n // O interruptor \"Aparece na agenda\" agora vem DENTRO do editor: era a\n // única coisa que esta porta mostrava e a da agenda não.\n <React.Suspense fallback={null}>\n <ScheduleEditor assigneeId={item.id} />\n </React.Suspense>\n )\n}\n\nexport const PERSON_DETAIL_TABS = [\n // Does this person sign in, and as what. `visibleFor: ['staff']` because a\n // client never holds a login — and it comes FIRST among the staff tabs\n // because granting access is what somebody opening a colleague's record came\n // to do. Its own \"does not sign in yet\" state carries the grant form.\n { id: 'access', label: 'Access', icon: 'KeyRound', component: AccessTab, visibleFor: ['staff'] },\n // Where this person works. `visibleFor: ['staff']` because a client does not\n // have units — she is a record IN one. The tab renders its own \"no login yet\"\n // state, so it is safe to show for staff who never sign in.\n { id: 'units', label: 'Unidades', icon: 'Building2', component: PersonUnitsTab, visibleFor: ['staff'] },\n // Em QUE unidades este cadastro pode ser usado — fornecedor que só atende a\n // filial do centro, parceiro de uma região só.\n //\n // CLIENTE ficou de fora: ele não é distribuído entre unidades, ele é ATENDIDO\n // numa. Quem decide a unidade do atendimento é o agendamento, não a ficha, e\n // a aba aqui fazia a recepção pensar que precisava \"liberar\" a paciente para\n // a filial antes de marcar.\n //\n // `requiresUnitMode` for the same reason `requiresWidgetZone` sits on the\n // others: on an account that does not work with units, \"which units may use\n // this supplier\" has no answerable form — the list holds one item, ticking it\n // or not is the same outcome, and unticking hides the record from the only\n // place there is. Distributing a record means something only where there is\n // more than one place to distribute it to.\n {\n id: 'record-units', label: 'Unidades', icon: 'Building2', component: PersonAvailabilityTab,\n visibleFor: ['supplier', 'contact', 'lead', 'partner'], requiresUnitMode: true,\n },\n { id: 'schedule', label: 'Schedule', icon: 'CalendarDays', component: ScheduleTab, visibleFor: ['staff'] },\n // Endereços NÃO é aba: mora como seção da visão geral (CrudDetailPage) e do\n // formulário de pessoa (PersonFormLayout). Uma lista de dois endereços não\n // paga uma aba, e quem abre a ficha quer vê-la sem mais um clique.\n // \"Documentos\" virou REGISTROS: anamnese, evolução, laudo e contrato, numa\n // linha do tempo com pastilha por categoria. O id da aba fica `documents`\n // porque é a rota que já está em uso (e o alvo que a linha do tempo aponta);\n // o rótulo é o que mudou.\n { id: 'documents', label: 'Registros', icon: 'ClipboardList', component: DocumentsTab, aliases: ['records'] },\n {\n id: 'files', label: 'Arquivos', icon: 'Paperclip', component: FilesTab,\n requiresWidgetZone: 'person.detail.files',\n },\n {\n id: 'financial-settings', label: 'Configurações', icon: 'Settings', component: FinancialSettingsTab,\n visibleFor: ['supplier'], requiresWidgetZone: 'person.detail.financial-settings',\n },\n // Per-person financial statement — only shown when the financial plugin contributes\n // its widget (see requiresWidgetZone). Clients = paid invoices; staff = commissions.\n { id: 'financial', label: 'Statement', icon: 'DollarSign', component: FinancialTab, requiresWidgetZone: 'person.detail.financial' },\n // O que já foi FEITO com esta pessoa — a régua de cada atendimento, com o\n // contador daquele dia congelado. Só aparece onde algum plugin sabe\n // responder: sem prontuário instalado, a aba não existe (em vez de existir\n // vazia, afirmando que a pessoa nunca foi atendida).\n {\n id: 'attendance', label: 'Atendimentos', icon: 'Stethoscope', component: AttendanceTab,\n visibleFor: ['customer'], requiresWidgetZone: 'person.detail.attendance',\n },\n // V1 keeps these two side by side, and the split is the point: Atendimentos\n // is the day-by-day, Serviços is the running balance per procedure — how\n // many sessions bought, how many done, how many left.\n {\n id: 'services', label: 'Serviços', icon: 'Layers', component: PersonServicesTab,\n visibleFor: ['customer'], requiresWidgetZone: 'person.detail.services',\n },\n { id: 'activity', label: 'Activity', icon: 'Clock', component: ActivityTab },\n]\n","import React from 'react'\nimport { BarChart3, Truck, Tag, Clock } from 'lucide-react'\nimport { Card, CardContent } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\n\nfunction ComingSoon({ icon: Icon, title, description }: { icon: React.ElementType; title: string; description: string }) {\n const t = useTranslation()\n return (\n <Card>\n <CardContent className=\"flex flex-col items-center justify-center py-12 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-3\">\n <Icon className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <p className=\"text-sm font-medium\">{title}</p>\n <p className=\"text-xs text-muted-foreground mt-1 max-w-xs\">{description}</p>\n <Badge variant=\"secondary\" className=\"mt-3 text-[10px]\">{t('crud.archetype.comingSoon')}</Badge>\n </CardContent>\n </Card>\n )\n}\n\nexport function InventoryTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={BarChart3}\n title={t('crud.archetype.inventory.title')}\n description={t('crud.archetype.inventory.description')}\n />\n )\n}\n\nexport function SuppliersTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={Truck}\n title={t('crud.archetype.suppliers.title')}\n description={t('crud.archetype.suppliers.description')}\n />\n )\n}\n\nexport function PricingTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={Tag}\n title={t('crud.archetype.pricing.title')}\n description={t('crud.archetype.pricing.description')}\n />\n )\n}\n\nexport function ProductActivityTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={Clock}\n title={t('crud.archetype.productActivity.title')}\n description={t('crud.archetype.productActivity.description')}\n />\n )\n}\n\nexport const PRODUCT_DETAIL_TABS = [\n { id: 'inventory', label: 'Inventory', component: InventoryTab },\n { id: 'suppliers', label: 'Suppliers', component: SuppliersTab },\n { id: 'pricing', label: 'Pricing', component: PricingTab },\n { id: 'activity', label: 'Activity', component: ProductActivityTab },\n]\n","import React from 'react'\nimport { CalendarDays, Tag, Clock } from 'lucide-react'\nimport { Card, CardContent } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\n\nfunction ComingSoon({ icon: Icon, title, description }: { icon: React.ElementType; title: string; description: string }) {\n const t = useTranslation()\n return (\n <Card>\n <CardContent className=\"flex flex-col items-center justify-center py-12 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-3\">\n <Icon className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <p className=\"text-sm font-medium\">{title}</p>\n <p className=\"text-xs text-muted-foreground mt-1 max-w-xs\">{description}</p>\n <Badge variant=\"secondary\" className=\"mt-3 text-[10px]\">{t('crud.archetype.comingSoon')}</Badge>\n </CardContent>\n </Card>\n )\n}\n\nexport function AvailabilityTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={CalendarDays}\n title={t('crud.archetype.availability.title')}\n description={t('crud.archetype.availability.description')}\n />\n )\n}\n\nexport function ServicePricingTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={Tag}\n title={t('crud.archetype.servicePricing.title')}\n description={t('crud.archetype.servicePricing.description')}\n />\n )\n}\n\nexport function ServiceActivityTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={Clock}\n title={t('crud.archetype.serviceActivity.title')}\n description={t('crud.archetype.serviceActivity.description')}\n />\n )\n}\n\nexport const SERVICE_DETAIL_TABS = [\n { id: 'availability', label: 'Availability', component: AvailabilityTab },\n { id: 'pricing', label: 'Pricing', component: ServicePricingTab },\n { id: 'activity', label: 'Activity', component: ServiceActivityTab },\n]\n","import * as React from 'react'\nimport { useDataVersion } from '@fayz-ai/core'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport {\n Card, Button, Badge, Avatar, AvatarImage, AvatarFallback, DataTable,\n Select, SelectTrigger, SelectValue, SelectContent, SelectItem, Skeleton,\n} from '@fayz-ai/ui'\nimport { Plus, Users, X } from 'lucide-react'\nimport { useOrganizationStore } from '../stores/organization.store'\nimport { usePermissionsStore } from '../permissions'\nimport { useTenantOptional } from '../org'\nimport { toast } from '../components/notifications/ToastProvider'\nimport { useUnitStore } from './store'\nimport { useUnitBootstrap } from './useUnitBootstrap'\nimport {\n bindUserToUnit, fetchMemberActivity, fetchUnitMembers, unbindUserFromUnit, type UnitMemberRow, UNIT_ACCESS_CHANGED } from './data'\n\n// ---------------------------------------------------------------------------\n// \"Quem trabalha aqui\" — the unit's own roster, as a table.\n//\n// Same shape as every other list in the product (the units list one screen up,\n// the team list in Settings): header on a muted rule, rows at p-3, actions on\n// the right. A roster that looked like a stack of cards read as a different\n// kind of object than the thing that contains it.\n//\n// Two columns that are not decoration: SINCE WHEN someone has access, and\n// whether they have actually signed in. \"We gave Ana access\" and \"Ana is using\n// it\" are different facts, and only the second one answers why a unit's numbers\n// look empty.\n//\n// Two screens ask the same question from opposite ends: this one starts from\n// the unit (\"who is in Ipanema?\"), the sheet on the team screen starts from the\n// person (\"where does Maria work?\"). Both write the same single row.\n// ---------------------------------------------------------------------------\n\nconst NO_EXTRA_ROLE = '__none__'\n\nfunction initials(name: string): string {\n const parts = name.trim().split(/\\s+/)\n return ((parts[0]?.[0] ?? '') + (parts[1]?.[0] ?? '')).toUpperCase() || '?'\n}\n\nfunction shortDate(value: string | null | undefined): string {\n if (!value) return '—'\n const d = new Date(value)\n return Number.isNaN(d.getTime()) ? '—' : d.toLocaleDateString()\n}\n\n/** \"há 3 dias\" beats a date here: the question is whether this person is using\n * it, and a date makes you do the arithmetic to find out. */\nfunction sinceNow(value: string | null | undefined): string {\n if (!value) return 'nunca entrou'\n const d = new Date(value)\n if (Number.isNaN(d.getTime())) return '—'\n const days = Math.floor((Date.now() - d.getTime()) / 86_400_000)\n if (days <= 0) return 'hoje'\n if (days === 1) return 'ontem'\n if (days < 30) return `há ${days} dias`\n if (days < 60) return 'há 1 mês'\n if (days < 365) return `há ${Math.floor(days / 30)} meses`\n return d.toLocaleDateString()\n}\n\nexport function UnitMembersTab({ item }: { item: unknown }) {\n useUnitBootstrap()\n const unit = item as { id?: string; name?: string; kind?: string } | undefined\n const unitId = unit?.id\n const isRegion = unit?.kind === 'region'\n\n const tenant = useTenantOptional()\n const orgId = tenant?.org?.id\n const orgMembers = useOrganizationStore((s) => s.members)\n const profiles = usePermissionsStore((s) => s.profiles)\n const unitMode = useUnitStore((s) => s.unitMode)\n\n const [rows, setRows] = React.useState<UnitMemberRow[] | null>(null)\n const [activity, setActivity] = React.useState<Record<string, { lastSignInAt: string | null; signedUpAt: string | null }>>({})\n const [adding, setAdding] = React.useState(false)\n const [busy, setBusy] = React.useState<string | null>(null)\n\n const reload = React.useCallback(async () => {\n if (!unitId) return\n setRows(await fetchUnitMembers(unitId))\n }, [unitId])\n\n // Quem entra ou sai desta unidade pode ser mexido do painel da pessoa, na\n // mesma coluna. Sem isto, as duas listas discordam sobre quem está aqui.\n const version = useDataVersion(UNIT_ACCESS_CHANGED)\n React.useEffect(() => { void reload() }, [reload, version])\n\n React.useEffect(() => {\n if (!orgId) return\n let alive = true\n // Silently empty for a non-admin: the function refuses them, and a roster\n // without a \"last access\" column is still a useful roster.\n void fetchMemberActivity(orgId).then((a) => { if (alive) setActivity(a) })\n return () => { alive = false }\n }, [orgId])\n\n const byUser = React.useMemo(() => {\n const map = new Map<string, { name: string; email?: string; avatarUrl?: string; orgRole?: string }>()\n for (const m of orgMembers) {\n map.set(m.userId, {\n name: m.user.fullName || m.user.email,\n email: m.user.email,\n avatarUrl: m.user.avatarUrl,\n orgRole: m.profileName,\n })\n }\n return map\n }, [orgMembers])\n\n const available = React.useMemo(\n () => orgMembers.filter((m) => !(rows ?? []).some((r) => r.userId === m.userId)),\n [orgMembers, rows],\n )\n\n async function run(userId: string, fn: () => Promise<void>, failure: string) {\n setBusy(userId)\n try {\n await fn()\n await reload()\n } catch (err: any) {\n toast.error(failure, { description: err?.message })\n } finally {\n setBusy(null)\n }\n }\n\n if (rows === null) {\n return <Card className=\"p-4\"><Skeleton className=\"h-9 w-full\" /><Skeleton className=\"mt-2 h-9 w-full\" /></Card>\n }\n\n const showActivity = Object.keys(activity).length > 0\n\n const columns: ColumnDef<UnitMemberRow>[] = [\n {\n id: 'member',\n header: 'Membro',\n cell: ({ row: { original: r } }) => {\n const person = byUser.get(r.userId)\n return (\n <div className=\"flex items-center gap-3\">\n <Avatar className=\"h-8 w-8 shrink-0\">\n {person?.avatarUrl && <AvatarImage src={person.avatarUrl} />}\n <AvatarFallback className=\"text-[10px]\">{initials(person?.name ?? '?')}</AvatarFallback>\n </Avatar>\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-medium\">{person?.name ?? r.userId}</div>\n {person?.email && (\n <div className=\"truncate text-xs text-muted-foreground\">{person.email}</div>\n )}\n </div>\n </div>\n )\n },\n },\n {\n id: 'orgRole',\n header: 'Função na organização',\n cell: ({ row: { original: r } }) => {\n const orgRole = byUser.get(r.userId)?.orgRole\n return orgRole\n ? <Badge variant=\"secondary\" className=\"text-xs\">{orgRole}</Badge>\n : <span className=\"text-xs text-muted-foreground\">—</span>\n },\n },\n {\n id: 'unitRole',\n header: `Função nesta ${isRegion ? 'região' : 'unidade'}`,\n cell: ({ row: { original: r } }) => (\n <Select\n value={r.role ?? NO_EXTRA_ROLE}\n onValueChange={(v: string) =>\n void run(r.userId, () => bindUserToUnit(unitId!, r.userId, v === NO_EXTRA_ROLE ? null : v), 'Não deu para mudar a função')}\n >\n <SelectTrigger className=\"h-8 w-44 text-xs\" disabled={busy === r.userId}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={NO_EXTRA_ROLE}>sem função extra</SelectItem>\n {profiles.map((p) => (\n <SelectItem key={p.id} value={p.id}>{p.name}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n ),\n },\n ...(showActivity ? [{\n id: 'lastSignIn',\n header: 'Último acesso',\n cell: ({ row: { original: r } }) => (\n <span className=\"text-sm text-muted-foreground\" title={activity[r.userId]?.lastSignInAt ?? ''}>\n {sinceNow(activity[r.userId]?.lastSignInAt)}\n </span>\n ),\n } satisfies ColumnDef<UnitMemberRow>] : []),\n {\n id: 'since',\n header: 'Desde',\n cell: ({ row: { original: r } }) => <span className=\"text-sm text-muted-foreground\">{shortDate(r.since)}</span>,\n },\n {\n id: 'remove',\n header: '',\n meta: { className: 'w-12 text-right' },\n cell: ({ row: { original: r } }) => (\n <Button\n size=\"icon\"\n variant=\"ghost\"\n disabled={busy === r.userId}\n onClick={() => void run(r.userId, () => unbindUserFromUnit(unitId!, r.userId), 'Não deu para remover')}\n aria-label={`Tirar ${byUser.get(r.userId)?.name ?? ''} desta unidade`}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n ),\n },\n ]\n\n return (\n <div className=\"space-y-3\">\n {!unitMode && (\n <p className=\"rounded-lg border border-border bg-muted/40 p-3 text-xs text-muted-foreground\">\n A gestão por unidades está desligada, então estes vínculos ainda não restringem nada —\n eles passam a valer no momento em que ela for ligada em Configurações → Geral.\n </p>\n )}\n\n {isRegion && (\n <p className=\"rounded-lg border border-border bg-muted/40 p-3 text-xs text-muted-foreground\">\n Esta é uma <strong>região</strong>. Quem for vinculado aqui alcança todas as unidades\n dentro dela — é assim que se monta um gerente regional.\n </p>\n )}\n\n <Card className=\"overflow-hidden\">\n {rows.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\n <div className=\"mb-3 flex h-12 w-12 items-center justify-center rounded-full bg-muted\">\n <Users className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <p className=\"text-sm font-medium\">Ninguém vinculado ainda</p>\n <p className=\"mt-1 max-w-xs text-xs text-muted-foreground\">\n Quem estiver aqui vê os dados desta {isRegion ? 'região' : 'unidade'}. Quem não estiver, não vê.\n </p>\n </div>\n ) : (\n <DataTable variant=\"bare\" columns={columns} data={rows} getRowId={(r) => r.userId} />\n )}\n </Card>\n\n <div className=\"flex items-center justify-between gap-3\">\n {adding ? (\n <Select onValueChange={(v: string) => void run(v, async () => { await bindUserToUnit(unitId!, v, null); setAdding(false) }, 'Não deu para adicionar')}>\n <SelectTrigger className=\"h-9 w-72\">\n <SelectValue placeholder=\"Quem trabalha aqui?\" />\n </SelectTrigger>\n <SelectContent>\n {available.map((m) => (\n <SelectItem key={m.userId} value={m.userId}>{m.user.fullName || m.user.email}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : (\n <Button size=\"sm\" variant=\"outline\" onClick={() => setAdding(true)} disabled={available.length === 0}>\n <Plus className=\"mr-1.5 h-3.5 w-3.5\" />\n Adicionar pessoa\n </Button>\n )}\n {rows.length > 0 && (\n <span className=\"text-xs text-muted-foreground\">\n {rows.length} {rows.length === 1 ? 'pessoa' : 'pessoas'}\n </span>\n )}\n </div>\n\n <p className=\"text-xs text-muted-foreground\">\n A função escolhida na coluna do meio <strong>soma</strong> à função que a pessoa tem na\n organização — ela vale só dentro desta {isRegion ? 'região' : 'unidade'} e nunca tira nada.\n </p>\n </div>\n )\n}\n","import React from 'react'\nimport { Users, CalendarDays, BarChart3, Clock } from 'lucide-react'\nimport { Card, CardContent } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { UnitMembersTab } from '../../units/UnitMembersTab'\n\nfunction ComingSoon({ icon: Icon, title, description }: { icon: React.ElementType; title: string; description: string }) {\n const t = useTranslation()\n return (\n <Card>\n <CardContent className=\"flex flex-col items-center justify-center py-12 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-3\">\n <Icon className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <p className=\"text-sm font-medium\">{title}</p>\n <p className=\"text-xs text-muted-foreground mt-1 max-w-xs\">{description}</p>\n <Badge variant=\"secondary\" className=\"mt-3 text-[10px]\">{t('crud.archetype.comingSoon')}</Badge>\n </CardContent>\n </Card>\n )\n}\n\n// Was a ComingSoon placeholder for as long as the binding table sat unused.\n// Now it is the roster: who works in this unit, and what they may do here.\nexport const MembersTab = UnitMembersTab\n\nexport function LocationScheduleTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={CalendarDays}\n title={t('crud.archetype.locationSchedule.title')}\n description={t('crud.archetype.locationSchedule.description')}\n />\n )\n}\n\nexport function LocationStatsTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={BarChart3}\n title={t('crud.archetype.locationStats.title')}\n description={t('crud.archetype.locationStats.description')}\n />\n )\n}\n\nexport function LocationActivityTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={Clock}\n title={t('crud.archetype.locationActivity.title')}\n description={t('crud.archetype.locationActivity.description')}\n />\n )\n}\n\nexport const LOCATION_DETAIL_TABS = [\n { id: 'members', label: 'Team', component: MembersTab },\n { id: 'schedule', label: 'Hours', component: LocationScheduleTab },\n { id: 'stats', label: 'Statistics', component: LocationStatsTab },\n { id: 'activity', label: 'Activity', component: LocationActivityTab },\n]\n","import React from 'react'\nimport { ExternalLink } from 'lucide-react'\nimport { appHref } from '@fayz-ai/core'\n\ninterface EntityLinkProps {\n /** The entity ID to link to */\n entityId: string\n /** The base path of the CRUD page (e.g. '/registry/tutors') */\n basePath: string\n /** Display label */\n children: React.ReactNode\n /** Optional className */\n className?: string\n}\n\n/**\n * Reusable link to a CRUD entity detail page.\n * The href is in the app's addressing scheme (`#/base/id` or `/base/id`).\n */\nexport function EntityLink({ entityId, basePath, children, className }: EntityLinkProps) {\n const href = appHref(`${basePath}/${entityId}`)\n\n return (\n <a\n href={href}\n className={`inline-flex items-center gap-1 text-primary hover:underline transition-colors ${className ?? ''}`}\n >\n {children}\n <ExternalLink className=\"h-3 w-3 opacity-50\" />\n </a>\n )\n}\n\n/**\n * Registry of known entity paths by person kind.\n * Projects can extend this via the `registerEntityPath` function.\n */\nconst ENTITY_PATHS: Record<string, string> = {\n // VAZIO DE PROPÓSITO.\n //\n // Aqui moravam defaults de clínica veterinária — `customer → /registry/tutors`,\n // `professional → /registry/veterinarians`, `organization → /registry/clinics`.\n // Num app que não é veterinário, clicar no nome de um cliente levava a\n // `#/registry/tutors/<id>` e **dava 404**: o palpite ganhava do fato, porque\n // este mapa era consultado ANTES das rotas que o app de verdade registrou.\n //\n // Quem sabe onde uma pessoa mora é quem a cadastra. Este registro continua\n // existindo para o caso que o mapa de rotas não cobre — um `kind` que não é\n // arquétipo, como o `shop_customer` da loja —, e é por isso que ele é\n // preenchido por `registerEntityPath`, nunca por suposição.\n}\n\n/** Register a custom path for a person kind */\nexport function registerEntityPath(kind: string, basePath: string) {\n ENTITY_PATHS[kind] = basePath\n}\n\n/** Get the CRUD base path for a person kind */\nexport function getPersonPath(kind: string): string | null {\n return ENTITY_PATHS[kind] ?? null\n}\n\n/**\n * Smart link that auto-resolves the path based on person kind.\n * Falls back to non-linked text if no path is registered.\n */\nexport function PersonLink({ personId, kind, children, className }: {\n personId: string\n kind: string\n children: React.ReactNode\n className?: string\n}) {\n const basePath = getPersonPath(kind)\n if (!basePath) {\n return <span className={className}>{children}</span>\n }\n return (\n <EntityLink entityId={personId} basePath={basePath} className={className}>\n {children}\n </EntityLink>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { User, Clock, FileText } from 'lucide-react'\nimport { Card, CardContent } from '@fayz-ai/ui'\nimport { Badge, PhoneLink } from '@fayz-ai/ui'\nimport { PersonLink } from './EntityLink'\nimport { getSupabaseClientOptional } from '@fayz-ai/core'\nimport { useTranslation } from '@fayz-ai/core'\n\nfunction ComingSoon({ icon: Icon, title, description }: { icon: React.ElementType; title: string; description: string }) {\n const t = useTranslation()\n return (\n <Card>\n <CardContent className=\"flex flex-col items-center justify-center py-12 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-3\">\n <Icon className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <p className=\"text-sm font-medium\">{title}</p>\n <p className=\"text-xs text-muted-foreground mt-1 max-w-xs\">{description}</p>\n <Badge variant=\"secondary\" className=\"mt-3 text-[10px]\">{t('crud.archetype.comingSoon')}</Badge>\n </CardContent>\n </Card>\n )\n}\n\nexport function OwnerTab({ item }: { item: any }) {\n const t = useTranslation()\n const [person, setPerson] = useState<any>(null)\n const [loading, setLoading] = useState(true)\n\n useEffect(() => {\n const tutorId = item?.tutorId\n if (!tutorId) { setLoading(false); return }\n\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) { setLoading(false); return }\n\n supabase\n .from('people')\n .select('*')\n .eq('id', tutorId)\n .single()\n .then(({ data }: any) => {\n setPerson(data)\n setLoading(false)\n }, () => setLoading(false))\n }, [item?.tutorId])\n\n if (loading) {\n return (\n <Card>\n <CardContent className=\"py-8 flex justify-center\">\n <div className=\"h-5 w-5 animate-spin rounded-full border-2 border-muted border-t-primary\" />\n </CardContent>\n </Card>\n )\n }\n\n if (!person) {\n return (\n <Card>\n <CardContent className=\"flex flex-col items-center justify-center py-12 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-3\">\n <User className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <p className=\"text-sm font-medium\">{t('crud.archetype.owner.noOwner')}</p>\n <p className=\"text-xs text-muted-foreground mt-1\">{t('crud.archetype.owner.assignHint')}</p>\n </CardContent>\n </Card>\n )\n }\n\n const fields: Array<{ label: string; value: string; href?: string; phone?: boolean }> = [\n { label: t('crud.archetype.owner.name'), value: person.name },\n // `phone: true` em vez de href: quem sabe montar o link de um telefone é o\n // PhoneLink — o número gravado pode vir sem DDI, com máscara, ou impróprio\n // para link nenhum.\n { label: t('crud.archetype.owner.phone'), value: person.phone, phone: true },\n { label: t('crud.archetype.owner.email'), value: person.email, href: person.email ? `mailto:${person.email}` : undefined },\n { label: t('crud.archetype.owner.document'), value: person.document_number },\n { label: t('crud.archetype.owner.address'), value: [person.address, person.city, person.state].filter(Boolean).join(', ') },\n ].filter((f) => f.value)\n\n return (\n <Card>\n <CardContent className=\"pt-5\">\n <div className=\"flex items-start gap-4 mb-4\">\n <div className=\"flex h-12 w-12 shrink-0 items-center justify-center rounded-full bg-primary/10 text-primary\">\n <User className=\"h-5 w-5\" />\n </div>\n <div className=\"flex-1\">\n <PersonLink personId={person.id} kind={person.kind} className=\"text-base font-semibold\">\n {person.name}\n </PersonLink>\n <div className=\"flex items-center gap-2 mt-0.5\">\n <Badge variant=\"secondary\" className=\"text-[10px] capitalize\">{person.kind}</Badge>\n <Badge variant={person.is_active ? 'default' : 'secondary'} className=\"text-[10px]\">\n {person.is_active ? t('crud.archetype.owner.active') : t('crud.archetype.owner.inactive')}\n </Badge>\n </div>\n </div>\n </div>\n <dl className=\"divide-y\">\n {fields.map((f) => (\n <div key={f.label} className=\"grid grid-cols-3 gap-4 py-2.5\">\n <dt className=\"text-sm text-muted-foreground\">{f.label}</dt>\n <dd className=\"col-span-2 text-sm\">\n {f.phone ? (\n <PhoneLink phone={f.value} className=\"text-primary\" />\n ) : f.href ? (\n <a href={f.href} className=\"text-primary hover:underline\">{f.value}</a>\n ) : f.value}\n </dd>\n </div>\n ))}\n </dl>\n </CardContent>\n </Card>\n )\n}\n\nexport function SubjectHistoryTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={Clock}\n title={t('crud.archetype.history.title')}\n description={t('crud.archetype.history.description')}\n />\n )\n}\n\nexport function SubjectDocumentsTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={FileText}\n title={t('crud.archetype.subjectDocuments.title')}\n description={t('crud.archetype.subjectDocuments.description')}\n />\n )\n}\n\nexport const SUBJECT_DETAIL_TABS = [\n { id: 'owner', label: 'Owner', component: OwnerTab },\n { id: 'history', label: 'History', component: SubjectHistoryTab },\n { id: 'documents', label: 'Documents', component: SubjectDocumentsTab },\n]\n","import React, { useCallback, useEffect, useState } from 'react'\nimport { Camera, Check, Edit, Loader2, Pencil, Sparkles, Trash2, X } from 'lucide-react'\nimport type { LucideIcon } from 'lucide-react'\nimport { Card, CardContent, PageHeaderActions, useSaveBar, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Textarea } from '@fayz-ai/ui'\n\n/** Barra da shell quando a ficha É a tela; ali mesmo quando ela é um pedaço de\n * outra (embedded), porque aí a barra pertence à tela de fora. */\nfunction ActionSlot({ embedded, children }: { embedded?: boolean; children: React.ReactNode }) {\n if (embedded) return <div className=\"flex shrink-0 items-center gap-1.5\">{children}</div>\n return <PageHeaderActions><div className=\"flex items-center gap-1.5\">{children}</div></PageHeaderActions>\n}\nimport { Button } from '@fayz-ai/ui'\nimport { Input, Switch } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport { usePresetLabel } from '../app/useAppPreset'\nimport { useMyPersonId } from '../org/self'\nimport { Tabs, TabsContent } from '@fayz-ai/ui'\nimport { PhoneLink } from '@fayz-ai/ui'\nimport { Markdown } from '@fayz-ai/ui'\nimport { ConfirmDialog, getLucideIcon, toast } from '@fayz-ai/ui'\nimport { PageActions, type PageAction } from '../plugins/PageActions'\nimport { useHeaderActions } from '../plugins/header-actions'\nimport { WidgetSlot } from '../plugins/WidgetSlot'\nimport { RecordMetaFooter } from './RecordMetaFooter'\nimport { RecordHeader, RecordTabStrip, resolveTabIcon, statusLabel } from './record-chrome'\nexport { resolveTabIcon }\nimport { entityZoneId, legacyEntityZoneId } from './entity-zone'\nimport { errorMessage, formatCurrency, navigateApp, appHref } from '@fayz-ai/core'\nimport { RelatedListTab, relatedListTabId } from './RelatedListTab'\nimport { FieldRow, InlineEditor, isInlineEditable } from './InlineField'\nimport { RelationCell, useRelationOptions } from './relation-field'\nimport { usePersonTabCounts } from './tab-counts'\nimport { PERSON_DETAIL_TABS } from './archetypes/PersonDetailTabs'\nimport { AddressesTab } from './archetypes/AddressesTab'\nimport { TagChip } from './TagsField'\nimport { PayeeAccountsSection } from './archetypes/PayeeAccountsSection'\nimport { RelatedSection } from './RelatedSection'\nimport { PRODUCT_DETAIL_TABS } from './archetypes/ProductDetailTabs'\nimport { SERVICE_DETAIL_TABS } from './archetypes/ServiceDetailTabs'\nimport { LOCATION_DETAIL_TABS } from './archetypes/LocationDetailTabs'\nimport { SUBJECT_DETAIL_TABS } from './archetypes/SubjectDetailTabs'\nimport { useTranslation } from '@fayz-ai/core'\nimport { usePluginRuntimeOptional, getWidgetsForZone, useUnitMode } from '@fayz-ai/core'\nimport type { DetailAction, EntityDef, FieldDef, FieldGroup, FormLayout, DetailTab } from '@fayz-ai/core'\n\ninterface CrudDetailPageProps {\n entityDef: EntityDef\n item: Record<string, any>\n namePlural: string\n basePath: string\n initialTab?: string\n /**\n * Path segments past the tab id, handed to the tab component as `tabPath`.\n *\n * This is what lets something INSIDE a record be linkable without inventing a\n * top-level route for it: `/clients/:id/scribe/:recordingId` opens the\n * client, on the recordings tab, on that recording — keeping the name, the\n * other tabs and the way back that `#/scribe/:id` threw away.\n */\n tabPath?: string[]\n onBack: () => void\n onEdit?: () => void\n onDelete?: () => void\n feature?: string\n /** Embedded mode — compact hero, no breadcrumb, no hash nav. For use inside modals/panels. */\n embedded?: boolean\n /** Saves ONE field. Absent means read-only — the same signal that already\n * decides the Edit button. */\n onFieldSave?: (key: string, value: unknown) => Promise<void> | void\n /** Grava TODOS os campos encostados de uma vez.\n *\n * A ficha junta as alterações inline num rascunho e salva pela ilha da\n * shell, então o caminho natural é uma escrita só: três campos corrigidos\n * são um update, uma linha de auditoria e um aviso — não três. Quem não\n * passa isto continua funcionando: a ficha cai em `onFieldSave` campo a\n * campo. */\n onFieldsSave?: (values: Record<string, unknown>) => Promise<void> | void\n /** Extra badges beside the name — facts ABOUT the record that do not live on\n * it. The org role is the case that forced this: it belongs to the\n * membership, not to the person, so there is no field to render it from and\n * no honest place to put it except next to the name. */\n badges?: React.ReactNode\n /** Makes the hero photo replaceable. Absent means the image is display-only,\n * which is what every registry screen wants; the profile passes it because\n * there the photo IS the account's photo. */\n onImageChange?: (file: File) => Promise<void> | void\n /** Caller-supplied actions beside Edit — the embedded ficha's \"open the full\n * record\" is the case: the surface that embeds knows where the record lives;\n * this page does not. */\n extraActions?: PageAction[]\n}\n\nfunction FieldGroupSection({\n group,\n fields,\n item,\n compact,\n onFieldSave,\n pendingKeys,\n}: {\n group: FieldGroup\n fields: FieldDef[]\n item: Record<string, any>\n compact?: boolean\n onFieldSave?: (key: string, value: unknown) => Promise<void> | void\n pendingKeys?: ReadonlySet<string>\n}) {\n const tFn = useTranslation()\n const cols = group.columns ?? 2\n\n // O MESMO lugar do formulário: num grupo lateral, o interruptor mora na\n // linha do título, à direita. Ler a ficha e editá-la têm de encontrar\n // «Ativo» no mesmo ponto — senão o lugar fixo não é fixo, é fixo por tela.\n const toggleField = group.column === 'side'\n ? fields.find((f) => f.type === 'boolean' && f.inlineToggle)\n : undefined\n const bodyFields = toggleField ? fields.filter((f) => f !== toggleField) : fields\n\n return (\n <div>\n <div className=\"flex items-center justify-between gap-3\">\n <h3 className={`font-semibold text-foreground ${compact ? 'text-xs mb-0.5' : 'text-sm mb-1'}`}>{group.label}</h3>\n {/* Sem selo aqui: na FICHA o estado se lê ao lado do NOME, que é para\n onde o olho vai primeiro, e o cabeçalho já o mostra. Repetir no rail\n dava dois selos para a mesma pergunta — e, quando as duas colunas do\n banco discordavam, dois selos com respostas opostas.\n No FORMULÁRIO o rail mantém o interruptor: lá ele não informa, edita. */}\n </div>\n {group.description && (\n <p className={`text-muted-foreground ${compact ? 'text-[10px] mb-1.5' : 'text-xs mb-3'}`}>{group.description}</p>\n )}\n <Card>\n <CardContent className=\"p-0\">\n <dl className={`fz-fields gap-0 divide-y ${cols >= 2 ? 'fz-fields-2 fz-divide-none' : ''}`}>\n {bodyFields.map((field) => (\n <div key={field.key} className={compact ? 'px-3' : 'px-5'}>\n <FieldRow\n field={field}\n value={item[field.key]}\n row={item as Record<string, any>}\n t={tFn}\n compact={compact}\n onSave={onFieldSave ? (next) => Promise.resolve(onFieldSave(field.key, next)) : undefined}\n pending={pendingKeys?.has(field.key)}\n />\n </div>\n ))}\n </dl>\n </CardContent>\n </Card>\n </div>\n )\n}\n\n/**\n * Os campos que a ficha mostra deste registro.\n *\n * `visibleWhen` vale na ficha tanto quanto no formulário. O formulário já não\n * pergunta Agência num caixa físico; a ficha do mesmo registro listava os dez\n * campos e mostrava «Agência —», «Dia de fechamento —» para todo tipo de\n * conta. Um traço não é informação: é uma pergunta sem resposta ocupando a\n * linha, e quem lê não sabe se está vazio ou se não se aplica. O predicado é o\n * mesmo, lido sobre o registro gravado em vez do rascunho.\n *\n * @internal exportado para teste.\n */\nexport function visibleDetailFields(entityDef: EntityDef, item: Record<string, any>): FieldDef[] {\n return entityDef.fields.filter(\n (f) => f.showInDetail !== false\n && f.key !== 'id' && f.key !== entityDef.displayField && f.key !== entityDef.imageField\n && (!f.visibleWhen || f.visibleWhen(item))\n )\n}\n\n/**\n * Uma ABA da ficha, montada com os mesmos grupos que o formulário usa.\n *\n * Ler e editar têm de ter a mesma forma: o cadastro de produto do V1 tem uma\n * aba por assunto, e uma ficha que só mostra isso no modo edição obriga a\n * pessoa a clicar em «Editar» para LER. Os campos continuam os mesmos — é\n * `FieldGroup.tab` decidindo, numa declaração só, as abas das duas telas.\n */\nfunction FieldGroupTab({\n entityDef,\n item,\n compact,\n onFieldSave,\n pendingKeys,\n groupIds,\n}: {\n entityDef: EntityDef\n item: Record<string, any>\n compact?: boolean\n onFieldSave?: (key: string, value: unknown) => Promise<void> | void\n pendingKeys?: ReadonlySet<string>\n groupIds: string[]\n}) {\n const detailFields = visibleDetailFields(entityDef, item)\n const groups = (entityDef.fieldGroups ?? []).filter((g) => groupIds.includes(g.id))\n const runtime = usePluginRuntimeOptional()\n const zoneWidgets = runtime\n ? groups.flatMap((g) => g.detailZones ?? []).flatMap((zone) => getWidgetsForZone(runtime, zone))\n : []\n return (\n <div className=\"space-y-5\">\n {groups.map((group) => {\n const fields = detailFields.filter((f) => f.group === group.id)\n if (fields.length === 0) return null\n // O título do grupo repetiria o nome da aba que a pessoa clicou.\n const shown = group.tab === group.label ? { ...group, label: '' } : group\n return (\n <FieldGroupSection\n key={group.id}\n group={shown}\n fields={fields}\n item={item}\n compact={compact}\n onFieldSave={onFieldSave}\n pendingKeys={pendingKeys}\n />\n )\n })}\n {zoneWidgets.map((w) => {\n const Widget = w.component as React.ComponentType<any>\n return <Widget key={w.id} item={item} config={w.config} runtime={runtime?.context} plugin={w.plugin} widget={w} />\n })}\n </div>\n )\n}\n\nfunction OverviewTab({\n entityDef,\n item,\n compact,\n onFieldSave,\n pendingKeys,\n}: {\n entityDef: EntityDef\n item: Record<string, any>\n compact?: boolean\n onFieldSave?: (key: string, value: unknown) => Promise<void> | void\n /** As chaves cujo valor está no rascunho — para a linha dizer que não gravou. */\n pendingKeys?: ReadonlySet<string>\n}) {\n const tFn = useTranslation()\n const detailFields = visibleDetailFields(entityDef, item)\n\n // Group fields\n const groups = entityDef.fieldGroups ?? []\n const ungroupedFields = detailFields.filter((f) => !f.group)\n\n // Build group → fields map\n const groupFieldMap = new Map<string, FieldDef[]>()\n for (const field of detailFields) {\n if (field.group) {\n const existing = groupFieldMap.get(field.group) ?? []\n existing.push(field)\n groupFieldMap.set(field.group, existing)\n }\n }\n\n // A MESMA divisão do formulário: o que o registro É fica no corpo, e o que\n // se DIZ sobre ele — unidade, o interruptor, observações, etiquetas — fica\n // no rail da direita. Ler a ficha e editá-la têm de ter a mesma forma; com\n // o rail só no formulário, o operador achava «Ativo» num lugar ao editar e\n // noutro ao ler.\n //\n // `fz-split` só divide quando há largura: num painel estreito (o modal, o\n // assistente ao lado) as duas colunas viram uma, na ordem certa.\n const sideGroups = groups.filter((g) => g.column === 'side' && (groupFieldMap.get(g.id)?.length ?? 0) > 0)\n // Grupo com `tab` tem aba PRÓPRIA (ver `fieldGroupTabs`) e por isso sai da\n // Visão Geral — senão a mesma ficha apareceria duas vezes, uma empilhada na\n // visão geral e outra atrás da aba.\n const bodyGroups = groups.filter((g) => !sideGroups.includes(g) && !g.tab)\n\n const body = (\n <>\n {/* Ungrouped fields */}\n {ungroupedFields.length > 0 && (\n <Card>\n <CardContent className=\"p-0\">\n <dl className=\"divide-y\">\n {ungroupedFields.map((field) => (\n <div key={field.key} className={compact ? 'px-3' : 'px-5'}>\n <FieldRow\n field={field}\n value={item[field.key]}\n row={item as Record<string, any>}\n t={tFn}\n compact={compact}\n onSave={onFieldSave ? (next) => Promise.resolve(onFieldSave(field.key, next)) : undefined}\n pending={pendingKeys?.has(field.key)}\n />\n </div>\n ))}\n </dl>\n </CardContent>\n </Card>\n )}\n\n {/* Grouped fields */}\n {bodyGroups.map((group) => {\n const fields = groupFieldMap.get(group.id)\n if (!fields || fields.length === 0) return null\n return (\n <FieldGroupSection\n key={group.id}\n group={group}\n fields={fields}\n item={item}\n compact={compact}\n onFieldSave={onFieldSave}\n pendingKeys={pendingKeys}\n />\n )\n })}\n\n {/* Catch any grouped fields without a matching FieldGroup definition */}\n {Array.from(groupFieldMap.entries()).map(([groupId, fields]) => {\n if (groups.some((g) => g.id === groupId)) return null\n return (\n <FieldGroupSection\n key={groupId}\n group={{ id: groupId, label: groupId.charAt(0).toUpperCase() + groupId.slice(1) }}\n fields={fields}\n item={item}\n compact={compact}\n onFieldSave={onFieldSave}\n pendingKeys={pendingKeys}\n />\n )\n })}\n </>\n )\n\n if (sideGroups.length === 0) {\n return <div className={`fz-container ${compact ? 'space-y-3' : 'space-y-6'}`}>{body}</div>\n }\n\n return (\n <div className=\"fz-container\">\n <div className=\"fz-split\">\n <div className={`fz-container ${compact ? 'space-y-3' : 'space-y-6'}`}>{body}</div>\n <div className={`fz-container ${compact ? 'space-y-3' : 'space-y-6'}`}>\n {sideGroups.map((group) => (\n <FieldGroupSection\n key={group.id}\n group={group}\n fields={groupFieldMap.get(group.id)!}\n item={item}\n compact={compact}\n onFieldSave={onFieldSave}\n pendingKeys={pendingKeys}\n />\n ))}\n </div>\n </div>\n </div>\n )\n}\n\n/** @internal exportado para teste — a resolução das abas do arquétipo. */\nexport function getArchetypeTabs(layout?: FormLayout, archetypeKind?: string): DetailTab[] {\n let tabs: DetailTab[]\n switch (layout) {\n case 'person':\n tabs = PERSON_DETAIL_TABS\n break\n case 'product':\n tabs = PRODUCT_DETAIL_TABS\n break\n case 'service':\n tabs = SERVICE_DETAIL_TABS\n break\n case 'location':\n tabs = LOCATION_DETAIL_TABS\n break\n case 'subject':\n tabs = SUBJECT_DETAIL_TABS\n break\n default:\n tabs = []\n }\n // `visibleFor` é uma restrição, não uma preferência: a aba de escala do\n // arquétipo de pessoa se declara `visibleFor: ['staff']` porque grade semanal\n // de expediente só faz sentido para quem atende. Filtrar só quando a entidade\n // declara um archetypeKind invertia isso — quem NÃO declara kind (uma tela que\n // mistura cliente, fornecedor e contato numa entidade só) via todas as abas\n // restritas, inclusive a de expediente na ficha de quem contrata.\n //\n // Sem kind declarado a entidade não é nenhum dos kinds da lista, então a aba\n // restrita fica de fora. Quem quiser uma dessas abas declara o kind, ou a\n // redeclara em `detailTabs` — tab da entidade ganha do arquétipo por id.\n return tabs.filter((tab) => !tab.visibleFor || (archetypeKind ? tab.visibleFor.includes(archetypeKind) : false))\n}\n\n/**\n * The filters that depend on the RUNTIME rather than on the archetype.\n *\n * `visibleFor` above answers \"what kind of record is this\", which the definition\n * already states and can be decided with no app running. These three interrogate\n * the app they are inside: which plugins contributed, whether this account works\n * with units, and what the entity asked to hide. They live together and outside\n * the component because a filter that only runs inside JSX is a filter nobody\n * tests — the tab set is a product decision and deserves assertions.\n *\n * @internal exported for tests.\n */\nexport function filterRuntimeTabs(\n tabs: DetailTab[],\n ctx: { hasWidget: (zone: string) => boolean; unitMode: boolean },\n): DetailTab[] {\n return tabs\n .filter((tab) => !tab.requiresWidgetZone || ctx.hasWidget(tab.requiresWidgetZone))\n .filter((tab) => !tab.requiresUnitMode || ctx.unitMode)\n .filter((tab) => !(tab as DetailTab & { hidden?: boolean }).hidden)\n}\n\nfunction mergeDetailTabs(archetypeTabs: DetailTab[], entityTabs: DetailTab[]): DetailTab[] {\n const merged = new Map<string, DetailTab>()\n\n for (const tab of entityTabs) merged.set(tab.id, tab)\n for (const tab of archetypeTabs) {\n if (!merged.has(tab.id)) merged.set(tab.id, tab)\n }\n\n return Array.from(merged.values())\n}\n\nfunction normalizeTabId(value?: string): string | undefined {\n return value?.split('?')[0]\n}\n\nfunction resolveActiveTab(initialTab: string | undefined, tabs: DetailTab[]): string {\n const normalized = normalizeTabId(initialTab)\n if (!normalized) return 'overview'\n if (normalized === 'overview') return 'overview'\n\n const direct = tabs.find((tab) => tab.id === normalized)\n if (direct) return direct.id\n\n const alias = tabs.find((tab) => (tab as DetailTab & { aliases?: string[] }).aliases?.includes(normalized))\n return alias?.id ?? 'overview'\n}\n\n/**\n * The record's tabs beyond \"overview\", and how many rows sit behind each.\n * One answer for the page that reads the record and the form that edits it.\n */\nexport function useRecordTabs(entityDef: EntityDef, item: Record<string, any> | null | undefined): { customTabs: DetailTab[]; tabCounts: Record<string, number | undefined> } {\n // Merge archetype tabs + custom entity tabs. Entity-specific tabs win by id\n // so vertical apps can replace generic person/product tabs without duplicates.\n const runtime = usePluginRuntimeOptional()\n const archetypeTabs = getArchetypeTabs(entityDef.layout, entityDef.data?.archetypeKind)\n // A one-to-many is a tab. `relatedLists` says which children this record has\n // and the FK that points back; the tab itself is the same for every pairing,\n // so it is built here rather than hand-written per entity. Declared tabs still\n // win by id — an app that wants its own \"Tables\" tab replaces this one.\n const relatedTabs: DetailTab[] = (entityDef.relatedLists ?? []).map((related) => ({\n id: relatedListTabId(related),\n label: related.label ?? related.entity.namePlural ?? related.entity.name,\n icon: related.icon ?? related.entity.icon,\n component: (props) => <RelatedListTab {...props} related={related} />,\n }))\n // The hook and not `isUnitMode()`: on a session with no local snapshot the\n // server answer lands after the first render, and without subscribing the tab\n // would stay missing on a real franchise until the person navigated away.\n const unitMode = useUnitMode()\n // As abas que vêm dos GRUPOS de campos (`FieldGroup.tab`). Mesma declaração\n // que o formulário lê, então ler e editar mostram os mesmos assuntos na mesma\n // ordem. Uma aba sem nenhum campo aplicável não entra: no produto, a aba\n // «Patrimônio» só existe para o que a casa marcou como patrimônio.\n const fieldGroupTabs: DetailTab[] = React.useMemo(() => {\n const groups = entityDef.fieldGroups ?? []\n if (!groups.some((g) => g.tab) || !item) return []\n const applicable = new Set(visibleDetailFields(entityDef, item).map((f) => f.group))\n const byTab = new Map<string, string[]>()\n const iconOf = new Map<string, string | undefined>()\n for (const g of groups) {\n if (!g.tab || !applicable.has(g.id)) continue\n byTab.set(g.tab, [...(byTab.get(g.tab) ?? []), g.id])\n if (!iconOf.has(g.tab)) iconOf.set(g.tab, g.tabIcon)\n }\n return [...byTab.entries()].map(([label, groupIds]) => ({\n id: `fields:${groupIds[0]}`,\n label,\n icon: iconOf.get(label),\n component: (props: { item: unknown; entityDef: EntityDef; [key: string]: unknown }) => (\n <FieldGroupTab\n entityDef={props.entityDef}\n item={props.item as Record<string, any>}\n groupIds={groupIds}\n // A ficha edita no lugar nas abas também. Sem passar isto, a Visão\n // Geral tinha lápis e as abas das fichas não — o mesmo registro\n // editável de um lado e travado do outro.\n onFieldSave={props.onFieldSave as ((key: string, value: unknown) => void) | undefined}\n pendingKeys={props.pendingKeys as ReadonlySet<string> | undefined}\n />\n ),\n }))\n }, [entityDef, item])\n\n const customTabs = filterRuntimeTabs(\n mergeDetailTabs(archetypeTabs, [...fieldGroupTabs, ...relatedTabs, ...(entityDef.detailTabs ?? [])]),\n {\n hasWidget: (zone) => (runtime ? getWidgetsForZone(runtime, zone).length > 0 : false),\n unitMode,\n },\n )\n // Quantos registros, arquivos… antes do clique. Só o arquétipo de pessoa por\n // enquanto: é dele que os provedores sabem contar.\n const tabCounts = usePersonTabCounts(entityDef.layout === 'person' ? item?.id : undefined)\n return { customTabs, tabCounts }\n}\n\nexport function CrudDetailPage({\n entityDef,\n item,\n namePlural,\n basePath,\n initialTab,\n tabPath,\n onBack,\n onEdit,\n onDelete,\n feature,\n embedded,\n onFieldSave,\n onFieldsSave,\n badges,\n onImageChange,\n extraActions,\n}: CrudDetailPageProps) {\n const t = useTranslation()\n\n // ── O RASCUNHO DA FICHA ────────────────────────────────────────────────────\n // Editar inline passou a ENCOSTAR o valor aqui em vez de gravá-lo. Quem\n // grava é a ilha de «Alterações não salvas» da shell — a mesma do\n // formulário, o mesmo Cmd+Enter, o mesmo Esc para desfazer — porque é assim\n // que a pessoa trabalha: corrige o que estiver errado na ficha inteira e\n // salva uma vez. Um ✓ por célula dava três escritas, três avisos e três\n // linhas de auditoria para um único ato de corrigir um cadastro.\n //\n // `item` continua sendo a verdade do banco; `view` é o que a tela desenha.\n const [pending, setPending] = useState<Record<string, unknown>>({})\n const [savingDraft, setSavingDraft] = useState(false)\n const pendingKeys = React.useMemo(() => new Set(Object.keys(pending)), [pending])\n const dirty = pendingKeys.size > 0\n const view = React.useMemo(\n () => (dirty ? { ...item, ...pending } : item),\n [item, pending, dirty],\n )\n\n // Voltar ao valor original APAGA a pendência em vez de gravar o mesmo dado de\n // volta: quem digitou errado e corrigiu não alterou nada, e a ilha não pode\n // ficar aberta pedindo para salvar coisa nenhuma.\n const stageField = useCallback((key: string, value: unknown) => {\n setPending((prev) => {\n const next = { ...prev, [key]: value }\n const original = item[key]\n if ((value ?? '') === (original ?? '')) delete next[key]\n return next\n })\n }, [item])\n\n const commitDraft = useCallback(async () => {\n const changes = pending\n if (Object.keys(changes).length === 0 || savingDraft) return\n setSavingDraft(true)\n try {\n if (onFieldsSave) await onFieldsSave(changes)\n else if (onFieldSave) {\n // Em série e não em paralelo: dois updates simultâneos na mesma linha\n // é o jeito de uma das duas escritas sumir.\n for (const [key, value] of Object.entries(changes)) await onFieldSave(key, value)\n }\n setPending({})\n } catch (err) {\n toast.error(errorMessage(err))\n } finally {\n setSavingDraft(false)\n }\n }, [pending, savingDraft, onFieldsSave, onFieldSave])\n\n // Chamado sempre — a ilha só aparece com `dirty`, e uma ficha somente leitura\n // nunca fica suja.\n useSaveBar({\n dirty,\n saving: savingDraft,\n onSave: () => { void commitDraft() },\n onDiscard: () => setPending({}),\n })\n\n const displayField = entityDef.displayField ?? entityDef.fields[0]?.key ?? 'id'\n const displayFieldDef = entityDef.fields.find((f) => f.key === displayField)\n // O TÍTULO DE QUEM SE CHAMA PELO QUE APONTA.\n //\n // Nem toda ficha tem nome próprio: a linha de um pacote é «qual serviço, e\n // quantas vezes», e o que a identifica é a relação. Com o valor cru o hero, a\n // inicial do avatar e o breadcrumb escreviam o uuid — três lugares dizendo\n // «07cfbc2b-7138-…» onde cabia «Psicoterapia». O rótulo é o mesmo que a\n // célula da lista já resolve; só o detalhe não o consultava.\n const displayRelation = displayFieldDef?.type === 'relation' ? displayFieldDef.relation : undefined\n const { labelFor: displayLabelFor } = useRelationOptions(displayRelation)\n const rawDisplayValue = view[displayField] ?? 'Untitled'\n const displayValue = displayRelation\n ? (displayLabelFor(rawDisplayValue) || '—')\n : rawDisplayValue\n const subtitleValue = entityDef.subtitleField ? view[entityDef.subtitleField] : null\n // `imageField` only reaches a plain string column. Entities whose image lives\n // somewhere richer (a product's images[] relation, say) supply `image.get`,\n // and without consulting it the hero fell back to the initial letter even for\n // records that clearly have a photo.\n const imageValue = entityDef.image?.get(item) ?? (entityDef.imageField ? item[entityDef.imageField] : null)\n // A chave do interruptor é a que a ENTIDADE declara (`isActive`); `is_active`\n // é o que uma tabela legada entrega sem passar pelo mapeamento.\n const activeValue: boolean | undefined = view.isActive ?? view.is_active\n const initial = typeof displayValue === 'string' ? displayValue.charAt(0).toUpperCase() : '?'\n\n // Perguntado só na ficha de pessoa: o detalhe é genérico e também desenha\n // produto, serviço e unidade, e um id desses nunca casaria com uma ficha —\n // perguntar em todas seria uma requisição por tela para não descobrir nada.\n const myPersonId = useMyPersonId(entityDef.layout === 'person')\n const isMyRecord = Boolean(myPersonId) && myPersonId === item.id\n\n // O nome fica editável NO HERO, e não como mais uma linha da lista: ele é o\n // `displayField`, que é justamente o campo que a lista exclui. Sem isto, a\n // ficha embutida no perfil não teria como corrigir o próprio nome sem abrir a\n // página de cadastros — o pulo entre telas que ela existe para não exigir.\n const nameEditable = Boolean(onFieldSave || onFieldsSave) && Boolean(displayFieldDef) && isInlineEditable(displayFieldDef!)\n const [editingName, setEditingName] = useState(false)\n const imageInputRef = React.useRef<HTMLInputElement>(null)\n\n const { customTabs, tabCounts } = useRecordTabs(entityDef, item)\n const entityId = entityZoneId(entityDef)\n const legacyEntityId = legacyEntityZoneId(entityDef)\n const widgetZone = `${entityId}.detail.tabs`\n // Kept until 0.12: an app that already registered against the label-derived\n // id keeps rendering, instead of losing its widget to a fix it never saw.\n const legacyWidgetZone = `${legacyEntityId}.detail.tabs`\n // Primary verbs a plugin owns for this record. Without this zone the only\n // reachable place was BELOW the tabs, so an action had to disguise itself as\n // a tab to be seen.\n const headerActionsZone = `${entityId}.detail.header.actions`\n const aboveTabsZone = `${entityId}.detail.above-tabs`\n // O ARQUÉTIPO TAMBÉM TEM ZONA. As abas de pessoa já se registram por\n // `person.detail.*` em qualquer entidade com esse arquétipo — \"clientes\",\n // \"pacientes\", \"tutores\" são a mesma ficha. Um widget que vale para a pessoa\n // não pode ter de saber como o app chamou a entidade.\n // O arquétipo é o `layout` (\"person\", \"product\"…), não o `archetypeKind`\n // (\"customer\", \"staff\") — é ele que escolhe as abas, e é por ele que as\n // zonas de pessoa já se chamam `person.detail.*`.\n const archetypeAboveTabsZone = entityDef.layout\n ? `${entityDef.layout}.detail.above-tabs`\n : null\n const contributed = useHeaderActions(headerActionsZone)\n\n // Os verbos que a ENTIDADE declara (duplicar, encerrar, reemitir). Entram no\n // mesmo conjunto do Editar, então dobram no caret e no menu do celular como\n // o resto — uma barra própria só para eles seria uma segunda gramática de\n // ação na mesma tela.\n const [runningAction, setRunningAction] = useState<string | null>(null)\n const [pendingAction, setPendingAction] = useState<DetailAction | null>(null)\n\n // `window.confirm` NÃO: ele congela a aba inteira até alguém clicar, o que\n // numa shell com sincronização em segundo plano trava tudo, e some por\n // completo em qualquer contexto que suprima diálogos nativos. O ConfirmDialog\n // é o mesmo que a exclusão já usa.\n const executeAction = useCallback(async (action: DetailAction) => {\n setPendingAction(null)\n setRunningAction(action.id)\n try {\n const next = await action.run(item)\n if (typeof next === 'string') navigateApp(next)\n } catch (error) {\n toast.error(errorMessage(error))\n } finally {\n setRunningAction(null)\n }\n }, [item])\n\n const declared = (entityDef.detailActions ?? []).map((action) => ({\n id: action.id,\n label: action.label,\n icon: (action.icon ? getLucideIcon(action.icon) : undefined) ?? Sparkles,\n intent: action.intent ?? ('secondary' as const),\n disabled: runningAction !== null,\n onSelect: () => (action.confirm ? setPendingAction(action) : executeAction(action)),\n }))\n\n // Resolve initial tab — allow compatibility aliases, fallback to \"overview\".\n const activeTab = resolveActiveTab(initialTab, customTabs)\n const [selectedTab, setSelectedTab] = useState(activeTab)\n\n useEffect(() => {\n setSelectedTab(activeTab)\n }, [activeTab])\n\n const handleTabChange = useCallback((value: string) => {\n setSelectedTab(value)\n if (embedded) return\n const detailPath = `${basePath}/${item.id}`\n const newHash = value === 'overview' ? detailPath : `${detailPath}/${value}`\n window.history.replaceState(null, '', appHref(newHash))\n }, [basePath, item.id, embedded])\n\n /** The writer for {@link CrudDetailPageProps.tabPath} — handed to the open\n * tab so what it opens becomes addressable without it having to guess how\n * deep its own record's base path is. `replaceState` like the tab switch\n * above: browser Back means \"leave this record\", not \"close a panel\". */\n const setTabPath = useCallback((...segments: string[]) => {\n if (embedded) return\n const base = `${basePath}/${item.id}/${selectedTab}`\n window.history.replaceState(null, '', appHref(segments.length ? `${base}/${segments.join('/')}` : base))\n }, [basePath, item.id, selectedTab, embedded])\n\n // O cabeçalho vai para a barra da shell, não para cima do hero: empilhados,\n // a barra dizia \"Clientes\" e a linha de baixo \"Clientes / Carvalho\" — o nome\n // da seção duas vezes, com uma linha de distância.\n //\n // SubpageHeader e não um breadcrumb próprio: é o MESMO desenho de \"← título\" que\n // formulário, pedido e modelo de e-mail usam. Três desenhos da mesma seta era\n // o que havia antes.\n // …e o rótulo do pai é o do OFÍCIO quando ele tem um: o rail mostrava\n // \"Funcionários\" e esta linha, \"Profissionais\".\n const parentLabel = usePresetLabel(basePath, namePlural)\n const headerNode = React.useMemo(\n () => embedded ? null : (\n <RecordHeader entityDef={entityDef} item={view} title={String(displayValue)} parentLabel={parentLabel} onBack={onBack} badges={badges} />\n ),\n [embedded, entityDef, view, displayValue, parentLabel, onBack, badges],\n )\n\n const actionsNode = (\n <>\n {/* Editar / excluir / o que os plugins montam aqui vão para a direita da\n barra, o mesmo canto de toda tela do produto — era mais uma fileira\n de botões desenhada por conta. Embutida (uma ficha dentro de uma aba)\n não existe barra para reivindicar: aí eles ficam onde estão. */}\n <ActionSlot embedded={embedded}>\n <WidgetSlot zone={headerActionsZone} item={item} entityId={entityId} embedded={embedded} />\n {/* Editing is what you came to the record for; deleting is not, and an\n icon-only bin one pixel from it was the loudest thing on the row.\n The size fork also carried `'xs' as any` — a cast for a size that\n is not in buttonVariants. */}\n <PageActions\n actions={[\n ...(onEdit ? [{ id: 'edit', label: t('common.edit'), icon: Edit, intent: 'primary' as const, onSelect: onEdit }] : []),\n ...(extraActions ?? []),\n ...declared,\n // Plugin contributions join the set instead of standing beside it,\n // so they fold into the caret and the phone's menu like the rest.\n ...contributed,\n ...(onDelete ? [{ id: 'delete', label: t('common.delete'), icon: Trash2, intent: 'danger' as const, onSelect: onDelete }] : []),\n ]}\n />\n </ActionSlot>\n </>\n )\n\n return (\n // A largura que importa é a desta coluna — o assistente ocupa metade da\n // tela e o `lg:` da janela nunca soube disso.\n <>\n {/* Outside the spaced column: a header row hidden by breakpoint would still\n count as a sibling and push the tabs down by one gap. */}\n {headerNode}\n <div className={`fz-container ${embedded ? 'space-y-4' : 'space-y-6'}`}>\n {/* The hero is for a record with no bar above it (inside a panel). On a\n page the bar already names the record, and a second name below it\n pushed the tabs down to a height the edit form never had. */}\n {embedded && (\n <div className=\"flex items-start gap-3\">\n {/* Avatar / Image */}\n {/* A foto, e o botão de trocá-la quando quem monta a ficha diz que ela\n é trocável. Sem `onImageChange` nada muda: a tela de cadastros\n continua exibindo, e só. */}\n <div className=\"relative shrink-0\">\n {/* Um cartão de crédito tem CARA, e ela identifica melhor do que a\n inicial do nome num quadrado. Ver EntityDef.renderAvatar. */}\n {entityDef.renderAvatar ? (\n entityDef.renderAvatar(item)\n ) : imageValue ? (\n <img\n src={imageValue}\n alt={displayValue}\n className={`shrink-0 object-cover shadow-sm ${embedded ? 'h-10 w-10 rounded-xl' : 'h-20 w-20 rounded-2xl'}`}\n />\n ) : (\n <div className={`flex shrink-0 items-center justify-center bg-primary/10 text-primary font-bold shadow-sm ${embedded ? 'h-10 w-10 rounded-xl text-sm' : 'h-20 w-20 rounded-2xl text-2xl'}`}>\n {initial}\n </div>\n )}\n {onImageChange && (\n <>\n <Button\n variant=\"bare\"\n size=\"bare\"\n type=\"button\"\n onClick={() => imageInputRef.current?.click()}\n aria-label={t('common.edit')}\n className={`absolute -bottom-1 -right-1 flex items-center justify-center rounded-full border-2 border-background bg-primary text-primary-foreground transition-colors hover:bg-primary/90 ${embedded ? 'h-6 w-6' : 'h-8 w-8'}`}\n >\n <Camera className={embedded ? 'h-3 w-3' : 'h-3.5 w-3.5'} />\n </Button>\n <input\n ref={imageInputRef}\n type=\"file\"\n accept=\"image/*\"\n className=\"hidden\"\n onChange={(e) => {\n const file = e.target.files?.[0]\n if (file) void onImageChange(file)\n if (e.target) e.target.value = ''\n }}\n />\n </>\n )}\n </div>\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"group flex items-center gap-2\">\n {editingName && nameEditable && displayFieldDef ? (\n <InlineEditor\n field={displayFieldDef}\n value={displayValue}\n onCancel={() => setEditingName(false)}\n onSave={async (next) => { stageField(displayField, next) }}\n cancelLabel={t('common.cancel')}\n />\n ) : (\n <>\n <h1 className={`font-bold text-foreground truncate ${embedded ? 'text-base' : 'text-2xl'}`}>{displayValue}</h1>\n {nameEditable && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n type=\"button\"\n onClick={() => setEditingName(true)}\n aria-label={`${t('common.edit')} ${displayFieldDef?.label ?? ''}`}\n title={`${t('common.edit')} ${displayFieldDef?.label ?? ''}`}\n className=\"h-6 w-6 shrink-0 rounded-md text-muted-foreground opacity-0 transition-opacity focus:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring group-hover:opacity-100\"\n >\n <Pencil className=\"h-3 w-3\" />\n </Button>\n )}\n {/* Esta ficha é você. Sem isto, quem abre o próprio cadastro não tem\n como saber que é o próprio — a ficha e o login são duas linhas, e\n nada na tela dizia que apontavam para a mesma pessoa. Só aparece\n depois que alguém ligou as duas em Configurações → Perfil: dizer\n \"você\" por semelhança de nome seria afirmar uma identidade que o\n sistema não estabeleceu. */}\n {isMyRecord && (\n <Badge variant=\"secondary\" className=\"shrink-0\">{t('common.you')}</Badge>\n )}\n {/* O RÓTULO do estado, não o valor cru.\n Capitalizar a string do banco entrega \"On_sale\" no lugar de \"À\n venda\": o valor é um identificador, e quem sabe como ele se\n chama para uma pessoa é a lista de `options` do próprio campo —\n a mesma que o formulário e a célula da tabela já leem. Sem\n `options`, cai no comportamento antigo. */}\n {/* UMA fonte de verdade para «vale ou não».\n `services` tem `status` E `is_active`, e no cluster elas\n DISCORDAM em 22 linhas: status='active' com is_active=false. A\n tela mostrava as duas, lado a lado, dizendo coisas opostas.\n O badge de status só aparece onde a entidade DECLARA um campo\n `status` — ali ele é um estado de verdade (rascunho, publicado,\n cancelado), e não o eco de um booleano. */}\n {item.status && entityDef.fields.some((f) => f.key === 'status') && (\n <Badge variant=\"secondary\" className=\"shrink-0\">\n {statusLabel(entityDef, item.status)}\n </Badge>\n )}\n {activeValue !== undefined && (\n <Badge variant={activeValue ? 'success' : 'destructive'} className=\"shrink-0\">\n {activeValue ? t('common.active') : t('common.inactive')}\n </Badge>\n )}\n {badges}\n </>\n )}\n </div>\n {subtitleValue && (\n <p className={`text-muted-foreground mt-0.5 ${embedded ? 'text-xs' : ''}`}>{subtitleValue}</p>\n )}\n </div>\n\n {actionsNode}\n </div>\n )}\n {!embedded && actionsNode}\n\n {pendingAction && (\n <ConfirmDialog\n open\n title={pendingAction.label}\n description={pendingAction.confirm}\n confirmLabel={pendingAction.label}\n // O primitivo cai em \"Cancel\" cru; a shell é pt-BR.\n cancelLabel={t('common.cancel')}\n variant={pendingAction.intent === 'danger' ? 'destructive' : 'default'}\n loading={runningAction === pendingAction.id}\n onConfirm={() => executeAction(pendingAction)}\n onCancel={() => setPendingAction(null)}\n />\n )}\n\n {/* ACIMA DAS ABAS — e é onde o V1 põe o que é do DIA.\n A ficha guarda o histórico nas abas; o que está acontecendo agora\n (o atendimento em curso, o botão de começar) não é histórico e não\n pode exigir um clique de aba para aparecer. */}\n <WidgetSlot zone={aboveTabsZone} item={item} entityId={entityId} embedded={embedded} />\n {archetypeAboveTabsZone && archetypeAboveTabsZone !== aboveTabsZone && (\n <WidgetSlot zone={archetypeAboveTabsZone} item={item} entityId={entityId} embedded={embedded} />\n )}\n\n {/* Tabs */}\n <Tabs value={selectedTab} onValueChange={handleTabChange}>\n <RecordTabStrip\n compact={embedded}\n tabs={customTabs.map((tab) => ({ id: tab.id, label: tab.label, icon: tab.icon, count: tabCounts[tab.id] }))}\n />\n\n <TabsContent value=\"overview\" className={embedded ? 'mt-2' : 'mt-4'}>\n {entityDef.overviewComponent\n ? React.createElement(entityDef.overviewComponent, { item, entityDef })\n : (\n <OverviewTab\n entityDef={entityDef}\n item={view}\n compact={embedded}\n // A edição inline ENCOSTA; a ilha grava. `onFieldSave` continua\n // sendo o sinal de \"esta ficha é editável\".\n onFieldSave={onFieldSave || onFieldsSave ? (key, value) => stageField(key, value) : undefined}\n pendingKeys={pendingKeys}\n />\n )}\n {/* Endereços é SEÇÃO, não aba: duas linhas de lista não pagam uma aba\n própria, e onde a pessoa mora faz parte de quem ela é. */}\n {entityDef.layout === 'person' && item?.id && (\n <div className={embedded ? 'mt-3' : 'mt-5'}>\n <AddressesTab item={item} />\n </div>\n )}\n {/* E para onde o dinheiro SAI para esta pessoa. Seção irmã da de\n endereços, pela mesma razão: uma pessoa tem mais de uma conta (a\n do CNPJ e a do sócio), e isso não cabe num campo do formulário. */}\n {/* Only for someone the house PAYS: the entity says so by declaring a\n `bank` field. A customer record has no use for it. */}\n {entityDef.layout === 'person' && item?.id && entityDef.fields.some((f) => f.type === 'bank') && (\n <div className={embedded ? 'mt-3' : 'mt-5'}>\n <PayeeAccountsSection item={item} />\n </div>\n )}\n {/* A unidade lê o endereço do MESMO lugar, e num bloco só: rua,\n número, bairro e CEP soltos entre \"Código\" e \"Telefone\" não se\n leem como um endereço. Um, porque uma loja tem um. */}\n {entityDef.layout === 'location' && item?.id && (\n <div className={embedded ? 'mt-3' : 'mt-5'}>\n <AddressesTab item={item} ownerType=\"unit\" single />\n </div>\n )}\n {/* O mesmo lugar, agora declarável por qualquer entidade: o filho que\n o autor marcou como SEÇÃO se lê junto com os campos, e não atrás\n de uma aba. */}\n {item?.id && (entityDef.relatedSections ?? []).map((related) => (\n <div key={relatedListTabId(related)} className={embedded ? 'mt-3' : 'mt-5'}>\n <RelatedSection parentId={item.id as string} related={related} compact={embedded} />\n </div>\n ))}\n </TabsContent>\n\n {customTabs.map((tab) => (\n <TabsContent key={tab.id} value={tab.id} className=\"mt-4\">\n {tab.component ? (\n // `tabPath` only to the tab the URL is actually addressing —\n // handing it to every tab would have the documents tab trying to\n // open a recording id when the user switches across.\n React.createElement(tab.component, {\n item,\n entityDef,\n // A rota DESTE registro. Uma aba que lista eventos precisa\n // saber para onde apontar cada um (`#/clients/:id/:aba`), e\n // só esta página sabe em que caminho o app pendurou o\n // cadastro — a aba não tem como descobrir.\n recordPath: `${basePath}/${item.id}`,\n // Edição inline para quem a desenha (as abas das fichas). Uma\n // aba que não usa isto simplesmente ignora as duas chaves.\n onFieldSave: (onFieldSave || onFieldsSave) ? stageField : undefined,\n pendingKeys,\n ...(tab.id === selectedTab ? { tabPath, setTabPath } : {}),\n ...(tab.props ?? {}),\n })\n ) : (\n <Card>\n <CardContent className=\"flex items-center justify-center py-12\">\n <p className=\"text-muted-foreground\">{t('common.noContent')}</p>\n </CardContent>\n </Card>\n )}\n </TabsContent>\n ))}\n </Tabs>\n\n {/* Widget zone for plugin tab injection */}\n <WidgetSlot zone={widgetZone} />\n {legacyWidgetZone !== widgetZone && <WidgetSlot zone={legacyWidgetZone} />}\n\n {/* Fora das abas de propósito: a procedência é do REGISTRO, não da aba\n aberta — some ao trocar de aba seria ela mudando de assunto. */}\n <RecordMetaFooter item={item} compact={embedded} />\n </div>\n </>\n )\n}\n","import { useCallback, useRef, useState } from 'react'\nimport type { AddressValue } from '@fayz-ai/core'\nimport { formatPostalCode, isValidPostalCode, lookupPostalCode, isAddressEmpty, isAddressIncomplete } from '@fayz-ai/core'\nimport { Input } from '@fayz-ai/ui'\nimport { MapPin } from 'lucide-react'\nimport { AttachedFieldSection } from './AttachedFieldSection'\nimport { useTranslation } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// O endereço DENTRO do formulário do cadastro.\n//\n// A ficha já tem a aba Endereços (AddressesTab), e ela continua sendo a dona do\n// caso geral: uma pessoa tem casa, trabalho e o endereço da nota. Este campo\n// resolve outra coisa — o endereço que se digita JUNTO com o nome, no balcão,\n// antes de o registro existir. Sem ele o V2 pedia o cadastro numa tela e o\n// endereço em outra, e a recepção só fazia a primeira.\n//\n// Por isso ele é um campo, não uma aba: o valor viaja no formulário como\n// qualquer outro, e quem grava a linha de `public.addresses` é o provider.\n// ---------------------------------------------------------------------------\n\nexport function AddressField({\n value,\n onChange,\n invalid,\n}: {\n value: AddressValue | undefined\n onChange: (next: AddressValue) => void\n invalid?: boolean\n}) {\n const t = useTranslation()\n const v = value ?? {}\n const set = (key: keyof AddressValue, next: string) => onChange({ ...v, [key]: next })\n\n // Mesma consulta da aba (core `lookupPostalCode`): cache, e o cuidado que o\n // ViaCEP exige — CEP inexistente volta 200 com `{erro:true}`, e tratar isso\n // como sucesso apagaria a rua que a pessoa acabou de digitar.\n const [cepState, setCepState] = useState<'idle' | 'loading' | 'notFound' | 'failed'>('idle')\n const lastLookup = useRef('')\n const numberRef = useRef<HTMLInputElement>(null)\n\n const lookup = useCallback(async (masked: string) => {\n if (!isValidPostalCode(masked) || lastLookup.current === masked) return\n lastLookup.current = masked\n setCepState('loading')\n try {\n const found = await lookupPostalCode(masked)\n if (!found) { setCepState('notFound'); return }\n setCepState('idle')\n // Só o que veio PREENCHIDO: um CEP de cidade inteira responde sem\n // logradouro, e sobrescrever a rua com '' é o mesmo erro por outra porta.\n onChange({\n ...v,\n postalCode: masked,\n street: found.street || v.street,\n district: found.district || v.district,\n city: found.city || v.city,\n state: found.state || v.state,\n })\n // O número é o único campo que a consulta não sabe: é para lá que o\n // cursor vai, em vez de voltar para o começo.\n requestAnimationFrame(() => numberRef.current?.focus())\n } catch {\n // Offline é diferente de CEP inexistente, e a frase tem de dizer qual.\n setCepState('failed')\n }\n }, [onChange, v])\n\n const onPostal = (raw: string) => {\n const masked = formatPostalCode(raw)\n set('postalCode', masked)\n if (cepState !== 'idle') setCepState('idle')\n if (isValidPostalCode(masked)) void lookup(masked)\n else lastLookup.current = ''\n }\n\n const incomplete = invalid || isAddressIncomplete(v)\n const sub = (key: keyof AddressValue, labelKey: string, span?: boolean) => (\n <label className={`grid gap-1 ${span ? 'fz-field-wide' : ''}`}>\n <span className=\"text-xs text-muted-foreground\">{t(`crud.address.${labelKey}`)}</span>\n <Input\n ref={key === 'number' ? numberRef : undefined}\n value={(v[key] as string) ?? ''}\n onChange={(e) => set(key, e.target.value)}\n />\n </label>\n )\n\n return (\n <AttachedFieldSection\n present={value != null}\n addLabel={t('crud.address.add')}\n emptyLabel={t('crud.address.emptyState')}\n emptyHint={t('crud.address.emptyHint')}\n emptyIcon={MapPin}\n onAdd={() => onChange({})}\n >\n <div className=\"fz-container\">\n <div className=\"fz-fields fz-fields-3\">\n <label className=\"grid gap-1\">\n <span className=\"text-xs text-muted-foreground\">{t('crud.address.postalCode')}</span>\n <Input\n value={v.postalCode ?? ''}\n onChange={(e) => onPostal(e.target.value)}\n onBlur={() => void lookup(formatPostalCode(v.postalCode ?? ''))}\n placeholder=\"00000-000\"\n inputMode=\"numeric\"\n />\n </label>\n {sub('street', 'street', true)}\n {sub('number', 'number')}\n {sub('complement', 'complement')}\n {sub('district', 'district')}\n {sub('city', 'city')}\n {sub('state', 'state')}\n {sub('country', 'country')}\n </div>\n {cepState === 'notFound' && (\n <p className=\"mt-1 text-[11px] text-muted-foreground\">{t('crud.address.lookupFailed')}</p>\n )}\n {/* Só quando há endereço começado: um cadastro sem endereço nenhum não\n está errado, e avisar ali seria pedir um dado que ninguém exigiu. */}\n {incomplete && !isAddressEmpty(v) && (\n <p className=\"mt-1 text-[11px] text-destructive\">{t('crud.address.incomplete')}</p>\n )}\n </div>\n </AttachedFieldSection>\n )\n}\n","import type { BankAccountValue } from '@fayz-ai/core'\nimport { isBankEmpty, isBankIncomplete, payeeAccountFields, payeeMethodOf, useTranslation } from '@fayz-ai/core'\nimport { Landmark } from 'lucide-react'\nimport { AttachedFieldSection } from './AttachedFieldSection'\nimport { SubForm } from './SubForm'\nimport { usePermissionOptional } from '../permissions/context'\n\n// ---------------------------------------------------------------------------\n// A conta de quem a casa PAGA, dentro do formulário do cadastro.\n//\n// Uma linha de `public.payee_accounts` (migration 149) — e não de\n// `plg_financial_accounts`, que é o razão. A conta do fornecedor não é dinheiro\n// da casa: é o endereço para onde o dinheiro sai, e pô-la no razão a faria\n// aparecer no seletor de «Receber em» e no saldo consolidado da empresa.\n//\n// Os CAMPOS não moram aqui: são `payeeAccountFields()`, os mesmos que o diálogo\n// da ficha usa, renderizados pelo mesmo motor (SubForm). É o que garante que\n// escolher PIX esconda agência nos dois lugares, em vez de num só.\n// ---------------------------------------------------------------------------\n\nconst FIELDS = payeeAccountFields()\n\nexport function BankField({\n value,\n onChange,\n}: {\n value: BankAccountValue | undefined\n onChange: (next: BankAccountValue) => void\n}) {\n const t = useTranslation()\n const v = (value ?? {}) as Record<string, any>\n // `method` não é coluna: uma linha com chave PIX e sem conta É um PIX. Aqui\n // ele é derivado na leitura e vive só enquanto o formulário está aberto.\n const withMethod = { ...v, method: v.method ?? payeeMethodOf(v) }\n // payee_accounts is gated by financial.edit (db 174); without it the save\n // would be refused by RLS and swallowed by the attached-row writer.\n const canEdit = usePermissionOptional()('financial', 'edit')\n if (!canEdit) return null\n\n return (\n <AttachedFieldSection\n present={value != null}\n addLabel={t('crud.bank.add')}\n emptyLabel={t('crud.bank.emptyState')}\n emptyHint={t('crud.bank.emptyHint')}\n emptyIcon={Landmark}\n onAdd={() => onChange({ method: 'bank' } as BankAccountValue)}\n >\n <SubForm fields={FIELDS} values={withMethod} onChange={(next) => onChange(next as BankAccountValue)} />\n {isBankIncomplete(v) && !isBankEmpty(v) && (\n <p className=\"mt-1 text-[11px] text-destructive\">{t('crud.bank.incomplete')}</p>\n )}\n </AttachedFieldSection>\n )\n}\n","import { errorMessage, isAddressIncomplete, isBankIncomplete, emitDataChanged } from '@fayz-ai/core'\nimport type { AddressValue, BankAccountValue } from '@fayz-ai/core'\nimport React, { useState, useEffect, useContext } from 'react'\nimport { ArrowLeft, ChevronDown, ChevronLeft, ChevronRight, ImagePlus, Loader2 } from 'lucide-react'\nimport { Card, CardContent, navigateToCrumb, usePageTrailParent } from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { Input, Textarea } from '@fayz-ai/ui'\nimport { Checkbox } from '@fayz-ai/ui'\nimport { CurrencyInput } from '@fayz-ai/ui'\nimport { PhoneField } from '@fayz-ai/ui'\nimport { MarkdownEditor } from '@fayz-ai/ui'\nimport { toast } from '@fayz-ai/ui'\nimport { useSaveBar, useBackHandler, ViewTabs, ICON_MAP } from '@fayz-ai/ui'\nimport { PersonFormLayout } from './archetypes/PersonFormLayout'\nimport { RelatedSection, PendingChildrenProvider, usePendingChildren } from './RelatedSection'\nimport { ProductFormLayout } from './archetypes/ProductFormLayout'\nimport { ServiceFormLayout } from './archetypes/ServiceFormLayout'\nimport { LocationFormLayout } from './archetypes/LocationFormLayout'\nimport { SubjectFormLayout } from './archetypes/SubjectFormLayout'\nimport { useTranslation } from '@fayz-ai/core'\nimport { SubpageHeader, Tabs } from '@fayz-ai/ui'\nimport { RecordHeader, RecordTabStrip, type RecordTabItem } from './record-chrome'\nimport { useRecordTabs } from './CrudDetailPage'\nimport { AddressField } from './AddressField'\nimport { BankField } from './BankField'\nimport { TagsField } from './TagsField'\nimport { InlineToggle } from './fieldToColumn'\nimport { AttachedSectionProvider, isAttachedFieldType } from './AttachedFieldSection'\nimport { currencySymbol } from '../lib/currency'\nimport type { EntityImageConfig } from '@fayz-ai/core'\nimport type { FieldDef, FieldGroup, EntityDef } from '@fayz-ai/core'\nimport type { FormLayout } from '@fayz-ai/core'\nimport { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from '@fayz-ai/ui'\nimport { RelationSelect } from './relation-field'\nimport { useLimitGuard } from '../access/context'\nimport { invalidateLimit } from '../access/limits-registry'\nimport { humanizeWriteError } from './write-errors'\n\n/**\n * `datetime-local` fala RELÓGIO DE PAREDE; a coluna fala INSTANTE.\n *\n * O input entrega \"2026-09-27T23:00\" — sem fuso — e esse texto seguia direto\n * para uma coluna `timestamptz`. O Postgres então o lia como UTC e gravava\n * 23:00Z, que em São Paulo é 20:00: um show marcado para as 23h aparecia às\n * 20h na própria tela que acabou de o cadastrar. Na volta era o espelho do\n * mesmo defeito — o valor vinha com offset (\"...+00:00\"), o input não sabe ler\n * isso, e o campo abria VAZIO ao editar, pronto para apagar o horário.\n *\n * As duas conversões abaixo são o tradutor que faltava. Todas as 790 colunas de\n * horário deste cluster são `timestamptz`, então mandar um ISO com offset é\n * sempre a leitura certa.\n */\nfunction toLocalDateTimeInput(value: unknown): string {\n if (!value) return ''\n const raw = String(value)\n // Já é relógio de parede — devolver como está evita um round-trip que só\n // introduziria erro de arredondamento.\n if (/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$/.test(raw)) return raw\n const d = new Date(raw)\n if (Number.isNaN(d.getTime())) return ''\n const pad = (n: number) => String(n).padStart(2, '0')\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${pad(d.getHours())}:${pad(d.getMinutes())}`\n}\n\nfunction fromLocalDateTimeInput(value: string): string | null {\n // `null` e não `''`: string vazia numa coluna de horário é erro de tipo, e o\n // usuário que limpou o campo quis dizer \"não tem\".\n if (!value) return null\n // Um texto sem offset é parseado no fuso do NAVEGADOR — que é exatamente o\n // fuso em que a pessoa digitou.\n const d = new Date(value)\n return Number.isNaN(d.getTime()) ? null : d.toISOString()\n}\n\ninterface CrudFormPageProps {\n entityDef: EntityDef\n mode: 'create' | 'edit'\n initialData?: Record<string, any>\n /** Devolver o registro criado é o que permite gravar os filhos que a tela\n * juntou antes de ele existir (ver `relatedSections` na criação). */\n onSubmit: (data: Record<string, any>) => void | Promise<void | { id?: string } | null>\n /**\n * DEPOIS de tudo gravado — inclusive os filhos que esperavam o dono.\n *\n * A navegação morava dentro do `onSubmit` e saía antes deles: a tela ia para\n * a ficha, a seção desmontava, e as linhas que a pessoa tinha montado no\n * formulário sumiam sem erro nenhum. Quem navega é este, no fim da fila.\n */\n onSaved?: (created: { id?: string } | null | void) => void\n onCancel: () => void\n namePlural: string\n /** Embedded mode — no breadcrumb, compact layout. For use inside modals/panels. */\n embedded?: boolean\n /** Hide the internal breadcrumb while keeping the full-page SaveBar/Escape flow.\n * Use when a parent already renders its own header (e.g. SubpageHeader). */\n hideBreadcrumb?: boolean\n /**\n * Editing a record that has a page of its own: draws the record's tab strip\n * where that page draws it, and is called when the reader picks a tab the\n * form does not hold (a related list, a statement) — the host opens it.\n */\n onRecordTab?: (tabId: string) => void\n /**\n * Id on the <form>, so a submit button OUTSIDE it can drive it — the plain\n * HTML `form=` attribute, no refs. What a dialog needs to keep saving in a\n * fixed footer while the fields scroll.\n */\n formId?: string\n /** Drop the inline Cancel/Save row: the host renders them somewhere better. */\n hideActions?: boolean\n /**\n * Opens showing ONLY the essentials — the required fields — with a link that\n * reveals the whole registry. For a form that interrupts something else: the\n * supplier missing mid-invoice needs a name, not twenty fields the person\n * posting it does not have to hand.\n */\n essentialFirst?: boolean\n /** Opens with the empty required fields already marked, for a caller that came to complete the record. */\n highlightMissing?: boolean\n /**\n * Render the fields in a <div> instead of a <form>, and hand the host a way\n * to submit them (`submitRef`).\n *\n * For a host that is ITSELF a form — a lookup's inline create sitting inside\n * an invoice or a booking. A form nested in a form cannot be submitted at\n * all: the button is associated correctly and `requestSubmit()` is simply\n * ignored, so the only symptom is a dead button. Verified in Chromium.\n *\n * The trade is native `required` validation, which `submit` replaces with its\n * own check over the entity's required fields.\n */\n noForm?: boolean\n /** Receives the submit function while mounted. Only useful with `noForm`. */\n submitRef?: React.MutableRefObject<(() => void) | null>\n}\n\n/**\n * Empty for the purpose of a REQUIRED check.\n *\n * Deliberately not `!value`: `0` is a price a merchant meant to type and\n * `false` is an answer to a checkbox, and treating either as missing is how a\n * validator starts refusing valid input. Spelled out rather than leaning on\n * string coercion — `!String(v ?? '').trim()` happens to agree on every case\n * here, and agreeing by accident is not the same as saying what you mean.\n */\nexport function isEmptyValue(value: unknown): boolean {\n if (value === undefined || value === null) return true\n if (typeof value === 'string') return value.trim() === ''\n if (Array.isArray(value)) return value.length === 0\n return false\n}\n\n/**\n * The required fields a save would fail on, in the order they appear on screen.\n *\n * Pure and exported because it is the whole judgement — the rest is wiring —\n * and because it is the same question the agent path (`ai-tool-handlers.ts`)\n * asks of the same record. Fields hidden by `visibleWhen` are skipped: a field\n * the merchant cannot see is not one they can be asked to fill.\n */\nexport function missingRequiredFields(\n fields: FieldDef[],\n values: Record<string, unknown>,\n): FieldDef[] {\n return fields.filter((f) => {\n if (f.type === 'computed') return false\n if (f.visibleWhen && !f.visibleWhen(values)) return false\n // Endereço é tudo-ou-nada: `public.addresses` exige CEP, rua, cidade e UF,\n // e começado pela metade ele não tem como ser gravado. Vale mesmo sem\n // `required` — quem exigiu foi o banco, não o cadastro. Vazio segue livre.\n if (f.type === 'address') return isAddressIncomplete(values[f.key])\n // Mesma regra do endereço, outra tabela: o CHECK da 149 recusa uma linha\n // sem conta E sem PIX, então começar e parar no nome do banco é erro aqui.\n if (f.type === 'bank') return isBankIncomplete(values[f.key])\n if (!f.required) return false\n return isEmptyValue(values[f.key])\n })\n}\n\n/** Stable identity so an empty invalid-set never re-renders the form. */\nconst EMPTY_KEYS: ReadonlySet<string> = new Set<string>()\n\n/**\n * Brings a field into view and focuses it. Best-effort by design: a field\n * inside a collapsed group has nothing to focus, and the toast still named it.\n */\nfunction focusField(key: string): void {\n if (typeof document === 'undefined') return\n const el = document.querySelector<HTMLElement>(`[data-field-key=\"${CSS.escape(key)}\"]`)\n if (!el) return\n el.scrollIntoView({ block: 'center', behavior: 'smooth' })\n const input = el.querySelector<HTMLElement>('input, textarea, select, [contenteditable=\"true\"]')\n ;(input ?? el).focus?.()\n}\n\nfunction getDefaultValues(fields: FieldDef[]): Record<string, any> {\n const values: Record<string, any> = {}\n for (const field of fields) {\n if (field.showInForm === false) continue\n // Computed fields are read-only and never part of the payload.\n if (field.type === 'computed') continue\n if (field.defaultValue != null) {\n values[field.key] = field.defaultValue\n } else {\n switch (field.type) {\n case 'boolean':\n values[field.key] = false\n break\n case 'number':\n case 'currency':\n values[field.key] = ''\n break\n default:\n values[field.key] = ''\n }\n }\n }\n return values\n}\n\n/** Lets a `custom` field write a sibling field (FieldDef.renderInput's setValue). */\nconst SetFieldValueContext = React.createContext<((key: string, next: unknown) => void) | undefined>(undefined)\n\nfunction renderField(\n field: FieldDef,\n value: any,\n onChange: (val: any) => void,\n allValues: Record<string, any> = {},\n // A frase do seletor vazio vem TRADUZIDA de quem renderiza.\n //\n // Aqui ela era montada em inglês — `Select ${label}...` — num produto\n // inteiro em pt-BR, e a chave traduzida já existia\n // (`crud.form.selectPlaceholder`) sem ninguém usá-la. Aparecia em toda\n // relação e toda escolha de todo cadastro: «Select categoria...».\n selectPlaceholder?: (label: string) => string,\n setValue?: (key: string, next: unknown) => void,\n) {\n const baseClass = 'flex h-9 w-full rounded-input border border-input bg-background px-3 py-1.5 text-sm shadow-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50'\n\n switch (field.type) {\n case 'custom':\n return <>{field.renderInput?.({ value, onChange, values: allValues, setValue })}</>\n // Masked in, digits out — the same field every hand-rolled form was reaching\n // for. A raw input here stored \"(11) 98765-4321\" and the next lookup for\n // 11987654321 found nothing.\n case 'phone':\n return (\n <PhoneField\n value={value ?? ''}\n onChange={onChange}\n placeholder={field.placeholder}\n className={baseClass}\n />\n )\n case 'currency': {\n const locale = field.currencyLocale ?? 'pt-BR'\n return (\n <CurrencyInput\n value={Number(value) || 0}\n onChange={(n) => onChange(n)}\n currencyCode={field.currency}\n locale={locale}\n symbol={field.currencySymbol ?? (field.currency ? currencySymbol(field.currency, locale) : 'R$')}\n />\n )\n }\n case 'segmented': {\n const options = (field.options ?? []).map((o) =>\n typeof o === 'string' ? { label: o, value: o, description: undefined } : o,\n )\n return (\n <div className=\"fz-options\">\n {options.map((o) => {\n const active = value === o.value\n return (\n <Button\n variant=\"bare\"\n size=\"bare\"\n key={o.value}\n type=\"button\"\n onClick={() => onChange(o.value)}\n className={`inline-block whitespace-normal text-[length:inherit] font-normal rounded-lg border-2 p-3 text-left transition-all ${\n active\n ? 'border-primary bg-primary/5'\n : 'border-transparent bg-muted/20 hover:bg-muted/40'\n }`}\n >\n <p className={`text-sm font-medium ${active ? 'text-primary' : ''}`}>{o.label}</p>\n {'description' in o && o.description && (\n <p className=\"text-[10px] text-muted-foreground mt-0.5 leading-tight\">{o.description}</p>\n )}\n </Button>\n )\n })}\n </div>\n )\n }\n case 'computed': {\n const result = field.compute ? field.compute(allValues) : null\n const tone = result?.tone === 'positive' ? 'text-success'\n : result?.tone === 'negative' ? 'text-destructive'\n : 'text-foreground'\n return (\n <div className=\"mt-1 rounded-lg border bg-muted/20 px-3 py-2 text-sm tabular-nums text-right\">\n {result ? <span className={tone}>{result.display}</span> : <span className=\"text-muted-foreground\">—</span>}\n </div>\n )\n }\n case 'address':\n // O endereço inteiro num campo só — ver AddressField.\n return (\n <AddressField\n value={value as AddressValue | undefined}\n onChange={onChange}\n />\n )\n case 'bank':\n // A conta de quem a casa paga — ver BankField e a migration 149.\n return (\n <BankField\n value={value as BankAccountValue | undefined}\n onChange={onChange}\n />\n )\n case 'tags':\n // As sugestões saem da própria tabela do cadastro — ver TagsField.\n return (\n <TagsField\n value={Array.isArray(value) ? value : undefined}\n onChange={onChange}\n table={field.relation?.table}\n placeholder={field.placeholder}\n />\n )\n case 'textarea':\n return (\n <Textarea\n value={value ?? ''}\n onChange={(e) => onChange(e.target.value)}\n placeholder={field.placeholder}\n required={field.required}\n rows={2}\n className=\"bg-background py-1.5 shadow-sm\"\n />\n )\n case 'markdown':\n return (\n <MarkdownEditor\n value={value ?? ''}\n onChange={onChange}\n placeholder={field.placeholder}\n minRows={12}\n defaultMode=\"edit\"\n />\n )\n case 'relation':\n return (\n <RelationSelect\n relation={field.relation}\n value={value}\n onChange={onChange}\n className={baseClass}\n required={field.required}\n placeholder={field.placeholder ?? selectPlaceholder?.(field.label.toLowerCase()) ?? field.label}\n />\n )\n case 'select': {\n const options = (field.options ?? []).map((o) =>\n typeof o === 'string' ? { label: o, value: o } : o,\n )\n // O <select> do NAVEGADOR e o resto do produto não se pareciam.\n //\n // Todo dropdown do sistema é o do design system — altura, raio, hairline,\n // a seta, o item marcado. Este era o nativo, com a aparência que cada\n // sistema operacional lhe dá: no modal \"Novo: Contato\" ele aparecia ao\n // lado de um campo de texto do DS, e os dois tinham molduras diferentes.\n //\n // `value={undefined}` e não `''`: o Radix trata a string vazia como\n // \"sem opção\" e recusa um `SelectItem` com esse valor, então o vazio é a\n // ausência de valor, e o placeholder é quem o desenha.\n return (\n <Select value={value ? String(value) : undefined} onValueChange={(v) => onChange(v)}>\n <SelectTrigger className={baseClass} aria-required={field.required || undefined}>\n <SelectValue placeholder={field.placeholder ?? selectPlaceholder?.(field.label.toLowerCase()) ?? field.label} />\n </SelectTrigger>\n <SelectContent>\n {options.map((o) => (\n <SelectItem key={o.value} value={String(o.value)}>{o.label}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n )\n }\n case 'boolean': {\n const boolLabel = (field.labelWhen && field.labelWhen(allValues)) || field.label\n // Interruptor quando o campo é um estado que se LIGA (`inlineToggle`) —\n // o mesmo controle que a lista usa na coluna «Ativa», e não uma caixa de\n // seleção ao lado dele. Caixa continua valendo para o resto: «não cobrar\n // taxa», «aceita receber e-mail» são concordâncias, não estados.\n if (field.inlineToggle) {\n return (\n <label className=\"flex items-center gap-2.5 cursor-pointer\">\n <InlineToggle checked={!!value} onChange={onChange} />\n <span className=\"text-sm\">{boolLabel}</span>\n </label>\n )\n }\n return (\n <label className=\"flex items-center gap-2.5 cursor-pointer\">\n {/* A `<button>` IS a labelable element, so this label adopted the\n Checkbox as its control and re-fired the click on it — every box\n toggled twice and no boolean field in any registry could be turned\n OFF again (found while porting Parcerias; it broke Won/Lost on\n Stages too). Cancelling the label's default activation for clicks\n that land on the box itself leaves one toggle; clicks on the text\n still reach the label and forward as before. */}\n <span onClick={(e) => e.preventDefault()} className=\"inline-flex\">\n <Checkbox\n checked={!!value}\n onChange={(checked) => onChange(checked)}\n />\n </span>\n <span className=\"text-sm\">{boolLabel}</span>\n </label>\n )\n }\n case 'number':\n return (\n <Input\n type=\"number\"\n value={value ?? ''}\n onChange={(e) => onChange(e.target.value === '' ? '' : Number(e.target.value))}\n placeholder={field.placeholder}\n required={field.required}\n min={field.min}\n max={field.max}\n />\n )\n case 'date':\n return <Input type=\"date\" value={value ?? ''} onChange={(e) => onChange(e.target.value)} required={field.required} />\n case 'datetime':\n return (\n <Input\n type=\"datetime-local\"\n value={toLocalDateTimeInput(value)}\n onChange={(e) => onChange(fromLocalDateTimeInput(e.target.value))}\n required={field.required}\n />\n )\n case 'time':\n return <Input type=\"time\" value={value ?? ''} onChange={(e) => onChange(e.target.value)} required={field.required} />\n case 'color':\n return (\n <div className=\"flex items-center gap-2\">\n <input\n type=\"color\"\n value={value || '#6b7280'}\n onChange={(e) => onChange(e.target.value)}\n className=\"h-9 w-12 rounded-input border border-input cursor-pointer p-0.5\"\n />\n <Input\n type=\"text\"\n value={value ?? ''}\n onChange={(e) => onChange(e.target.value)}\n placeholder=\"#000000\"\n className=\"flex-1 font-mono text-xs\"\n />\n </div>\n )\n default:\n return (\n <Input\n type={field.type === 'email' ? 'email' : field.type === 'url' ? 'url' : 'text'}\n value={value ?? ''}\n onChange={(e) => onChange(e.target.value)}\n placeholder={field.placeholder}\n required={field.required}\n // `max` num campo de texto é o teto de CARACTERES — o `maxLength={80}`\n // que o V1 põe no nome do KDS. Sem isto o limite existia só na\n // declaração e o campo aceitava qualquer coisa.\n maxLength={field.max}\n />\n )\n }\n}\n\nexport function FormFieldItem({ field, value, onChange, allValues, invalid }: { field: FieldDef; value: any; onChange: (val: any) => void; allValues?: Record<string, any>; invalid?: boolean }) {\n const tField = useTranslation()\n const setValue = useContext(SetFieldValueContext)\n // Here and not in each layout: there are six form layouts and the archetypes\n // render their own field lists, so a filter applied at the call site would be\n // right in one of them and forgotten in five.\n if (field.visibleWhen && !field.visibleWhen(allValues ?? {})) return null\n // O rótulo pode depender do que já foi respondido: `cpf` é «CPF» de gente e\n // «CNPJ» de empresa, e é a MESMA coluna. Ver FieldDef.labelWhen.\n const label = (field.labelWhen && field.labelWhen(allValues ?? {})) || field.label\n return (\n // `data-field-key` is what lets a failed save scroll the offending field\n // into view; `fz-field-invalid` is a marker class so the ring is one rule\n // in the stylesheet instead of a Tailwind string at six form layouts.\n <div\n data-field-key={field.key}\n className={`grid gap-1 ${field.span === 2 ? 'fz-field-wide' : ''}${invalid ? ' fz-field-invalid' : ''}`}\n >\n {/* `address` desenha o próprio conjunto de rótulos (CEP, Número, Bairro…),\n e o grupo já se chama Endereço: um rótulo aqui era o mesmo título\n duas vezes, uma linha acima da outra. Mesma razão do booleano, que\n leva o texto ao lado da caixa. */}\n {field.type !== 'boolean' && field.type !== 'address' && field.type !== 'bank' && (\n <label className=\"text-sm font-medium text-foreground\">\n {label}\n {field.required && <span className=\"text-destructive ml-0.5\">*</span>}\n </label>\n )}\n {renderField(field, value, onChange, allValues, (l) => tField('crud.form.selectPlaceholder', { label: l }), setValue)}\n {invalid ? (\n // Said at the field as well as in the toast: a toast is gone in four\n // seconds and a form is filled in longer than that.\n <p className=\"text-[11px] text-destructive mt-0.5\">{label}</p>\n ) : (\n field.hint && <p className=\"text-[10px] text-muted-foreground mt-0.5\">{field.hint}</p>\n )}\n </div>\n )\n}\n\n/**\n * The image slot, wired. Renders the record's current image and, when the entity\n * supplies an `upload`, lets it be replaced. An entity can also declare a\n * `draftField`: create mode then previews the local file and hands it to the\n * owning form, which persists it after the record receives an id.\n */\nfunction ImageSlot({\n image,\n row,\n canEdit,\n onDraftFile,\n}: {\n image: EntityImageConfig\n row: Record<string, any>\n canEdit: boolean\n onDraftFile?: (file: File) => void\n}) {\n const t = useTranslation()\n const inputRef = React.useRef<HTMLInputElement>(null)\n const [url, setUrl] = React.useState<string | undefined>(() => image.get(row))\n const [busy, setBusy] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const draftUrlRef = React.useRef<string | null>(null)\n const currentUrl = image.get(row)\n const draftFile = image.draftField ? row[image.draftField] : undefined\n\n // The form mounts before the record is loaded in edit mode, so the initial\n // value can be undefined and arrive later. Clearing/discarding a draft must\n // also clear its preview even when the persisted URL stays undefined.\n React.useEffect(() => {\n if (draftFile) return\n if (draftUrlRef.current) {\n URL.revokeObjectURL(draftUrlRef.current)\n draftUrlRef.current = null\n }\n setUrl(currentUrl)\n }, [currentUrl, draftFile])\n\n React.useEffect(() => () => {\n if (draftUrlRef.current) URL.revokeObjectURL(draftUrlRef.current)\n }, [])\n\n const acceptsDraft = !canEdit && Boolean(image.draftField && onDraftFile)\n const editable = (canEdit && Boolean(image.upload)) || acceptsDraft\n const pick = () => { if (editable && !busy) inputRef.current?.click() }\n\n const onFile = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n e.target.value = ''\n if (!file) return\n\n // A create form has no record id yet. Keep the File outside the persisted\n // payload and show its local object URL immediately; the owning form will\n // upload it after creating the record.\n if (acceptsDraft && onDraftFile) {\n if (draftUrlRef.current) URL.revokeObjectURL(draftUrlRef.current)\n draftUrlRef.current = URL.createObjectURL(file)\n setUrl(draftUrlRef.current)\n setError(null)\n onDraftFile(file)\n return\n }\n\n if (!image.upload) return\n setBusy(true)\n setError(null)\n try {\n setUrl(await image.upload(file, row))\n } catch (err: unknown) {\n setError(errorMessage(err))\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <div className=\"shrink-0\">\n <div\n onClick={pick}\n role={editable ? 'button' : undefined}\n tabIndex={editable ? 0 : undefined}\n onKeyDown={(e) => { if (editable && (e.key === 'Enter' || e.key === ' ')) { e.preventDefault(); pick() } }}\n title={editable ? t('crud.form.changeImage') : undefined}\n className={`relative flex h-20 w-20 items-center justify-center overflow-hidden rounded-lg border-2 text-muted-foreground transition-colors ${\n url ? 'border-solid border-border' : 'border-dashed border-muted'\n } ${editable ? 'cursor-pointer hover:border-primary/30 hover:text-primary/50' : ''}`}\n >\n {url\n ? <img src={url} alt=\"\" className=\"h-full w-full object-cover\" />\n : <ImagePlus className=\"h-5 w-5\" />}\n {busy && (\n <span className=\"absolute inset-0 flex items-center justify-center bg-background/70 text-[10px]\">\n ...\n </span>\n )}\n </div>\n {editable && (\n <input\n ref={inputRef}\n type=\"file\"\n accept={image.accept ?? 'image/*'}\n className=\"hidden\"\n onChange={onFile}\n />\n )}\n {!canEdit && !acceptsDraft && (\n <p className=\"mt-1 w-20 text-[10px] leading-tight text-muted-foreground\">\n {t('crud.form.imageAfterSave')}\n </p>\n )}\n {error && <p className=\"mt-1 w-20 text-[10px] leading-tight text-destructive\">{error}</p>}\n </div>\n )\n}\n\nfunction FormGroup({\n group,\n fields,\n values,\n onChange,\n image,\n canEditImage,\n invalidKeys,\n}: {\n group: FieldGroup\n fields: FieldDef[]\n values: Record<string, any>\n onChange: (key: string, val: any) => void\n image?: EntityImageConfig\n canEditImage?: boolean\n invalidKeys?: ReadonlySet<string>\n}) {\n const t = useTranslation()\n const cols = group.columns ?? 2\n const visibleFields = fields.filter((field) => !field.visibleWhen || field.visibleWhen(values))\n // Grupo sem nenhum campo aplicável não se desenha. Ele nasce inteiro do\n // `visibleWhen` dos filhos: numa conta bancária o grupo «Cartão» não tem um\n // único campo que valha, e o que sobrava era um título com um cartão vazio\n // embaixo — a tela prometendo uma seção que não existe.\n if (visibleFields.length === 0) return null\n // Conditional fields should not leave empty columns behind. A pricing card\n // with only cost, for example, uses the whole row instead of reserving two\n // invisible thirds for sale price and margin.\n const visibleCols = Math.min(cols, Math.max(visibleFields.length, 1))\n\n // Um grupo cujo ÚNICO campo é uma linha anexa (endereço, conta bancária) não\n // desenha o próprio cabeçalho: o campo desenha, porque é ele que tem o botão\n // «+ Adicionar» — e a ação de uma seção mora na linha do título dela, não\n // dentro do cartão. O título e a descrição descem pelo contexto.\n if (visibleFields.length === 1 && isAttachedFieldType(visibleFields[0].type)) {\n const field = visibleFields[0]\n return (\n <AttachedSectionProvider value={{ title: group.label, description: group.description }}>\n <FormFieldItem\n field={field}\n value={values[field.key]}\n onChange={(val) => onChange(field.key, val)}\n allValues={values}\n invalid={invalidKeys?.has(field.key)}\n />\n </AttachedSectionProvider>\n )\n }\n\n // O INTERRUPTOR vai para a linha do título, à direita — não para uma linha\n // sua. Num rail estreito ele gastava uma faixa inteira para dizer uma\n // palavra, e ficava numa altura diferente em cada cadastro (depende de\n // quantos campos vieram antes). No canto do título ele tem lugar FIXO: quem\n // procura «Ativo» olha sempre para o mesmo ponto.\n const toggleField = group.column === 'side'\n ? visibleFields.find((f) => f.type === 'boolean' && f.inlineToggle)\n : undefined\n const bodyFields = toggleField ? visibleFields.filter((f) => f !== toggleField) : visibleFields\n const bodyCols = Math.min(cols, Math.max(bodyFields.length, 1))\n\n const grid = (\n <div className={`fz-fields ${bodyCols >= 3 ? 'fz-fields-3' : bodyCols >= 2 ? 'fz-fields-2' : ''}`}>\n {bodyFields.map((field) => (\n <FormFieldItem\n key={field.key}\n field={field}\n value={values[field.key]}\n onChange={(val) => onChange(field.key, val)}\n allValues={values}\n invalid={invalidKeys?.has(field.key)}\n />\n ))}\n </div>\n )\n\n return (\n <div>\n {/* Título vazio é deliberado: numa aba cujo nome É o do grupo, o h3\n repetiria a palavra que a pessoa acabou de clicar. Um assunto, um\n título. A linha só desaparece quando também não há interruptor. */}\n <div className={`flex items-center justify-between gap-3 ${!group.label && !toggleField ? 'hidden' : ''}`}>\n {group.label && <h3 className=\"text-sm font-semibold text-foreground\">{group.label}</h3>}\n {toggleField && (\n <FormFieldItem\n field={toggleField}\n value={values[toggleField.key]}\n onChange={(val) => onChange(toggleField.key, val)}\n allValues={values}\n />\n )}\n </div>\n {group.description && (\n <p className=\"text-xs text-muted-foreground mt-0.5 mb-3\">{group.description}</p>\n )}\n <Card>\n <CardContent className=\"pt-4\">\n {group.imageSlot ? (\n // Photo as a strip above the fields: beside them it took a whole\n // column and pushed every field into one long single column.\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-3\">\n {image\n ? (\n <ImageSlot\n image={image}\n row={values}\n canEdit={Boolean(canEditImage)}\n onDraftFile={image.draftField ? (file) => onChange(image.draftField!, file) : undefined}\n />\n )\n : (\n // No entity image config: keep the old decorative square.\n <div className=\"shrink-0\">\n <div className=\"flex h-20 w-20 items-center justify-center rounded-lg border-2 border-dashed border-muted text-muted-foreground\">\n <ImagePlus className=\"h-5 w-5\" />\n </div>\n </div>\n )}\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-foreground\">{t('crud.form.imageLabel')}</p>\n <p className=\"text-xs text-muted-foreground\">{t('crud.form.imageHint')}</p>\n </div>\n </div>\n <div className=\"fz-container\">{grid}</div>\n </div>\n ) : (\n grid\n )}\n </CardContent>\n </Card>\n </div>\n )\n}\n\nexport function CrudFormPage(props: CrudFormPageProps) {\n // O canal das linhas que esperam o dono vive FORA do formulário, para que o\n // provider já exista quando as seções montarem.\n const { provider, flush } = usePendingChildren()\n return (\n <PendingChildrenProvider value={provider}>\n <CrudFormPageBody {...props} flushPending={flush} />\n </PendingChildrenProvider>\n )\n}\n\nfunction CrudFormPageBody({ entityDef, mode, initialData, onSubmit, onSaved, onCancel, namePlural, embedded, hideBreadcrumb, onRecordTab, formId, hideActions, essentialFirst, highlightMissing, noForm, submitRef, flushPending }: CrudFormPageProps & { flushPending: (parentId: string) => Promise<void> }) {\n const t = useTranslation()\n const createOnlyGroupIds = new Set((entityDef.fieldGroups ?? []).filter((g) => g.createOnly).map((g) => g.id))\n const formFields = entityDef.fields.filter(\n (f) => f.showInForm !== false && (mode === 'create' || !f.group || !createOnlyGroupIds.has(f.group)),\n )\n const displayField = entityDef.displayField ?? entityDef.fields[0]?.key ?? 'id'\n const [showAllFields, setShowAllFields] = useState(false)\n // Vale nos DOIS modos: um cadastro aberto por um campo de busca já sabe o\n // nome que ninguém achou, e jogá-lo fora obrigava a digitar de novo.\n const computeInit = () => ({ ...getDefaultValues(formFields), ...(initialData ?? {}) })\n const [values, setValues] = useState<Record<string, any>>(computeInit)\n const [saving, setSaving] = useState(false)\n // Which required fields were empty at the last attempted save.\n const [invalidKeys, setInvalidKeys] = useState<ReadonlySet<string>>(EMPTY_KEYS)\n const initialRef = React.useRef<string>(JSON.stringify(values))\n\n useEffect(() => {\n const init = computeInit()\n setValues(init)\n initialRef.current = JSON.stringify(init)\n if (highlightMissing) setInvalidKeys(new Set(missingRequiredFields(formFields, init).map((f) => f.key)))\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [mode, initialData])\n\n const computedKeys = new Set(formFields.filter((f) => f.type === 'computed').map((f) => f.key))\n\n // Plan quantity guard for CREATE. Hook is called unconditionally (rules of\n // hooks) with a safe empty key when the entity declares none; the guard then\n // resolves to 'ok'. Degrades to allow-all outside <AccessProvider>.\n const limitKey = entityDef.limitKey\n const guardLimit = useLimitGuard(limitKey ?? '')\n\n const submit = async () => {\n // ALWAYS, not only when `noForm` — which is the whole fix.\n //\n // This was gated on `noForm`, on the assumption that a real <form> gets the\n // browser's native `required` validation for free. It does not: the\n // SaveBar's button lives OUTSIDE the form element and calls `submit()`\n // directly, so the browser never runs constraint validation and this check\n // never ran on the screens people actually use.\n //\n // What the merchant saw instead was the database's own words —\n // `null value in column \"name\" of relation \"plg_shop_shipping_zones\"\n // violates not-null constraint` — for a field the form had already marked\n // with an asterisk. Native validation is a bonus where it fires; it must\n // not be the only guard.\n const missing = missingRequiredFields(formFields, values)\n if (missing.length > 0) {\n // Every one, not just the first: discovering required fields one save at\n // a time is the same form filled three times.\n toast.error(\n missing.length === 1\n ? t('crud.form.requiredField', { field: missing[0].label })\n : t('crud.form.requiredFields', { fields: missing.map((f) => f.label).join(', ') }),\n )\n setInvalidKeys(new Set(missing.map((f) => f.key)))\n // Put the first one on screen. A toast naming a field the merchant has\n // scrolled past is a message about a problem they cannot see.\n focusField(missing[0].key)\n return\n }\n setInvalidKeys(EMPTY_KEYS)\n setSaving(true)\n try {\n // Client-side plan cap: block the save (the guard opens the UpgradeModal)\n // before touching the store. Only CREATE consumes a new slot. Inside the\n // try because it hits the network — a rejection out here escaped\n // unhandled, which reads as a dead button.\n if (mode === 'create' && limitKey && (await guardLimit(1)) === 'blocked') return\n // Sanitize: convert empty strings to null so the DB doesn't choke on e.g. empty date fields.\n // Computed fields are read-only and never persisted.\n const sanitized: Record<string, any> = {}\n for (const [key, val] of Object.entries(values)) {\n if (computedKeys.has(key)) continue\n // `customFields` é a SACOLA, e ela é do provider. Ela chega aqui de\n // carona: `values` nasce da linha inteira, e ao EDITAR a linha traz o\n // jsonb junto. Devolvê-lo fazia o portão de custom_fields validar cada\n // chave da sacola como se a tela a estivesse escrevendo — e recusar o\n // salvamento inteiro com «field \"gender\" is not declared by this\n // entity», num campo que o cadastro declara e grava sozinho.\n //\n // Os campos custom que ESTA tela edita viajam planos (`gender`,\n // `mobile`), como o provider os espera. Mesma razão pela qual\n // `splitFields` já descarta id, createdAt e tenantId: são do sistema.\n if (key === 'customFields' && !formFields.some((f) => f.key === key)) continue\n // Campo ESCONDIDO não se grava. `visibleWhen` diz «isto não se aplica\n // a este registro», e mandar o valor assim mesmo é gravar a resposta de\n // uma pergunta que a tela não fez — com `defaultValue`, sem ninguém ter\n // digitado nada. Foi como um cartão tentou gravar saldo inicial numa\n // coluna que a tabela não tem, e o cadastro inteiro morreu no insert.\n //\n // Escondido também não APAGA o que já está lá: trocar o tipo por engano\n // e voltar devolve a agência que estava gravada. Quem quer limpar,\n // limpa com o campo à vista.\n const def = formFields.find((f) => f.key === key)\n if (def?.visibleWhen && !def.visibleWhen(values)) continue\n sanitized[key] = val === '' ? null : val\n }\n const criado = await onSubmit(sanitized)\n // AS LINHAS QUE ESPERARAM O DONO. Na criação a seção de filhos não tem\n // contra quem gravar, então ela acumula; aqui o pai já existe e elas\n // descem. Falhar aqui não desfaz o pai — ele está gravado e a tela avisa.\n const novoId = (criado as { id?: string } | null | undefined)?.id\n if (mode === 'create' && novoId) {\n try {\n await flushPending(novoId)\n // O PAI MUDOU por causa dos filhos: o preço de um pacote é a soma das\n // linhas, e elas só desceram agora. Sem invalidar, a ficha que abre a\n // seguir mostra o registro como ele era um instante antes delas.\n if (entityDef.data?.table) emitDataChanged({ table: entityDef.data.table })\n } catch (err) {\n toast.error(t('crud.form.failedToSave', { entity: entityDef.name.toLowerCase() }), {\n description: humanizeWriteError(err),\n })\n }\n }\n // Refresh the live count so gates/banners reflect the new row immediately.\n if (mode === 'create' && limitKey) invalidateLimit(limitKey)\n onSaved?.(criado ?? null)\n } catch (err: unknown) {\n // \"duplicate key value violates unique constraint persons_tenant_customer_phone\"\n // era o que o lojista lia. O banco continua dizendo isso; a tela não.\n toast.error(t('crud.form.failedToSave', { entity: entityDef.name.toLowerCase() }), {\n description: humanizeWriteError(err),\n })\n } finally {\n setSaving(false)\n }\n }\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault()\n // Enter inside a wizard step means \"next\", not \"save what I have so far\".\n if (wizard && !onLastStep) { goNext(); return }\n void submit()\n }\n\n // Published while mounted so a `noForm` host can drive the save.\n if (submitRef) submitRef.current = () => { void submit() }\n React.useEffect(() => () => { if (submitRef) submitRef.current = null }, [submitRef])\n\n const dirty = JSON.stringify(values) !== initialRef.current\n\n // Discard reverts the form to its pristine state and stays on the page (the\n // SaveBar then hides). Leaving the page is a separate action — the breadcrumb\n // link, or pressing Escape again once there's nothing left to discard.\n const discard = () => { setValues(computeInit()) }\n\n\n const handleChange = (key: string, val: any) => {\n setValues((prev) => ({ ...prev, [key]: val }))\n // Clear the mark the moment the field is answered. A form that keeps\n // shouting after you have fixed it teaches people to ignore the shouting.\n setInvalidKeys((prev) => {\n if (!prev.has(key) || isEmptyValue(val)) return prev\n const next = new Set(prev)\n next.delete(key)\n return next\n })\n }\n\n const title = mode === 'create' ? t('crud.form.addTitle', { entity: entityDef.name }) : t('crud.form.editTitle', { entity: entityDef.name })\n const breadcrumbLabel = mode === 'create'\n ? t('crud.form.newBreadcrumb', { entity: entityDef.name })\n : (values[displayField] || initialData?.[displayField] || t('common.edit'))\n\n // Organize fields by groups\n const groups = (entityDef.fieldGroups ?? []).filter((g) => mode === 'create' || !g.createOnly)\n const groupFieldMap = new Map<string, FieldDef[]>()\n const ungroupedFields: FieldDef[] = []\n\n for (const field of formFields) {\n if (field.group) {\n const existing = groupFieldMap.get(field.group) ?? []\n existing.push(field)\n groupFieldMap.set(field.group, existing)\n } else {\n ungroupedFields.push(field)\n }\n }\n\n // Um cadastro sem grupos declarados caía numa coluna só: Contas abria os seus\n // dezessete campos um por linha, com metade da ficha em branco. Grupo é sobre\n // SIGNIFICADO («dados bancários»), não sobre largura, e não declarar um não é\n // pedido para desperdiçar a tela. O `visibleWhen` é contado antes porque um\n // formulário que sobrou com um campo não abre meia coluna vazia ao lado.\n const visibleUngrouped = ungroupedFields.filter((f) => !f.visibleWhen || f.visibleWhen(values))\n const ungroupedCols = Math.min(2, Math.max(visibleUngrouped.length, 1))\n\n // O essencial é o que o cadastro EXIGE (mais o campo que dá nome ao registro,\n // quando nada é exigido — um formulário sem nenhum campo não é um formulário).\n // Dobrado, ele ignora grupos e layout de arquétipo de propósito: três campos\n // sob dois títulos de seção são mais moldura que conteúdo.\n const essentialFields = formFields.filter((f) => f.required || f.key === displayField)\n const canCollapseFields = !!essentialFirst && essentialFields.length > 0 && essentialFields.length < formFields.length\n const collapsedToEssential = canCollapseFields && !showAllFields\n\n // Um grupo só EXISTE na tela quando tem ao menos um campo aplicável. É a\n // mesma pergunta que o FormGroup faz antes de devolver `null`, respondida\n // aqui também porque a faixa de abas precisa saber ANTES de desenhar o\n // rótulo: uma aba vazia é uma promessa que o clique não cumpre.\n const groupShows = (group: FieldGroup) => {\n const fields = groupFieldMap.get(group.id)\n if (!fields || fields.length === 0) return false\n return fields.some((f) => !f.visibleWhen || f.visibleWhen(values))\n }\n\n const renderGroup = (group: FieldGroup) => {\n const fields = groupFieldMap.get(group.id)\n if (!fields || fields.length === 0) return null\n // Aba «Insumo» com a seção «Insumo» dentro diz a mesma palavra duas vezes.\n const label = group.labelWhen?.(values) || group.label\n const shown = { ...group, label: group.tab && group.tab === label ? '' : label }\n return (\n <FormGroup\n key={group.id}\n group={shown}\n fields={fields}\n values={values}\n onChange={handleChange}\n image={entityDef.image}\n canEditImage={mode === 'edit'}\n invalidKeys={invalidKeys}\n />\n )\n }\n\n // An archetype layout owns its own internal shape (name block, contact block,\n // addresses…), so the side rail is carved out ONE LEVEL UP instead: the side\n // groups and their fields are withheld from the archetype, which renders in\n // the main column, and they are rendered beside it. One change, and every\n // archetype layout gains the two-column form.\n const sideGroups = entityDef.formColumns === 2 && !embedded\n ? groups.filter((g) => g.column === 'side')\n : []\n const sideGroupIds = new Set(sideGroups.map((g) => g.id))\n const archetypeFields = sideGroupIds.size\n ? formFields.filter((f) => !f.group || !sideGroupIds.has(f.group))\n : formFields\n\n // ---------------------------------------------------------------------------\n // Abas do formulário. Só existem quando ALGUM grupo declara `tab` — sem isso\n // o formulário continua a coluna única de sempre, que é o certo para a\n // esmagadora maioria dos cadastros. O produto é a exceção que as pediu: dez\n // assuntos numa rolagem só fazem quem veio trocar o preço percorrer noventa\n // campos.\n // ---------------------------------------------------------------------------\n const FIRST_TAB = t('crud.form.generalTab')\n const tabbed = groups.some((g) => g.tab)\n const tabNames: string[] = []\n if (tabbed) {\n for (const g of groups) {\n if (sideGroupIds.has(g.id)) continue\n const name = g.tab ?? FIRST_TAB\n if (groupShows(g) && !tabNames.includes(name)) tabNames.push(name)\n }\n // Os campos sem grupo moram na primeira aba, junto com o resto do começo.\n if (visibleUngrouped.length > 0 && !tabNames.includes(FIRST_TAB)) tabNames.unshift(FIRST_TAB)\n }\n const [activeTab, setActiveTab] = useState<string>('')\n // A aba escolhida pode DEIXAR de existir — desligar «Patrimônio» apaga a aba\n // em que a pessoa estava. Cair na primeira é melhor que ficar numa aba que o\n // formulário não desenha mais, que é uma tela em branco sem explicação.\n const currentTab = tabbed\n ? (tabNames.includes(activeTab) ? activeTab : (tabNames[0] ?? FIRST_TAB))\n : ''\n\n // Campo inválido numa aba fechada não pode travar o salvamento em silêncio:\n // o aviso aparece, o botão não grava e a pessoa não vê campo vermelho nenhum.\n useEffect(() => {\n if (!tabbed || invalidKeys.size === 0) return\n const home = (f: FieldDef) =>\n (groups.find((g) => g.id === f.group)?.tab) ?? FIRST_TAB\n const offending = formFields.find((f) => invalidKeys.has(f.key))\n if (offending) {\n const target = home(offending)\n if (tabNames.includes(target) && target !== currentTab) setActiveTab(target)\n }\n }, [invalidKeys])\n\n // ---------------------------------------------------------------------------\n // Create as a wizard: one step per `step ?? tab`, each validated before the\n // next. Steps come and go with `visibleWhen`, so the current one is tracked\n // by name, not index.\n // ---------------------------------------------------------------------------\n const stepOf = (g: FieldGroup) => g.step ?? g.tab ?? FIRST_TAB\n const stepNames: string[] = []\n if (visibleUngrouped.length > 0) stepNames.push(FIRST_TAB)\n for (const g of groups) {\n if (groupShows(g) && !stepNames.includes(stepOf(g))) stepNames.push(stepOf(g))\n }\n // Archetype layouts draw their own shape; a tabbed location already takes the generic path.\n const wizard = mode === 'create' && !embedded && !essentialFirst\n && (!entityDef.layout || (entityDef.layout === 'location' && tabbed))\n && stepNames.length >= 2 && (entityDef.createFlow ?? 'wizard') === 'wizard'\n const [stepName, setStepName] = useState('')\n const stepTopRef = React.useRef<HTMLDivElement>(null)\n const currentStep = stepNames.includes(stepName) ? stepName : (stepNames[0] ?? FIRST_TAB)\n const stepIndex = stepNames.indexOf(currentStep)\n const onLastStep = stepIndex === stepNames.length - 1\n const stepOfField = (f: FieldDef) => {\n const g = groups.find((x) => x.id === f.group)\n return g ? stepOf(g) : FIRST_TAB\n }\n const goToStep = (name: string) => {\n setStepName(name)\n // The shell scrolls an inner pane, not the window.\n stepTopRef.current?.scrollIntoView({ block: 'start', behavior: 'smooth' })\n }\n const goNext = () => {\n const missing = missingRequiredFields(formFields.filter((f) => stepOfField(f) === currentStep), values)\n if (missing.length > 0) {\n toast.error(\n missing.length === 1\n ? t('crud.form.requiredField', { field: missing[0].label })\n : t('crud.form.requiredFields', { fields: missing.map((f) => f.label).join(', ') }),\n )\n setInvalidKeys(new Set(missing.map((f) => f.key)))\n focusField(missing[0].key)\n return\n }\n for (const g of groups) {\n if (stepOf(g) !== currentStep || !groupShows(g)) continue\n const problem = g.validate?.(values)\n if (problem) { toast.error(problem); return }\n }\n const next = stepNames[stepIndex + 1]\n if (next) goToStep(next)\n }\n // A final save that finds a hole in an earlier step takes the reader there.\n useEffect(() => {\n if (!wizard || invalidKeys.size === 0) return\n const offending = formFields.find((f) => invalidKeys.has(f.key))\n if (offending && stepOfField(offending) !== currentStep) setStepName(stepOfField(offending))\n }, [invalidKeys])\n\n // Full-page CRUD forms surface Save/Discard via the app-wide floating SaveBar.\n // Embedded forms (rendered inside other widgets) keep their inline buttons.\n useSaveBar({\n // The wizard carries its own Back/Next/Save row; a floating \"save\" over\n // step 1 would create the record before the later steps were seen.\n dirty: !embedded && !wizard && dirty,\n saving,\n onSave: () => { void submit() },\n onDiscard: discard,\n saveLabel: mode === 'create' ? t('crud.form.addTitle', { entity: entityDef.name }) : t('crud.form.saveChanges'),\n })\n\n // Register \"leave to parent\" with the app-wide Escape key. While the form is\n // dirty the SaveBar owns Escape (→ discard); once pristine, Escape navigates\n // back — giving the two-step \"discard, then leave\" flow for free.\n useBackHandler(embedded ? undefined : onCancel)\n\n const groupsOfTab = (name: string) =>\n groups.filter((g) => !sideGroupIds.has(g.id) && (g.tab ?? FIRST_TAB) === name)\n\n // The record's own tab strip, in edit mode. The tabs that are field groups\n // switch the form's section; the rest belong to the record page.\n const recordItem = React.useMemo(() => ({ ...(initialData ?? {}), ...values }), [initialData, values])\n const record = useRecordTabs(entityDef, mode === 'edit' ? recordItem : null)\n const showRecordTabs = !embedded && mode === 'edit' && Boolean(onRecordTab) && Boolean(initialData?.id)\n // Archetype layouts draw one scroll and ignore `FieldGroup.tab`.\n const formHoldsTabs = tabbed && tabNames.length > 1 && (!entityDef.layout || entityDef.layout === 'location')\n const FORM_TAB = 'form:'\n const stripTabs: RecordTabItem[] = []\n if (showRecordTabs) {\n const sections = formHoldsTabs ? tabNames.filter((name) => name !== FIRST_TAB) : []\n const placed = new Set<string>()\n let afterSections = 0\n for (const tab of record.customTabs) {\n if (tab.id.startsWith('fields:')) {\n if (!sections.includes(tab.label)) continue\n stripTabs.push({ id: FORM_TAB + tab.label, label: tab.label, icon: tab.icon })\n placed.add(tab.label)\n afterSections = stripTabs.length\n } else {\n stripTabs.push({ id: tab.id, label: tab.label, icon: tab.icon, count: record.tabCounts[tab.id] })\n }\n }\n // A section the read page hides (nothing filled in yet) still has to be\n // reachable here, or its fields could never be filled.\n const missing = sections.filter((name) => !placed.has(name)).map((name) => ({ id: FORM_TAB + name, label: name }))\n stripTabs.splice(afterSections, 0, ...missing)\n }\n const stripValue = formHoldsTabs && currentTab !== FIRST_TAB ? FORM_TAB + currentTab : 'overview'\n const onStripChange = (id: string) => {\n if (id === 'overview') setActiveTab(FIRST_TAB)\n else if (id.startsWith(FORM_TAB)) setActiveTab(id.slice(FORM_TAB.length))\n else onRecordTab?.(id)\n }\n\n const archetypeLayoutProps = {\n fields: archetypeFields,\n allFields: entityDef.fields,\n fieldGroups: groups.filter((g) => !sideGroupIds.has(g.id)),\n values,\n onChange: handleChange,\n renderField,\n entityIcon: entityDef.icon,\n compact: embedded,\n }\n\n const withSideRail = (main: React.ReactNode) => {\n if (sideGroups.length === 0) return main\n return (\n <div className=\"fz-split\">\n <div className=\"fz-container space-y-5\">{main}</div>\n <div className=\"fz-container space-y-5\">{sideGroups.map(renderGroup)}</div>\n </div>\n )\n }\n\n const wizardNav = (\n <div className=\"flex items-center justify-between gap-2 border-t border-border pt-4\">\n {stepIndex > 0 ? (\n <Button type=\"button\" variant=\"outline\" onClick={() => goToStep(stepNames[stepIndex - 1])} disabled={saving}>\n <ChevronLeft className=\"mr-1 h-4 w-4\" />\n {t('crud.form.wizardBack')}\n </Button>\n ) : <span />}\n {onLastStep ? (\n <Button type=\"button\" onClick={() => { void submit() }} disabled={saving}>\n {saving && <Loader2 className=\"mr-1.5 h-4 w-4 animate-spin\" />}\n {saving ? t('common.saving') : t('crud.form.addTitle', { entity: entityDef.name })}\n </Button>\n ) : (\n <Button type=\"button\" onClick={goNext}>\n {t('crud.form.wizardNext')}\n <ChevronRight className=\"ml-1 h-4 w-4\" />\n </Button>\n )}\n </div>\n )\n\n function renderFormBody(layout?: FormLayout) {\n // The location layout predates tabs and field groups: an entity that\n // declares tabbed groups (the company form, ported from V1) takes the\n // generic path, which draws tabs, groups and the in-form address.\n if (layout === 'location' && tabbed) layout = undefined\n switch (layout) {\n case 'person':\n // `recordId` só na edição: a seção de endereços grava direto em\n // `public.addresses`, e na criação ainda não existe dono.\n return withSideRail(\n <PersonFormLayout\n {...archetypeLayoutProps}\n recordId={mode === 'edit' ? (initialData?.id as string | undefined) : undefined}\n />,\n )\n case 'product':\n return withSideRail(<ProductFormLayout {...archetypeLayoutProps} />)\n case 'service':\n return withSideRail(<ServiceFormLayout {...archetypeLayoutProps} />)\n case 'location':\n return withSideRail(\n <LocationFormLayout\n {...archetypeLayoutProps}\n recordId={mode === 'edit' ? (initialData?.id as string | undefined) : undefined}\n />,\n )\n case 'subject':\n return withSideRail(<SubjectFormLayout {...archetypeLayoutProps} />)\n default:\n // Generic layout — ungrouped + grouped fields, main column only; the\n // side groups are appended by withSideRail (same path the archetypes\n // take, so there is one implementation of the split).\n const ungroupedCard = visibleUngrouped.length > 0 ? (\n <Card>\n <CardContent className=\"pt-5\">\n <div className={`fz-fields gap-4 ${ungroupedCols >= 2 ? 'fz-fields-2' : ''}`}>\n {visibleUngrouped.map((field) => (\n <FormFieldItem\n key={field.key}\n field={field}\n value={values[field.key]}\n onChange={(val) => handleChange(field.key, val)}\n allValues={values}\n invalid={invalidKeys.has(field.key)}\n />\n ))}\n </div>\n </CardContent>\n </Card>\n ) : null\n\n if (wizard) {\n const stepIcon = (name: string) => groups.find((g) => stepOf(g) === name && g.tabIcon)?.tabIcon\n return (\n <div ref={stepTopRef} className=\"scroll-mt-4 md:flex md:items-start md:gap-6\">\n {/* A plain list beside the fields, open in any order; the final\n save still checks every step. */}\n <nav aria-label={entityDef.name} className=\"hidden w-44 shrink-0 space-y-0.5 md:sticky md:top-4 md:block\">\n {stepNames.map((name) => {\n const Icon = ICON_MAP[stepIcon(name) ?? ''] ?? null\n const active = name === currentStep\n return (\n <Button variant=\"bare\" size=\"bare\"\n key={name}\n type=\"button\"\n onClick={() => goToStep(name)}\n aria-current={active ? 'step' : undefined}\n className={`font-normal whitespace-normal justify-start flex w-full items-center gap-2 rounded-md px-2.5 py-1.5 text-left text-sm transition-colors ${\n active ? 'bg-primary/10 font-medium text-primary' : 'text-muted-foreground hover:bg-muted hover:text-foreground'\n }`}\n >\n {Icon && <Icon className=\"h-4 w-4 shrink-0\" />}\n <span className=\"truncate\">{name}</span>\n </Button>\n )\n })}\n </nav>\n <div className=\"min-w-0 flex-1 space-y-5\">\n <ViewTabs\n value={currentStep}\n onChange={goToStep}\n options={stepNames.map((name) => ({ value: name, label: name }))}\n aria-label={entityDef.name}\n className=\"overflow-x-auto md:hidden\"\n />\n {currentStep === FIRST_TAB && ungroupedCard}\n {groups.filter((g) => stepOf(g) === currentStep).map(renderGroup)}\n {wizardNav}\n </div>\n </div>\n )\n }\n\n // Com abas, a tela mostra UM assunto de cada vez. Os campos sem grupo\n // ficam na primeira, que é onde o cadastro começa.\n if (tabbed && tabNames.length > 1) {\n return withSideRail(\n <div className=\"space-y-5\">\n {!showRecordTabs && (\n <ViewTabs\n value={currentTab}\n onChange={setActiveTab}\n options={tabNames.map((name) => ({ value: name, label: name }))}\n aria-label={entityDef.name}\n className=\"flex-wrap border-b border-border pb-2\"\n />\n )}\n {currentTab === FIRST_TAB && ungroupedCard}\n {groupsOfTab(currentTab).map(renderGroup)}\n </div>,\n )\n }\n\n return withSideRail(\n <div className=\"space-y-5\">\n {ungroupedCard}\n {groups.filter((g) => !sideGroupIds.has(g.id)).map(renderGroup)}\n </div>,\n )\n }\n }\n\n // O cabeçalho vai para a barra da shell, não para cima do formulário: o\n // título da barra e o do formulário eram a mesma palavra, uma linha acima da\n // outra, custando uma faixa inteira da tela.\n // O pai é de onde o formulário foi ABERTO, não o nome do cadastro. Quando a\n // lista mora dentro de outra tela — Embalagens é uma seção de Entrega, não\n // uma página — \"← Embalagens\" mandava o lojista de volta para um lugar que\n // não existe sozinho. A trilha sabe disso; `namePlural` só responde fora dela.\n const trailParent = usePageTrailParent()\n // The arrow goes where the label says. It read \"← Entrega\" and landed on the\n // record's own detail page — the one screen the reader had just left — so a\n // form opened straight from a settings tab took three clicks to get back to\n // it. `onCancel` still owns Cancel, which is a different act.\n // Where \"Editar\" sits on the record page, so leaving edit mode is the same\n // reach as entering it. The save bar only exists once something changed.\n const cancelAction = (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={onCancel} disabled={saving}>{t('common.cancel')}</Button>\n )\n const headerBack = trailParent ? () => navigateToCrumb(trailParent) : onCancel\n const header = (embedded || hideBreadcrumb) ? null : mode === 'edit' ? (\n <RecordHeader\n entityDef={entityDef}\n item={recordItem}\n title={String(breadcrumbLabel)}\n parentLabel={trailParent?.label ?? namePlural}\n onBack={headerBack}\n actions={cancelAction}\n />\n ) : (\n <SubpageHeader\n title={breadcrumbLabel}\n parentLabel={trailParent?.label ?? namePlural}\n onBack={headerBack}\n actions={cancelAction}\n />\n )\n\n // A <form> inside another <form> cannot be submitted — see `noForm`.\n const FieldsTag = (noForm ? 'div' : 'form') as 'div'\n\n return (\n <SetFieldValueContext.Provider value={handleChange}>\n <div className={`w-full flex flex-col items-center ${embedded ? 'text-sm' : 'pb-28'}`}>\n {/* A two-column form needs room for both: max-w-3xl would squeeze the\n side rail to a sliver and wrap every label in it. */}\n {/* `pb-24`: a barra «Alterações não salvas» é `fixed` no rodapé e passa por\n cima do FIM do formulário. A última seção ficava debaixo dela — e o\n clique em «+ Adicionar conta bancária» caía no botão de salvar, que é\n o pior jeito de um controle falhar: ele faz outra coisa, e funciona.\n O espaço é reservado sempre, e não só quando a barra aparece: surgir\n ao primeiro caractere digitado empurraria a tela debaixo do cursor. */}\n {header && <div className=\"w-full\">{header}</div>}\n {/* Full width and above the form's own column: the strip has to land\n where the record page puts it, and that page is not centred. */}\n {showRecordTabs && (\n <Tabs value={stripValue} onValueChange={onStripChange} className=\"mb-4 w-full\">\n <RecordTabStrip tabs={stripTabs} />\n </Tabs>\n )}\n <div className={`fz-container w-full pb-24 ${embedded ? 'space-y-3' : wizard ? 'max-w-5xl space-y-5' : entityDef.formColumns === 2 ? 'max-w-6xl space-y-5' : 'max-w-3xl space-y-5'}`}>\n {/* Form */}\n <FieldsTag\n {...(noForm ? {} : { id: formId, onSubmit: handleSubmit })}\n className={embedded ? 'space-y-3' : 'space-y-5'}\n >\n {collapsedToEssential ? (\n <div className=\"fz-fields fz-fields-2 gap-4\">\n {essentialFields.map((field) => (\n <FormFieldItem\n key={field.key}\n field={field}\n value={values[field.key]}\n onChange={(val) => handleChange(field.key, val)}\n allValues={values}\n invalid={invalidKeys.has(field.key)}\n />\n ))}\n </div>\n ) : renderFormBody(entityDef.layout)}\n\n {/* As seções de filhos, em modo de edição. Gravam sozinhas (linhas de\n outra tabela, não campos deste formulário), então só aparecem\n quando já existe um dono contra o qual gravar — na criação não há\n id. Mesma regra que os endereços do cliente seguem. */}\n {/* NA CRIAÇÃO TAMBÉM. A seção gravava direto e por isso só existia na\n edição; montar um pacote, porém, é dizer o que entra nele — salvar\n vazio, reabrir e só então listar os serviços é o trabalho em duas\n voltas, e a primeira grava um preço que ainda não é o preço. Sem\n dono, a grade acumula e o `flushPending` acima as desce. */}\n {(mode === 'edit' ? Boolean(initialData?.id) : !wizard || onLastStep) && (entityDef.relatedSections ?? []).map((related) => (\n <RelatedSection\n key={related.id ?? related.entity.name}\n parentId={mode === 'edit' ? (initialData?.id as string) : ''}\n related={related}\n compact={embedded}\n />\n ))}\n\n {canCollapseFields && (\n <Button\n variant=\"bare\"\n size=\"bare\"\n type=\"button\"\n onClick={() => setShowAllFields(!showAllFields)}\n className=\"inline-flex items-center gap-1 text-xs text-muted-foreground transition-colors hover:text-foreground font-normal\"\n >\n <ChevronDown className={`h-3 w-3 transition-transform ${showAllFields ? 'rotate-180' : ''}`} />\n {showAllFields ? t('crud.form.showEssentialFields') : t('crud.form.showAllFields')}\n </Button>\n )}\n\n {/* Submit — embedded forms keep inline buttons; full-page forms use the floating SaveBar */}\n {embedded && !hideActions && (\n <div className=\"flex items-center justify-end gap-2 pt-1\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={onCancel} disabled={saving}>{t('common.cancel')}</Button>\n <Button type=\"submit\" size=\"sm\" disabled={saving}>\n {saving && <Loader2 className=\"animate-spin mr-1.5 h-3 w-3\" />}\n {saving ? t('common.saving') : mode === 'create' ? t('crud.form.addTitle', { entity: entityDef.name }) : t('crud.form.saveChanges')}\n </Button>\n </div>\n )}\n </FieldsTag>\n </div>\n </div>\n </SetFieldValueContext.Provider>\n )\n}\n","import { errorMessage } from '@fayz-ai/core'\nimport * as React from 'react'\nimport {\n Button, Modal, ModalPortal, ModalOverlay, ModalContent,\n ModalHeader, ModalBody, ModalFooter, ModalTitle, ModalDescription,\n} from '@fayz-ai/ui'\nimport { CrudFormPage } from './CrudFormPage'\nimport { CrudFormSkeleton } from './CrudSkeletons'\nimport { humanizeWriteError } from './write-errors'\nimport type { EntityDef } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// CrudRecordModal — edit ONE record of any entity, without leaving the screen\n// that needed it edited.\n//\n// A refusal usually names a record somewhere else: the carrier says the sender\n// has no phone, the invoice says the customer has no document, the automation\n// says the channel has no token. Sending the merchant to that registry loses\n// what they were doing; writing a bespoke form for each one loses the entity's\n// own fields, labels, groups and validation the moment either changes.\n//\n// So this renders the SAME CrudFormPage the registry page renders — `embedded`\n// mode exists for exactly this — over whatever is behind it. It knows nothing\n// about which entity: the caller passes the definition and the two IO calls.\n//\n// The same dialog CREATES: a search field that did not find the supplier opens\n// it with the typed text already in the name, showing only what is required\n// (`essentialFirst`) — whoever is mid-invoice did not come to register a\n// supplier. The rest stays one click away, on the same screen.\n// ---------------------------------------------------------------------------\n\nexport interface CrudRecordModalProps {\n open: boolean\n onClose: () => void\n /** The saved record, for a caller that wants to retry what it was doing. */\n onSaved?: (record: Record<string, any>) => void\n entityDef: EntityDef\n /** 'edit' (default) reads via `load`; 'create' opens blank over `initialData`. */\n mode?: 'create' | 'edit'\n /** Reads the record. Null closes the form with the empty state. Edit only. */\n load?: () => Promise<Record<string, any> | null>\n /** What is already known about the new record (the name the search missed). */\n initialData?: Record<string, any>\n /** Writes. Throwing keeps the form open with the message on it. */\n save: (data: Record<string, any>) => Promise<Record<string, any> | void>\n /**\n * The caller's own message above the form — for a refusal that has an ANSWER,\n * not just a text. \"That e-mail already belongs to Ana Souza — use her\n * record\" is a button; as a thrown error it would be a dead end. Render it\n * from a `save` that resolves instead of throwing.\n */\n notice?: React.ReactNode\n /** Defaults to the entity's own name. */\n title?: React.ReactNode\n description?: React.ReactNode\n /** Shown when `load` answers null — there is no record to edit. */\n emptyLabel?: React.ReactNode\n /** Opens showing only required fields, with a link to the rest. */\n essentialFirst?: boolean\n /** Opens with the empty required fields already marked (see CrudFormPage). */\n highlightMissing?: boolean\n}\n\nexport function CrudRecordModal({\n open, onClose, onSaved, entityDef, mode = 'edit', load, initialData, save,\n title, description, emptyLabel, essentialFirst, highlightMissing, notice,\n}: CrudRecordModalProps) {\n const [record, setRecord] = React.useState<Record<string, any> | null>(null)\n const [loading, setLoading] = React.useState(false)\n const [saving, setSaving] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n // The footer's button lives outside the <form>; this is what binds them.\n const formId = React.useId()\n\n // Layout effect: the skeleton must be up before the first paint, or \"not found\" flashes.\n React.useLayoutEffect(() => {\n if (!open) return\n setError(null)\n // Create reads nothing: the record is what the screen does not have yet.\n if (mode === 'create' || !load) {\n setRecord(initialData ?? {})\n setLoading(false)\n return\n }\n let cancelled = false\n setLoading(true)\n load()\n .then((found) => { if (!cancelled) setRecord(found) })\n .catch((err: unknown) => {\n if (!cancelled) setError(errorMessage(err))\n })\n .finally(() => { if (!cancelled) setLoading(false) })\n return () => { cancelled = true }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open])\n\n async function submit(data: Record<string, any>) {\n setSaving(true)\n try {\n const saved = await save(data)\n onSaved?.((saved as Record<string, any>) ?? data)\n } catch (err: unknown) {\n // Kept on the form: a failed save must not close over the typing.\n setError(humanizeWriteError(err))\n throw err\n } finally {\n setSaving(false)\n }\n }\n\n return (\n <Modal open={open} onOpenChange={(next) => { if (!next) onClose() }}>\n <ModalPortal>\n <ModalOverlay>\n {/* A record form is as tall as its entity, which is taller than any\n dialog: without a scroll container the last group spills out of\n the rounded box and the save button lands off screen. */}\n <ModalContent size=\"2xl\" data-testid=\"crud-record-modal\" className=\"flex max-h-[85vh] flex-col\">\n <ModalHeader className=\"mb-4\">\n <ModalTitle>{title ?? (mode === 'create' ? `Novo: ${entityDef.name}` : entityDef.name)}</ModalTitle>\n {description && <ModalDescription>{description}</ModalDescription>}\n </ModalHeader>\n\n <ModalBody className=\"-mx-1 px-1\">\n {loading && <div aria-busy=\"true\" data-testid=\"crud-record-loading\"><CrudFormSkeleton /></div>}\n\n {!loading && !record && (\n <p className=\"text-sm text-muted-foreground\">\n {emptyLabel ?? 'Não encontramos esse registro.'}\n </p>\n )}\n\n {error && (\n <p role=\"alert\" className=\"mb-3 rounded-md border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-800\">\n {error}\n </p>\n )}\n\n {notice && <div className=\"mb-3\">{notice}</div>}\n\n {!loading && record && (\n <CrudFormPage\n embedded\n hideActions\n essentialFirst={essentialFirst}\n highlightMissing={highlightMissing}\n formId={formId}\n entityDef={entityDef}\n mode={mode}\n initialData={record}\n namePlural={entityDef.namePlural ?? entityDef.name}\n onSubmit={submit}\n onCancel={onClose}\n />\n )}\n </ModalBody>\n\n {/* Fixed: a save button you have to scroll to is not a button. */}\n {!loading && record && (\n <ModalFooter className=\"mt-4 gap-2 border-t pt-4\">\n <Button variant=\"outline\" onClick={onClose} disabled={saving}>Cancelar</Button>\n <Button type=\"submit\" form={formId} disabled={saving} data-testid=\"crud-record-save\">\n {saving ? 'Salvando…' : mode === 'create' ? 'Cadastrar' : 'Salvar'}\n </Button>\n </ModalFooter>\n )}\n </ModalContent>\n </ModalOverlay>\n </ModalPortal>\n </Modal>\n )\n}\n"]}
|