Repository navigation
release: integra customizações Pespo, correções e tradução pt-BR - #6
Merged
Merged
Conversation
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Leva para a
previewa branch que está em produção desde 2026-09-23 (pespo-preview-integration): opreviewatual 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)/dashboard; os dashboards nativos do preview foram para/dashboards, com aba própria.0129_merge_pespo_preview, sem renomear nada.packages/tailwind-config/pespo-brand.css, por cima dos tokens do@makeplane/propel.Correções
@headlessui/react2.2.10. OFrozendoCombobox.Optionsapagava a ref do filho no React 19. Registrado empnpm-workspace.yaml.project_idnão aceito pela view), com teste de contrato.HydrateFallbackdo web (já existia antes).{max}sem o valor) e o tooltip dizia 50 em vez de 10. Nova constantePROJECT_IDENTIFIER_MAX_LENGTH, e o campo agora temmaxLength.Tradução para pt-BR
common.json(ui.*,auth_errors.*,native_dashboards.*,chart_axis.*), em en e pt-BR.Docs:
docs/pespo-customizations.mdatualizado com o fluxo de deploy da VPS, as decisões do merge e o checklist de upgrade.Type of Change
Screenshots and Media (if applicable)
Test Scenarios
check:typesecheck:lintsem erros em web, space, admin e ui. Os testes de dashboard do backend passam (17/17, incluindo o novotest_project_scoped_chart_route).migrate --plancontra 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.CustomSelecteCustomSearchSelectreais. Sem o patch a caixa abre em (0, 0); com o patch, logo abaixo do botão./projects/:id/dashboards, adicionar um widget e ver o gráfico carregar;References
pespo-branding-v1.4.1🤖 Generated with Claude Code