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

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions