Skip to content

feat(novo-projeto): seletor de pasta em árvore, igual à tela Arquivos (#1250) - #28

Merged
tbc-joaovitor merged 5 commits into
mainfrom
feat/1250-seletor-pasta-arvore
Nov 3, 2026
Merged

tbc-joaovitor merged 5 commits into
mainfrom
feat/1250-seletor-pasta-arvore

Conversation

@tbc-joaovitor

Copy link
Copy Markdown
Collaborator

Mudança

OpenProject devswha#1250 / devswha#1282 (parte 2). Em Novo projeto (+) → Browse, o seletor de pasta era uma lista plana, uma pasta por vez. Agora é a mesma árvore da tela Arquivos (FileTree) em modo seleção: níveis de pasta com chevrons e guias, filtro "Filter by name…" e rodapé com atalhos.

  • FileTree ganha onPick (e onOpenFile passa a ser opcional): só pastas (fetchDirectories(…, false)); o clique seleciona a pasta (barra de destaque) e a abre; clicar de novo na selecionada a fecha. "Use this folder" usa a pasta selecionada ou, sem seleção, a pasta raiz, e o caminho escolhido aparece ao lado do botão. A lista tem aria-label "Choose a folder" e a dica do rodapé diz "Enter select".
  • NewSessionDialog usa <FileTree paneId={null} onPick=…>. A altura da lista já é limitada pelo CSS existente, então Name e Start continuam alcançáveis.
  • "Show hidden" fica em uma linha; as dicas de atalho quebram antes.
  • Docs na mesma mudança: README e preview.html do FileTree, bundle.css, src/AGENTS.md, DESIGN.md, comentários do DirectoryBrowser, CHANGELOG.
  • scripts/folder-filter-regression.ts reescrito para a árvore (mesmas intenções: filtro sem diferenciar maiúsculas, texto de resultado vazio, cancelar "New folder" não cria nada, IME, Up move a raiz, "Use this folder" preenche o campo e fecha o seletor).

Decisões

  • Filtro no modo seleção: sem paneId não há busca no servidor (canSearch já é falso); o filtro vale só para os nomes das pastas já carregadas, e o aviso diz "Searching only the open folders". Clicar numa pasta do resultado limpa o filtro, abre a árvore até ela e a seleciona.
  • Chave de armazenamento: herdr-web-ui:pick-tree:<máquina>:<pasta>, separada de files-tree (expandedKey ganhou o parâmetro pick).
  • Novo tab não muda: ele nunca usou o seletor (mostra "Uses the project's folder").
  • DirectoryBrowser fica, pois o FileViewer ainda o usa.
  • Nenhuma chave i18n nova além de select (ko/ja/zh/pt).

Validação

  • bun run test:unit: 2193 pass, 6 skip, 1 fail. A falha é server/remote-bundle.test.ts ("reuses a cached release bundle by checksum…", timeout de 5 s), que já falha na main (confirmado com a mudança em stash). fileTree.test.ts e i18n.test.ts: 37 pass, 0 fail.
  • bun run typecheck e bun run build: ok.
  • bun run check run bun scripts/ui-regression.ts (CHROME_PATH apontando para o Chromium do Playwright): 90 PASS, 0 falhas, incluindo "folder filtering and the New folder field…".
  • Visual: demo (fixtures) em 1280 px e 390 px, antes e depois, e a tela Arquivos a 360 px sem regressão. Capturas anexadas na tarefa fix(settings): center the switch thumb in its track devswha/ovis#1282 do OpenProject.

🤖 Generated with Claude Code

tbc-joaovitor and others added 4 commits November 2, 2026 13:59
…devswha#1250)

FileTree ganha o modo seleção (onPick): só pastas, clique seleciona e abre,
"Use this folder" no rodapé. NewSessionDialog passa a usá-lo no lugar do
DirectoryBrowser (que segue no FileViewer).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…seleção (devswha#1250)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…; CHANGELOG (devswha#1250)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@gianlukamoraes gianlukamoraes left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔴 REQUEST CHANGES (gate) — o código do PR está limpo; o bloqueio é um teste que já falha na main

🧑 Resumo (para humanos)

  • ✅ O seletor em árvore faz o que promete. Ele mostra só pastas, o clique seleciona e abre a pasta, e "Usar esta pasta" devolve a pasta escolhida ou, sem escolha, a pasta raiz, no mesmo formato ~/… de antes. As pastas abertas ficam salvas numa chave separada da tela Arquivos. A tela Arquivos não muda.
  • 🔴 O gate deu vermelho por 1 teste unitário, e o teste não é deste PR. É o teste do cache do pacote remoto, que espera até 5 s e falha da mesma forma na main (conferido num worktree limpo da main). Este PR não mexe em server/. (o gate segue vermelho até a main ser corrigida ou o teste ir para quarentena)
  • 🟡 Ordem de merge: este PR e o #25 mexem nos mesmos 4 arquivos de tradução (ja/ko/pt/zh). O que entrar depois precisa de rebase. (não bloqueia)

O que fazer: nada a corrigir nesta branch. Quem cuida da main corrige ou põe em quarentena o server/remote-bundle.test.ts. Depois disso, um novo push ou novo gate libera o PR.

🤖 Detalhe técnico (gate, causa provável, verificado limpo)

[GATE] RED: bun run test:unit, head 7218c01

✅ typecheck (tsc --noEmit)
❌ testes unitários (bun run test:unit)
 2193 pass / 6 skip / 1 fail
(fail) remote bundle sources > reuses a cached release bundle by checksum and never trusts a changed one [5000.58ms]
  • Já falha na main: worktree em origin/main, bun test server/remote-bundle.test.ts → mesmo (fail) a 5000 ms. Bate com a nota do autor no corpo do PR.
  • Causa provável (fora do PR): server/remote-bundle.test.ts:64-76. Com o cache adulterado, bundleFile tenta baixar de https://bundles.invalid/…. Neste host, a resolução DNS de .invalid leva cerca de 6 s para falhar (curl → Could not resolve host em 6,03 s), e o tempo-limite do bun é 5 s. O resultado depende do DNS da máquina. Fix sugerido (PR separado na main): rejeitar o hash diferente no cache antes de ir à rede, ou injetar um fetch falso e rejeitado no teste, ou subir o timeout desse it.

Três verificações de UI:

  • Teste de digitação: não se aplica, porque nenhum campo editável foi criado ou alterado. O filtro já existia, é controlado e não tem key derivada do valor. O roteiro de regressão usa fill e verifica as teclas de IME, como antes.
  • Validação sobre dados reais: não se aplica, porque o PR não cria regra de validação.
  • Evidência local: ✅. Há 5 capturas na OP devswha#1282: antes e depois em desktop e em 390 px, e a tela Arquivos em 360 px.

Verificado limpo:

  • FileTree.tsx: pick → fetchDirectories(…, !pick) nas 3 chamadas (raiz, subpastas e recarga depois de "New folder"); a troca de raiz (Up/Home/hidden) zera selected; chosen cai na raiz quando nada está selecionado; onPick(chosen.shown) usa homeRelative, no mesmo formato que o DirectoryBrowser devolvia (DirectoryBrowser.tsx:202).
  • O clique em modo seleção abre a pasta e só a fecha quando ela já estava selecionada; com filtro ativo, reveal abre a árvore até a pasta e limpa o filtro.
  • paneId={null} → canSearch falso (FileTree.tsx:98): não há busca no servidor, e o aviso "Searching only the open folders" já existe nas 4 línguas.
  • expandedKey(…, pick) separa pick-tree de files-tree, com teste novo em fileTree.test.ts. A chave i18n select foi adicionada em ja/ko/pt/zh; "Choose a folder" e "Use this folder" já existiam nas 4.
  • DirectoryBrowser continua sendo usado pelo FileViewer; só os comentários mudaram.

@tbc-joaovitor
tbc-joaovitor merged commit 861674c into main Nov 3, 2026
@tbc-joaovitor
tbc-joaovitor deleted the feat/1250-seletor-pasta-arvore branch November 3, 2026 14:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants