Skip to content

Admin: suportar fallback condicional em @title de itens de array (Mustache inverted sections) #372

Description

@JonasJesus42

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:

  1. 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.
  2. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions