Cria o módulo modules/ldap_courses_sync/ seguindo o mesmo padrão do
ldap_research_groups_sync, com bundle `course`, campos field_course_*
e field_user_courses, sincronização de membros via atributo LDAP, e
aba "Courses Sync" no painel unificado.
Também registra `courses` no módulo pai (routing, UnifiedAccessRulesForm
e GlobalAccessRuleForm) para suporte a access rules unificadas.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ldap_departments_sync/ e ldap_research_groups_sync/ movidos para
modules/, padrão adotado por módulos contrib como Drupal Commerce.
Nenhum arquivo PHP ou YAML alterado — o Drupal descobre módulos
recursivamente pelo .info.yml independente do caminho.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
O botão "Cancel" usava #type => 'submit' com #submit => []. No Drupal,
um array #submit vazio é falsy, então FormBuilder cai de volta nos
handlers de nível de formulário e chama submitForm() — que salvava
uma regra vazia ignorando a validação (#limit_validation_errors => []).
A solução é #type => 'button', cujo #executes_submit_callback é FALSE
por padrão, impedindo qualquer submit handler de rodar.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Inclui strings de LdapGroupsSyncController, UnifiedAccessRulesForm e
GlobalAccessRuleForm que não estavam cobertas pelo .po existente:
módulo/descrição/status da overview, campo "Tipo de Grupo", opções
"Departamentos"/"Grupos de Pesquisa" e mensagens de tabela vazia.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Adiciona rota, menu e abas unificados em ldap_groups_sync
- Cria LdapGroupsSyncController (overview dos submódulos)
- Cria UnifiedAccessRulesForm: tabela combinada de regras de todos os
submódulos habilitados, com único botão "Add Rule"
- Cria GlobalAccessRuleForm: estende AccessRuleFormBase com parâmetro
{group_type} na rota; exibe select "Group Type" com AJAX rebuild ao
criar novas regras (desabilitado ao editar)
- Remove rotas access_rules e access_rule_form dos submódulos
- Remove entradas de menu dos submódulos (módulo pai fornece a entrada)
- Atualiza abas dos submódulos para base_route: ldap_groups_sync.config
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Cria super-módulo com infraestrutura compartilhada de regras de acesso
para os módulos de sincronização LDAP de grupos.
- GroupAccessRulesService: serviço parametrizável por config name
- AccessRulesFormBase: listagem/remoção de regras (classe abstrata)
- AccessRuleFormBase: formulário modal de criação/edição (classe abstrata)
- Sub-módulos ldap_departments_sync e ldap_research_groups_sync refatorados
para estender as classes base com subclasses mínimas
- Traduções pt-br centralizadas em ldap_groups_sync.pt-br.po
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>