Registra o handler de entidade User para o módulo Structural Pages,
permitindo que nós content_page usem um usuário como entidade pai e
viabilizando a hierarquia de páginas do microsite (/user/{id}/...).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adiciona checkbox 'use_homepage_title' ao formulário de configuração do
microsite. Quando ativado, o hook_preprocess_block substitui o título do
bloco 'Título da Página' pelo título do nó configurado como homepage.
Sem nó configurado ou no caso de fallback, mantém o nome do usuário.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Regiões posicionadas de forma análoga ao tema Olivero: content_above
dentro do <main> antes do conteúdo principal, e content_below após o
bloco main/sidebar.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adiciona biblioteca CSS 'form' ao tema do microsite com estilos para
labels, campos, descrições e botão de submit, seguindo a paleta de cores
do tema. O formulário aplica a classe .microsite-form e anexa a biblioteca
automaticamente.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Permite ao usuário selecionar qual conteúdo (content_page toplevel) é
exibido na página inicial do microsite. A configuração é armazenada via
user.data e a homepage respeita a escolha com fallback para o primeiro nó
publicado. O nó configurado como homepage é ocultado automaticamente do
menu de navegação (structural_pages). Inclui link "Configuração" no menu
da conta via rota de redirecionamento para o usuário atual.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
O negociador de tema passa a verificar o alias do caminho atual em vez
de checar nomes de rota específicos, cobrindo páginas de qualquer módulo
acessadas via alias /user/{id}/.... Adiciona site_users_get_microsite_user()
como helper reutilizável para obter o usuário do microsite a partir da rota
ou do alias, e atualiza MicrositeHeaderBlock e site_tools_share_links para
usá-lo.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Item pai 'Adicionar' no menu account com subitens derivados dinamicamente
a partir de site_users.settings:add_content_links. O pai fica oculto quando
o usuário não tem acesso a nenhum dos routes configurados.
- Rota site_users.add_content com _custom_access via AddContentAccessCheck
- hook_menu_links_discovered_alter() gera os subitens com IDs estáveis
- Formulário de settings com tabela editável (label, rota, parâmetro, peso)
- CSS do microsite atualizado com dropdown ao hover/focus-within
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- RouteSubscriber redireciona entity.user.canonical ao MicrositeHomeController
- Nova rota site_users_microsite.profile em /user/{user}/profile com _entity_access
- Corrige configFactory() → config() no MicrositeContentController
- Exclui rota de settings do tema do micro-site no ThemeNegotiator
- Adiciona local task tabs para settings (módulo pai e submódulo)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Novo campo link field_user_homepage (página pessoal do usuário)
- Update hook 10009 para instalações existentes
- MicrositeHeaderBlock: variável #homepage via getFieldUri()
- Template: link com ícone 'home' como primeiro item nos links acadêmicos
- CSS: fill para ícone de casinha no fundo escuro do header
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Formatadores FieldFormatter para Lattes, ORCID e MathSciNet: geram
link para o perfil na plataforma a partir do ID armazenado no campo
- MicrositeHeaderBlock: inclui lattes_id, orcid_id e mathscinet_id
- Template: exibe ícones SVG via site_tools_academic_icon() (extensão
Twig do módulo site_tools) com links acessíveis para cada plataforma
- CSS: estilos para .msite-header-block__academic-links com animação
de hover nos ícones
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Novo bloco MicrositeHeaderBlock (site_users_microsite): exibe foto
circular (220×280px), nome (h1), biografia e contatos (telefone,
e-mail). Título oculto por padrão; biografia renderizada via
->processed com |raw no template.
- Remove UserInfoBlock e seu template (não estava em uso).
- Adiciona regiões Top Bar e Navigation ao tema; menu.html.twig para
gerar classes .menu__item/.menu__link compatíveis com o CSS.
- CSS: estilos das novas regiões e do bloco de cabeçalho.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Top Bar: barra estreita acima do header para menu do usuário,
fundo escuro com links claros alinhados à direita.
- Navigation: barra horizontal abaixo do header para menu da página,
estilo baseado no nav-secondary do Olivero (hover com underline animado).
- Inclui menu.html.twig para gerar as classes .menu, .menu__item e
.menu__link necessárias para o CSS funcionar (stable9 não as adiciona).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Widget unificado para field_user_photos: exibe tira de thumbnails em
linha com destaque (borda azul) na foto padrão; clicar num thumbnail
seleciona-o como padrão. O campo field_user_default_photo é atualizado
ao salvar. Edição/remoção de mídias individuais ficam a cargo do menu
contextual do Drupal. O hook _site_users_add_default_photo_selector()
é ignorado automaticamente quando o widget está ativo.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Implementa o layout estilo Olivero: em desktop (≥ 1200 px) a região
Social fica fixada à esquerda com conteúdo girado −90°; em mobile exibe
barra horizontal compacta. Usa IntersectionObserver para aplicar
.is-fixed ao scroll.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sub-módulo com ThemeNegotiator, controller de listagem de conteúdo por usuário,
formulário de configuração de tipos de conteúdo por papel e serviços registrados.
Tema com regiões header, highlighted, tabs, messages, content, sidebar, social
e footer; template page.html.twig com header padrão gerado a partir dos dados
do usuário (foto, nome, roles) quando a região header estiver vazia.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Inclui config/install com langcode en, update hook 10008 para sites
já instalados e tradução pt-br do label e descrição do campo.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Inclui field.storage e field.field para o campo Institutional ID,
com tradução 'Id Institucional' em config/translations/pt-br/.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Roles criados com langcode: en e tradução pt-br correspondente em
config/translations/pt-br/, sem uuid, seguindo o padrão de configuração
opcional do módulo. Inclui também as ações em lote (user_add_role_action
e user_remove_role_action) para ambos os roles, permitindo atribuição e
remoção em massa via interface de administração.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
IDs Lattes têm 16 dígitos, excedendo o limite do INT (≈2.1 bilhões).
Corrige erro SQLSTATE[22003] durante o cron ao salvar o campo.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Roles movidos do módulo base_site_config para centralizar as definições
de usuários neste módulo.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Cria view mode e display 'restricted' (template mostra só username + mensagem)
- Adiciona campo field_user_selected_view_mode (string, default: restricted)
- update_10006: provisiona view mode, display e campo; inicializa role_view_modes
- Seletor de visibilidade no form de edição do perfil (owner e admin)
- hook_entity_view_mode_alter lê o campo e valida existência do display
- Formulário de admin: checkboxes de view modes por role (exceto anonymous e authenticated)
- Schema YAML completo para site_users.settings incluindo role_view_modes
- Tradução pt-BR de todas as novas strings
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Adiciona hook_entity_view_mode_alter() para redirecionar visitantes
não-proprietários e não-admins para o view mode 'public' ao acessar
/user/{uid}, exibindo apenas foto padrão, bio e redes sociais
- Simplifica hook_entity_field_access(): operação 'view' retorna neutral
para não-proprietários (visibilidade controlada pelo view mode)
- Cria update_10005() que provisiona o view mode 'public', seu display
e concede a permissão 'access user profiles' ao papel anonymous
- Replica a concessão de permissão em hook_install() para novas instalações
- Corrige TypeError em hook_entity_view_mode_alter(): $context aceita null
- Amplia hook_media_access() para permitir visualização de mídia publicada
também para usuários anônimos
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Implementa hook_ldap_user_edit_user_alter() para capturar a foto do
atributo LDAP configurado e adicioná-la como primeira entrada em
field_user_photos, sem queries adicionais ao servidor.
Inclui LdapPhotoSyncService com detecção de tipo via exif_imagetype,
deduplicação por MD5 e reutilização de media entity existente.
Adiciona checkbox para ativar/desativar o sync no formulário de settings,
com visibilidade condicional do campo de atributo via #states.
Corrige acesso a mídias publicadas para usuários autenticados via
hook_media_access(), resolvendo "Acesso restrito" no widget e na
visualização do perfil.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Implementa hook_user_format_name_alter() para substituir o username pelo
valor de field_user_name em todo o site. Na view /admin/people o username
original é mantido alterando o formatter do campo name de user_name para
string, exibindo o valor bruto sem passar por getDisplayName().
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Implementa hook_site_tools_share_links() para fornecer os links do campo
field_user_social_links ao ShareLinksBlock quando em página de perfil de
usuário. Adiciona site_tools como dependência do módulo.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adiciona update_10003 e update_10004 para normalizar entradas de
ldapUserSyncMappings que possuem prov_events, config_module, prov_module
ou outros campos nulos, evitando TypeError no FieldProvider do ldap_user.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Move core.entity_form_display.user.user.default de base_site_config
para site_users, que é o módulo responsável pelos campos de perfil.
Inclui field_user_social_links (social_link_widget) e remove referência
obsoleta a field_user_photo.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Campos que retornam forbidden() em fieldAccess() são gravados como
false no submitForm(), evitando que um valor true residual persista
quando um campo passa a ser protegido por outro módulo. Inclui também
o nome do campo no label no formato [módulo:field_name].
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
hook_entity_field_access() passa a cobrir todos os FieldConfigInterface
do usuário, sem lista hardcoded. Campos de referência a mídia usam
lógica de fotos; demais usam lógica de perfil.
SiteUsersSettingsForm descobre campos dinamicamente via
entity_field.manager, listando todos os campos configuráveis do usuário
independente do módulo que os define.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Para operação 'edit', verifica apenas a config user_editable_fields
para o próprio usuário, sem exigir permissão explícita. Evita que
AccessResult::neutral() bloqueie o widget no formulário.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Retorna neutral() quando $items e NULL (contexto sem entidade),
evitando forbidden() prematuro que escondia campos no formulario
- Retorna neutral() para o proprio usuario sem a permissao explicita,
deferindo ao comportamento padrao do Drupal em vez de negar acesso
- Retorna forbidden() apenas quando ha entidade e o usuario esta
editando o perfil de outro (sem permissao 'edit any')
- A permissao 'edit own user profile fields' passa a funcionar como
controle refinado via config: se presente, aplica restricoes por
campo; se ausente, o modulo nao interfere no acesso padrao
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adiciona seção na tela de configurações do módulo que permite ao
administrador controlar quais campos do perfil cada usuário pode
editar no próprio perfil, independentemente das permissões de papel.
- site_users.settings.yml: novo grupo user_editable_fields (todos
habilitados por padrão)
- SiteUsersSettingsForm: fieldset com checkboxes por campo
- site_users.module: site_users_check_profile_field_access() e
site_users_check_photo_field_access() recebem field_name e
consultam a config ao verificar 'edit own'; resultado inclui
cache tag config:site_users.settings
- translations/site_users.pt-br.po: novas strings traduzidas
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Implementa o field type 'social_link' com seletor de rede e URL de
perfil, composto por:
- SocialLinkItem: field type com colunas 'network' (varchar 64) e
'url' (varchar 2048), cardinalidade ilimitada
- SocialLinkWidget: widget com select de rede e input de URL
- SocialLinkFormatter: formatter que renderiza links com classe CSS
por rede (social-link--{network}), target _blank e rel noopener
- config/optional: field.storage e field.field para user
- config/translations/pt-br: tradução do label e description
- hook_install e update_10002: configura form/view displays
- UserInfoBlock: expõe social_links via getSocialLinks()
- Template: adiciona seção de redes sociais e remove referências
obsoletas a category e dept_code
- translations/site_users.pt-br.po: strings do novo field type
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remove os arquivos de config field.storage, field.field e translation
referentes ao field_user_category, e elimina todas as referências
ao campo em site_users.module, site_users.install e UserInfoBlock.php.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remove os arquivos de config field.storage, field.field e translation
referentes ao field_user_dept_code, e elimina todas as referências
ao campo em site_users.module, site_users.install e UserInfoBlock.php.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Altera langcode de pt-br para en em todos os field.field YAMLs
- Traduz labels e descriptions dos campos para inglês
- Converte strings de info.yml, permissions.yml, links.menu.yml e
routing.yml para inglês
- Converte todas as strings t() e @Translation em PHP para inglês
- Adiciona traduções de config em config/translations/pt-br/ para os
7 campos de usuário
- Adiciona arquivo translations/site_users.pt-br.po com todas as
strings de interface traduzidas para pt-br
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adiciona a configuração da view de administração de usuários
(/admin/people) em config/optional com langcode en e strings
em inglês, e as traduções para pt-br em config/translations/pt-br.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Módulo Drupal para gerenciamento de campos e fotos de perfil de usuários:
- Campos customizados: nome, telefone, categoria, departamento, biografia
- Suporte a múltiplas fotos com seleção de foto padrão
- Controle de permissões granular para visualização e edição
- Bloco de informações do usuário para exibição em páginas
- Configurações administrativas para limite de fotos e integração LDAP
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>