Mercurial > hg > dml-open-vis
diff src/DML/MainVisBundle/Resources/assets/marionette/modules/DataModule/DataModule.31-DynamicDefinitionProvider.js @ 0:493bcb69166c
added public content
author | Daniel Wolff |
---|---|
date | Tue, 09 Feb 2016 20:54:02 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/DML/MainVisBundle/Resources/assets/marionette/modules/DataModule/DataModule.31-DynamicDefinitionProvider.js Tue Feb 09 20:54:02 2016 +0100 @@ -0,0 +1,74 @@ +"use strict"; + +App.module("DataModule", function(DataModule, App, Backbone, Marionette, $, _, Logger) { + DataModule.addInitializer(function(){ + //var logger = Logger.get("DataModule.DynamicDefinition"); + + DataModule.DynamicDefinitionProvider = Marionette.Object.extend({ + + options: { + DynamicDefinition: undefined, + apiMethod: undefined, + customAttributesWhenNotApplicable: undefined, + customAttributesWhileBeingUpdated: undefined, + customAttributesWhenIsFaulty: undefined, + }, + + // These methods are defined in children prototypes + definitionIsFaulty: function(definition) {}, + definitionIsBeingUpdated: function(definition) {}, + configParametersToRequestParameters: function(config) {}, + apiResponseToDynamicDefinitionAttributes: function(data, query) {}, + + initialize: function() { + //this.options = options; + this._dynamicDefinitionsByEntityConfigClientId = {}; + this._requestHashesByParameterHash = {}; + this._requestParametersByRequestHash = {}; + this._cachedAttributesByRequestHash = {}; + }, + + get: function(entityConfig) { + var clientId = entityConfig.getClientId(); + var definition = this._dynamicDefinitionsByEntityConfigClientId[clientId]; + + if (!definition) { + definition = new this.options.DynamicDefinition({}, { + entityConfig: entityConfig, + provider: this, + }); + this._dynamicDefinitionsByEntityConfigClientId[clientId] = definition; + } + + return definition; + }, + + retire: function (entityConfigClientId) { + var definitionToRetire = this._dynamicDefinitionsByEntityConfigClientId[entityConfigClientId]; + definitionToRetire.destroy(); + delete this._dynamicDefinitionsByEntityConfigClientId[entityConfigClientId]; + }, + + updateResponseForRequestHash: function(requestHash) { + var requestParameters = this._requestParametersByRequestHash[requestHash]; + + if (requestParameters === null) { + this._cachedAttributesByRequestHash[requestHash] = _.clone(this.options.customAttributesWhenNotApplicable); + this.trigger("change:" + requestHash); + return; + } + + this._cachedAttributesByRequestHash[requestHash] = _.clone(this.options.customAttributesWhileBeingUpdated); + this.trigger("change:" + requestHash); + + var provider = this; + App.DataModule.CliopatriaAPI.request(this.options.apiMethod, requestParameters, function(data, query){ + var attributes = provider.apiResponseToAttributes(data, query); + provider._cachedAttributesByRequestHash[requestHash] = attributes; + provider.trigger("change:" + requestHash); + }); + } + }); + }); + +}, Logger);