Admin: suportar fallback condicional em @title de itens de array (Mustache inverted sections)
Nobody has claimed this yet.
- Dominant language
- TypeScript
- Stars
- 5
- Forks
- 2
- Avg merge
- 20h 12m
- Merged PRs (30d)
- 36
Description
Contexto
No admin, o rótulo de cada item de um array de objetos é renderizado a partir da anotação @title/@titleBy da interface do item. Hoje o renderer só faz substituição simples de {{campo}} / {{{campo}}}. Ele não suporta as inverted sections do Mustache ({{^campo}}...{{/campo}} e {{#campo}}...{{/campo}}).
Isso foi descoberto em produção na Granado (deco-sites/granadobr-tanstack) ao tentar dar um título com fallback a banners de carrossel.
Comportamento observado
Com a anotação:
/** @title {{alt}}{{^alt}}{{promotionId}}{{/alt}} */
interface ImageBanner { alt?: string; promotionId: string; /* ... */ }
- Quando
altestá vazio, o admin mostra a string do template crua no rótulo do item ({{alt}}{{^alt}}{{promotionId}}{{/alt}}) ou cai para o genérico "Item N". - Em outro caso (
{{label}}{{^label}}{{alt}}{{/label}}), o admin ignorou as tags de seção e concatenou os dois campos (labelalt), em vez de usar um como fallback do outro.
Ou seja, as inverted sections não funcionam de forma nenhuma — nem como fallback, nem sendo ignoradas de forma limpa.
Impacto
Arrays no CMS (banners, cards, links, etc.) frequentemente têm um campo "preferido" para o rótulo e um "reserva" (ex.: alt quando preenchido, senão promotionId; title senão label). Sem fallback, o editor precisa escolher um único campo fixo:
- se escolher o opcional (
alt), muitos itens ficam sem rótulo → "Item N"; - se escolher o obrigatório (
promotionId), perde-se o texto mais legível quando existe.
Proposta / benefício
Suportar lógica condicional simples no @title, por uma destas vias:
- Implementar as inverted/normal sections do Mustache no renderer de título do admin (
@decocms/blocks-admin) —{{alt}}{{^alt}}{{promotionId}}{{/alt}}passaria a significar "mostraalt; se vazio, mostrapromotionId". É o comportamento padrão de qualquer engine Mustache. - Adicionar suporte a fallback no
@titleBy, aceitando uma lista de campos:@titleBy alt, promotionId→ usa o primeiro não-vazio.
A opção (2) é mais explícita e à prova de erro para quem escreve as interfaces; a (1) desbloqueia também concatenações condicionais mais ricas.
Workaround atual
Trocamos por títulos simples e confiáveis (ex.: @titleBy promotionId, @title {{label}} {{alt}}), documentado no PR https://github.com/deco-sites/granadobr-tanstack/pull/172.
Observação adicional
@titleBy/@title apontando para um campo @format rich-text renderiza o HTML cru no rótulo (<p style=...>). Vale considerar remover as tags HTML ao montar o rótulo do item.
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by locating the admin title renderer in @decocms/blocks-admin and reproduce the documented @title examples with empty and populated fields. Check existing renderer tests, if present, then clarify whether completion means Mustache section support, @titleBy fallback support, or both; include coverage for the chosen behavior and verify that raw templates no longer appear in item labels.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- frontend
- Issue type
- Feature
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 48/100