Repository navigation
Client Details EmployeesTab Refresh
Documentação técnica da aba Colaboradores no detalhe do cliente/empresa (Client Details) e do padrão de invalidação/refetch da lista após edição, sem refresh manual da página.
Trilha de origem: app-community#375.
Visão (APP_TYPE) |
Uso neste fluxo |
|---|---|
| MANAGER | Detalhe administrativo de pessoa jurídica/cliente; aba Colaboradores lista e permite criar vínculos (people_link) e abrir o detalhe PF do colaborador |
| CRM / outros | Reutilizam ClientDetails e a mesma aba quando a tab está visível; o contrato de leitura (people_links) e o ciclo de foco são os mesmos |
ui-customers é o dono da tela de detalhe e das abas (incluindo EmployeesTab). O backend de vínculos permanece em api-platform-people (people_link); esta página não redefine contratos de escrita.
Registrar:
- fonte de dados da lista de colaboradores;
- ciclo de vida da lista (montagem vs reganho de foco);
- fluxo de criação vs edição (e por que o edit dependia de F5 antes do #375);
- modularização e testes de aceitação do refresh.
| Módulo | Papel no fluxo |
|---|---|
ui-customers |
EmployeesTab, helpers, smoke de refresh ao foco |
app-community |
Composição / pin do submódulo; rota /client-details
|
api-platform-people |
Recurso people_link (leitura da coleção; inalterado no #375) |
- Rota típica:
/client-details?clientId=<id>(pessoa jurídica / empresa). - Aba: Colaboradores (
EmployeesTab). - Lista: vínculos da empresa com
linkTypeem{ employee, owner, director, manager, courier }, obtidos via storepeople_link(getItems/getPeopleLinks).
Parâmetros de leitura relevantes (via helpers / buildPeopleLinkReadParams):
-
companyId= id da pessoa jurídica pai; -
linkTypes= conjunto acima; -
itemsPerPageelevado (ex.: 100) para não truncar empresas com muitos colaboradores.
Normalização: buildEmployeeContactsFromPeopleLinks + avatares a partir de peopleMedia já presente no payload de people_links (sem chamada extra a /people_media na listagem).
- Botão + abre modal local (
name,alias, data,linkType). - Save chama
peopleActions.company(payload)(payload montado porbuildEmployeeCreatePayload). - Em sucesso: fecha modal e chama
fetchEmployees()imediatamente — a lista já era atualizada sem F5 nesse caminho.
- Toque na linha navega para o detalhe PF do colaborador (
buildEmployeeDetailNavParams:contextKey=contacts,initialTab=general,parentCompanyId,linkType). - No detalhe, o usuário altera e salva (fluxo de outras abas / people).
- Ao voltar para a aba Colaboradores, a lista precisa refletir os novos valores sem reload completo da página.
Causa raiz (#375): fetchEmployees era disparado só no useEffect de montagem. Ao navegar para o detalhe e voltar, a tab não era desmontada/remontada de forma confiável; o efeito de montagem não rodava de novo e a lista ficava com o snapshot antigo.
Solução canônica: trocar o efeito de montagem por useFocusEffect + useCallback, reexecutando fetchEmployees sempre que a tab reganha foco (padrão já usado em telas como Profile em ui-people).
montagem / reganho de foco
│
▼
fetchEmployees()
│
▼
getPeopleLinks(companyId, linkTypes, itemsPerPage)
│
▼
normalize → setEmployees(...)
Create continua chamando fetchEmployees() após save; edit/return passa a invalidar via foco.
- Contrato de API / payload de escrita de
people/people_link. - Layout da aba, campos do colaborador, exclusão ou troca de
linkTypealém do já existente. - AuthZ: continua a mesma leitura já autorizada; sem endpoint ou campo novo.
| Arquivo | Papel |
|---|---|
src/react/components/tabs/EmployeesTab.js |
Lista, modal de create, fetchEmployees, useFocusEffect
|
src/react/components/tabs/employeesTabHelpers.js |
LINK_TYPE_OPTIONS, normalização, nav params, payload create |
src/react/components/tabs/employeeContacts.js |
buildEmployeeContactsFromPeopleLinks, params de leitura |
src/react/pages/details.js |
ClientDetails e composição das tabs |
Limite absoluto do projeto: ≤ 500 linhas por arquivo.
| Tipo | Local | Cobertura |
|---|---|---|
| Unit |
src/tests/react/components/tabs/employeesTabHelpers.test.js (e media) |
helpers de normalização / linkType / media |
| Browser smoke | src/tests/browser/manager/client-details-employees-refresh.spec.js |
lista inicial → simulação de leave/return (foco) → segundo GET de people_links com payload atualizado, sem F5 |
O smoke cobre o critério de aceite de #375: após “voltar” (regain de foco), a UI mostra o nome/alias atualizados a partir da resposta mockada da API.
- Não é o enforcement de autorização de escrita no backend.
- Não redefine o fluxo de detalhe PF do colaborador (GeneralTab etc.).
- Não substitui o padrão de outras abas (GeneralTab, MediaTab, UsersTab) — apenas alinha EmployeesTab ao lifecycle de foco já usado no ecossistema.
| Destino | URL |
|---|---|
| Home deste módulo | https://github.com/ControleOnline/ui-customers/wiki |
| Client Details — criar usuário (UsersTab) | https://github.com/ControleOnline/ui-customers/wiki/Client-Details-Criar-Usuario |
| Cliente × Vendedor | https://github.com/ControleOnline/ui-customers/wiki/Cliente-Vendedor-Vinculo-e-Permissoes |
| App home | https://github.com/ControleOnline/app-community/wiki |
| Issue de origem | https://github.com/ControleOnline/app-community/issues/375 |
| Preservação de capitalização (nome/alias) | https://github.com/ControleOnline/ui-customers/wiki/Client-Details-People-Name-Case |
| Visões do app | https://github.com/ControleOnline/app-community/blob/master/MODOS_OPERACAO.md |
Cópia versionada no Git: docs/technical/Client-Details-EmployeesTab-Refresh.md