Skip to content

release: integra customizações Pespo, correções e tradução pt-BR - #6

Merged
giuntonic merged 34 commits into
previewfrom
pespo-preview-integration
Sep 24, 2026
Merged

giuntonic merged 34 commits into
previewfrom
pespo-preview-integration

Conversation

@giuntonic

Copy link
Copy Markdown
Owner

Description

Leva para a preview a branch que está em produção desde 2026-09-23 (pespo-preview-integration): o preview atual com todas as customizações da Pespo da fase v1.4.1 integradas, mais as correções e a tradução feitas depois do merge.

Integração (merge de pespo-branding-v1.4.1)

  • Rebrand Pespo Hub, Marcação de Peça, embed do Metabase, Google Calendar, widget de Tarefas, Clapshot, remoção de UI de planos pagos, fuso/idioma padrão pt-BR.
  • Dashboard do projeto: o embed do Metabase segue em /dashboard; os dashboards nativos do preview foram para /dashboards, com aba própria.
  • Migrations: a cadeia da Pespo (0123–0128, já aplicada em produção) e a do preview (0123–0125) são unidas pela 0129_merge_pespo_preview, sem renomear nada.
  • A cor de marca passa a viver em packages/tailwind-config/pespo-brand.css, por cima dos tokens do @makeplane/propel.

Correções

  • Dropdowns abrindo no canto superior esquerdo: patch no @headlessui/react 2.2.10. O Frozen do Combobox.Options apagava a ref do filho no React 19. Registrado em pnpm-workspace.yaml.
  • Erro 500 nos gráficos de widget dos dashboards de projeto (project_id não aceito pela view), com teste de contrato.
  • Erro de hidratação React feat: issue filter views  makeplane/plane#418 no HydrateFallback do web (já existia antes).
  • Identificador do projeto: o limite não aparecia (a mensagem usava {max} sem o valor) e o tooltip dizia 50 em vez de 10. Nova constante PROJECT_IDENTIFIER_MAX_LENGTH, e o campo agora tem maxLength.

Tradução para pt-BR

  • ~2.000 textos que ainda estavam em inglês em web, space, admin e ui. Chaves novas em common.json (ui.*, auth_errors.*, native_dashboards.*, chart_axis.*), em en e pt-BR.
  • O admin (god-mode) passa a ter i18n.
  • Corrige 37 usos de chaves inexistentes (apareciam como texto cru), 34 textos em polonês no pt-BR e traduções que ainda diziam "Plane".

Docs: docs/pespo-customizations.md atualizado com o fluxo de deploy da VPS, as decisões do merge e o checklist de upgrade.

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • Feature (non-breaking change which adds functionality)
  • Improvement (change that would cause existing functionality to not work as expected)
  • Code refactoring
  • Performance improvements
  • Documentation update

Screenshots and Media (if applicable)

Test Scenarios

  • Verificações automáticas: check:types e check:lint sem erros em web, space, admin e ui. Os testes de dashboard do backend passam (17/17, incluindo o novo test_project_scoped_chart_route).
  • Plano de migrations: migrate --plan contra o banco de produção listou só 0123_custom_fields, 0124_custom_field_multi_select, 0123_dashboard_dashboardwidget, 0125_merge e 0129_merge, já aplicadas.
  • Dropdowns: medidos no Chromium com CustomSelect e CustomSearchSelect reais. Sem o patch a caixa abre em (0, 0); com o patch, logo abaixo do botão.
  • Telas públicas em produção (login do web, god-mode, space): sem chaves de tradução cruas e sem erros de JavaScript, incluindo o feat: issue filter views  makeplane/plane#418.
  • A conferir manualmente, logado:
    • abrir estado, prioridade e membros num item e ver os dropdowns abrindo sob o botão;
    • criar um dashboard nativo em /projects/:id/dashboards, adicionar um widget e ver o gráfico carregar;
    • criar um projeto com identificador de 11+ caracteres e ver o limite (10) no tooltip e no bloqueio do campo;
    • ver o histórico de atividades de um item e os modais de exclusão em pt-BR.

References

🤖 Generated with Claude Code

sriramveeraghanta and others added 30 commits April 6, 2026 20:00
Troca de nome/título/metadados/textos de UI de "Plane" para "Pespo
Hub" em: metadata.ts, root.tsx (título da aba/PWA), telas de
autenticação (header, layouts de sign-up/reset/forgot/set-password),
strings de atividade (autor "Plane" -> "Pespo Hub" em ações do
sistema), e todas as chaves i18n pt-BR/en que continham "Plane".

Não alterado ainda: o ícone/logo SVG (PlaneNewIcon em
packages/propel/src/icons/sub-brand/plane-icon.tsx, usado no rail
lateral e telas de auth) - precisa de um arquivo de logo real da
Pespo antes de trocar, pra não inventar uma marca. Cores/tema
também ficaram de fora (Plane só permite tema custom por usuário,
não por workspace/instância - trocar isso globalmente exigiria
uma mudança mais profunda no ThemeProvider).
…p de vídeo)

