Skip to content

Change from Mustache to Handlebars for string template methods #28

@cblanquera

Description

@cblanquera

Describe the feature you'd like to request

You can use mustache templating in @display, @field.relation, @list.template, @view.template to describe rows in form fields, search columns and bread crumbs.

model ArticleComment 
  @display("{{comment.profile.name}} {{comment.profile.email}} - {{comment.message}}")
  @query("*" "article.*" "comment.*" "comment.profile.*")
{
  articleId  String @id

  commentId  String
    @label("Note") @id
    @field.relation({ 
      id "id"
      search "/admin/comment/search?json"
      template "{{message}}"  
    })
    @filter.relation({ 
      id "id"
      search "/admin/comment/search?json"
      template "{{message}}"  
    })
   @list.template({ template "{{comment.message}}" }) 
   @view.template({ template "{{comment.message}}" })

  article           Article         @relation({ local "articleId" foreign "id" })
  comment     Comment    @relation({ local "commentId" foreign "id" })
}

Consider a comment model where there is no column to easily label a comment. In the generated components for comments using the entire message to represent a row will break the intended layout interface.

Describe the solution you'd like

I would like to switch out mustache to handlebars in the generators and add the following handlebar helpers to start.

  • clip - {{clip comment 25}}...
  • either - {{either name email}}
  • formula - {{#formula}} {{order.subtotal}} + {{order.shipping}} {{/formula}}
  • uppercase - {{uppercase country}}
  • lowercase - {{lowercase status}}

This way, we can change the templates to look like the following (and will generate more pleasing results).

model ArticleComment 
  @display("{{either comment.profile.name comment.profile.email}} - {{clip comment.message 25}}...")
  @query("*" "article.*" "comment.*" "comment.profile.*")
{
  articleId  String @id

  commentId  String
    @label("Note") @id
    @field.relation({ 
      id "id"
      search "/admin/comment/search?json"
      template "{{clip message 25}}..."  
    })
    @filter.relation({ 
      id "id"
      search "/admin/comment/search?json"
      template "{{clip message 25}}..."  
    })
   @list.template({ template "{{clip comment.message 25}}..." }) 
   @view.template({ template "{{clip comment.message 25}}..." })

  article           Article         @relation({ local "articleId" foreign "id" })
  comment     Comment    @relation({ local "commentId" foreign "id" })
}
  • Global search and replace mustache with handlebars by hand for each (4 files)
  • Provision a helper file (or method) that adds pre-defined helpers to the global handlebars import (whenever it's imported, add the following helpers).

Describe alternatives you've considered

Generators also use mustache to some extent to generate code. But it should be okay to swap this out because handlebars markets that it is built on top of mustache and is backwards compatible with mustache templates. We just need to double check the generated code for type errors.

Metadata

Metadata

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