Parent
Parte da PRD #250 — Módulo Profile Fase 1.
Contexto
O admin precisa visualizar e editar o perfil de qualquer membro pra fins de moderação (bio ofensiva, dados incorretos, etc.). Em vez de criar um ProfileResource separado no Admin panel, a decisão é adicionar uma tab "Profile" dentro do UserResource existente.
Isso faz sentido porque o admin pensa em termos de "estou olhando o User X" e quer ver tudo sobre ele num lugar só — dados de conta, perfil profissional, character/gamificação, etc.
Onde vive o código
Na camada do Admin panel (não dentro de app-modules/profile/). Seguir o padrão de onde o UserResource já está registrado.
Tenant context
O admin opera dentro de um tenant (Filament multi-tenancy). A tab mostra o Profile daquele User no tenant atual. Se o User tem profiles em múltiplos tenants, o admin vê o do contexto em que está.
O que construir
1. Tab "Profile" no UserResource
Adicionar uma tab (ou RelationManager) na página de edição do UserResource que exibe os campos do Profile.
2. Form schema da tab
Mesmos campos do form do User panel (#255), mas no contexto admin:
nickname, birthdate, headline, seniority_level, years_experience, about, social_links
available_for_proposals (toggle) + start_availability (condicional)
Considerar reutilizar o schema de form se possível (extrair pra um schema compartilhado que ambos os painéis usam). Se não for possível, duplicar é aceitável — são dois contextos diferentes.
3. Save handler
Ao salvar, chama as mesmas actions de domínio (UpsertProfile, ToggleAvailability). Exibe notificação de sucesso.
4. Caso do Profile inexistente
Se o User não tem Profile no tenant atual (edge case — ex: membro foi adicionado antes do Profile module existir), a tab deve mostrar estado vazio ou criar o Profile on-the-fly.
Cenários BDD
Funcionalidade: Admin edita perfil de membro
Cenário: Admin vê tab Profile no UserResource
Dado que estou logado como admin no painel Admin
E estou no tenant "He4rt Developers"
Quando acesso o UserResource do membro "danielhe4rt"
Então vejo uma tab "Profile"
Cenário: Tab Profile carrega dados do membro
Dado que "danielhe4rt" tem Profile com headline "Backend Dev" no tenant atual
Quando acesso a tab Profile do UserResource
Então o campo headline exibe "Backend Dev"
Cenário: Admin edita bio de um membro
Dado que estou logado como admin
Quando altero a bio de "danielhe4rt" para "Bio moderada pelo admin"
E salvo
Então a bio é atualizada no banco
E uma notificação de sucesso aparece
Cenário: Admin vê toggle de disponibilidade
Dado que "danielhe4rt" tem available_for_proposals true
Quando acesso a tab Profile
Então o toggle está ativo
E o campo start_availability está visível
Cenário: Validação funciona no contexto admin
Dado que estou logado como admin
Quando preencho bio com 501 caracteres
E salvo
Então o form exibe erro de validação
Acceptance Criteria
Blocked by
Parent
Parte da PRD #250 — Módulo Profile Fase 1.
Contexto
O admin precisa visualizar e editar o perfil de qualquer membro pra fins de moderação (bio ofensiva, dados incorretos, etc.). Em vez de criar um ProfileResource separado no Admin panel, a decisão é adicionar uma tab "Profile" dentro do UserResource existente.
Isso faz sentido porque o admin pensa em termos de "estou olhando o User X" e quer ver tudo sobre ele num lugar só — dados de conta, perfil profissional, character/gamificação, etc.
Onde vive o código
Na camada do Admin panel (não dentro de
app-modules/profile/). Seguir o padrão de onde o UserResource já está registrado.Tenant context
O admin opera dentro de um tenant (Filament multi-tenancy). A tab mostra o Profile daquele User no tenant atual. Se o User tem profiles em múltiplos tenants, o admin vê o do contexto em que está.
O que construir
1. Tab "Profile" no UserResource
Adicionar uma tab (ou RelationManager) na página de edição do UserResource que exibe os campos do Profile.
2. Form schema da tab
Mesmos campos do form do User panel (#255), mas no contexto admin:
nickname,birthdate,headline,seniority_level,years_experience,about,social_linksavailable_for_proposals(toggle) +start_availability(condicional)Considerar reutilizar o schema de form se possível (extrair pra um schema compartilhado que ambos os painéis usam). Se não for possível, duplicar é aceitável — são dois contextos diferentes.
3. Save handler
Ao salvar, chama as mesmas actions de domínio (
UpsertProfile,ToggleAvailability). Exibe notificação de sucesso.4. Caso do Profile inexistente
Se o User não tem Profile no tenant atual (edge case — ex: membro foi adicionado antes do Profile module existir), a tab deve mostrar estado vazio ou criar o Profile on-the-fly.
Cenários BDD
Acceptance Criteria
app-modules/profile/)vendor/bin/pint --dirty --format agentpassa sem errosBlocked by