Novo widget na tela de detalhe do work item, ao lado de
Attachments/Relations/Links: quando o anexo mais recente é imagem,
clicar nela cria um pin numerado; quando é vídeo, "Comentar neste
momento" captura o timestamp atual. Sem tabela nova - cada marcação
vira um comentário no próprio work item (via a mesma store de
comment.createComment já usada pelo resto do app), com a posição
codificada no texto.

Formato do texto igual ao que o portal-cliente (app externo que fala
com o Plane via API pública) já usa para o mesmo recurso, então uma
marcação feita aqui aparece lá e vice-versa, sem duplicar dado.

Novos arquivos: issue-detail-widgets/peca-marking/{root,content,helper,index}.
TWorkItemWidgets ganhou o valor "peca-marking" (issue.ts) e o default
de openWidgets passou a incluir esse widget já aberto (root.store.ts).
Node customizado do Tiptap (packages/editor/src/ce/extensions/clapshot-embed)
que embute revisões de vídeo do Clapshot via comando /clapshot, contornando o
limite de tamanho/duração de upload direto de vídeo. Inclui o ajuste
necessário no sanitizador HTML do backend (content_validator.py) para não
descartar a tag e o atributo url, e documenta a customização em
docs/pespo-customizations.md.
O texto ainda dizia "Abrir modal de planos pagos" mesmo depois da remoção
da UI de upgrade — o badge agora só mostra a versão, sem modal nenhum.
Muda o default de timezone/language de UTC/en pra America/Sao_Paulo/pt-BR
nos models de cycle, project, user e workspace, com as migrations
correspondentes. Os mesmos defaults são espelhados nas telas de perfil do
frontend (que também carregam pequenos ajustes de tradução feitos na mesma
edição).
Instância self-hosted que nunca vai virar cliente pago do Plane, então
removemos billing, o modal de licença, a tela de upsell de Active Cycles,
o banner de upgrade em operações em massa, o link "Contact sales" e os
logos de marketing da tela de login, junto com as entradas de menu/rota
que levavam a essas telas.
CustomSearchSelect (packages/ui) e o formatador de datas (packages/utils)
não tinham acesso a @plane/i18n antes, então "Search" e nomes de mês/hora
apareciam sempre em inglês, mesmo com o app todo em pt-BR. Adiciona a
dependência de @plane/i18n a esses dois pacotes (e ao propel, usado por um
deles) pra poder usar useTranslation()/i18nInstance.language internamente.
Os 12 templates de e-mail (convite, redefinição de senha, notificações
etc.) e as linhas de assunto geradas em Python nos bgtasks, mais os
filtros de labels/estado do portal público de compartilhamento (apps/space).
Restante da tradução: centenas de strings hardcoded em inglês trocadas por
t(...) em apps/web/core e apps/web/app, mais os namespaces de i18n
correspondentes (auth, common, cycle, module, page, power-k,
project-settings, project, work-item, workspace-settings, workspace) em
en e pt-BR.
…ed do Clapshot, remove branding do GitHub e a feature de projetos limitados na sidebar

Quatro frentes:

- Google Calendar: conexão OAuth pessoal por usuário, sincroniza itens
  de trabalho atribuídos (com data) pra uma agenda dedicada no Google,
  e sobrepõe eventos de agendas escolhidas na visualização de
  calendário do Plane. Item "Calendário" novo na sidebar, logo abaixo
  de "Notas adesivas" — mostra tarefas e eventos juntos, mês a mês, com
  popover de detalhes (horário, descrição, link) ao clicar num evento.
  Precisa da Google Calendar API habilitada e do redirect URI
  /api/users/me/google-calendar/callback/ autorizado no client OAuth
  existente antes de funcionar de ponta a ponta.

- Clapshot embed: botão "Aprovar edição" no player de vídeo embutido
  no editor — posta um comentário no work item, mesmo padrão do botão
  "Aprovar peça" da Marcação da Peça. O webhook Plane -> n8n que
  escuta esse padrão pro Metabase ainda não foi atualizado pra esse
  novo texto.

- Sidebar: remove o link "Star us on GitHub" e a seção de ajuda/Discord
  do topo — não fazem sentido pra um fork interno. Botão de atalhos de
  teclado ocupa o espaço que sobrou.

- Sidebar: remove a feature "mostrar projetos limitados / ver mais"
  (checkbox de configuração, contagem customizável, botão de expandir)
  — lista de projetos sempre mostra tudo agora.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
