X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/ab787c87caf7725e7c1c451fb2550a6619bab082..a49547b7a4bef633bb92bee9cf97fdcfe67c76aa:/src/fnpjs/actions.js diff --git a/src/fnpjs/actions.js b/src/fnpjs/actions.js index 8b002bf..b8aa033 100644 --- a/src/fnpjs/actions.js +++ b/src/fnpjs/actions.js @@ -3,7 +3,11 @@ define(function(require) { 'use strict'; var _ = require('libs/underscore'), - Backbone = require('libs/backbone'); + Backbone = require('libs/backbone'), + logging = require('fnpjs/logging/logging'); + +var logger = logging.getLogger('fnpjs.actions'); + var Action = function(fqName, definition, config, appObject) { this.fqName = fqName; @@ -19,14 +23,14 @@ _.extend(Action.prototype, Backbone.Events, { getPluginName: function() { return this.fqName.split('.')[0]; }, - updateContextParam: function(contextName, value) { + updateParam: function(filter, value) { var changed = false; _.pairs(this.definition.params).forEach(function(pair) { var paramName = pair[0], paramDesc = pair[1]; - if(paramDesc.type === 'context' && paramDesc.name === contextName) { - this.params[paramName] = value; - changed = true; + if(filter(paramDesc, paramName)) { + this.params[paramName] = value; + changed = true; } }.bind(this)); if(changed) { @@ -34,35 +38,30 @@ _.extend(Action.prototype, Backbone.Events, { this.trigger('paramsChanged'); } }, + updateContextParam: function(contextName, value) { + this.updateParam(function(paramDesc) { + return paramDesc.type === 'context' && paramDesc.name === contextName; + }, value); + }, updateKeyParam: function(keyName, toggled) { - var changed = false; - _.pairs(this.definition.params).forEach(function(pair) { - var paramName = pair[0], - paramDesc = pair[1]; - if(paramDesc.type === 'key' && paramDesc.key === keyName) { - this.params[paramName] = toggled; - changed = true; - } - }.bind(this)); - - if(changed) { - this._cache = null; - this.trigger('paramsChanged'); - } + this.updateParam(function(paramDesc) { + return paramDesc.type === 'key' && paramDesc.key === keyName; + }, toggled); }, updateWidgetParam: function(name, value) { - var paramDesc = this.definition.params[name]; - if(paramDesc.type === 'context' || paramDesc.type === 'key') { - throw new Error(''); - } - this.params[name] = value; - this._cache = null; - this.trigger('paramsChanged'); + this.updateParam(function(paramDesc, paramName) { + return !_.contains(['context', 'key'], paramDesc.type) && paramName === name; + }, value); }, getState: function() { var gotState; if(!this._cache) { - gotState = this.definition.getState.call(this, this.params); + try { + gotState = this.definition.getState.call(this, this.params); + } catch(e) { + logger.exception(e); + return; + } if(typeof gotState === 'boolean') { gotState = {allowed: gotState}; } @@ -75,8 +74,13 @@ _.extend(Action.prototype, Backbone.Events, { }, execute: function() { var state = this.getState(); + + var callback = function(ret) { + this.trigger('actionExecuted', ret); + }.bind(this); + if(state.allowed) { - return state.execute.call(this, this.params, this.appObject); + return state.execute.call(this, callback, this.params, this.appObject); } throw new Error('Execution not allowed'); }