Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Function call and checking results in DustJs

I am combining connect-roles with dust template ejs template have something like this syntax

<% if (userCan('impersonate')) { %>
  <button id="impersonate">Impersonate</button>
<% } %>  

and that in jade

if userCan('impersonate')
  button#impersonate Impersonate

How to do this in dust?

            {@eq key=userCan('edit data') value="true" }
                <td><a href='/assets/edit/{.ID_ASSET}'>Edit</a></td>
                <td><a href='/assets/delete/{.ID_ASSET}'>Delete</a></td>
            {:else}

            {/eq}

This code get me an error

Wed, 06 Jan 2016 16:57:47 GMT uncaughtException Expected end tag for assets but it was not found. At line : 42, column : 13

Edit: I have this in {@contextDump key="full"/}

   "tail": {},
  "isObject": true,
  "head": {
    "enrouten": {
      "routes": {},
      "path": "function path(name, data) {var route;route = this.routes[name];if (typeof route === 'string') {return path2regexp.compile(route)(data);}return undefined;}"
    },
    "userIs": "function (action) {var act = ert(req, action);return roles.test(req, act)}",
    "userCan": "function (action) {var act = ert(req, action);return roles.test(req, act)}",
    "isAuthenticated": "function () { [native code] }",
    "_csrf": "FSaqN0PWxOF4slTUfnGHXJ0NkPOTJFl0u57eM=",
    "title": "Справочник спецификаций",
    "assets": [
      {
        "ID_ASSET": 1,
        "SYMBOL_KODE": "12.TR.18",
        "DOK_NAME": "ТХ9042",
        "DESCRIPTION": "Контроллер программируемый ТХ9042",
        "DATE_RELISE": "2001-10-04T21:00:00.000Z",
        "POS_KODE": "pos kode 1                                                                                                                                                                                                                                                     ",

And this is my controller

    router.get('/',  function (req, res) {
   var context = {
   req: req, // from Express callback
   userCan: function(chunk, context, bodies, params) {
     var permission = context.resolve(params.permission);
     return context.get('req').userCan(permission);
   }
 }
    models.SPR_ASSET.findAll({
      include: [ models.SPR_TYPE_UM, models.SPR_TYPE_ASSETS,  models.SPR_ASSETS_DS ]
    }).then(function(assets) {
      res.render('assets', {
        title: 'Справочник спецификаций',
        assets: assets
        context: context
      });
    });

var context here didn't work

like image 270
Anatoly Ruchka Avatar asked Sep 25 '22 18:09

Anatoly Ruchka


1 Answers

Dust doesn't know what functions are. It only knows about "references", which are keys in your context.

If a key in your context is a function, Dust will invoke the function and use the result in its rendering. Such functions are called context helpers, and you can read about them in the documentation. Alternatively, you can register functions directly with Dust that are accessible anywhere-- these are referred to as global helpers.

If userCan is some sort of global that connect-roles makes available, you might make use of it in a global helper like this:

dust.helpers.userCan = function(chunk, context, bodies, params) {
  var permission = context.resolve(params.permission);
  return userCan(permission);
}

And in your template:

{@userCan permission="edit data"}
  <td><a href='/assets/edit/{.ID_ASSET}'>Edit</a></td>
  <td><a href='/assets/delete/{.ID_ASSET}'>Delete</a></td>
{:else}
  Please log in.
{/userCan}

Edit: It looks like userCan is request-scoped, so you can use it by adding the request variable to your context. Something like:

var context = {
  req: req, // from Express callback
  userCan: function(chunk, context, bodies, params) {
    var permission = context.resolve(params.permission);
    return context.get('req').userCan(permission);
  }
}

{#userCan permission="edit data"}
  <td><a href='/assets/edit/{.ID_ASSET}'>Edit</a></td>
  <td><a href='/assets/delete/{.ID_ASSET}'>Delete</a></td>
{:else}
  Please log in.
{/userCan}

To be clear, there is no method to invoke a function directly in your template in Dust-- it does not support arbitrary JS execution. To invoke a function with parameters, you must provide a helper that invokes the function so that it can transform the params into the format that your function expects.

like image 51
Interrobang Avatar answered Oct 16 '22 22:10

Interrobang