A página já existia (apps/web/app/(all)/[workspaceSlug]/(projects)/calendar/)
mas nunca tinha sido adicionada ao routes.ts — esse projeto usa rotas
explícitas, não roteamento automático por pastas, então o link
"Calendário" da sidebar caía em 404. Mesmo padrão de Drafts/Stickies.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
… Google Calendar

- workspace-invitations/page.tsx: convidado sem conta ainda (não
  logado) via o botão "Accept" chamar a API de join direto, que
  falhava com 401 silenciosamente (só console.error) — a página nunca
  saía do lugar. Agora detecta a falta de sessão e manda pro login com
  next_path de volta pra essa mesma URL (mesmo padrão já usado no
  AuthenticationWrapper). De quebra, essa página nunca tinha entrado
  na tradução pt-BR — estava 100% hardcoded em inglês, com "Star us on
  GitHub" apontando pro repo original — agora usa i18n.
- utils/google_calendar.py: a API de eventos do Google exige timestamp
  RFC3339 completo, mas o calendário mandava só a data (YYYY-MM-DD),
  causando 400 em toda tentativa de listar eventos sobrepostos.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…m drag-and-drop, e traduz strings que faltavam nos Stickies

- Novo widget "Tarefas" na home: checklist simples e privada por
  usuário (WorkspaceUserTask no backend, mesmo padrão do
  WorkspaceUserLink; WorkspaceTaskStore no frontend, aninhado em
  HomeStore.tasks igual ao quickLinks). Migration 0128 (campo `project`
  órfão removido antes de aplicar — não existia no model).
- Homepage passa de lista empilhada em coluna única pra grade de 2
  colunas, com cada widget virando um card arrastável direto na home
  (DashboardWidgetBlock) — reaproveita o mesmo helper/ação de reorder
  que o modal "Gerenciar widgets" já usava, não introduz sistema novo.
- Stickies: algumas strings que ficaram de fora da tradução pt-BR
  original agora usam i18n (mesma categoria de gap do fix da página de
  convite de workspace).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…kspaceBaseModel

Reverte uma remoção errada minha de sessão anterior — WorkspaceBaseModel
(classe base abstrata de WorkspaceUserTask, mesma que WorkspaceUserLink
usa) já declara workspace + project como campos herdados. A migration
original estava certa; eu confundi isso com um campo órfão porque só
tinha olhado o corpo da classe WorkspaceUserTask, sem checar a base.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Merge da branch de produção da Pespo sobre origin/preview (dashboards
  configuráveis, Custom Fields, React 19 / React Router 8).
- Dashboard do projeto: o embed do Metabase continua em /dashboard; os
  dashboards nativos do preview passam para /dashboards, com aba própria.
- Migração 0129_merge_pespo_preview une as duas cadeias paralelas a partir
  da 0122 sem renomear as migrações já aplicadas em produção (0123..0128).
- Cor de marca: o preview trocou variables.css pelos tokens do
  @makeplane/propel; a paleta Pespo agora vive em
  packages/tailwind-config/pespo-brand.css, importado depois do propel.
- Remove trackers *_TRACKER_ELEMENTS (removidos no preview) mantendo as
  traduções pt-BR; adiciona chaves pt-BR para Dashboards/Meus dashboards.
- pnpm-lock regenerado (links de @plane/i18n em propel, ui e utils).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- onboarding/team: InviteTeamStep usa t() das traduções pt-BR mas o preview
  tinha removido o hook useTranslation desse componente.
- analytics/project-insights: tipa os dados traduzidos como TChartData e
  passa [] enquanto carregam (RadarChart do preview exige array).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A rota projects/<project_id>/dashboards/.../widgets/<id>/chart/ passava
project_id para DashboardWidgetChartEndpoint.get(), que não aceitava o
argumento: todo widget de gráfico dentro de um projeto quebrava com 500.
Aceita project_id e restringe os dashboards a esse projeto. Adiciona
teste de contrato para a rota de projeto.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ss UI)

O Frozen interno do @headlessui/react 2.2.10, que envolve o conteúdo do
Combobox.Options, faz cloneElement(filho, { ref }) mesmo quando nenhuma ref
foi repassada. No React 19 a ref é uma prop comum, então isso substituía a
ref do próprio filho por null: o setPopperElement do react-popper nunca era
chamado, o popper não era criado e a caixa ficava em top:0/left:0.

Afeta os 17 dropdowns que usam Combobox.Options + usePopper (estado,
prioridade, membros, ciclo, módulo, datas, labels, CustomSelect,
CustomSearchSelect...). Listbox, Menu e Popover não usam o Frozen.

O patch só sobrescreve a ref do filho quando uma ref foi de fato repassada.
2.2.10 é a versão mais recente e ainda tem o bug. Verificado no Chromium
com o CustomSelect e o CustomSearchSelect reais: sem o patch a caixa abre
em (0,0); com o patch, logo abaixo do botão.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Dashboards nativos (vindos do preview sem i18n): lista, modal de criação,
  grid, formulário de widget, seletor de tipo de gráfico, estado vazio,
  toasts, cabeçalhos e títulos de página. Chaves em common.native_dashboards.
