@fayz-ai/admin 0.66.0 → 0.67.2

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.
@@ -1,4 +1,4 @@
1
- import { useMyPersonId, fetchMyPersonRecord, CrudDetailPage, findMyPersonCandidate, linkPersonToLogin } from './chunk-BFOH3AVP.js';
1
+ import { useMyPersonId, fetchMyPersonRecord, CrudDetailPage, findMyPersonCandidate, linkPersonToLogin } from './chunk-RLZCH4NU.js';
2
2
  import './chunk-AWM4AMBS.js';
3
3
  import './chunk-6QFOE3UD.js';
4
4
  import './chunk-FK6RHGI7.js';
@@ -420,5 +420,5 @@ function ConnectedUserProfile() {
420
420
  }
421
421
 
422
422
  export { ConnectedUserProfile };
423
- //# sourceMappingURL=ConnectedUserProfile-Z5PWF7EV.js.map
424
- //# sourceMappingURL=ConnectedUserProfile-Z5PWF7EV.js.map
423
+ //# sourceMappingURL=ConnectedUserProfile-2PP755RY.js.map
424
+ //# sourceMappingURL=ConnectedUserProfile-2PP755RY.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/settings/UserProfile.tsx","../src/components/settings/MyWorkspaceCard.tsx","../src/components/settings/MyRecordPanel.tsx","../src/components/settings/ConnectedUserProfile.tsx"],"names":["React","jsxs","jsx","Card","CardHeader","CardTitle","CardDescription","CardContent","Button","useAuthStore","React3","Badge","React4"],"mappings":"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","file":"ConnectedUserProfile-Z5PWF7EV.js","sourcesContent":["import * as React from 'react'\nimport { Camera, Save } from 'lucide-react'\nimport { cn } from '../../lib/cn'\nimport { Button } from '@fayz-ai/ui'\nimport { Input } from '@fayz-ai/ui'\nimport { Avatar, AvatarFallback, AvatarImage } from '@fayz-ai/ui'\nimport { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@fayz-ai/ui'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport type { AuthUser } from '../../types/auth'\n\ninterface UserProfileProps {\n user?: AuthUser | null\n onSave?: (data: { fullName: string }) => void\n onAvatarChange?: (file: File) => void\n}\n\nfunction getInitials(name: string): string {\n return name\n .split(' ')\n .map((part) => part[0])\n .filter(Boolean)\n .slice(0, 2)\n .join('')\n .toUpperCase()\n}\n\nexport function UserProfile({ user, onSave, onAvatarChange }: UserProfileProps) {\n const { t } = useTranslation()\n const [fullName, setFullName] = React.useState(user?.fullName ?? '')\n const [saving, setSaving] = React.useState(false)\n const fileInputRef = React.useRef<HTMLInputElement>(null)\n\n React.useEffect(() => {\n if (user) {\n setFullName(user.fullName)\n }\n }, [user])\n\n const handleAvatarClick = () => {\n fileInputRef.current?.click()\n }\n\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n if (file && onAvatarChange) {\n onAvatarChange(file)\n }\n if (e.target) {\n e.target.value = ''\n }\n }\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n if (!onSave) return\n\n setSaving(true)\n try {\n await onSave({ fullName })\n } finally {\n setSaving(false)\n }\n }\n\n return (\n <form onSubmit={handleSubmit} className=\"space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle className=\"text-lg\">{t('settings.profile.title')}</CardTitle>\n <CardDescription>\n {t('settings.profile.subtitle')}\n </CardDescription>\n </CardHeader>\n\n <CardContent className=\"space-y-6\">\n <div className=\"flex items-center gap-6\">\n <div className=\"relative\">\n <Avatar className=\"h-20 w-20\">\n <AvatarImage src={user?.avatarUrl} alt={user?.fullName} />\n <AvatarFallback className=\"text-lg\">\n {user?.fullName ? getInitials(user.fullName) : '?'}\n </AvatarFallback>\n </Avatar>\n {onAvatarChange && (\n <Button\n variant=\"bare\"\n size=\"bare\"\n type=\"button\"\n onClick={handleAvatarClick}\n className={cn(\n 'absolute -bottom-1 -right-1 flex h-8 w-8 items-center justify-center rounded-full',\n 'border-2 border-background bg-primary text-primary-foreground',\n 'transition-colors hover:bg-primary/90'\n )}\n aria-label=\"Change avatar\"\n >\n <Camera className=\"h-3.5 w-3.5\" />\n </Button>\n )}\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*\"\n className=\"hidden\"\n onChange={handleFileChange}\n />\n </div>\n\n <div className=\"space-y-1\">\n <p className=\"font-medium\">{user?.fullName ?? 'User'}</p>\n <p className=\"text-sm text-muted-foreground\">{user?.email}</p>\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <label htmlFor=\"full-name\" className=\"text-sm font-medium\">\n {t('settings.profile.fullName')}\n </label>\n <Input\n id=\"full-name\"\n value={fullName}\n onChange={(e) => setFullName(e.target.value)}\n placeholder=\"John Doe\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <label htmlFor=\"email\" className=\"text-sm font-medium\">\n {t('settings.profile.email')}\n </label>\n <Input\n id=\"email\"\n type=\"email\"\n value={user?.email ?? ''}\n disabled\n className=\"bg-muted\"\n />\n <p className=\"text-xs text-muted-foreground\">\n {t('settings.profile.emailHelp')}\n </p>\n </div>\n </CardContent>\n\n <CardFooter className=\"justify-end\">\n <Button type=\"submit\" disabled={saving}>\n <Save className=\"mr-2 h-4 w-4\" />\n {saving ? t('common.saving') : t('settings.profile.saveProfile')}\n </Button>\n </CardFooter>\n </Card>\n </form>\n )\n}\n","import * as React from 'react'\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle, Button, Badge } from '@fayz-ai/ui'\nimport { AlertTriangle, Building2, Contact, Layers, Link2 } from 'lucide-react'\nimport { useAuthStore } from '@fayz-ai/auth'\nimport { useOrganizationStore } from '../../org/store'\nimport { useUnitStore } from '../../units/store'\nimport { useUnitBootstrap } from '../../units/useUnitBootstrap'\nimport { usePermissionsStore } from '../../permissions'\nimport { fetchMyPersonRecord, findMyPersonCandidate, linkPersonToLogin, type LinkedPerson } from '../../org/self'\nimport { toast } from '../notifications/ToastProvider'\n\n// ---------------------------------------------------------------------------\n// \"Você aqui\" — o que é verdade sobre você NESTE espaço de trabalho.\n//\n// A tela de perfil sabia nome, e-mail e foto: fatos da sua conta, iguais em\n// qualquer lugar. Não sabia nada do que decide o seu dia — que função você tem,\n// em quais unidades você entra, qual delas você está vendo agora, e se você tem\n// ficha profissional. Era por isso que ela parecia uma tela apartada: ela é o\n// único lugar do sistema que não fala do trabalho.\n//\n// As unidades vêm da store que o seletor já carregou, então isto não custa\n// requisição nenhuma. Quando a gestão por unidades está desligada, a seção\n// inteira desaparece: um fato que não se aplica é ruído, não informação.\n// ---------------------------------------------------------------------------\n\n/** Por que a unidade ativa é a que é. A resolução automática cria a pergunta\n * \"por que abriu na Ipanema?\", e este é o lugar onde ela é respondida. */\nconst REASON_TEXT: Record<string, string> = {\n device: 'foi a última unidade aberta neste computador',\n account: 'foi a última unidade que você abriu, em outro aparelho',\n only: 'é a única que você alcança',\n manual: 'você escolheu',\n nearest: 'foi a mais perto de você',\n all: 'você não estreitou nada',\n}\n\n/**\n * Uma linha rótulo/resposta. O rótulo tem largura fixa para as três respostas\n * começarem na mesma coluna — é o alinhamento que faz o cartão ser lido de uma\n * vez em vez de seção por seção. Abaixo de `sm` empilha: rótulo de 7rem ao lado\n * de um texto de duas linhas num celular é pior do que não alinhar nada.\n *\n * Flex com `w-28`, e não `grid-cols-[7rem_1fr]`, por um motivo que não é\n * estética. O Tailwind gera uma utility só quando a encontra LITERALMENTE num\n * arquivo varrido, e os apps consomem este pacote pelo source com o dev server\n * ligado há horas — uma classe que existe só aqui simplesmente não aparece no\n * CSS deles, e o sintoma não é erro nenhum: é o layout empilhado como se o\n * código estivesse errado. Aconteceu com este cartão. Utilities que o SDK já\n * emite em outros lugares não têm esse problema.\n */\nfunction Field({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <div className=\"flex flex-col gap-1 px-6 py-4 sm:flex-row sm:items-start sm:gap-4\">\n <span className=\"w-28 shrink-0 pt-0.5 text-sm text-muted-foreground\">{label}</span>\n <div className=\"min-w-0 flex-1\">{children}</div>\n </div>\n )\n}\n\nexport function MyWorkspaceCard() {\n useUnitBootstrap()\n const user = useAuthStore((s) => s.user)\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n const members = useOrganizationStore((s) => s.members)\n const staffKinds = useOrganizationStore((s) => s.teamPersonKinds)\n const profiles = usePermissionsStore((s) => s.profiles)\n\n const unitMode = useUnitStore((s) => s.unitMode)\n const byId = useUnitStore((s) => s.byId)\n const bindings = useUnitStore((s) => s.myBindings)\n const myUnitIds = useUnitStore((s) => s.myUnitIds)\n const activeUnitId = useUnitStore((s) => s.activeUnitId)\n const entryReason = useUnitStore((s) => s.entryReason)\n\n const [person, setPerson] = React.useState<LinkedPerson | null | undefined>(undefined)\n const [candidate, setCandidate] = React.useState<LinkedPerson | null>(null)\n const [linking, setLinking] = React.useState(false)\n\n const orgId = currentOrg?.id\n const userId = user?.id\n\n const load = React.useCallback(async () => {\n if (!orgId || !userId) return\n const linked = await fetchMyPersonRecord(orgId, userId)\n setPerson(linked)\n // Só procura candidato quando não há vínculo — uma sugestão ao lado de um\n // vínculo que já existe é um convite a trocar por engano.\n setCandidate(linked ? null : await findMyPersonCandidate(orgId, user?.email, staffKinds))\n }, [orgId, userId, user?.email, staffKinds])\n\n React.useEffect(() => { void load() }, [load])\n\n if (!currentOrg) return null\n\n const myRole = members.find((m) => m.userId === userId)?.profileName\n\n async function link() {\n if (!orgId || !userId || !candidate) return\n setLinking(true)\n try {\n await linkPersonToLogin(orgId, userId, candidate.id)\n toast.success(`Login ligado ao cadastro de ${candidate.name}`)\n await load()\n } catch (err: any) {\n // A policy da 001 deixa escrever em `tenant_members` só para\n // administrador. Traduzir em vez de repetir o erro do banco: quem não é\n // administrador não precisa saber o que é uma policy, precisa saber a\n // quem pedir.\n toast.error('Só um administrador pode ligar um login a um cadastro', { description: err?.message })\n } finally {\n setLinking(false)\n }\n }\n\n // Só as filiais: uma região é agrupamento, e listá-la ao lado das unidades\n // faria parecer que a pessoa \"trabalha na região Rio\".\n const boundUnits = bindings\n .map((b) => ({ unit: byId[b.locationId], role: b.role }))\n .filter((x): x is { unit: NonNullable<typeof x.unit>; role: string | null } => Boolean(x.unit))\n\n const activeUnit = activeUnitId ? byId[activeUnitId] : undefined\n // Com uma unidade só não há o que explicar: \"vendo agora, porque é a única\"\n // é uma frase que ocupa uma linha para dizer o óbvio. A explicação só ganha\n // o seu espaço quando havia escolha a fazer.\n const worthExplaining = myUnitIds.length > 1 && Boolean(REASON_TEXT[entryReason])\n\n return (\n <Card>\n <CardHeader>\n <CardTitle className=\"text-lg\">Você em {currentOrg.name}</CardTitle>\n <CardDescription>\n O que vale só aqui — sua conta em si vale em todo espaço de trabalho em que você entra.\n </CardDescription>\n </CardHeader>\n\n {/* Rótulo à esquerda, resposta à direita — a mesma forma três vezes.\n Antes cada seção tinha o próprio cabeçalho com ícone e o próprio\n espaçamento, e três blocos soltos custam mais leitura do que três\n linhas alinhadas. O divisor entre elas faz o trabalho que o espaço\n em branco estava tentando fazer. */}\n <CardContent className=\"divide-y divide-border p-0\">\n <Field label=\"Função\">\n <Badge variant=\"secondary\">{myRole || 'sem função definida'}</Badge>\n </Field>\n\n {unitMode && (\n <Field label={boundUnits.length === 1 ? 'Unidade' : 'Unidades'}>\n {boundUnits.length === 0 ? (\n // O aviso que evita o chamado \"sumiu tudo\". Quem não tem vínculo\n // com a gestão ligada não vê nada carimbado, e a tela precisa\n // dizer isso antes da pessoa concluir que o sistema quebrou.\n <div className=\"flex gap-2.5 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>\n Você não está em nenhuma unidade. Enquanto for assim, não vê agendamento, pedido\n nem caixa de lugar nenhum — só o que é da organização inteira. Peça a um\n administrador para te incluir.\n </p>\n </div>\n ) : (\n <div className=\"space-y-1\">\n {boundUnits.map(({ unit, role }) => (\n <div key={unit.id} className=\"flex flex-wrap items-center gap-2 text-sm\">\n <Building2 className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 truncate\">{unit.name}</span>\n {/* A unidade ativa marcada NA LINHA dela. Antes isto era uma\n faixa cinza abaixo da lista repetindo o mesmo nome logo\n acima — duas vezes a mesma informação, e a segunda mais\n pesada que a primeira. */}\n {unit.id === activeUnitId && (\n <Badge variant=\"outline\" className=\"shrink-0 text-[10px] font-normal\">\n vendo agora\n </Badge>\n )}\n {unit.kind === 'region' && (\n <span className=\"shrink-0 text-xs text-muted-foreground\">\n região — alcança as de dentro\n </span>\n )}\n {role && (\n <Badge variant=\"secondary\" className=\"shrink-0 text-[10px] font-normal\">\n {profiles.find((p) => p.id === role)?.name ?? role} aqui\n </Badge>\n )}\n </div>\n ))}\n\n {/* Vínculo numa região alcança as filhas; sem dizer isso, a\n conta \"1 vínculo, 4 unidades\" não fecha para quem lê. */}\n {myUnitIds.length > boundUnits.length && (\n <p className=\"text-xs text-muted-foreground\">\n Ao todo você alcança {myUnitIds.length} unidades, contando as que estão dentro\n das regiões acima.\n </p>\n )}\n\n {!activeUnit && myUnitIds.length > 1 && (\n <p className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n <Layers className=\"h-3.5 w-3.5 shrink-0\" />\n Vendo todas as unidades.\n </p>\n )}\n\n {worthExplaining && (\n <p className=\"text-xs text-muted-foreground\">\n {activeUnit ? 'Abriu aqui porque ' : 'Está assim porque '}\n {REASON_TEXT[entryReason]}.\n </p>\n )}\n </div>\n )}\n </Field>\n )}\n\n {/* Só enquanto não há ficha ligada. Quando há, ela está desenhada logo\n abaixo neste mesmo perfil, e repetir o nome dela aqui é dizer a\n mesma coisa duas vezes com uma linha de distância. */}\n {person === null && (\n <Field label=\"Cadastro\">\n {candidate ? (\n // O caso que motivou tudo isto: a mesma pessoa existe como login e\n // como ficha, e ninguém disse ao sistema que são a mesma. Nunca\n // automático — o mesmo e-mail costuma estar em várias fichas.\n <div className=\"flex flex-wrap items-center gap-2\">\n <Link2 className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1 text-sm\">\n Existe um cadastro de <strong className=\"font-medium\">{candidate.name}</strong> com o\n seu e-mail. É você?\n </span>\n <Button size=\"sm\" variant=\"outline\" disabled={linking} onClick={() => void link()}>\n {linking ? 'Ligando…' : 'Sim, sou eu'}\n </Button>\n </div>\n ) : (\n <p className=\"text-xs text-muted-foreground\">\n Seu login não está ligado a nenhum cadastro de pessoa. É o normal para quem administra\n e não atende — escala, comissão e documentos vivem na ficha de quem atende.\n </p>\n )}\n </Field>\n )}\n </CardContent>\n </Card>\n )\n}\n","import * as React from 'react'\nimport { Badge, Skeleton } from '@fayz-ai/ui'\nimport { getEntityByKey, resolveDataProvider, type EntityDef } from '@fayz-ai/core'\nimport { useAuthStore } from '@fayz-ai/auth'\nimport { useOrganizationStore } from '../../org/store'\nimport { fetchMyPersonRecord } from '../../org/self'\nimport { CrudDetailPage } from '../../crud/CrudDetailPage'\nimport { dedup } from '../../lib/dedup'\nimport { getSupabaseClientSafe } from '../../lib/supabase'\nimport { toast } from '../notifications/ToastProvider'\n\n/** Mantém `profiles`, o metadado do login e a sessão em pé com o nome da ficha.\n * Silencioso: a gravação que importava já aconteceu, e um aviso de que o\n * espelho falhou não ajuda ninguém no meio de renomear a si mesmo. */\nasync function syncLoginName(fullName: string): Promise<void> {\n try {\n const supabase = getSupabaseClientSafe()\n if (!supabase) return\n const { data } = await supabase.auth.getUser()\n const id = data?.user?.id\n if (!id) return\n await supabase.from('profiles').upsert({ id, full_name: fullName }, { onConflict: 'id' })\n await supabase.auth.updateUser({ data: { full_name: fullName } })\n useAuthStore.getState().setUser({ ...(useAuthStore.getState().user as any), fullName })\n } catch {\n // ver acima\n }\n}\n\n// ---------------------------------------------------------------------------\n// A sua ficha, dentro do seu perfil.\n//\n// Eram duas páginas para a mesma pessoa: uma com foto, nome e e-mail do login,\n// outra com escala, unidades, endereços, documentos e extrato. Quem abria a\n// primeira não achava nada do próprio trabalho; quem abria a segunda não sabia\n// que era a própria ficha.\n//\n// A ficha continua tendo página própria — é a mesma tela pela qual um\n// administrador abre a ficha da Solange, e isso não é duplicação: é a mesma\n// tela para outra pessoa. O que mudou é que a SUA não exige ir procurá-la.\n//\n// É a MESMA `CrudDetailPage` da tela de cadastros, no modo embutido, com a\n// mesma definição de entidade que o app registrou. Reescrever as abas aqui\n// criaria uma segunda ficha para divergir da primeira, que é exatamente o\n// problema que isto veio resolver.\n// ---------------------------------------------------------------------------\n\n\nexport function MyRecordPanel() {\n const orgId = useOrganizationStore((s) => s.currentOrg?.id)\n const userId = useAuthStore((s) => s.user?.id)\n\n const members = useOrganizationStore((s) => s.members)\n const myRole = members.find((m) => m.userId === userId)?.profileName\n\n const [state, setState] = React.useState<\n { status: 'loading' } | { status: 'none' } | { status: 'ready'; entityDef: EntityDef; item: Record<string, any> }\n >({ status: 'loading' })\n\n const load = React.useCallback(async () => {\n if (!orgId || !userId) return\n const person = await dedup(`self:record:${orgId}:${userId}`, () => fetchMyPersonRecord(orgId, userId))\n if (!person) return setState({ status: 'none' })\n\n // A chave que o registro usa é `<arquétipo>:<kind>`, e o app registra cada\n // entidade de CRUD na avaliação do módulo. Sem registro — app com dados\n // simulados, kind que ninguém cadastrou — não há ficha para desenhar, e a\n // tela some em vez de inventar uma.\n const registered = person.kind ? getEntityByKey(`person:${person.kind}`) : undefined\n const entityDef = registered?.entityDef\n if (!entityDef) return setState({ status: 'none' })\n\n try {\n const provider = resolveDataProvider(entityDef as any)\n const { data } = await provider.list({ filters: { id: person.id }, pageSize: 1, countMode: 'none' })\n const item = data?.[0]\n if (!item) return setState({ status: 'none' })\n setState({ status: 'ready', entityDef, item: item as Record<string, any> })\n } catch {\n // A ficha é um extra desta tela, não o conteúdo dela. Um erro aqui não\n // pode derrubar o perfil inteiro — some, e o resto continua.\n setState({ status: 'none' })\n }\n }, [orgId, userId])\n\n React.useEffect(() => { void load() }, [load])\n\n /**\n * Trocar a foto — uma foto, dois donos.\n *\n * `profiles.avatar_url` é a que a barra de cima mostra e que vale em toda\n * conta em que a pessoa entra; a da ficha é a que a equipe vê na lista. São a\n * mesma cara, e deixar uma para trás é a mesma divergência do nome, só que\n * visível. Grava nas duas quando a entidade declara um campo de imagem.\n */\n const changePhoto = React.useCallback(async (file: File) => {\n if (state.status !== 'ready') return\n const supabase = getSupabaseClientSafe()\n if (!supabase) return\n const { data: auth } = await supabase.auth.getUser()\n const id = auth?.user?.id\n if (!id) return\n\n const ext = file.name.split('.').pop()\n const path = `avatars/${id}.${ext}`\n const { error: uploadError } = await supabase.storage.from('avatars').upload(path, file, { upsert: true })\n if (uploadError) {\n toast.error('Não deu para enviar a foto', { description: uploadError.message })\n return\n }\n const url = supabase.storage.from('avatars').getPublicUrl(path).data.publicUrl\n\n await supabase.from('profiles').upsert({ id, avatar_url: url }, { onConflict: 'id' })\n await supabase.auth.updateUser({ data: { avatar_url: url } })\n useAuthStore.getState().setUser({ ...(useAuthStore.getState().user as any), avatarUrl: url })\n\n const imageField = state.entityDef.imageField\n if (imageField) {\n const provider = resolveDataProvider(state.entityDef as any)\n const updated = await provider.update(state.item.id, { [imageField]: url } as any)\n setState({ ...state, item: { ...state.item, ...(updated as Record<string, any>) } })\n }\n toast.success('Foto atualizada')\n }, [state])\n\n if (state.status === 'loading') return <Skeleton className=\"h-40 w-full\" />\n if (state.status === 'none') return null\n\n return (\n <CrudDetailPage\n entityDef={state.entityDef}\n item={state.item}\n namePlural={state.entityDef.namePlural ?? state.entityDef.name}\n basePath=\"\"\n embedded\n onBack={() => {}}\n // A função é da associação à conta, não da ficha — não existe campo de\n // onde renderizá-la, e o lado do nome é o único lugar honesto para ela.\n badges={myRole ? <Badge variant=\"secondary\" className=\"shrink-0\">{myRole}</Badge> : null}\n onImageChange={changePhoto}\n // Edição campo a campo, sim; excluir, não. Apagar a própria ficha a\n // partir das configurações não é uma coisa que alguém queira fazer sem\n // querer, e o botão existe na página de cadastros para quem precisar.\n onFieldSave={async (key, value) => {\n const provider = resolveDataProvider(state.entityDef as any)\n const updated = await provider.update(state.item.id, { [key]: value } as any)\n setState({ ...state, item: { ...state.item, ...(updated as Record<string, any>) } })\n\n // O nome da ficha e o nome do login são a mesma pessoa em duas linhas.\n // Corrigir um e deixar o outro é como a divergência começa: a barra de\n // cima continuaria chamando você pelo nome antigo. Aqui só acontece\n // porque esta ficha é comprovadamente a sua.\n if (key === (state.entityDef.displayField ?? 'name') && typeof value === 'string') {\n await syncLoginName(value)\n }\n }}\n />\n )\n}\n","import * as React from 'react'\nimport { UserProfile } from './UserProfile'\nimport { MyWorkspaceCard } from './MyWorkspaceCard'\nimport { MyRecordPanel } from './MyRecordPanel'\nimport { useMyPersonId } from '../../org/self'\n// The signed-in user lives in @fayz-ai/auth's store (the one AuthProvider fills) —\n// the shell stores/auth.store is a separate, unpopulated store.\nimport { useAuthStore } from '@fayz-ai/auth'\nimport { getSupabaseClient, getSupabaseClientSafe } from '../../lib/supabase'\nimport { toast } from '../notifications/ToastProvider'\n\ninterface ProfileRow {\n full_name: string | null\n avatar_url: string | null\n email: string | null\n}\n\n// The \"/me\" surface: the current user's canonical profile = the auth user (id,\n// e-mail) merged with their profiles row (name, avatar). Reads/writes go\n// to public.profiles (RLS: id = auth.uid(), so a user only ever sees/edits their\n// own), and keep the auth-user metadata in sync so both stay coherent.\nexport function ConnectedUserProfile() {\n const user = useAuthStore((s) => s.user)\n // Quando o login tem ficha, ela é desenhada logo abaixo e já edita nome,\n // e-mail e telefone. Manter o formulário de cima seria pedir a mesma coisa\n // duas vezes na mesma tela, gravando em linhas diferentes — o começo exato de\n // uma divergir da outra. Sobra a foto, que é do login e não da ficha.\n const myPersonId = useMyPersonId()\n const hasRecord = Boolean(myPersonId)\n const setUser = useAuthStore((s) => s.setUser)\n const [profile, setProfile] = React.useState<ProfileRow | null>(null)\n\n // Fill: load the canonical profile row on mount (falls back to auth metadata).\n React.useEffect(() => {\n const supabase = getSupabaseClientSafe()\n if (!user || !supabase) return // mock/no-backend: just use the auth-store user\n let cancelled = false\n void supabase\n .from('profiles')\n .select('full_name, avatar_url, email')\n .eq('id', user.id)\n .maybeSingle()\n .then(({ data }) => {\n if (!cancelled && data) setProfile(data as ProfileRow)\n })\n return () => {\n cancelled = true\n }\n }, [user?.id])\n\n const handleSave = async (data: { fullName: string }) => {\n if (!user) return\n try {\n const supabase = getSupabaseClient()\n // Upsert the canonical row (INSERT if the profile doesn't exist yet).\n const { error: profileError } = await supabase\n .from('profiles')\n .upsert({ id: user.id, full_name: data.fullName, email: user.email }, { onConflict: 'id' })\n if (profileError) throw profileError\n\n // Keep the auth-user metadata in sync (used across the app's session).\n const { error: metaError } = await supabase.auth.updateUser({ data: { full_name: data.fullName } })\n if (metaError) throw metaError\n\n setUser({ ...user, fullName: data.fullName })\n setProfile({ full_name: data.fullName, avatar_url: profile?.avatar_url ?? null, email: user.email })\n toast.success('Perfil atualizado')\n } catch (err: any) {\n toast.error('Falha ao atualizar', { description: err?.message })\n }\n }\n\n const handleAvatarChange = async (file: File) => {\n if (!user) return\n try {\n const supabase = getSupabaseClient()\n const ext = file.name.split('.').pop()\n const path = `avatars/${user.id}.${ext}`\n\n const { error: uploadError } = await supabase.storage\n .from('avatars')\n .upload(path, file, { upsert: true })\n if (uploadError) throw uploadError\n\n const { data: urlData } = supabase.storage.from('avatars').getPublicUrl(path)\n const avatarUrl = urlData.publicUrl\n\n const { error: profileError } = await supabase\n .from('profiles')\n .upsert({ id: user.id, avatar_url: avatarUrl, email: user.email }, { onConflict: 'id' })\n if (profileError) throw profileError\n\n await supabase.auth.updateUser({ data: { avatar_url: avatarUrl } })\n setUser({ ...user, avatarUrl })\n setProfile({ full_name: profile?.full_name ?? null, avatar_url: avatarUrl, email: user.email })\n toast.success('Avatar atualizado')\n } catch (err: any) {\n toast.error('Falha ao enviar avatar', { description: err?.message })\n }\n }\n\n // Merge: prefer the canonical profile row, fall back to auth metadata.\n const merged = user\n ? { ...user, fullName: profile?.full_name ?? user.fullName, avatarUrl: profile?.avatar_url ?? user.avatarUrl }\n : null\n\n // Duas coisas, na ordem em que a pessoa pergunta: quem eu sou (a conta, igual\n // em todo espaço de trabalho) e o que eu sou aqui (função, unidades, ficha).\n // A segunda faltava, e era por isso que esta tela parecia desligada do resto.\n return (\n // Com ficha, a tela É a ficha: ela já tem a foto (que grava nos dois\n // lugares), o nome no cabeçalho, a função ao lado dele e uma aba de\n // unidades. Qualquer cartão acima dela repetiria alguma dessas coisas.\n //\n // Sem ficha, nada disso existe — e aí voltam o formulário da conta e o\n // resumo, que é onde mora o convite para ligar as duas.\n <div className=\"space-y-6\">\n {hasRecord ? (\n <MyRecordPanel />\n ) : (\n <>\n <UserProfile user={merged as any} onSave={handleSave} onAvatarChange={handleAvatarChange} />\n <MyWorkspaceCard />\n </>\n )}\n </div>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/components/settings/UserProfile.tsx","../src/components/settings/MyWorkspaceCard.tsx","../src/components/settings/MyRecordPanel.tsx","../src/components/settings/ConnectedUserProfile.tsx"],"names":["React","jsxs","jsx","Card","CardHeader","CardTitle","CardDescription","CardContent","Button","useAuthStore","React3","Badge","React4"],"mappings":"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","file":"ConnectedUserProfile-2PP755RY.js","sourcesContent":["import * as React from 'react'\nimport { Camera, Save } from 'lucide-react'\nimport { cn } from '../../lib/cn'\nimport { Button } from '@fayz-ai/ui'\nimport { Input } from '@fayz-ai/ui'\nimport { Avatar, AvatarFallback, AvatarImage } from '@fayz-ai/ui'\nimport { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@fayz-ai/ui'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport type { AuthUser } from '../../types/auth'\n\ninterface UserProfileProps {\n user?: AuthUser | null\n onSave?: (data: { fullName: string }) => void\n onAvatarChange?: (file: File) => void\n}\n\nfunction getInitials(name: string): string {\n return name\n .split(' ')\n .map((part) => part[0])\n .filter(Boolean)\n .slice(0, 2)\n .join('')\n .toUpperCase()\n}\n\nexport function UserProfile({ user, onSave, onAvatarChange }: UserProfileProps) {\n const { t } = useTranslation()\n const [fullName, setFullName] = React.useState(user?.fullName ?? '')\n const [saving, setSaving] = React.useState(false)\n const fileInputRef = React.useRef<HTMLInputElement>(null)\n\n React.useEffect(() => {\n if (user) {\n setFullName(user.fullName)\n }\n }, [user])\n\n const handleAvatarClick = () => {\n fileInputRef.current?.click()\n }\n\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n if (file && onAvatarChange) {\n onAvatarChange(file)\n }\n if (e.target) {\n e.target.value = ''\n }\n }\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n if (!onSave) return\n\n setSaving(true)\n try {\n await onSave({ fullName })\n } finally {\n setSaving(false)\n }\n }\n\n return (\n <form onSubmit={handleSubmit} className=\"space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle className=\"text-lg\">{t('settings.profile.title')}</CardTitle>\n <CardDescription>\n {t('settings.profile.subtitle')}\n </CardDescription>\n </CardHeader>\n\n <CardContent className=\"space-y-6\">\n <div className=\"flex items-center gap-6\">\n <div className=\"relative\">\n <Avatar className=\"h-20 w-20\">\n <AvatarImage src={user?.avatarUrl} alt={user?.fullName} />\n <AvatarFallback className=\"text-lg\">\n {user?.fullName ? getInitials(user.fullName) : '?'}\n </AvatarFallback>\n </Avatar>\n {onAvatarChange && (\n <Button\n variant=\"bare\"\n size=\"bare\"\n type=\"button\"\n onClick={handleAvatarClick}\n className={cn(\n 'absolute -bottom-1 -right-1 flex h-8 w-8 items-center justify-center rounded-full',\n 'border-2 border-background bg-primary text-primary-foreground',\n 'transition-colors hover:bg-primary/90'\n )}\n aria-label=\"Change avatar\"\n >\n <Camera className=\"h-3.5 w-3.5\" />\n </Button>\n )}\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*\"\n className=\"hidden\"\n onChange={handleFileChange}\n />\n </div>\n\n <div className=\"space-y-1\">\n <p className=\"font-medium\">{user?.fullName ?? 'User'}</p>\n <p className=\"text-sm text-muted-foreground\">{user?.email}</p>\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <label htmlFor=\"full-name\" className=\"text-sm font-medium\">\n {t('settings.profile.fullName')}\n </label>\n <Input\n id=\"full-name\"\n value={fullName}\n onChange={(e) => setFullName(e.target.value)}\n placeholder=\"John Doe\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <label htmlFor=\"email\" className=\"text-sm font-medium\">\n {t('settings.profile.email')}\n </label>\n <Input\n id=\"email\"\n type=\"email\"\n value={user?.email ?? ''}\n disabled\n className=\"bg-muted\"\n />\n <p className=\"text-xs text-muted-foreground\">\n {t('settings.profile.emailHelp')}\n </p>\n </div>\n </CardContent>\n\n <CardFooter className=\"justify-end\">\n <Button type=\"submit\" disabled={saving}>\n <Save className=\"mr-2 h-4 w-4\" />\n {saving ? t('common.saving') : t('settings.profile.saveProfile')}\n </Button>\n </CardFooter>\n </Card>\n </form>\n )\n}\n","import * as React from 'react'\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle, Button, Badge } from '@fayz-ai/ui'\nimport { AlertTriangle, Building2, Contact, Layers, Link2 } from 'lucide-react'\nimport { useAuthStore } from '@fayz-ai/auth'\nimport { useOrganizationStore } from '../../org/store'\nimport { useUnitStore } from '../../units/store'\nimport { useUnitBootstrap } from '../../units/useUnitBootstrap'\nimport { usePermissionsStore } from '../../permissions'\nimport { fetchMyPersonRecord, findMyPersonCandidate, linkPersonToLogin, type LinkedPerson } from '../../org/self'\nimport { toast } from '../notifications/ToastProvider'\n\n// ---------------------------------------------------------------------------\n// \"Você aqui\" — o que é verdade sobre você NESTE espaço de trabalho.\n//\n// A tela de perfil sabia nome, e-mail e foto: fatos da sua conta, iguais em\n// qualquer lugar. Não sabia nada do que decide o seu dia — que função você tem,\n// em quais unidades você entra, qual delas você está vendo agora, e se você tem\n// ficha profissional. Era por isso que ela parecia uma tela apartada: ela é o\n// único lugar do sistema que não fala do trabalho.\n//\n// As unidades vêm da store que o seletor já carregou, então isto não custa\n// requisição nenhuma. Quando a gestão por unidades está desligada, a seção\n// inteira desaparece: um fato que não se aplica é ruído, não informação.\n// ---------------------------------------------------------------------------\n\n/** Por que a unidade ativa é a que é. A resolução automática cria a pergunta\n * \"por que abriu na Ipanema?\", e este é o lugar onde ela é respondida. */\nconst REASON_TEXT: Record<string, string> = {\n device: 'foi a última unidade aberta neste computador',\n account: 'foi a última unidade que você abriu, em outro aparelho',\n only: 'é a única que você alcança',\n manual: 'você escolheu',\n nearest: 'foi a mais perto de você',\n all: 'você não estreitou nada',\n}\n\n/**\n * Uma linha rótulo/resposta. O rótulo tem largura fixa para as três respostas\n * começarem na mesma coluna — é o alinhamento que faz o cartão ser lido de uma\n * vez em vez de seção por seção. Abaixo de `sm` empilha: rótulo de 7rem ao lado\n * de um texto de duas linhas num celular é pior do que não alinhar nada.\n *\n * Flex com `w-28`, e não `grid-cols-[7rem_1fr]`, por um motivo que não é\n * estética. O Tailwind gera uma utility só quando a encontra LITERALMENTE num\n * arquivo varrido, e os apps consomem este pacote pelo source com o dev server\n * ligado há horas — uma classe que existe só aqui simplesmente não aparece no\n * CSS deles, e o sintoma não é erro nenhum: é o layout empilhado como se o\n * código estivesse errado. Aconteceu com este cartão. Utilities que o SDK já\n * emite em outros lugares não têm esse problema.\n */\nfunction Field({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <div className=\"flex flex-col gap-1 px-6 py-4 sm:flex-row sm:items-start sm:gap-4\">\n <span className=\"w-28 shrink-0 pt-0.5 text-sm text-muted-foreground\">{label}</span>\n <div className=\"min-w-0 flex-1\">{children}</div>\n </div>\n )\n}\n\nexport function MyWorkspaceCard() {\n useUnitBootstrap()\n const user = useAuthStore((s) => s.user)\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n const members = useOrganizationStore((s) => s.members)\n const staffKinds = useOrganizationStore((s) => s.teamPersonKinds)\n const profiles = usePermissionsStore((s) => s.profiles)\n\n const unitMode = useUnitStore((s) => s.unitMode)\n const byId = useUnitStore((s) => s.byId)\n const bindings = useUnitStore((s) => s.myBindings)\n const myUnitIds = useUnitStore((s) => s.myUnitIds)\n const activeUnitId = useUnitStore((s) => s.activeUnitId)\n const entryReason = useUnitStore((s) => s.entryReason)\n\n const [person, setPerson] = React.useState<LinkedPerson | null | undefined>(undefined)\n const [candidate, setCandidate] = React.useState<LinkedPerson | null>(null)\n const [linking, setLinking] = React.useState(false)\n\n const orgId = currentOrg?.id\n const userId = user?.id\n\n const load = React.useCallback(async () => {\n if (!orgId || !userId) return\n const linked = await fetchMyPersonRecord(orgId, userId)\n setPerson(linked)\n // Só procura candidato quando não há vínculo — uma sugestão ao lado de um\n // vínculo que já existe é um convite a trocar por engano.\n setCandidate(linked ? null : await findMyPersonCandidate(orgId, user?.email, staffKinds))\n }, [orgId, userId, user?.email, staffKinds])\n\n React.useEffect(() => { void load() }, [load])\n\n if (!currentOrg) return null\n\n const myRole = members.find((m) => m.userId === userId)?.profileName\n\n async function link() {\n if (!orgId || !userId || !candidate) return\n setLinking(true)\n try {\n await linkPersonToLogin(orgId, userId, candidate.id)\n toast.success(`Login ligado ao cadastro de ${candidate.name}`)\n await load()\n } catch (err: any) {\n // A policy da 001 deixa escrever em `tenant_members` só para\n // administrador. Traduzir em vez de repetir o erro do banco: quem não é\n // administrador não precisa saber o que é uma policy, precisa saber a\n // quem pedir.\n toast.error('Só um administrador pode ligar um login a um cadastro', { description: err?.message })\n } finally {\n setLinking(false)\n }\n }\n\n // Só as filiais: uma região é agrupamento, e listá-la ao lado das unidades\n // faria parecer que a pessoa \"trabalha na região Rio\".\n const boundUnits = bindings\n .map((b) => ({ unit: byId[b.locationId], role: b.role }))\n .filter((x): x is { unit: NonNullable<typeof x.unit>; role: string | null } => Boolean(x.unit))\n\n const activeUnit = activeUnitId ? byId[activeUnitId] : undefined\n // Com uma unidade só não há o que explicar: \"vendo agora, porque é a única\"\n // é uma frase que ocupa uma linha para dizer o óbvio. A explicação só ganha\n // o seu espaço quando havia escolha a fazer.\n const worthExplaining = myUnitIds.length > 1 && Boolean(REASON_TEXT[entryReason])\n\n return (\n <Card>\n <CardHeader>\n <CardTitle className=\"text-lg\">Você em {currentOrg.name}</CardTitle>\n <CardDescription>\n O que vale só aqui — sua conta em si vale em todo espaço de trabalho em que você entra.\n </CardDescription>\n </CardHeader>\n\n {/* Rótulo à esquerda, resposta à direita — a mesma forma três vezes.\n Antes cada seção tinha o próprio cabeçalho com ícone e o próprio\n espaçamento, e três blocos soltos custam mais leitura do que três\n linhas alinhadas. O divisor entre elas faz o trabalho que o espaço\n em branco estava tentando fazer. */}\n <CardContent className=\"divide-y divide-border p-0\">\n <Field label=\"Função\">\n <Badge variant=\"secondary\">{myRole || 'sem função definida'}</Badge>\n </Field>\n\n {unitMode && (\n <Field label={boundUnits.length === 1 ? 'Unidade' : 'Unidades'}>\n {boundUnits.length === 0 ? (\n // O aviso que evita o chamado \"sumiu tudo\". Quem não tem vínculo\n // com a gestão ligada não vê nada carimbado, e a tela precisa\n // dizer isso antes da pessoa concluir que o sistema quebrou.\n <div className=\"flex gap-2.5 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>\n Você não está em nenhuma unidade. Enquanto for assim, não vê agendamento, pedido\n nem caixa de lugar nenhum — só o que é da organização inteira. Peça a um\n administrador para te incluir.\n </p>\n </div>\n ) : (\n <div className=\"space-y-1\">\n {boundUnits.map(({ unit, role }) => (\n <div key={unit.id} className=\"flex flex-wrap items-center gap-2 text-sm\">\n <Building2 className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 truncate\">{unit.name}</span>\n {/* A unidade ativa marcada NA LINHA dela. Antes isto era uma\n faixa cinza abaixo da lista repetindo o mesmo nome logo\n acima — duas vezes a mesma informação, e a segunda mais\n pesada que a primeira. */}\n {unit.id === activeUnitId && (\n <Badge variant=\"outline\" className=\"shrink-0 text-[10px] font-normal\">\n vendo agora\n </Badge>\n )}\n {unit.kind === 'region' && (\n <span className=\"shrink-0 text-xs text-muted-foreground\">\n região — alcança as de dentro\n </span>\n )}\n {role && (\n <Badge variant=\"secondary\" className=\"shrink-0 text-[10px] font-normal\">\n {profiles.find((p) => p.id === role)?.name ?? role} aqui\n </Badge>\n )}\n </div>\n ))}\n\n {/* Vínculo numa região alcança as filhas; sem dizer isso, a\n conta \"1 vínculo, 4 unidades\" não fecha para quem lê. */}\n {myUnitIds.length > boundUnits.length && (\n <p className=\"text-xs text-muted-foreground\">\n Ao todo você alcança {myUnitIds.length} unidades, contando as que estão dentro\n das regiões acima.\n </p>\n )}\n\n {!activeUnit && myUnitIds.length > 1 && (\n <p className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n <Layers className=\"h-3.5 w-3.5 shrink-0\" />\n Vendo todas as unidades.\n </p>\n )}\n\n {worthExplaining && (\n <p className=\"text-xs text-muted-foreground\">\n {activeUnit ? 'Abriu aqui porque ' : 'Está assim porque '}\n {REASON_TEXT[entryReason]}.\n </p>\n )}\n </div>\n )}\n </Field>\n )}\n\n {/* Só enquanto não há ficha ligada. Quando há, ela está desenhada logo\n abaixo neste mesmo perfil, e repetir o nome dela aqui é dizer a\n mesma coisa duas vezes com uma linha de distância. */}\n {person === null && (\n <Field label=\"Cadastro\">\n {candidate ? (\n // O caso que motivou tudo isto: a mesma pessoa existe como login e\n // como ficha, e ninguém disse ao sistema que são a mesma. Nunca\n // automático — o mesmo e-mail costuma estar em várias fichas.\n <div className=\"flex flex-wrap items-center gap-2\">\n <Link2 className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1 text-sm\">\n Existe um cadastro de <strong className=\"font-medium\">{candidate.name}</strong> com o\n seu e-mail. É você?\n </span>\n <Button size=\"sm\" variant=\"outline\" disabled={linking} onClick={() => void link()}>\n {linking ? 'Ligando…' : 'Sim, sou eu'}\n </Button>\n </div>\n ) : (\n <p className=\"text-xs text-muted-foreground\">\n Seu login não está ligado a nenhum cadastro de pessoa. É o normal para quem administra\n e não atende — escala, comissão e documentos vivem na ficha de quem atende.\n </p>\n )}\n </Field>\n )}\n </CardContent>\n </Card>\n )\n}\n","import * as React from 'react'\nimport { Badge, Skeleton } from '@fayz-ai/ui'\nimport { getEntityByKey, resolveDataProvider, type EntityDef } from '@fayz-ai/core'\nimport { useAuthStore } from '@fayz-ai/auth'\nimport { useOrganizationStore } from '../../org/store'\nimport { fetchMyPersonRecord } from '../../org/self'\nimport { CrudDetailPage } from '../../crud/CrudDetailPage'\nimport { dedup } from '../../lib/dedup'\nimport { getSupabaseClientSafe } from '../../lib/supabase'\nimport { toast } from '../notifications/ToastProvider'\n\n/** Mantém `profiles`, o metadado do login e a sessão em pé com o nome da ficha.\n * Silencioso: a gravação que importava já aconteceu, e um aviso de que o\n * espelho falhou não ajuda ninguém no meio de renomear a si mesmo. */\nasync function syncLoginName(fullName: string): Promise<void> {\n try {\n const supabase = getSupabaseClientSafe()\n if (!supabase) return\n const { data } = await supabase.auth.getUser()\n const id = data?.user?.id\n if (!id) return\n await supabase.from('profiles').upsert({ id, full_name: fullName }, { onConflict: 'id' })\n await supabase.auth.updateUser({ data: { full_name: fullName } })\n useAuthStore.getState().setUser({ ...(useAuthStore.getState().user as any), fullName })\n } catch {\n // ver acima\n }\n}\n\n// ---------------------------------------------------------------------------\n// A sua ficha, dentro do seu perfil.\n//\n// Eram duas páginas para a mesma pessoa: uma com foto, nome e e-mail do login,\n// outra com escala, unidades, endereços, documentos e extrato. Quem abria a\n// primeira não achava nada do próprio trabalho; quem abria a segunda não sabia\n// que era a própria ficha.\n//\n// A ficha continua tendo página própria — é a mesma tela pela qual um\n// administrador abre a ficha da Solange, e isso não é duplicação: é a mesma\n// tela para outra pessoa. O que mudou é que a SUA não exige ir procurá-la.\n//\n// É a MESMA `CrudDetailPage` da tela de cadastros, no modo embutido, com a\n// mesma definição de entidade que o app registrou. Reescrever as abas aqui\n// criaria uma segunda ficha para divergir da primeira, que é exatamente o\n// problema que isto veio resolver.\n// ---------------------------------------------------------------------------\n\n\nexport function MyRecordPanel() {\n const orgId = useOrganizationStore((s) => s.currentOrg?.id)\n const userId = useAuthStore((s) => s.user?.id)\n\n const members = useOrganizationStore((s) => s.members)\n const myRole = members.find((m) => m.userId === userId)?.profileName\n\n const [state, setState] = React.useState<\n { status: 'loading' } | { status: 'none' } | { status: 'ready'; entityDef: EntityDef; item: Record<string, any> }\n >({ status: 'loading' })\n\n const load = React.useCallback(async () => {\n if (!orgId || !userId) return\n const person = await dedup(`self:record:${orgId}:${userId}`, () => fetchMyPersonRecord(orgId, userId))\n if (!person) return setState({ status: 'none' })\n\n // A chave que o registro usa é `<arquétipo>:<kind>`, e o app registra cada\n // entidade de CRUD na avaliação do módulo. Sem registro — app com dados\n // simulados, kind que ninguém cadastrou — não há ficha para desenhar, e a\n // tela some em vez de inventar uma.\n const registered = person.kind ? getEntityByKey(`person:${person.kind}`) : undefined\n const entityDef = registered?.entityDef\n if (!entityDef) return setState({ status: 'none' })\n\n try {\n const provider = resolveDataProvider(entityDef as any)\n const { data } = await provider.list({ filters: { id: person.id }, pageSize: 1, countMode: 'none' })\n const item = data?.[0]\n if (!item) return setState({ status: 'none' })\n setState({ status: 'ready', entityDef, item: item as Record<string, any> })\n } catch {\n // A ficha é um extra desta tela, não o conteúdo dela. Um erro aqui não\n // pode derrubar o perfil inteiro — some, e o resto continua.\n setState({ status: 'none' })\n }\n }, [orgId, userId])\n\n React.useEffect(() => { void load() }, [load])\n\n /**\n * Trocar a foto — uma foto, dois donos.\n *\n * `profiles.avatar_url` é a que a barra de cima mostra e que vale em toda\n * conta em que a pessoa entra; a da ficha é a que a equipe vê na lista. São a\n * mesma cara, e deixar uma para trás é a mesma divergência do nome, só que\n * visível. Grava nas duas quando a entidade declara um campo de imagem.\n */\n const changePhoto = React.useCallback(async (file: File) => {\n if (state.status !== 'ready') return\n const supabase = getSupabaseClientSafe()\n if (!supabase) return\n const { data: auth } = await supabase.auth.getUser()\n const id = auth?.user?.id\n if (!id) return\n\n const ext = file.name.split('.').pop()\n const path = `avatars/${id}.${ext}`\n const { error: uploadError } = await supabase.storage.from('avatars').upload(path, file, { upsert: true })\n if (uploadError) {\n toast.error('Não deu para enviar a foto', { description: uploadError.message })\n return\n }\n const url = supabase.storage.from('avatars').getPublicUrl(path).data.publicUrl\n\n await supabase.from('profiles').upsert({ id, avatar_url: url }, { onConflict: 'id' })\n await supabase.auth.updateUser({ data: { avatar_url: url } })\n useAuthStore.getState().setUser({ ...(useAuthStore.getState().user as any), avatarUrl: url })\n\n const imageField = state.entityDef.imageField\n if (imageField) {\n const provider = resolveDataProvider(state.entityDef as any)\n const updated = await provider.update(state.item.id, { [imageField]: url } as any)\n setState({ ...state, item: { ...state.item, ...(updated as Record<string, any>) } })\n }\n toast.success('Foto atualizada')\n }, [state])\n\n if (state.status === 'loading') return <Skeleton className=\"h-40 w-full\" />\n if (state.status === 'none') return null\n\n return (\n <CrudDetailPage\n entityDef={state.entityDef}\n item={state.item}\n namePlural={state.entityDef.namePlural ?? state.entityDef.name}\n basePath=\"\"\n embedded\n onBack={() => {}}\n // A função é da associação à conta, não da ficha — não existe campo de\n // onde renderizá-la, e o lado do nome é o único lugar honesto para ela.\n badges={myRole ? <Badge variant=\"secondary\" className=\"shrink-0\">{myRole}</Badge> : null}\n onImageChange={changePhoto}\n // Edição campo a campo, sim; excluir, não. Apagar a própria ficha a\n // partir das configurações não é uma coisa que alguém queira fazer sem\n // querer, e o botão existe na página de cadastros para quem precisar.\n onFieldSave={async (key, value) => {\n const provider = resolveDataProvider(state.entityDef as any)\n const updated = await provider.update(state.item.id, { [key]: value } as any)\n setState({ ...state, item: { ...state.item, ...(updated as Record<string, any>) } })\n\n // O nome da ficha e o nome do login são a mesma pessoa em duas linhas.\n // Corrigir um e deixar o outro é como a divergência começa: a barra de\n // cima continuaria chamando você pelo nome antigo. Aqui só acontece\n // porque esta ficha é comprovadamente a sua.\n if (key === (state.entityDef.displayField ?? 'name') && typeof value === 'string') {\n await syncLoginName(value)\n }\n }}\n />\n )\n}\n","import * as React from 'react'\nimport { UserProfile } from './UserProfile'\nimport { MyWorkspaceCard } from './MyWorkspaceCard'\nimport { MyRecordPanel } from './MyRecordPanel'\nimport { useMyPersonId } from '../../org/self'\n// The signed-in user lives in @fayz-ai/auth's store (the one AuthProvider fills) —\n// the shell stores/auth.store is a separate, unpopulated store.\nimport { useAuthStore } from '@fayz-ai/auth'\nimport { getSupabaseClient, getSupabaseClientSafe } from '../../lib/supabase'\nimport { toast } from '../notifications/ToastProvider'\n\ninterface ProfileRow {\n full_name: string | null\n avatar_url: string | null\n email: string | null\n}\n\n// The \"/me\" surface: the current user's canonical profile = the auth user (id,\n// e-mail) merged with their profiles row (name, avatar). Reads/writes go\n// to public.profiles (RLS: id = auth.uid(), so a user only ever sees/edits their\n// own), and keep the auth-user metadata in sync so both stay coherent.\nexport function ConnectedUserProfile() {\n const user = useAuthStore((s) => s.user)\n // Quando o login tem ficha, ela é desenhada logo abaixo e já edita nome,\n // e-mail e telefone. Manter o formulário de cima seria pedir a mesma coisa\n // duas vezes na mesma tela, gravando em linhas diferentes — o começo exato de\n // uma divergir da outra. Sobra a foto, que é do login e não da ficha.\n const myPersonId = useMyPersonId()\n const hasRecord = Boolean(myPersonId)\n const setUser = useAuthStore((s) => s.setUser)\n const [profile, setProfile] = React.useState<ProfileRow | null>(null)\n\n // Fill: load the canonical profile row on mount (falls back to auth metadata).\n React.useEffect(() => {\n const supabase = getSupabaseClientSafe()\n if (!user || !supabase) return // mock/no-backend: just use the auth-store user\n let cancelled = false\n void supabase\n .from('profiles')\n .select('full_name, avatar_url, email')\n .eq('id', user.id)\n .maybeSingle()\n .then(({ data }) => {\n if (!cancelled && data) setProfile(data as ProfileRow)\n })\n return () => {\n cancelled = true\n }\n }, [user?.id])\n\n const handleSave = async (data: { fullName: string }) => {\n if (!user) return\n try {\n const supabase = getSupabaseClient()\n // Upsert the canonical row (INSERT if the profile doesn't exist yet).\n const { error: profileError } = await supabase\n .from('profiles')\n .upsert({ id: user.id, full_name: data.fullName, email: user.email }, { onConflict: 'id' })\n if (profileError) throw profileError\n\n // Keep the auth-user metadata in sync (used across the app's session).\n const { error: metaError } = await supabase.auth.updateUser({ data: { full_name: data.fullName } })\n if (metaError) throw metaError\n\n setUser({ ...user, fullName: data.fullName })\n setProfile({ full_name: data.fullName, avatar_url: profile?.avatar_url ?? null, email: user.email })\n toast.success('Perfil atualizado')\n } catch (err: any) {\n toast.error('Falha ao atualizar', { description: err?.message })\n }\n }\n\n const handleAvatarChange = async (file: File) => {\n if (!user) return\n try {\n const supabase = getSupabaseClient()\n const ext = file.name.split('.').pop()\n const path = `avatars/${user.id}.${ext}`\n\n const { error: uploadError } = await supabase.storage\n .from('avatars')\n .upload(path, file, { upsert: true })\n if (uploadError) throw uploadError\n\n const { data: urlData } = supabase.storage.from('avatars').getPublicUrl(path)\n const avatarUrl = urlData.publicUrl\n\n const { error: profileError } = await supabase\n .from('profiles')\n .upsert({ id: user.id, avatar_url: avatarUrl, email: user.email }, { onConflict: 'id' })\n if (profileError) throw profileError\n\n await supabase.auth.updateUser({ data: { avatar_url: avatarUrl } })\n setUser({ ...user, avatarUrl })\n setProfile({ full_name: profile?.full_name ?? null, avatar_url: avatarUrl, email: user.email })\n toast.success('Avatar atualizado')\n } catch (err: any) {\n toast.error('Falha ao enviar avatar', { description: err?.message })\n }\n }\n\n // Merge: prefer the canonical profile row, fall back to auth metadata.\n const merged = user\n ? { ...user, fullName: profile?.full_name ?? user.fullName, avatarUrl: profile?.avatar_url ?? user.avatarUrl }\n : null\n\n // Duas coisas, na ordem em que a pessoa pergunta: quem eu sou (a conta, igual\n // em todo espaço de trabalho) e o que eu sou aqui (função, unidades, ficha).\n // A segunda faltava, e era por isso que esta tela parecia desligada do resto.\n return (\n // Com ficha, a tela É a ficha: ela já tem a foto (que grava nos dois\n // lugares), o nome no cabeçalho, a função ao lado dele e uma aba de\n // unidades. Qualquer cartão acima dela repetiria alguma dessas coisas.\n //\n // Sem ficha, nada disso existe — e aí voltam o formulário da conta e o\n // resumo, que é onde mora o convite para ligar as duas.\n <div className=\"space-y-6\">\n {hasRecord ? (\n <MyRecordPanel />\n ) : (\n <>\n <UserProfile user={merged as any} onSave={handleSave} onAvatarChange={handleAvatarChange} />\n <MyWorkspaceCard />\n </>\n )}\n </div>\n )\n}\n"]}
@@ -1,7 +1,7 @@
1
- import { useMemberAccessPanel, MemberUnitsCell, startImpersonation } from './chunk-D7DQ6W4H.js';
1
+ import { useMemberAccessPanel, MemberUnitsCell, startImpersonation } from './chunk-AIDRTAXD.js';
2
2
  import './chunk-JFIU6NQP.js';
