d369ff06dd75d835030412b8362ac8c6142732d1
[fnpeditor.git] / src / fnpjs / actions.js
1 define(function(require) {
2     
3 'use strict';
4
5 var _ = require('libs/underscore'),
6     Backbone = require('libs/backbone');
7
8 var Action = function(fqName, definition, config, appObject) {
9     this.fqName = fqName;
10     this.definition = definition;
11     this.config = config;
12     this._cache = null;
13     this.appObject = appObject;
14
15     this.params = {};
16 };
17
18 _.extend(Action.prototype, Backbone.Events, {
19     getPluginName: function() {
20         return this.fqName.split('.')[0];
21     },
22     updateParam: function(filter, value) {
23         var changed = false;
24         _.pairs(this.definition.params).forEach(function(pair) {
25             var paramName = pair[0],
26                 paramDesc = pair[1];
27             if(filter(paramDesc, paramName)) {
28                 this.params[paramName] = value;
29                 changed = true;
30             }
31         }.bind(this));
32         if(changed) {
33             this._cache = null;
34             this.trigger('paramsChanged');
35         }
36     },
37     updateContextParam: function(contextName, value) {
38         this.updateParam(function(paramDesc) {
39             return paramDesc.type === 'context' && paramDesc.name === contextName;
40         }, value);
41     },
42     updateKeyParam: function(keyName, toggled) {
43         this.updateParam(function(paramDesc) {
44             return paramDesc.type === 'key' && paramDesc.key === keyName;
45         }, toggled);
46     },
47     updateWidgetParam: function(name, value) {
48         this.updateParam(function(paramDesc, paramName) {
49             return !_.contains(['context', 'key'], paramDesc.type) && paramName === name;
50         }, value);
51     },
52     getState: function() {
53         var gotState;
54         if(!this._cache) {
55             gotState = this.definition.getState.call(this, this.params);
56             if(typeof gotState === 'boolean') {
57                 gotState = {allowed: gotState};
58             }
59             this._cache = _.extend({}, this.definition.stateDefaults || {}, gotState);
60         }
61         if(this._cache === false) {
62             this._cache = {allowed: false};
63         }
64         return this._cache;
65     },
66     execute: function() {
67         var state = this.getState();
68         if(state.allowed) {
69             return state.execute.call(this, this.params, this.appObject);
70         }
71         throw new Error('Execution not allowed');
72     }
73 });
74
75
76 return {
77     Action: Action
78 };
79
80 });