- Rótulos dos eixos X/Y dos gráficos (ANALYTICS_*_AXIS_VALUES eram texto fixo
  em inglês): mapa de chaves chart_axis.* em @plane/constants, usado pelo
  SelectXAxis/SelectYAxis e pelo gráfico de prioridade — cobre também a página
  de Analytics.
- Configurações > Projetos (estado vazio) e seletor de projeto (placeholder,
  tooltip e contagem com plural ICU).

Chaves adicionadas em en e pt-BR, seguindo a convenção do fork para textos da
Pespo; os demais idiomas caem no inglês.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…admin, ui)

Varredura completa dos frontends atrás de textos fixos em inglês, a maior
parte anterior ao preview (a tradução original cobriu as telas principais):

- ~1.300 ocorrências em ~370 arquivos: toasts, placeholders, labels,
  tooltips, textos de tela, validações de formulário, mensagens de loading e
  as mensagens de erro de login/cadastro (web, space e admin).
- Chaves novas em common.json (en + pt-BR): ui.* (textos gerais) e
  auth_errors.*; textos idênticos a chaves genéricas existentes reaproveitam
  essas chaves (toast.*, common.*).
- Admin (god-mode) não tinha i18n: passa a depender de @plane/i18n e aguarda
  o initPromise antes de hidratar, como web e space.
- Fora de componentes (helpers, stores, meta) usa i18nInstance.t; objetos
  constantes de módulo usam getters para traduzir no acesso, não no load.
- AlertModal do @plane/ui: padrões Delete/Deleting/Cancel traduzidos.
- Corrige 37 usos de chaves inexistentes deixados pela tradução original
  (apareciam como texto cru: search.no_matches_found, page.delete_modal.*,
  cycle.transfer_issues.*, work_item.bulk_delete_modal.* etc.).
- Corrige 34 textos em polonês no pt-BR/template.json (herdados do upstream)
  e 8 traduções pt-BR que ainda diziam "Plane" (convenção: Pespo Hub).

Mantidos como estão: marcas (Kanban, Markdown, Burn-down, Ask Pi),
identificadores internos e erros de estado interno das stores.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Após a verificação visual em produção, ainda apareciam textos em inglês em
padrões que as varreduras anteriores não cobriam:

- Textos em ternários/expressões JSX (botões com estado: "Saving"/"Save
  changes", "Continue", "Leave project?", "Copy link"/"Copied!" etc.):
  ~230 ocorrências em web, space, admin e ui.
- Login: botões OAuth ("Entrar com Google", ICU {action}/{provider}),
  divisor "ou" do @plane/ui, rótulos Email/Senha do god-mode e do space,
  termos de uso do space montados em pedaços.

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

Tradução (varredura final pelo AST do TypeScript, nós JsxText):
- ~370 textos que os scanners por regex não pegavam: palavras soltas em
  linha própria (Cancel, Edit, Apply...), frases partidas em volta de
  elementos (confirmações "Tem certeza de que deseja excluir o projeto
  {nome}?..."), mensagens do histórico de atividades dos itens (core/activity,
  common/activity) e textos de ajuda do god-mode.
- Contrações quebradas em dois nós (didn{"'"}t) unificadas antes da troca.
- Frases que o usuário precisa digitar ("delete my project" /
  "delete my workspace") continuam em inglês: o código compara o texto.

Identificador do projeto (criar e editar):
- A mensagem de erro usava {max} sem receber o valor, então o limite nunca
  aparecia; agora recebe PROJECT_IDENTIFIER_MAX_LENGTH (nova constante em
  @plane/constants, 10).
- O tooltip dizia "Máx. 50 caracteres" (errado); agora usa {max} em todos
  os idiomas.
- O campo ganhou maxLength, então não é mais possível digitar além do limite.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
O index.html pré-renderizado (SPA mode) contém o ramo de servidor do
HydrateFallback: uma div vazia. No cliente, o next-themes já conhece o tema
na primeira renderização, então o spinner era renderizado de imediato e a
árvore divergia do HTML do servidor. O spinner agora só aparece depois da
montagem. O erro já existia antes da atualização para o preview.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Branch de produção passa a ser pespo-preview-integration; documenta como
produção é buildada/publicada na VPS (compose, worktree, Caddy /uploads,
MinIO, RabbitMQ), as decisões do merge (rotas de dashboard, migration de
merge 0129, pespo-brand.css), o patch do Headless UI, as correções pós-merge
e as convenções da varredura de tradução. Checklist de upgrade revisado.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@giuntonic
giuntonic merged commit 4d8c6d5 into preview Sep 24, 2026
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.

3 participants