3
3
  import './chunk-YEHIBPIX.js';
4
- import { useInviteStore, useSystemPermission } from './chunk-BFOH3AVP.js';
4
+ import { useInviteStore, useSystemPermission } from './chunk-RLZCH4NU.js';
5
5
  import './chunk-AWM4AMBS.js';
6
6
  import './chunk-6QFOE3UD.js';
7
7
  import './chunk-FK6RHGI7.js';
@@ -498,5 +498,5 @@ function TeamTab() {
498
498
  }
499
499
 
500
500
  export { TeamTab };
501
- //# sourceMappingURL=TeamTab-KHFFG7VL.js.map
502
- //# sourceMappingURL=TeamTab-KHFFG7VL.js.map
501
+ //# sourceMappingURL=TeamTab-M5SAKV6M.js.map
502
+ //# sourceMappingURL=TeamTab-M5SAKV6M.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/organization/InviteMemberDialog.tsx","../src/impersonation/ImpersonateDialog.tsx","../src/components/organization/TeamTab.tsx"],"names":["useOrgAdapterOptional","React","React2","jsx","Modal","jsxs","ModalContent","ModalHeader","ModalTitle","ModalDescription","Input","ModalFooter","Button","useAuthStore","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Eye"],"mappings":"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","file":"TeamTab-KHFFG7VL.js","sourcesContent":["import * as React from 'react'\nimport { Plus, X } from 'lucide-react'\nimport { toast } from '../notifications/ToastProvider'\nimport {\n Modal,\n ModalContent,\n ModalHeader,\n ModalTitle,\n ModalDescription,\n ModalFooter,\n} from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { Input } from '@fayz-ai/ui'\nimport { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport { usePermissionsStore } from '../../permissions'\nimport { useOrganizationStore } from '../../stores/organization.store'\nimport { useInviteStore } from '../../stores/invite.store'\n// Native org adapter (the one the app actually provides). The shell lib/org-context\n// is a separate, un-provided context that returns null here — which made the submit\n// button a no-op (handleSend bailed on `!adapter`).\nimport { useOrgAdapterOptional as useNativeOrgAdapter } from '../../org'\nimport type { OrgAdapter } from '../../types/org-adapter'\n\n// The native adapter is the same runtime object; its Invite/Location types differ\n// from the shell's only in fields these components don't read, so a cast is safe.\nconst useOrgAdapterOptional = () => useNativeOrgAdapter() as unknown as OrgAdapter | null\n// The signed-in user lives in @fayz-ai/auth's store (what OrgProvider reads). The\n// shell stores/auth.store is a separate, unpopulated store — reading `user` from\n// it left `user` null, so handleSend bailed on `!user` (silent no-op).\nimport { useAuthStore } from '@fayz-ai/auth'\nimport { useTranslation } from '../../hooks/useTranslation'\n\ninterface InviteMemberDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /** Pre-fill the first email (e.g. from person detail Access tab) */\n defaultEmail?: string\n}\n\nexport function InviteMemberDialog({ open, onOpenChange, defaultEmail }: InviteMemberDialogProps) {\n const { t } = useTranslation()\n const adapter = useOrgAdapterOptional()\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n const profiles = usePermissionsStore((s) => s.profiles)\n const setInvites = useInviteStore((s) => s.setInvites)\n const { user } = useAuthStore()\n\n const [emails, setEmails] = React.useState<string[]>([defaultEmail ?? ''])\n const [profileId, setProfileId] = React.useState(profiles[1]?.id ?? profiles[0]?.id ?? '')\n const [sending, setSending] = React.useState(false)\n const [sent, setSent] = React.useState(false)\n\n // O prefill só chegava no PRIMEIRO render, e o diálogo fica montado o tempo\n // todo — abrir a partir da linha de alguém trazia o e-mail de quem foi\n // convidado antes, ou nada. O e-mail é a coisa que este diálogo não pode\n // errar: é ele que liga o convite aceito à ficha certa.\n React.useEffect(() => {\n if (open) setEmails([defaultEmail ?? ''])\n }, [open, defaultEmail])\n\n // A lista de papéis chega depois do primeiro render (vem do adaptador), e\n // sem isto o seletor abria vazio e o Enviar mandava um papel em branco.\n React.useEffect(() => {\n if (!profileId && profiles.length) setProfileId(profiles[1]?.id ?? profiles[0]!.id)\n }, [profiles, profileId])\n\n const addEmail = () => setEmails((prev) => [...prev, ''])\n\n const updateEmail = (idx: number, value: string) => {\n setEmails((prev) => {\n const next = [...prev]\n next[idx] = value\n return next\n })\n }\n\n const removeEmail = (idx: number) => {\n setEmails((prev) => prev.filter((_, i) => i !== idx))\n }\n\n const handleSend = async () => {\n if (!adapter || !currentOrg || !user) return\n const validEmails = emails.filter((e) => e.trim() && e.includes('@'))\n if (validEmails.length === 0) return\n\n setSending(true)\n try {\n if (validEmails.length === 1) {\n await adapter.createInvite(currentOrg.id, validEmails[0].trim(), profileId, user.id)\n } else {\n await adapter.bulkInvite(currentOrg.id, validEmails.map((e) => e.trim()), profileId, user.id)\n }\n const invites = await adapter.listInvites(currentOrg.id)\n setInvites(invites)\n setSent(true)\n } catch (err: any) {\n toast.error('Failed to send invites', { description: err?.message })\n } finally {\n setSending(false)\n }\n }\n\n const handleClose = () => {\n onOpenChange(false)\n // Reset after animation\n setTimeout(() => {\n setEmails([''])\n setProfileId(profiles[1]?.id ?? profiles[0]?.id ?? '')\n setSent(false)\n }, 200)\n }\n\n return (\n <Modal open={open} onOpenChange={handleClose}>\n <ModalContent>\n <ModalHeader>\n <ModalTitle>{t('organization.invite.title')}</ModalTitle>\n <ModalDescription>{t('organization.invite.description')}</ModalDescription>\n </ModalHeader>\n\n {sent ? (\n <div className=\"py-8 text-center\">\n <div className=\"mx-auto mb-3 flex h-12 w-12 items-center justify-center rounded-full bg-success/10\">\n <svg className=\"h-6 w-6 text-success\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={2} stroke=\"currentColor\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\" /></svg>\n </div>\n <p className=\"text-sm font-medium\">{t('organization.invite.sent')}</p>\n <p className=\"text-xs text-muted-foreground mt-1\">{t('organization.invite.sentDescription')}</p>\n </div>\n ) : (\n <div className=\"space-y-4 py-4\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">{t('organization.invite.emailLabel')}</label>\n {emails.map((email, idx) => (\n <div key={idx} className=\"flex items-center gap-2\">\n <Input\n type=\"email\"\n placeholder=\"team@example.com\"\n value={email}\n onChange={(e) => updateEmail(idx, e.target.value)}\n />\n {emails.length > 1 && (\n <Button variant=\"ghost\" size=\"sm\" onClick={() => removeEmail(idx)}>\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n ))}\n <Button variant=\"ghost\" size=\"sm\" onClick={addEmail} className=\"text-xs\">\n <Plus className=\"h-3.5 w-3.5 mr-1\" />\n {t('organization.invite.addAnother')}\n </Button>\n </div>\n\n <div>\n <label className=\"text-sm font-medium\">{t('organization.invite.roleLabel')}</label>\n <Select value={profileId} onValueChange={setProfileId}>\n <SelectTrigger className=\"mt-1\">\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 </div>\n )}\n\n <ModalFooter>\n {sent ? (\n <Button onClick={handleClose}>{t('common.done')}</Button>\n ) : (\n <>\n <Button variant=\"outline\" onClick={handleClose}>{t('common.cancel')}</Button>\n <Button onClick={handleSend} disabled={sending || emails.every((e) => !e.trim())}>\n {sending ? t('organization.invite.sending') : t('organization.invite.sendInvites')}\n </Button>\n </>\n )}\n </ModalFooter>\n </ModalContent>\n </Modal>\n )\n}\n","import * as React from 'react'\nimport { Eye } from 'lucide-react'\nimport { Modal, ModalContent, ModalHeader, ModalTitle, ModalDescription, ModalFooter, Button, Input } from '@fayz-ai/ui'\nimport { useTranslation } from '../hooks/useTranslation'\nimport { startImpersonation } from './session'\nimport { currentAppPath } from '@fayz-ai/core'\n\nexport interface ImpersonateTarget {\n userId: string\n name: string\n}\n\nexport function ImpersonateDialog({ tenantId, target, onClose }: {\n tenantId: string\n target: ImpersonateTarget | null\n onClose: () => void\n}) {\n const { t } = useTranslation()\n const [reason, setReason] = React.useState('')\n const [busy, setBusy] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n\n React.useEffect(() => {\n if (target) { setReason(''); setError(null); setBusy(false) }\n }, [target])\n\n async function enter() {\n if (!target) return\n setBusy(true)\n setError(null)\n try {\n await startImpersonation({\n tenantId,\n userId: target.userId,\n reason: reason.trim() || undefined,\n returnTo: currentAppPath(),\n })\n } catch (err) {\n setError((err as Error).message || t('impersonation.failed'))\n setBusy(false)\n }\n }\n\n return (\n <Modal open={!!target} onOpenChange={(open) => { if (!open && !busy) onClose() }}>\n <ModalContent>\n <ModalHeader>\n <ModalTitle>{t('impersonation.confirmTitle', { name: target?.name ?? '' })}</ModalTitle>\n <ModalDescription>{t('impersonation.confirmBody')}</ModalDescription>\n </ModalHeader>\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium\">{t('impersonation.reasonLabel')}</label>\n <Input value={reason} onChange={(e) => setReason(e.target.value)} disabled={busy} />\n {error && <p className=\"text-sm text-destructive\">{error}</p>}\n </div>\n <ModalFooter>\n <Button variant=\"outline\" onClick={onClose} disabled={busy}>{t('common.cancel')}</Button>\n <Button onClick={() => { void enter() }} disabled={busy}>\n <Eye className=\"mr-2 h-4 w-4\" />\n {t('impersonation.confirm')}\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n )\n}\n","import * as React from 'react'\nimport { UserPlus, UserMinus, Mail, Clock, Building2, Send, Ban, Contact, Eye } from 'lucide-react'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { Card, DataTable } from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { PageHeaderActions } from '@fayz-ai/ui'\nimport { RowActions } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport { Avatar, AvatarFallback, AvatarImage } from '@fayz-ai/ui'\nimport { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from '@fayz-ai/ui'\nimport { PageActions, type PageAction } from '../../plugins/PageActions'\nimport { InviteMemberDialog } from './InviteMemberDialog'\nimport { toast } from '../notifications/ToastProvider'\nimport { useOrganizationStore } from '../../stores/organization.store'\nimport { usePermissionsStore } from '../../permissions/store'\nimport { useInviteStore } from '../../stores/invite.store'\nimport { useMemberAccessPanel, MemberUnitsCell, useUnitStore, useUnitBootstrap } from '../../units'\n// Native org adapter (see InviteMemberDialog) — the shell context is un-provided.\nimport { useOrgAdapterOptional as useNativeOrgAdapter } from '../../org'\nimport type { OrgAdapter } from '../../types/org-adapter'\nconst useOrgAdapterOptional = () => useNativeOrgAdapter() as unknown as OrgAdapter | null\nimport { useAuthStore } from '@fayz-ai/auth'\nimport { useSystemPermission } from '../../hooks/useSystemPermission'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { dedup } from '../../lib/dedup'\nimport { useLimitGuard } from '../../access/context'\nimport { invalidateLimit } from '../../access/limits-registry'\nimport { entityRouteHasDetail, openEntity } from '../../lib/entity-routes'\nimport { ImpersonateDialog, type ImpersonateTarget } from '../../impersonation/ImpersonateDialog'\n\n// A normalized team row: either a person (person-first mode) with an optional\n// access overlay, or a legacy tenant_members row. `memberId` present ⇒ has login+role.\ninterface TeamRow {\n key: string\n /** The person record behind the row, when there is one. Login-only rows\n * (the owner who never staffed herself) carry none. */\n personId?: string\n kind?: string\n name: string\n email: string\n avatarUrl?: string\n /** kind label shown next to the name in person mode (e.g. \"Staff\"). */\n subtitle?: string\n roleId?: string\n roleName?: string\n memberId?: string\n /** The auth user behind the row — what a unit binding is keyed by. */\n userId?: string\n hasAccess: boolean\n joinedAt?: string\n isCurrentUser: boolean\n}\n\nconst capitalize = (s: string) => (s ? s.charAt(0).toUpperCase() + s.slice(1) : s)\n\nexport function TeamTab() {\n const adapter = useOrgAdapterOptional()\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n const members = useOrganizationStore((s) => s.members)\n const setMembers = useOrganizationStore((s) => s.setMembers)\n const teamPersonKinds = useOrganizationStore((s) => s.teamPersonKinds)\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\n // Person-first mode: drive the list from people of the configured kinds when\n // the adapter supports it. Otherwise fall back to the legacy members list.\n const personMode = teamPersonKinds.length > 0 && typeof adapter?.listTeam === 'function'\n const [team, setTeam] = React.useState<Awaited<ReturnType<NonNullable<OrgAdapter['listTeam']>>> | null>(null)\n\n const [inviteOpen, setInviteOpen] = React.useState(false)\n // Seat cap ('users' limit → tenant_members count). Guarded before opening the\n // invite dialog; the guard opens the global UpgradeModal when at the cap.\n const guardSeats = useLimitGuard('users')\n\n // Quem o convite está convidando. Um diálogo em branco aberto a partir da\n // LINHA de alguém fazia digitar de memória o e-mail de quem já estava na\n // tela — e o e-mail digitado ali é o que decide se o convite aceito vira a\n // mesma pessoa ou uma segunda ficha (ver a aba Acesso).\n const [inviteEmail, setInviteEmail] = React.useState<string | undefined>(undefined)\n\n const handleOpenInvite = async (row?: TeamRow) => {\n // Sem e-mail na ficha não há o que preencher, e adivinhar é justamente o\n // erro: a ficha da pessoa é onde o e-mail se resolve e se GRAVA.\n if (row && !row.email && row.personId && entityRouteHasDetail('person', row.kind)) {\n openEntity(row.personId, 'person', row.kind, 'access')\n return\n }\n if ((await guardSeats(1)) === 'blocked') return\n setInviteEmail(row?.email || undefined)\n setInviteOpen(true)\n }\n\n const reloadTeam = React.useCallback(async () => {\n if (!adapter || !currentOrg) return\n if (personMode && adapter.listTeam) {\n setTeam(await adapter.listTeam(currentOrg.id, teamPersonKinds))\n } else {\n setMembers(await adapter.listMembers(currentOrg.id))\n }\n }, [adapter, currentOrg?.id, personMode, teamPersonKinds, setMembers])\n\n // Load the person-first team list when in person mode (deduped).\n React.useEffect(() => {\n if (personMode && adapter?.listTeam && currentOrg) {\n dedup('team:people:' + currentOrg.id, () => adapter.listTeam!(currentOrg.id, teamPersonKinds))\n .then(setTeam)\n .catch(() => setTeam([]))\n }\n }, [personMode, adapter, currentOrg?.id, teamPersonKinds.join(',')])\n\n // Load invites on mount (deduped to avoid strict mode double-fetch)\n React.useEffect(() => {\n if (adapter && currentOrg) {\n dedup('team:invites:' + currentOrg.id, () => adapter.listInvites(currentOrg.id)).then(setInvites).catch(() => {})\n }\n }, [adapter, currentOrg?.id])\n\n const handleChangeProfile = async (memberId: string, profileId: string) => {\n if (!adapter || !currentOrg) return\n try {\n await adapter.updateMemberProfile(currentOrg.id, memberId, profileId)\n await reloadTeam()\n } catch {\n // ignore\n }\n }\n\n const handleRemoveMember = async (memberId: string) => {\n if (!adapter || !currentOrg) return\n try {\n await adapter.removeMember(currentOrg.id, memberId)\n await reloadTeam()\n } catch {\n // ignore\n }\n }\n\n // Which units a person works in — only offered once the org actually works\n // with units, so a single-site business never sees the concept.\n useUnitBootstrap()\n const unitMode = useUnitStore((st) => st.unitMode)\n // Abre na coluna da direita, ao lado da lista, e não numa gaveta por cima\n // dela: ver as unidades de alguém é consulta, não destino.\n const openMemberAccess = useMemberAccessPanel((st) => st.openMember)\n\n // Normalized rows for the table — person-first or legacy members.\n const rows: TeamRow[] = personMode\n ? (team ?? []).map((p) => ({\n // Login-only rows carry no personId — key off the membership instead.\n key: p.personId ?? p.membership?.memberId ?? p.name,\n personId: p.personId,\n kind: p.kind,\n name: p.name,\n email: p.email ?? '',\n avatarUrl: p.avatarUrl,\n subtitle: p.kind ? capitalize(p.kind) : undefined,\n roleId: p.membership?.profileId,\n roleName: p.membership?.profileName,\n memberId: p.membership?.memberId,\n userId: p.membership?.userId,\n hasAccess: !!p.membership,\n joinedAt: p.membership?.joinedAt,\n isCurrentUser: p.membership?.userId === user?.id,\n }))\n : members.map((m) => ({\n key: m.id,\n personId: m.personId,\n kind: m.personKind,\n name: m.user.fullName,\n email: m.user.email,\n avatarUrl: m.user.avatarUrl,\n roleId: m.profileId,\n roleName: m.profileName,\n memberId: m.id,\n userId: m.userId,\n hasAccess: true,\n joinedAt: m.joinedAt,\n isCurrentUser: m.userId === user?.id,\n }))\n const rowsLoading = personMode ? team === null : members.length === 0\n\n const handleRevokeInvite = async (inviteId: string) => {\n if (!adapter || !currentOrg) return\n try {\n await adapter.revokeInvite(currentOrg.id, inviteId)\n const updated = await adapter.listInvites(currentOrg.id)\n setInvites(updated)\n toast.success(t('organization.team.inviteRevoked'))\n } catch (err: any) {\n toast.error(t('organization.team.inviteActionFailed'), { description: err?.message })\n }\n }\n\n const handleResendInvite = async (inviteId: string) => {\n if (!adapter || !currentOrg) return\n try {\n await adapter.resendInvite(currentOrg.id, inviteId)\n const updated = await adapter.listInvites(currentOrg.id)\n setInvites(updated)\n toast.success(t('organization.team.inviteResent'))\n } catch (err: any) {\n toast.error(t('organization.team.inviteActionFailed'), { description: err?.message })\n }\n }\n\n const { t } = useTranslation()\n const canManageTeam = hasSystemPermission('manage_team')\n const [viewAs, setViewAs] = React.useState<ImpersonateTarget | null>(null)\n const inviteActions = React.useMemo<PageAction[]>(() => [{\n id: 'invite',\n label: t('organization.team.invite'),\n icon: UserPlus,\n intent: 'primary',\n // Inviting IS how a person gets added here, so the phone's circle is a \"+\".\n creates: true,\n onSelect: () => { void handleOpenInvite() },\n }], [t])\n const pendingInvites = invites.filter((i) => i.status === 'pending')\n\n const columns: ColumnDef<TeamRow>[] = [\n {\n id: 'member',\n header: t('organization.team.member'),\n cell: ({ row: { original: row } }) => {\n const initials = (row.name || '?')\n .split(' ')\n .map((n) => n[0])\n .join('')\n .toUpperCase()\n .slice(0, 2)\n return (\n <div className=\"flex items-center gap-3\">\n <Avatar className=\"h-8 w-8\">\n {row.avatarUrl && <AvatarImage src={row.avatarUrl} />}\n <AvatarFallback className=\"text-xs\">{initials}</AvatarFallback>\n </Avatar>\n <div>\n <p className=\"text-sm font-medium\">\n {row.name}\n {row.isCurrentUser && <span className=\"text-muted-foreground ml-1\">{t('organization.team.you')}</span>}\n {row.subtitle && <Badge variant=\"outline\" className=\"ml-2 text-[10px] font-normal\">{row.subtitle}</Badge>}\n </p>\n {row.email && <p className=\"text-xs text-muted-foreground\">{row.email}</p>}\n </div>\n </div>\n )\n },\n },\n {\n id: 'role',\n header: t('organization.team.role'),\n cell: ({ row: { original: row } }) =>\n !row.hasAccess ? (\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"outline\" className=\"text-xs text-muted-foreground\">{t('organization.team.noAccess')}</Badge>\n {canManageTeam && (\n <Button variant=\"ghost\" size=\"sm\" className=\"h-7 text-xs\" onClick={() => { void handleOpenInvite(row) }}>\n <UserPlus className=\"h-3 w-3 mr-1\" />\n {t('organization.team.invite')}\n </Button>\n )}\n </div>\n ) : canManageTeam && !row.isCurrentUser && row.memberId ? (\n <Select\n value={row.roleId}\n onValueChange={(val) => handleChangeProfile(row.memberId!, val)}\n >\n <SelectTrigger className=\"h-8 w-36 text-xs\">\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 <Badge variant=\"secondary\" className=\"text-xs\">\n {profiles.find((p) => p.id === row.roleId)?.name ?? row.roleName}\n </Badge>\n ),\n },\n ...(unitMode ? [{\n id: 'units',\n header: 'Unidades',\n cell: ({ row: { original: row } }) => (\n <MemberUnitsCell\n userId={row.userId}\n onManage={canManageTeam && row.userId\n ? () => openMemberAccess({ userId: row.userId!, name: row.name, email: row.email })\n : undefined}\n />\n ),\n } satisfies ColumnDef<TeamRow>] : []),\n {\n id: 'joined',\n header: t('organization.team.joined'),\n cell: ({ row: { original: row } }) => (\n <span className=\"text-sm text-muted-foreground\">\n {row.joinedAt ? new Date(row.joinedAt).toLocaleDateString() : '—'}\n </span>\n ),\n },\n ...(canManageTeam ? [{\n id: 'actions',\n header: '',\n meta: { className: 'w-12 text-right' },\n cell: ({ row: { original: row } }) => (\n <RowActions\n actions={[\n // A ficha é onde acesso, unidades, escala e\n // histórico da pessoa moram juntos — esta tela é\n // a lista, não o lugar de editar cada um deles.\n {\n id: 'record',\n label: t('organization.team.openRecord'),\n icon: Contact,\n hidden: !row.personId || !entityRouteHasDetail('person', row.kind),\n onSelect: () => openEntity(row.personId!, 'person', row.kind, 'access'),\n },\n {\n id: 'units',\n label: t('organization.team.unitAccess'),\n icon: Building2,\n hidden: !unitMode || !row.userId || !row.hasAccess,\n onSelect: () => openMemberAccess({ userId: row.userId!, name: row.name, email: row.email }),\n },\n {\n id: 'impersonate',\n label: t('impersonation.action'),\n icon: Eye,\n // The owner is out of reach on the server too.\n hidden: !row.hasAccess || row.isCurrentUser || !row.userId || row.roleId === 'owner',\n onSelect: () => setViewAs({ userId: row.userId!, name: row.name }),\n },\n {\n id: 'remove',\n label: t('organization.team.removeMember'),\n icon: UserMinus,\n intent: 'danger',\n hidden: !row.hasAccess || row.isCurrentUser || !row.memberId,\n onSelect: () => handleRemoveMember(row.memberId!),\n },\n ]}\n />\n ),\n } satisfies ColumnDef<TeamRow>] : []),\n ]\n\n return (\n <div className=\"space-y-6\">\n {currentOrg && <ImpersonateDialog tenantId={currentOrg.id} target={viewAs} onClose={() => setViewAs(null)} />}\n {/* Members */}\n <div>\n {/* O nome da tela é da barra (\"Equipe\"); aqui fica só a contagem, e o\n convidar sobe para a direita da barra como toda ação de página. */}\n {canManageTeam && (\n <PageHeaderActions>\n {/* Declared, not drawn: the shell renders it in the header bar on a\n desktop and as the circle in the thumb's corner on a phone. The\n seat cap is already guarded inside handleOpenInvite, so this\n does NOT repeat it as a limitKey. */}\n <PageActions actions={inviteActions} />\n </PageHeaderActions>\n )}\n <p className=\"mb-4 text-sm text-muted-foreground\">\n {t('organization.team.memberCount', { count: String(rows.length), plural: rows.length !== 1 ? 's' : '' })}\n </p>\n\n <Card className=\"overflow-hidden\">\n <DataTable\n variant=\"bare\"\n columns={columns}\n data={rows}\n loading={rowsLoading}\n getRowId={(row) => row.key}\n emptyMessage={t('organization.team.empty')}\n />\n </Card>\n </div>\n\n\n {/* Pending Invites */}\n {pendingInvites.length > 0 && (\n <div>\n <h3 className=\"text-lg font-semibold mb-3\">{t('organization.team.pendingInvites')}</h3>\n <div className=\"space-y-2\">\n {pendingInvites.map((invite) => (\n <Card key={invite.id} className=\"p-3\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-8 w-8 items-center justify-center rounded-full bg-muted\">\n <Mail className=\"h-4 w-4 text-muted-foreground\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium\">{invite.email}</p>\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <Badge variant=\"secondary\" className=\"text-xs\">{invite.profileName}</Badge>\n <span className=\"flex items-center gap-1\">\n <Clock className=\"h-3 w-3\" />\n Sent {new Date(invite.createdAt).toLocaleDateString()}\n </span>\n </div>\n </div>\n {canManageTeam && (\n <RowActions\n actions={[\n {\n id: 'resend',\n label: t('organization.team.resend'),\n icon: Send,\n onSelect: () => handleResendInvite(invite.id),\n },\n {\n id: 'revoke',\n label: t('organization.team.revoke'),\n icon: Ban,\n intent: 'danger',\n onSelect: () => handleRevokeInvite(invite.id),\n },\n ]}\n />\n )}\n </div>\n </Card>\n ))}\n </div>\n </div>\n )}\n\n <InviteMemberDialog\n open={inviteOpen}\n defaultEmail={inviteEmail}\n onOpenChange={(open) => {\n setInviteOpen(open)\n // On close (after a successful invite the dialog closes itself),\n // refresh the seat count so the guard/banner reflect the new member.\n if (!open) {\n invalidateLimit('users')\n setInviteEmail(undefined)\n void reloadTeam()\n }\n }}\n />\n </div>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/components/organization/InviteMemberDialog.tsx","../src/impersonation/ImpersonateDialog.tsx","../src/components/organization/TeamTab.tsx"],"names":["useOrgAdapterOptional","React","React2","jsx","Modal","jsxs","ModalContent","ModalHeader","ModalTitle","ModalDescription","Input","ModalFooter","Button","useAuthStore","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Eye"],"mappings":"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","file":"TeamTab-M5SAKV6M.js","sourcesContent":["import * as React from 'react'\nimport { Plus, X } from 'lucide-react'\nimport { toast } from '../notifications/ToastProvider'\nimport {\n Modal,\n ModalContent,\n ModalHeader,\n ModalTitle,\n ModalDescription,\n ModalFooter,\n} from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { Input } from '@fayz-ai/ui'\nimport { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport { usePermissionsStore } from '../../permissions'\nimport { useOrganizationStore } from '../../stores/organization.store'\nimport { useInviteStore } from '../../stores/invite.store'\n// Native org adapter (the one the app actually provides). The shell lib/org-context\n// is a separate, un-provided context that returns null here — which made the submit\n// button a no-op (handleSend bailed on `!adapter`).\nimport { useOrgAdapterOptional as useNativeOrgAdapter } from '../../org'\nimport type { OrgAdapter } from '../../types/org-adapter'\n\n// The native adapter is the same runtime object; its Invite/Location types differ\n// from the shell's only in fields these components don't read, so a cast is safe.\nconst useOrgAdapterOptional = () => useNativeOrgAdapter() as unknown as OrgAdapter | null\n// The signed-in user lives in @fayz-ai/auth's store (what OrgProvider reads). The\n// shell stores/auth.store is a separate, unpopulated store — reading `user` from\n// it left `user` null, so handleSend bailed on `!user` (silent no-op).\nimport { useAuthStore } from '@fayz-ai/auth'\nimport { useTranslation } from '../../hooks/useTranslation'\n\ninterface InviteMemberDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /** Pre-fill the first email (e.g. from person detail Access tab) */\n defaultEmail?: string\n}\n\nexport function InviteMemberDialog({ open, onOpenChange, defaultEmail }: InviteMemberDialogProps) {\n const { t } = useTranslation()\n const adapter = useOrgAdapterOptional()\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n const profiles = usePermissionsStore((s) => s.profiles)\n const setInvites = useInviteStore((s) => s.setInvites)\n const { user } = useAuthStore()\n\n const [emails, setEmails] = React.useState<string[]>([defaultEmail ?? ''])\n const [profileId, setProfileId] = React.useState(profiles[1]?.id ?? profiles[0]?.id ?? '')\n const [sending, setSending] = React.useState(false)\n const [sent, setSent] = React.useState(false)\n\n // O prefill só chegava no PRIMEIRO render, e o diálogo fica montado o tempo\n // todo — abrir a partir da linha de alguém trazia o e-mail de quem foi\n // convidado antes, ou nada. O e-mail é a coisa que este diálogo não pode\n // errar: é ele que liga o convite aceito à ficha certa.\n React.useEffect(() => {\n if (open) setEmails([defaultEmail ?? ''])\n }, [open, defaultEmail])\n\n // A lista de papéis chega depois do primeiro render (vem do adaptador), e\n // sem isto o seletor abria vazio e o Enviar mandava um papel em branco.\n React.useEffect(() => {\n if (!profileId && profiles.length) setProfileId(profiles[1]?.id ?? profiles[0]!.id)\n }, [profiles, profileId])\n\n const addEmail = () => setEmails((prev) => [...prev, ''])\n\n const updateEmail = (idx: number, value: string) => {\n setEmails((prev) => {\n const next = [...prev]\n next[idx] = value\n return next\n })\n }\n\n const removeEmail = (idx: number) => {\n setEmails((prev) => prev.filter((_, i) => i !== idx))\n }\n\n const handleSend = async () => {\n if (!adapter || !currentOrg || !user) return\n const validEmails = emails.filter((e) => e.trim() && e.includes('@'))\n if (validEmails.length === 0) return\n\n setSending(true)\n try {\n if (validEmails.length === 1) {\n await adapter.createInvite(currentOrg.id, validEmails[0].trim(), profileId, user.id)\n } else {\n await adapter.bulkInvite(currentOrg.id, validEmails.map((e) => e.trim()), profileId, user.id)\n }\n const invites = await adapter.listInvites(currentOrg.id)\n setInvites(invites)\n setSent(true)\n } catch (err: any) {\n toast.error('Failed to send invites', { description: err?.message })\n } finally {\n setSending(false)\n }\n }\n\n const handleClose = () => {\n onOpenChange(false)\n // Reset after animation\n setTimeout(() => {\n setEmails([''])\n setProfileId(profiles[1]?.id ?? profiles[0]?.id ?? '')\n setSent(false)\n }, 200)\n }\n\n return (\n <Modal open={open} onOpenChange={handleClose}>\n <ModalContent>\n <ModalHeader>\n <ModalTitle>{t('organization.invite.title')}</ModalTitle>\n <ModalDescription>{t('organization.invite.description')}</ModalDescription>\n </ModalHeader>\n\n {sent ? (\n <div className=\"py-8 text-center\">\n <div className=\"mx-auto mb-3 flex h-12 w-12 items-center justify-center rounded-full bg-success/10\">\n <svg className=\"h-6 w-6 text-success\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={2} stroke=\"currentColor\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\" /></svg>\n </div>\n <p className=\"text-sm font-medium\">{t('organization.invite.sent')}</p>\n <p className=\"text-xs text-muted-foreground mt-1\">{t('organization.invite.sentDescription')}</p>\n </div>\n ) : (\n <div className=\"space-y-4 py-4\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">{t('organization.invite.emailLabel')}</label>\n {emails.map((email, idx) => (\n <div key={idx} className=\"flex items-center gap-2\">\n <Input\n type=\"email\"\n placeholder=\"team@example.com\"\n value={email}\n onChange={(e) => updateEmail(idx, e.target.value)}\n />\n {emails.length > 1 && (\n <Button variant=\"ghost\" size=\"sm\" onClick={() => removeEmail(idx)}>\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n ))}\n <Button variant=\"ghost\" size=\"sm\" onClick={addEmail} className=\"text-xs\">\n <Plus className=\"h-3.5 w-3.5 mr-1\" />\n {t('organization.invite.addAnother')}\n </Button>\n </div>\n\n <div>\n <label className=\"text-sm font-medium\">{t('organization.invite.roleLabel')}</label>\n <Select value={profileId} onValueChange={setProfileId}>\n <SelectTrigger className=\"mt-1\">\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 </div>\n )}\n\n <ModalFooter>\n {sent ? (\n <Button onClick={handleClose}>{t('common.done')}</Button>\n ) : (\n <>\n <Button variant=\"outline\" onClick={handleClose}>{t('common.cancel')}</Button>\n <Button onClick={handleSend} disabled={sending || emails.every((e) => !e.trim())}>\n {sending ? t('organization.invite.sending') : t('organization.invite.sendInvites')}\n </Button>\n </>\n )}\n </ModalFooter>\n </ModalContent>\n </Modal>\n )\n}\n","import * as React from 'react'\nimport { Eye } from 'lucide-react'\nimport { Modal, ModalContent, ModalHeader, ModalTitle, ModalDescription, ModalFooter, Button, Input } from '@fayz-ai/ui'\nimport { useTranslation } from '../hooks/useTranslation'\nimport { startImpersonation } from './session'\nimport { currentAppPath } from '@fayz-ai/core'\n\nexport interface ImpersonateTarget {\n userId: string\n name: string\n}\n\nexport function ImpersonateDialog({ tenantId, target, onClose }: {\n tenantId: string\n target: ImpersonateTarget | null\n onClose: () => void\n}) {\n const { t } = useTranslation()\n const [reason, setReason] = React.useState('')\n const [busy, setBusy] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n\n React.useEffect(() => {\n if (target) { setReason(''); setError(null); setBusy(false) }\n }, [target])\n\n async function enter() {\n if (!target) return\n setBusy(true)\n setError(null)\n try {\n await startImpersonation({\n tenantId,\n userId: target.userId,\n reason: reason.trim() || undefined,\n returnTo: currentAppPath(),\n })\n } catch (err) {\n setError((err as Error).message || t('impersonation.failed'))\n setBusy(false)\n }\n }\n\n return (\n <Modal open={!!target} onOpenChange={(open) => { if (!open && !busy) onClose() }}>\n <ModalContent>\n <ModalHeader>\n <ModalTitle>{t('impersonation.confirmTitle', { name: target?.name ?? '' })}</ModalTitle>\n <ModalDescription>{t('impersonation.confirmBody')}</ModalDescription>\n </ModalHeader>\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium\">{t('impersonation.reasonLabel')}</label>\n <Input value={reason} onChange={(e) => setReason(e.target.value)} disabled={busy} />\n {error && <p className=\"text-sm text-destructive\">{error}</p>}\n </div>\n <ModalFooter>\n <Button variant=\"outline\" onClick={onClose} disabled={busy}>{t('common.cancel')}</Button>\n <Button onClick={() => { void enter() }} disabled={busy}>\n <Eye className=\"mr-2 h-4 w-4\" />\n {t('impersonation.confirm')}\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n )\n}\n","import * as React from 'react'\nimport { UserPlus, UserMinus, Mail, Clock, Building2, Send, Ban, Contact, Eye } from 'lucide-react'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { Card, DataTable } from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { PageHeaderActions } from '@fayz-ai/ui'\nimport { RowActions } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport { Avatar, AvatarFallback, AvatarImage } from '@fayz-ai/ui'\nimport { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from '@fayz-ai/ui'\nimport { PageActions, type PageAction } from '../../plugins/PageActions'\nimport { InviteMemberDialog } from './InviteMemberDialog'\nimport { toast } from '../notifications/ToastProvider'\nimport { useOrganizationStore } from '../../stores/organization.store'\nimport { usePermissionsStore } from '../../permissions/store'\nimport { useInviteStore } from '../../stores/invite.store'\nimport { useMemberAccessPanel, MemberUnitsCell, useUnitStore, useUnitBootstrap } from '../../units'\n// Native org adapter (see InviteMemberDialog) — the shell context is un-provided.\nimport { useOrgAdapterOptional as useNativeOrgAdapter } from '../../org'\nimport type { OrgAdapter } from '../../types/org-adapter'\nconst useOrgAdapterOptional = () => useNativeOrgAdapter() as unknown as OrgAdapter | null\nimport { useAuthStore } from '@fayz-ai/auth'\nimport { useSystemPermission } from '../../hooks/useSystemPermission'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { dedup } from '../../lib/dedup'\nimport { useLimitGuard } from '../../access/context'\nimport { invalidateLimit } from '../../access/limits-registry'\nimport { entityRouteHasDetail, openEntity } from '../../lib/entity-routes'\nimport { ImpersonateDialog, type ImpersonateTarget } from '../../impersonation/ImpersonateDialog'\n\n// A normalized team row: either a person (person-first mode) with an optional\n// access overlay, or a legacy tenant_members row. `memberId` present ⇒ has login+role.\ninterface TeamRow {\n key: string\n /** The person record behind the row, when there is one. Login-only rows\n * (the owner who never staffed herself) carry none. */\n personId?: string\n kind?: string\n name: string\n email: string\n avatarUrl?: string\n /** kind label shown next to the name in person mode (e.g. \"Staff\"). */\n subtitle?: string\n roleId?: string\n roleName?: string\n memberId?: string\n /** The auth user behind the row — what a unit binding is keyed by. */\n userId?: string\n hasAccess: boolean\n joinedAt?: string\n isCurrentUser: boolean\n}\n\nconst capitalize = (s: string) => (s ? s.charAt(0).toUpperCase() + s.slice(1) : s)\n\nexport function TeamTab() {\n const adapter = useOrgAdapterOptional()\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n const members = useOrganizationStore((s) => s.members)\n const setMembers = useOrganizationStore((s) => s.setMembers)\n const teamPersonKinds = useOrganizationStore((s) => s.teamPersonKinds)\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\n // Person-first mode: drive the list from people of the configured kinds when\n // the adapter supports it. Otherwise fall back to the legacy members list.\n const personMode = teamPersonKinds.length > 0 && typeof adapter?.listTeam === 'function'\n const [team, setTeam] = React.useState<Awaited<ReturnType<NonNullable<OrgAdapter['listTeam']>>> | null>(null)\n\n const [inviteOpen, setInviteOpen] = React.useState(false)\n // Seat cap ('users' limit → tenant_members count). Guarded before opening the\n // invite dialog; the guard opens the global UpgradeModal when at the cap.\n const guardSeats = useLimitGuard('users')\n\n // Quem o convite está convidando. Um diálogo em branco aberto a partir da\n // LINHA de alguém fazia digitar de memória o e-mail de quem já estava na\n // tela — e o e-mail digitado ali é o que decide se o convite aceito vira a\n // mesma pessoa ou uma segunda ficha (ver a aba Acesso).\n const [inviteEmail, setInviteEmail] = React.useState<string | undefined>(undefined)\n\n const handleOpenInvite = async (row?: TeamRow) => {\n // Sem e-mail na ficha não há o que preencher, e adivinhar é justamente o\n // erro: a ficha da pessoa é onde o e-mail se resolve e se GRAVA.\n if (row && !row.email && row.personId && entityRouteHasDetail('person', row.kind)) {\n openEntity(row.personId, 'person', row.kind, 'access')\n return\n }\n if ((await guardSeats(1)) === 'blocked') return\n setInviteEmail(row?.email || undefined)\n setInviteOpen(true)\n }\n\n const reloadTeam = React.useCallback(async () => {\n if (!adapter || !currentOrg) return\n if (personMode && adapter.listTeam) {\n setTeam(await adapter.listTeam(currentOrg.id, teamPersonKinds))\n } else {\n setMembers(await adapter.listMembers(currentOrg.id))\n }\n }, [adapter, currentOrg?.id, personMode, teamPersonKinds, setMembers])\n\n // Load the person-first team list when in person mode (deduped).\n React.useEffect(() => {\n if (personMode && adapter?.listTeam && currentOrg) {\n dedup('team:people:' + currentOrg.id, () => adapter.listTeam!(currentOrg.id, teamPersonKinds))\n .then(setTeam)\n .catch(() => setTeam([]))\n }\n }, [personMode, adapter, currentOrg?.id, teamPersonKinds.join(',')])\n\n // Load invites on mount (deduped to avoid strict mode double-fetch)\n React.useEffect(() => {\n if (adapter && currentOrg) {\n dedup('team:invites:' + currentOrg.id, () => adapter.listInvites(currentOrg.id)).then(setInvites).catch(() => {})\n }\n }, [adapter, currentOrg?.id])\n\n const handleChangeProfile = async (memberId: string, profileId: string) => {\n if (!adapter || !currentOrg) return\n try {\n await adapter.updateMemberProfile(currentOrg.id, memberId, profileId)\n await reloadTeam()\n } catch {\n // ignore\n }\n }\n\n const handleRemoveMember = async (memberId: string) => {\n if (!adapter || !currentOrg) return\n try {\n await adapter.removeMember(currentOrg.id, memberId)\n await reloadTeam()\n } catch {\n // ignore\n }\n }\n\n // Which units a person works in — only offered once the org actually works\n // with units, so a single-site business never sees the concept.\n useUnitBootstrap()\n const unitMode = useUnitStore((st) => st.unitMode)\n // Abre na coluna da direita, ao lado da lista, e não numa gaveta por cima\n // dela: ver as unidades de alguém é consulta, não destino.\n const openMemberAccess = useMemberAccessPanel((st) => st.openMember)\n\n // Normalized rows for the table — person-first or legacy members.\n const rows: TeamRow[] = personMode\n ? (team ?? []).map((p) => ({\n // Login-only rows carry no personId — key off the membership instead.\n key: p.personId ?? p.membership?.memberId ?? p.name,\n personId: p.personId,\n kind: p.kind,\n name: p.name,\n email: p.email ?? '',\n avatarUrl: p.avatarUrl,\n subtitle: p.kind ? capitalize(p.kind) : undefined,\n roleId: p.membership?.profileId,\n roleName: p.membership?.profileName,\n memberId: p.membership?.memberId,\n userId: p.membership?.userId,\n hasAccess: !!p.membership,\n joinedAt: p.membership?.joinedAt,\n isCurrentUser: p.membership?.userId === user?.id,\n }))\n : members.map((m) => ({\n key: m.id,\n personId: m.personId,\n kind: m.personKind,\n name: m.user.fullName,\n email: m.user.email,\n avatarUrl: m.user.avatarUrl,\n roleId: m.profileId,\n roleName: m.profileName,\n memberId: m.id,\n userId: m.userId,\n hasAccess: true,\n joinedAt: m.joinedAt,\n isCurrentUser: m.userId === user?.id,\n }))\n const rowsLoading = personMode ? team === null : members.length === 0\n\n const handleRevokeInvite = async (inviteId: string) => {\n if (!adapter || !currentOrg) return\n try {\n await adapter.revokeInvite(currentOrg.id, inviteId)\n const updated = await adapter.listInvites(currentOrg.id)\n setInvites(updated)\n toast.success(t('organization.team.inviteRevoked'))\n } catch (err: any) {\n toast.error(t('organization.team.inviteActionFailed'), { description: err?.message })\n }\n }\n\n const handleResendInvite = async (inviteId: string) => {\n if (!adapter || !currentOrg) return\n try {\n await adapter.resendInvite(currentOrg.id, inviteId)\n const updated = await adapter.listInvites(currentOrg.id)\n setInvites(updated)\n toast.success(t('organization.team.inviteResent'))\n } catch (err: any) {\n toast.error(t('organization.team.inviteActionFailed'), { description: err?.message })\n }\n }\n\n const { t } = useTranslation()\n const canManageTeam = hasSystemPermission('manage_team')\n const [viewAs, setViewAs] = React.useState<ImpersonateTarget | null>(null)\n const inviteActions = React.useMemo<PageAction[]>(() => [{\n id: 'invite',\n label: t('organization.team.invite'),\n icon: UserPlus,\n intent: 'primary',\n // Inviting IS how a person gets added here, so the phone's circle is a \"+\".\n creates: true,\n onSelect: () => { void handleOpenInvite() },\n }], [t])\n const pendingInvites = invites.filter((i) => i.status === 'pending')\n\n const columns: ColumnDef<TeamRow>[] = [\n {\n id: 'member',\n header: t('organization.team.member'),\n cell: ({ row: { original: row } }) => {\n const initials = (row.name || '?')\n .split(' ')\n .map((n) => n[0])\n .join('')\n .toUpperCase()\n .slice(0, 2)\n return (\n <div className=\"flex items-center gap-3\">\n <Avatar className=\"h-8 w-8\">\n {row.avatarUrl && <AvatarImage src={row.avatarUrl} />}\n <AvatarFallback className=\"text-xs\">{initials}</AvatarFallback>\n </Avatar>\n <div>\n <p className=\"text-sm font-medium\">\n {row.name}\n {row.isCurrentUser && <span className=\"text-muted-foreground ml-1\">{t('organization.team.you')}</span>}\n {row.subtitle && <Badge variant=\"outline\" className=\"ml-2 text-[10px] font-normal\">{row.subtitle}</Badge>}\n </p>\n {row.email && <p className=\"text-xs text-muted-foreground\">{row.email}</p>}\n </div>\n </div>\n )\n },\n },\n {\n id: 'role',\n header: t('organization.team.role'),\n cell: ({ row: { original: row } }) =>\n !row.hasAccess ? (\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"outline\" className=\"text-xs text-muted-foreground\">{t('organization.team.noAccess')}</Badge>\n {canManageTeam && (\n <Button variant=\"ghost\" size=\"sm\" className=\"h-7 text-xs\" onClick={() => { void handleOpenInvite(row) }}>\n <UserPlus className=\"h-3 w-3 mr-1\" />\n {t('organization.team.invite')}\n </Button>\n )}\n </div>\n ) : canManageTeam && !row.isCurrentUser && row.memberId ? (\n <Select\n value={row.roleId}\n onValueChange={(val) => handleChangeProfile(row.memberId!, val)}\n >\n <SelectTrigger className=\"h-8 w-36 text-xs\">\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 <Badge variant=\"secondary\" className=\"text-xs\">\n {profiles.find((p) => p.id === row.roleId)?.name ?? row.roleName}\n </Badge>\n ),\n },\n ...(unitMode ? [{\n id: 'units',\n header: 'Unidades',\n cell: ({ row: { original: row } }) => (\n <MemberUnitsCell\n userId={row.userId}\n onManage={canManageTeam && row.userId\n ? () => openMemberAccess({ userId: row.userId!, name: row.name, email: row.email })\n : undefined}\n />\n ),\n } satisfies ColumnDef<TeamRow>] : []),\n {\n id: 'joined',\n header: t('organization.team.joined'),\n cell: ({ row: { original: row } }) => (\n <span className=\"text-sm text-muted-foreground\">\n {row.joinedAt ? new Date(row.joinedAt).toLocaleDateString() : '—'}\n </span>\n ),\n },\n ...(canManageTeam ? [{\n id: 'actions',\n header: '',\n meta: { className: 'w-12 text-right' },\n cell: ({ row: { original: row } }) => (\n <RowActions\n actions={[\n // A ficha é onde acesso, unidades, escala e\n // histórico da pessoa moram juntos — esta tela é\n // a lista, não o lugar de editar cada um deles.\n {\n id: 'record',\n label: t('organization.team.openRecord'),\n icon: Contact,\n hidden: !row.personId || !entityRouteHasDetail('person', row.kind),\n onSelect: () => openEntity(row.personId!, 'person', row.kind, 'access'),\n },\n {\n id: 'units',\n label: t('organization.team.unitAccess'),\n icon: Building2,\n hidden: !unitMode || !row.userId || !row.hasAccess,\n onSelect: () => openMemberAccess({ userId: row.userId!, name: row.name, email: row.email }),\n },\n {\n id: 'impersonate',\n label: t('impersonation.action'),\n icon: Eye,\n // The owner is out of reach on the server too.\n hidden: !row.hasAccess || row.isCurrentUser || !row.userId || row.roleId === 'owner',\n onSelect: () => setViewAs({ userId: row.userId!, name: row.name }),\n },\n {\n id: 'remove',\n label: t('organization.team.removeMember'),\n icon: UserMinus,\n intent: 'danger',\n hidden: !row.hasAccess || row.isCurrentUser || !row.memberId,\n onSelect: () => handleRemoveMember(row.memberId!),\n },\n ]}\n />\n ),\n } satisfies ColumnDef<TeamRow>] : []),\n ]\n\n return (\n <div className=\"space-y-6\">\n {currentOrg && <ImpersonateDialog tenantId={currentOrg.id} target={viewAs} onClose={() => setViewAs(null)} />}\n {/* Members */}\n <div>\n {/* O nome da tela é da barra (\"Equipe\"); aqui fica só a contagem, e o\n convidar sobe para a direita da barra como toda ação de página. */}\n {canManageTeam && (\n <PageHeaderActions>\n {/* Declared, not drawn: the shell renders it in the header bar on a\n desktop and as the circle in the thumb's corner on a phone. The\n seat cap is already guarded inside handleOpenInvite, so this\n does NOT repeat it as a limitKey. */}\n <PageActions actions={inviteActions} />\n </PageHeaderActions>\n )}\n <p className=\"mb-4 text-sm text-muted-foreground\">\n {t('organization.team.memberCount', { count: String(rows.length), plural: rows.length !== 1 ? 's' : '' })}\n </p>\n\n <Card className=\"overflow-hidden\">\n <DataTable\n variant=\"bare\"\n columns={columns}\n data={rows}\n loading={rowsLoading}\n getRowId={(row) => row.key}\n emptyMessage={t('organization.team.empty')}\n />\n </Card>\n </div>\n\n\n {/* Pending Invites */}\n {pendingInvites.length > 0 && (\n <div>\n <h3 className=\"text-lg font-semibold mb-3\">{t('organization.team.pendingInvites')}</h3>\n <div className=\"space-y-2\">\n {pendingInvites.map((invite) => (\n <Card key={invite.id} className=\"p-3\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-8 w-8 items-center justify-center rounded-full bg-muted\">\n <Mail className=\"h-4 w-4 text-muted-foreground\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium\">{invite.email}</p>\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <Badge variant=\"secondary\" className=\"text-xs\">{invite.profileName}</Badge>\n <span className=\"flex items-center gap-1\">\n <Clock className=\"h-3 w-3\" />\n Sent {new Date(invite.createdAt).toLocaleDateString()}\n </span>\n </div>\n </div>\n {canManageTeam && (\n <RowActions\n actions={[\n {\n id: 'resend',\n label: t('organization.team.resend'),\n icon: Send,\n onSelect: () => handleResendInvite(invite.id),\n },\n {\n id: 'revoke',\n label: t('organization.team.revoke'),\n icon: Ban,\n intent: 'danger',\n onSelect: () => handleRevokeInvite(invite.id),\n },\n ]}\n />\n )}\n </div>\n </Card>\n ))}\n </div>\n </div>\n )}\n\n <InviteMemberDialog\n open={inviteOpen}\n defaultEmail={inviteEmail}\n onOpenChange={(open) => {\n setInviteOpen(open)\n // On close (after a successful invite the dialog closes itself),\n // refresh the seat count so the guard/banner reflect the new member.\n if (!open) {\n invalidateLimit('users')\n setInviteEmail(undefined)\n void reloadTeam()\n }\n }}\n />\n </div>\n )\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { RightRailPage } from './chunk-JFIU6NQP.js';
2
- import { createCrudPage, useUnitSwitchingStore, UnitMembersTab } from './chunk-BFOH3AVP.js';
2
+ import { createCrudPage, useUnitSwitchingStore, UnitMembersTab } from './chunk-RLZCH4NU.js';
3
3
  import { useUnitBootstrap } from './chunk-DPNFZONC.js';
4
4
  import { useTranslation } from './chunk-YUHCC7JY.js';
5
5
  import { toast } from './chunk-3OUD4XBK.js';
@@ -1077,5 +1077,5 @@ async function stopImpersonation() {
1077
1077
  }
1078
1078
 
1079
1079
  export { MemberAccessRailPage, MemberUnitsCell, UNIT_DETAIL_ZONES, UnitIndicator, UnitMenuSection, UnitPickerDialog, UnitRailPage, UnitSwitcher, UnitSwitchingHost, UnitsSettingsPage, canOfferNearest, findNearestUnit, startImpersonation, stopImpersonation, useMemberAccessPanel };
1080
- //# sourceMappingURL=chunk-D7DQ6W4H.js.map
1081
- //# sourceMappingURL=chunk-D7DQ6W4H.js.map
1080
+ //# sourceMappingURL=chunk-AIDRTAXD.js.map
1081
+ //# sourceMappingURL=chunk-AIDRTAXD.js.map