Mercurial > hg > dml-open-vis
diff src/DML/MainVisBundle/Resources/assets/marionette/modules/RepresentationModule/RepresentationModule.22-Master.entity.collection.pair.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/RepresentationModule/RepresentationModule.22-Master.entity.collection.pair.js Tue Feb 09 20:54:02 2016 +0100 @@ -0,0 +1,333 @@ +"use strict"; + +App.module("RepresentationModule", function(RepresentationModule, App, Backbone, Marionette, $, _, Logger) { + + RepresentationModule.addInitializer(function(options){ + + RepresentationModule.registerMaster({ + id: "entity.collection.pair", + inherit: "entity._pair", + + + // ================================================================= + // config grid header + + _generateHeaderLabel1: function(entityHeaderView) { + return _.str.sprintf("collection comparison (%s)", this.getConfigParameterValueOrDefaultValue(entityHeaderView.options.config, "comparisonMode")); + }, + + + _generateHeaderLabel2: function(viewHeader) { + var configOnTheLeft = viewHeader.dynamicDerivedConfigData.attributes.collectionConfigOnTheLeft; + var configOnTheRight = viewHeader.dynamicDerivedConfigData.attributes.collectionConfigOnTheRight; + + var labelParts = []; + + if (configOnTheLeft) { + labelParts.push(this._generateCollectionConfigTitle(configOnTheLeft)); + } else { + labelParts.push("×"); + } + + labelParts.push(" ↔ "); + + if (configOnTheRight) { + labelParts.push(this._generateCollectionConfigTitle(configOnTheRight)); + } else { + labelParts.push("×"); + } + + return labelParts.join(""); + }, + + + // ================================================================= + // dynamic derived config data + + __optionsOfDynamicDerivedConfigData: { + attributesToExcludeFromHash: ["collectionConfigOnTheLeft", "collectionConfigOnTheRight"], + customHashSuffixGenerator: function (attributes) { + return (attributes.collectionConfigOnTheLeft ? attributes.collectionConfigOnTheLeft. getClientId() : "x") + + (attributes.collectionConfigOnTheRight ? attributes.collectionConfigOnTheRight.getClientId() : "x"); +// return (attributes.collectionConfigOnTheLeft ? attributes.collectionConfigOnTheLeft. getHashForParameters() : "x") +// + (attributes.collectionConfigOnTheRight ? attributes.collectionConfigOnTheRight.getHashForParameters() : "x"); + } + }, + + + __updateMethodOfDynamicDerivedConfigData: function (force) { + this._doUpdate(force); + if (this.attributes.collectionConfigOnTheLeft && this.attributes.dynamicDefinitionForCollectionOnTheLeft) { + return; + } + if (this.attributes.collectionConfigOnTheRight && this.attributes.dynamicDefinitionForCollectionOnTheRight) { + return; + } + var _this = this; + var interval = setInterval(function() { + _this._doUpdate(force); + if (_this.attributes.collectionConfigOnTheLeft && !_this.attributes.dynamicDefinitionForCollectionOnTheLeft) { + return; + } + if (_this.attributes.collectionConfigOnTheRight && !_this.attributes.dynamicDefinitionForCollectionOnTheRight) { + return; + } + clearInterval(interval); + }, 50); + }, + + __doUpdateMethodOfDynamicDerivedConfigData: function (force) { + var entityConfig = this.options.entityConfig; + var configGrid = this.options.configGrid; + + // do nothing with orphans (configs just before they are deleted) + if (!entityConfig.getDimension()) { + return; + } + + // find the nearest collections on the left and on the right + var newCollectionConfigOnTheLeft = entityConfig; + var newCollectionConfigOnTheRight = entityConfig; + + do { + newCollectionConfigOnTheLeft = configGrid.getPrevEntityNeighbour(newCollectionConfigOnTheLeft); + } while (newCollectionConfigOnTheLeft && newCollectionConfigOnTheLeft.getParameterValue("kind") == "pair"); + + do { + newCollectionConfigOnTheRight = configGrid.getNextEntityNeighbour(newCollectionConfigOnTheRight); + } while (newCollectionConfigOnTheRight && newCollectionConfigOnTheRight.getParameterValue("kind") == "pair"); + + var newDynamicDerivedConfigDataOnTheLeft = App.dynamicDerivedConfigDataProvider.get(newCollectionConfigOnTheLeft); + var newDynamicDerivedConfigDataOnTheRight = App.dynamicDerivedConfigDataProvider.get(newCollectionConfigOnTheRight); + + var newDynamicDefinitionForCollectionOnTheLeft = newDynamicDerivedConfigDataOnTheLeft ? newDynamicDerivedConfigDataOnTheLeft .attributes.dynamicDefinitionForCollection : null; + var newDynamicDefinitionForCollectionOnTheRight = newDynamicDerivedConfigDataOnTheRight ? newDynamicDerivedConfigDataOnTheRight.attributes.dynamicDefinitionForCollection : null; + + var attributesToSet = {}; + + var arrayOfShortcuts = [ + [newCollectionConfigOnTheLeft, "collectionConfigOnTheLeft", "change:parameters", this.triggerChange], + [newCollectionConfigOnTheRight, "collectionConfigOnTheRight", "change:parameters", this.triggerChange], + [newDynamicDefinitionForCollectionOnTheLeft, "dynamicDefinitionForCollectionOnTheLeft", "change", this.triggerChange], + [newDynamicDefinitionForCollectionOnTheRight, "dynamicDefinitionForCollectionOnTheRight", "change", this.triggerChange], + ]; + + for (var i = arrayOfShortcuts.length - 1; i >= 0; --i) { + var shortcuts = arrayOfShortcuts[i]; + var oldAttributeValue = this.attributes[shortcuts[1]]; + var newAttributeValue = shortcuts[0]; + if (newAttributeValue != oldAttributeValue) { + attributesToSet[shortcuts[1]] = newAttributeValue; + if (oldAttributeValue) { + this.stopListening(oldAttributeValue, shortcuts[2]); + } + if (newAttributeValue) { + this.listenTo(newAttributeValue, shortcuts[2], shortcuts[3]); + } + } + } + this.set(attributesToSet); + }, + + + __triggerChangeMethodOfDynamicDerivedConfigData: function() { + this.dropCachedHash(); + this.trigger("change"); + }, + + + generateDynamicDerivedConfigData: function(entityConfig, configGrid) { + var optionsOfThisDynamicDerivedConfigData = _.clone(this.__optionsOfDynamicDerivedConfigData); + optionsOfThisDynamicDerivedConfigData.entityConfig = entityConfig; + optionsOfThisDynamicDerivedConfigData.configGrid = configGrid; + + var dynamicDerivedConfigData = new RepresentationModule.DynamicDerivedConfigData({ + collectionConfigOnTheLeft: null, + collectionConfigOnTheRight: null, + dynamicDefinitionForCollectionOnTheLeft: null, + dynamicDefinitionForCollectionOnTheRight: null + }, optionsOfThisDynamicDerivedConfigData); + + dynamicDerivedConfigData.update = this.__updateMethodOfDynamicDerivedConfigData; + dynamicDerivedConfigData._doUpdate = this.__doUpdateMethodOfDynamicDerivedConfigData; + dynamicDerivedConfigData.triggerChange = this.__triggerChangeMethodOfDynamicDerivedConfigData; + + dynamicDerivedConfigData.listenTo(configGrid, "change_layout", dynamicDerivedConfigData.update); + dynamicDerivedConfigData.update(); + + return dynamicDerivedConfigData; + }, + + + // ================================================================= + // dynamic derived vis instance data + + + // ----------------------------------------------------------------- + // dynamic derived vis instance data - base + + __optionsOfDynamicDerivedVisInstanceDataForBase: { + attributesToExcludeFromHash: ["apiResponseOnTheLeft", "apiResponseOnTheRight"], + customHashSuffixGenerator: function (attributes) { + if (attributes.apiResponseOnTheLeft) { + return JSON.stringify(attributes.apiResponseOnTheLeft.errors); + } else { + return typeof attributes.apiResponseOnTheLeft; + } + if (attributes.apiResponseOnTheRight) { + return JSON.stringify(attributes.apiResponseOnTheRight.errors); + } else { + return typeof attributes.apiResponseOnTheRight; + } + } + }, + + + __upateMethodOfDynamicDerivedVisInstanceDataForBase: function(force) { + var visInstanceView = this.options.visInstanceView; + var _this = this; + _.each(["Right", "Left"], function(side) { + var dynamicDefinitionForCollection = visInstanceView.dynamicDerivedConfigDataForEntity.attributes["dynamicDefinitionForCollectionOnThe" + side]; + if (!dynamicDefinitionForCollection) { // entity kind has changed (e.g. a grid was reset) + return; + } + + var collectionId = dynamicDefinitionForCollection.attributes.id; + var requestParams = _.clone(visInstanceView.dynamicDerivedConfigDataForView.attributes.basePerspectiveRequestParams); + + if (!requestParams || !collectionId) { + var attrs = {}; + attrs["apiRequestURIOnThe" + side] = undefined; + attrs["apiRequestParamsHashOnThe" + side] = undefined; + attrs["apiResponseOnThe" + side] = undefined; + _this.set(attrs); + return; + } + requestParams.cid = collectionId; + + var apiRequestParamsHash = JSON.stringify(requestParams); + + if (!force && apiRequestParamsHash == _this.attributes["apiRequestParamsHashOnThe" + side]) { + return; + } + + var apiRequestURI = App.DataModule.CliopatriaAPI.request("getCollectionPerspective", requestParams, function(data){ + if (JSON.stringify(requestParams) != _this.attributes["apiRequestParamsHashOnThe" + side]) { + return; + } + var attrs = {}; + attrs["apiRequestParamsHashOnThe" + side] = undefined; + attrs["apiResponseOnThe" + side] = data; + _this.set(attrs); + }); + + var attrs = {}; + attrs["apiRequestURIOnThe" + side] = apiRequestURI; + attrs["apiRequestParamsHashOnThe" + side] = apiRequestParamsHash; + attrs["apiResponseOnThe" + side] = null; + _this.set(attrs); + }); + }, + + + generateDynamicDerivedVisInstanceDataForBase: function(visInstanceView) { + // An empty object if comparison is not supported + var viewMaster = visInstanceView._cachedViewMaster; + if (!viewMaster.options.visInstanceSupportedComparisonModes.length) { + return new RepresentationModule.DynamicDerivedVisInstanceData({}); + } + + var optionsForThisDynamicDerivedVisInstanceDataForBase = _.clone(this.__optionsOfDynamicDerivedVisInstanceDataForBase); + optionsForThisDynamicDerivedVisInstanceDataForBase.visInstanceView = visInstanceView; + + var dynamicDerivedVisInstanceDataForBase = new RepresentationModule.DynamicDerivedVisInstanceData({ + apiRequestURIOnTheLeft: undefined, + apiRequestParamsHashOnTheLeft: undefined, + apiResponseOnTheLeft: undefined, + apiRequestURIOnTheRight: undefined, + apiRequestParamsHashOnTheRight: undefined, + apiResponseOnTheRight: undefined + }, optionsForThisDynamicDerivedVisInstanceDataForBase); + + dynamicDerivedVisInstanceDataForBase.update = this.__upateMethodOfDynamicDerivedVisInstanceDataForBase; + + dynamicDerivedVisInstanceDataForBase.listenTo(visInstanceView.dynamicDerivedConfigDataForEntity, "change", dynamicDerivedVisInstanceDataForBase.update); + dynamicDerivedVisInstanceDataForBase.listenTo(visInstanceView.dynamicDerivedConfigDataForView, "change:basePerspectiveRequestParams", dynamicDerivedVisInstanceDataForBase.update); + + dynamicDerivedVisInstanceDataForBase.update(); + + return dynamicDerivedVisInstanceDataForBase; + }, + + + verifyAllDataForVisInstanceBase: function(visInstanceView) { + this._verifyThatViewIsNotEmptyOrUnknown(visInstanceView); + +// if (visInstanceView.options.entityConfig.getParameterValue("kind") +// && visInstanceView.options.viewConfig.getParameterValue("kind") == "key-relative-chord-seq") { +// throw new RepresentationModule.Error({type: "drawing", derivedDataToUpdate: "base"}); +// } + + var viewMaster = visInstanceView._cachedViewMaster; + if (!viewMaster.options.canHaveBase) { + return; + } + var supportedComparisonModes = viewMaster.options.visInstanceSupportedComparisonModes; + if (!supportedComparisonModes.length) { + throw new RepresentationModule.Error({type: "comparison_not-supported"}); + } + if (!_.contains(supportedComparisonModes, viewMaster._getVisInstanceViewComparisonMode(visInstanceView))) { + throw new RepresentationModule.Error({type: "comparison_wrong-type", supportedTypes: supportedComparisonModes}); + } + + var attributesOfDerivedConfigDataForEntityOnTheLeft = visInstanceView.dynamicDerivedConfigDataForEntity.attributes; + var attributesOfDerivedConfigDataForEntityOnTheRight = visInstanceView.dynamicDerivedConfigDataForEntity.attributes; + var dynamicDefinitionForCollectionOnTheLeft = attributesOfDerivedConfigDataForEntityOnTheLeft .dynamicDefinitionForCollectionOnTheLeft; + var dynamicDefinitionForCollectionOnTheRight = attributesOfDerivedConfigDataForEntityOnTheRight.dynamicDefinitionForCollectionOnTheRight; + var attributesOfCollectionOnTheLeft = dynamicDefinitionForCollectionOnTheLeft ? dynamicDefinitionForCollectionOnTheLeft.attributes : {}; + var attributesOfCollectionOnTheRight = dynamicDefinitionForCollectionOnTheRight ? dynamicDefinitionForCollectionOnTheRight.attributes : {}; + + if (attributesOfCollectionOnTheLeft.id === null || attributesOfCollectionOnTheRight.id === null) { + throw new RepresentationModule.Error({type: "data-preparing_entity-derived"}); + } + if (attributesOfCollectionOnTheLeft.id === false || attributesOfCollectionOnTheRight.id === false) { + var apiErrorsOnTheLeft = attributesOfCollectionOnTheLeft .errors || []; + var apiErrorsOnTheRight = attributesOfCollectionOnTheRight.errors || []; + apiErrors = apiErrorsOnTheLeft.concat(apiErrorsOnTheRight); + throw new RepresentationModule.Error({type: "api-error_entity-derived", apiErrors: apiErrors, coverTapAction: this.__coverTapActionThatUpdatesDynamicDerivedData, derivedDataToUpdate: "entity"}); + } + if ((attributesOfCollectionOnTheLeft .id === "" || (attributesOfCollectionOnTheLeft .hasOwnProperty("id") && attributesOfCollectionOnTheLeft .id === undefined)) + || (attributesOfCollectionOnTheRight.id === "" || (attributesOfCollectionOnTheRight.hasOwnProperty("id") && attributesOfCollectionOnTheRight.id === undefined))) { + throw new RepresentationModule.Error({type: "collection_no-recordings"}); + } + if (attributesOfCollectionOnTheLeft.id === undefined || attributesOfCollectionOnTheRight.id === undefined) { + throw new RepresentationModule.Error({type: "pair_incomplete"}); + } + + var attribytesOfDerivedVisInstanceDataForBase = visInstanceView.dynamicDerivedVisInstanceDataForBase.attributes; + if (!attribytesOfDerivedVisInstanceDataForBase.apiResponseOnTheLeft || !attribytesOfDerivedVisInstanceDataForBase.apiResponseOnTheRight) { + throw new RepresentationModule.Error({type: "data-preparing_base"}); + } + if (attribytesOfDerivedVisInstanceDataForBase.apiResponseOnTheLeft.errors || attribytesOfDerivedVisInstanceDataForBase.apiResponseOnTheRight.errors) { + var apiErrorsOnTheLeft = attribytesOfDerivedVisInstanceDataForBase.apiResponseOnTheLeft .errors || []; + var apiErrorsOnTheRight = attribytesOfDerivedVisInstanceDataForBase.apiResponseOnTheRight.errors || []; + var apiErrors = apiErrorsOnTheLeft.concat(apiErrorsOnTheRight); + + if (apiErrors[0]) { + var error0 = apiErrors[0]; + if (((error0.code == 11 || error0.code == 12) && !apiErrors[1]) || (apiErrors[1] && (apiErrors[1].code == 11 || apiErrors[1].code == 12))) { + throw new RepresentationModule.Error({type: "api-message_progress_base", apiErrors: apiErrors, coverTapAction: this.__coverTapActionThatUpdatesDynamicDerivedData, derivedDataToUpdate: "base"}); + + // FIXME errors like this should probably go to Master.view.xxx + } else if ((error0.code == 20 && !apiErrors[1]) || (apiErrors[1] && (apiErrors[1].code == 20))) { + return; + } + + } + + throw new RepresentationModule.Error({type: "api-error_base", apiErrors: apiErrors, coverTapAction: this.__coverTapActionThatUpdatesDynamicDerivedData, derivedDataToUpdate: "base"}); + } + }, + }); + }); +}, Logger);