decocms / decocms/blocks

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

Open
#372 1 comment 0 reactions 0 assignees View on GitHub

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

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.