From 900c61df3d2397b3072a0c7de94a2a0f4a656061 Mon Sep 17 00:00:00 2001 From: Lucas Rayan Date: Mon, 2 Nov 2026 15:24:23 -0300 Subject: [PATCH] =?UTF-8?q?feat(catalogo):=20link=20de=20afiliado=20por=20?= =?UTF-8?q?idioma=20e=20bot=C3=A3o=20alinhado=20no=20rodap=C3=A9=20do=20ca?= =?UTF-8?q?rd?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit O botão do AliExpress passa a ficar no rodapé do card, alinhado entre os cards. O link usa a coluna Link_ da planilha (en, es, fr, de, zh-CN) e cai no Link (Brasil) quando ela está vazia. Colunas de link não viram filtro, e a API lê A1:AZ1000. Co-Authored-By: Claude Sonnet 5.5 --- CHANGELOG.md | 5 +++++ app/[locale]/catalogo/page.jsx | 5 +++-- app/api/placas/route.js | 2 +- components/BoardCard.jsx | 29 ++++++++++++++++++----------- lib/boardLinks.js | 12 ++++++++++++ 5 files changed, 39 insertions(+), 14 deletions(-) create mode 100644 lib/boardLinks.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 591c095..b571895 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,9 @@ Tudo o que muda de relevante no ESPDocs está aqui. O formato segue o ### Adicionado +- Catálogo de placas com link de afiliado por país: a planilha ganha as colunas `Link_en`, + `Link_es`, `Link_fr`, `Link_de` e `Link_zh-CN`, e o botão do card usa a do idioma da página, + caindo no `Link` (Brasil) quando a coluna está vazia. As colunas de link nunca viram filtro. - Deploy automático no Coolify: depois de publicar a imagem, o `release.yml` pede o deploy e espera o resultado. Só implanta quando o `latest` muda, então merge só de documentação ou tag não reiniciam o container. Um disparo manual do workflow força o deploy. @@ -26,6 +29,8 @@ Tudo o que muda de relevante no ESPDocs está aqui. O formato segue o ### Corrigido +- Card do catálogo: o botão "Ver no AliExpress" fica sempre no rodapé, alinhado entre os cards. +- A API do catálogo lê `A1:AZ1000`, para comportar as colunas novas da planilha. - O link do arquivo do Fritzing na apostila da formação 1 apontava para `/apostilas/1/`, caminho que não existe. diff --git a/app/[locale]/catalogo/page.jsx b/app/[locale]/catalogo/page.jsx index 31c1363..f5cce02 100644 --- a/app/[locale]/catalogo/page.jsx +++ b/app/[locale]/catalogo/page.jsx @@ -6,6 +6,7 @@ import Header from "@/components/Header"; import Footer from "@/components/Footer"; import PageHero from "@/components/PageHero"; import BoardCard from "@/components/BoardCard"; +import { isLinkColumn } from "@/lib/boardLinks"; import { AlertTriangle, RefreshCw, Search, ShoppingCart, SlidersHorizontal } from "lucide-react"; const HEADER_MAP_EN = { @@ -184,7 +185,7 @@ export default function PlacasPage() { const generateFilterOptions = (data, headers) => { const options = {}; - const filterableColumns = headers.filter((h) => !excludedColumns.includes(h)); + const filterableColumns = headers.filter((h) => !excludedColumns.includes(h) && !isLinkColumn(h)); filterableColumns.forEach((column) => { const uniqueValues = new Set(); @@ -265,7 +266,7 @@ export default function PlacasPage() { const activeFilterCount = Object.keys(activeFilters).length + (searchTerm ? 1 : 0); - const filterableColumns = headers.filter((h) => !excludedColumns.includes(h)); + const filterableColumns = headers.filter((h) => !excludedColumns.includes(h) && !isLinkColumn(h)); const hero = ( !mainFields.includes(key) && board[key]); + const mainFields = ["Nome", "Imagem", "Loja Oficial"]; + + const technicalFields = Object.keys(board).filter((key) => !isLinkColumn(key) && !mainFields.includes(key) && board[key]); const valor = (campo) => board[campo]?.toString().toLowerCase().trim(); const recursos = technicalFields.filter((campo) => ["sim", "opcional"].includes(valor(campo))); @@ -118,7 +123,7 @@ export default function BoardCard({ board }) { {board.Imagem && (
)} @@ -167,14 +172,16 @@ export default function BoardCard({ board }) {
)} - {board.Link && ( - - {isEn ? "View on AliExpress" : isEs ? "Ver en AliExpress" : isFr ? "Voir sur AliExpress" : isZh ? "在 AliExpress 查看" : isDe ? "Auf AliExpress ansehen" : "Ver no AliExpress"} - + {link && ( +
+ + {isEn ? "View on AliExpress" : isEs ? "Ver en AliExpress" : isFr ? "Voir sur AliExpress" : isZh ? "在 AliExpress 查看" : isDe ? "Auf AliExpress ansehen" : "Ver no AliExpress"} + +
)} diff --git a/lib/boardLinks.js b/lib/boardLinks.js new file mode 100644 index 0000000..6696dfb --- /dev/null +++ b/lib/boardLinks.js @@ -0,0 +1,12 @@ +// Colunas de link da planilha: "Link" é o padrão (Brasil) e "Link_" o link +// de afiliado gerado para o país de envio daquele idioma. +export const LINK_COLUMN_PREFIX = "Link_"; + +export function isLinkColumn(coluna) { + return coluna === "Link" || coluna.startsWith(LINK_COLUMN_PREFIX); +} + +export function linkForLocale(board, locale) { + const especifico = locale && locale !== "pt" ? board[`${LINK_COLUMN_PREFIX}${locale}`] : ""; + return (especifico || board.Link || "").trim(); +}