--- /dev/null
+define(function(require) {
+
+'use strict';
+
+var _ = require('libs/underscore'),
+ Backbone = require('libs/backbone');
+
+var Action = function(fqName, definition, config, appObject) {
+ this.fqName = fqName;
+ this.definition = definition;
+ this.config = config;
+ this._cache = null;
+ this.appObject = appObject;
+
+ this.params = {};
+};
+
+_.extend(Action.prototype, Backbone.Events, {
+ getPluginName: function() {
+ return this.fqName.split('.')[0];
+ },
+ updateContextParam: function(contextName, 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;
+ }
+ }.bind(this));
+ if(changed) {
+ this._cache = null;
+ this.trigger('paramsChanged');
+ }
+ },
+ 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');
+ }
+ },
+ 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');
+ },
+ getState: function() {
+ var gotState;
+ if(!this._cache) {
+ gotState = this.definition.getState.call(this, this.params);
+ if(typeof gotState === 'boolean') {
+ gotState = {allowed: gotState};
+ }
+ this._cache = _.extend({}, this.definition.stateDefaults || {}, gotState);
+ }
+ if(this._cache === false) {
+ this._cache = {allowed: false};
+ }
+ return this._cache;
+ },
+ execute: function() {
+ var state = this.getState();
+ if(state.allowed) {
+ return state.execute.call(this, this.params, this.appObject);
+ }
+ throw new Error('Execution not allowed');
+ }
+});
+
+
+return {
+ Action: Action
+};
+
+});
-define(['libs/jquery', 'libs/underscore', 'fnpjs/logging/logging'], function($, _, logging) {
+define(['libs/jquery', 'libs/underscore', 'fnpjs/logging/logging', 'fnpjs/actions'], function($, _, logging, actions) {
'use strict';
moduleInstances = {},
eventListeners = [],
plugins = [],
- config;
+ actionDefinitions = {},
+ config,
+ actionsAppObject;
_.each(_.keys(modules || {}), function(moduleName) {
if(_.contains(app.permissions[moduleName] || [], 'handleEvents')) {
this.getConfig = function() {
return config;
};
+
+ this.createAction = function(fqName, config) {
+ var definition = actionDefinitions[fqName];
+ if(!definition) {
+ throw new Error('Invalid action: ' + fqName);
+ }
+ return new actions.Action(fqName, definition, config, actionsAppObject);
+ };
+
+ this.registerKeyHandler = function(eventName, handler) {
+ $('body').on(eventName, function(e) {
+ handler(e);
+ });
+ };
+
+ this.registerActionsAppObject = function(_actionsAppObject) {
+ actionsAppObject = _actionsAppObject;
+ };
};
this.registerPlugin = function(plugin) {
plugins.push(plugin);
+ (plugin.actions || []).forEach(function(definition) {
+ var actionFqName = plugin.name + '.' + definition.name;
+ actionDefinitions[actionFqName] = definition;
+ });
};
this.start = function(_config) {
logging.setConfig(config.logging);
}
+ _.pairs(config.plugins || {}).forEach(function(pair) {
+ var pluginName = pair[0],
+ pluginConfig = pair[1];
+
+ plugins.some(function(plugin) {
+ if(plugin.name === pluginName) {
+ if(_.isFunction(plugin.config)) {
+ plugin.config(pluginConfig);
+ }
+ return true; //break
+ }
+ });
+ });
+
app.initModules.forEach(function(moduleName) {
getModuleInstance(moduleName).start();
});