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
alt está 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 "mostra alt; se vazio, mostra promotionId". É 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.
Contexto
No admin, o rótulo de cada item de um array de objetos é renderizado a partir da anotação
@title/@titleByda 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:
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".{{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.:
altquando preenchido, senãopromotionId;titlesenãolabel). Sem fallback, o editor precisa escolher um único campo fixo:alt), muitos itens ficam sem rótulo → "Item N";promotionId), perde-se o texto mais legível quando existe.Proposta / benefício
Suportar lógica condicional simples no
@title, por uma destas vias:@decocms/blocks-admin) —{{alt}}{{^alt}}{{promotionId}}{{/alt}}passaria a significar "mostraalt; se vazio, mostrapromotionId". É o comportamento padrão de qualquer engine Mustache.@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/@titleapontando para um campo@format rich-textrenderiza o HTML cru no rótulo (<p style=...>). Vale considerar remover as tags HTML ao montar o rótulo do item.