Mercurial > hg > dml-open-vis
diff src/DML/MainVisBundle/Resources/assets/marionette/modules/RepresentationModule/RepresentationModule.21-Master.entity.collection.default.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.21-Master.entity.collection.default.js Tue Feb 09 20:54:02 2016 +0100 @@ -0,0 +1,463 @@ +"use strict"; + +App.module("RepresentationModule", function(RepresentationModule, App, Backbone, Marionette, $, _, Logger) { + + RepresentationModule.addInitializer(function(options){ + + RepresentationModule.registerMaster({ + id: "entity.collection.default", + inherit: "entity._default", + + defaultConfigParameterValues: { + "library": "", + "year": "", + "genre": "", + "composer": "", + "performer": "", + "title": "", + "place": "", + "collection": "" + }, + + options: { + availableLibraries: ["bl", "charm", "ilm", "mazurka"], + librarySeparator: ";", + librarySeparatorAlternatives: /\,/g, + presenceOfParameters: { + "title": ["bl", "charm", "ilm", "mazurka"], + "year": ["bl", "charm", "mazurka"], // in ILM there is a release date (160 000 / 250 000) + "composer": ["bl", "charm", "mazurka"], + "performer": ["bl", "charm", "mazurka"], // artist in ILM + "collection": ["bl"], // (only for ethnographic, excludes composer) + "genre": ["ilm"], + "place": ["bl"], + }, + }, + + + // ================================================================= + // housekeeping + + extractCleanedConfigParameterValuesFromPlannedParameterValues: function(config) { + // Parent master's behaviour + var result = RepresentationModule.getMasterById("entity._default").extractCleanedConfigParameterValuesFromPlannedParameterValues.apply(this, arguments); + + // no need to remove recordingURI as there is no default value for it (it is removed automatically) + + //console.log("CLEANED BEFORE", result); + // remove all parameters that are not relevant to the chosen library + var presentParameterNames = _.keys(this._getPresentParameterNamesForLibrary(result.library)); + + for (var parameterName in result) { + if (result.hasOwnProperty(parameterName) && parameterName !== "library") { + if (presentParameterNames.indexOf(parameterName) == -1) { + delete result[parameterName]; + } + } + } + + //console.log("CLEANED AFTER", result); + return result; + }, + + + // ================================================================= + // config grid panel + + _parseLibraryStringToArray: function(library) { + var fixedLibrary = _.str.trim(library).replace(this.options.librarySeparatorAlternatives, this.options.librarySeparator).toLowerCase(); + if (!fixedLibrary.length) { + return []; + } else { + return _.map(fixedLibrary.split(this.options.librarySeparator), function(v) {return _.str.trim(v);}); + } + }, + + + _parseLibraryStringToObject: function(library) { + var result = {}; + var libraryAsArray = this._parseLibraryStringToArray(library); + for (var i = 0; i < libraryAsArray.length; i++) { + result[libraryAsArray[i]] = true; + } + return result; + }, + + + _restoreLibraryStringFromArray: function(libraryArray) { + libraryArray.sort(); + return libraryArray.length ? libraryArray.join(this.options.librarySeparator) : ""; + + }, + + _restoreLibraryStringFromObject: function(libraryObject) { + return this._restoreLibraryStringFromArray(_.keys(libraryObject)); + }, + + + _getPresentParameterNamesForLibrary: function(library) { + if (this._cachedPresentParameterNamesByLibrary === undefined) { + this._cachedPresentParameterNamesByLibrary = {}; + } + if (this._cachedPresentParameterNamesByLibrary[library] === undefined) { + var libraries = this._parseLibraryStringToArray(library); + var result = {}; + if (libraries.length) { + for (var parameterName in this.options.presenceOfParameters) { + var fieldPresence = this.options.presenceOfParameters[parameterName]; + if (_.intersection(libraries, fieldPresence).length == libraries.length) { + result[parameterName] = true; + } + } + } + this._cachedPresentParameterNamesByLibrary[library] = result; + } + + return this._cachedPresentParameterNamesByLibrary[library]; + }, + + + // ----------------------------------------------------------------- + // config grid panel - prepare + + prepareConfigGridPanelMainArea: function(configGridPanelView) { + configGridPanelView._$mainArea.data("$libraryLabel_yes", configGridPanelView._$mainArea.find(".cgpma__id_library-label_yes")); + configGridPanelView._$mainArea.data("$libraryLabel_no", configGridPanelView._$mainArea.find(".cgpma__id_library-label_no")); + + // Library tickboxes + for (var i = this.options.availableLibraries.length - 1; i >= 0; --i) { + var availableLibrary = this.options.availableLibraries[i]; + var $tickbox = configGridPanelView._$mainArea.find(".cgpma__id_" + availableLibrary); + configGridPanelView._$mainArea.data("$tickbox_library_" + availableLibrary, $tickbox); + $tickbox.data("libraryId", availableLibrary); + } + + // Parent master's behaviour + RepresentationModule.getMasterById("entity._default").prepareConfigGridPanelMainArea.apply(this, arguments); + }, + + + __panelInputChangeValueHandler: function(event) { + if (event.type == "tickboxchangevalue") { + var $thickbox = $(event.target); + var libraryId = $thickbox.data("libraryId"); + if (libraryId) { + var configGridPanelView = $thickbox.data("configGridPanelView"); + var $mainArea = configGridPanelView._$mainArea; + var master = $thickbox.data("configGridPanelView")._masterBehindMainArea; + if (!$mainArea.data("ignoreChangesInLibraryTickboxes")) { + var plannedLibraries = []; + for (var i = 0; i < master.options.availableLibraries.length; i++) { + var library = master.options.availableLibraries[i]; + if ($mainArea.data("$tickbox_library_" + library).tickbox("option", "value")) { + plannedLibraries.push(library); + } + }; + master.planConfigParameterUpdateWithRespectToValueAndDefaultValue(configGridPanelView._cachedConfig, "library", plannedLibraries.join(";")); + } + return; + }; + } + + // Parent master's behaviour + RepresentationModule.getMasterById("entity._default").__panelInputChangeValueHandler.apply(this, arguments); + }, + + + // ----------------------------------------------------------------- + // config grid panel - sync + + syncConfigGridPanelMainArea: function(configGridPanelView, instant) { + + // bl, charm, ilm tick boxes + field visibility + var library = this.getConfigParameterValueOrDefaultValue(configGridPanelView._cachedConfig, "library").toLowerCase(); + var plannedLibrary = this.getConfigPlannedParameterValueOrDefaultValue(configGridPanelView._cachedConfig, "library").toLowerCase(); + var libraryHash = library + plannedLibrary; + if (configGridPanelView._$mainArea.data("libraryCache") != libraryHash) { + configGridPanelView._$mainArea.data("libraryCache", libraryHash); + //var libraryAsObject = this._parseLibraryStringToObject(library); + var plannedLibraryAsArray = this._parseLibraryStringToArray(plannedLibrary); + var plannedLibraryAsObject = this._parseLibraryStringToObject(plannedLibrary); + + // tick boxes + configGridPanelView._$mainArea.data("ignoreChangesInLibraryTickboxes", true); + for (var i = this.options.availableLibraries.length - 1; i >= 0; --i) { + var availableLibrary = this.options.availableLibraries[i]; + var $tickbox = configGridPanelView._$mainArea.data("$tickbox_library_" + availableLibrary); + var value = (plannedLibraryAsObject[availableLibrary] !== undefined) ? "1" : ""; + var baseValue = (library !== plannedLibrary) + ? (value ? "" : "1") + : (value ? "1" : ""); + + $tickbox.tickbox("option", { + "value": value, + "baseValue": baseValue + }); + } + configGridPanelView._$mainArea.removeData("ignoreChangesInLibraryTickboxes"); + + // show / hide input blocks + var presentParameterNames = _.keys(this._getPresentParameterNamesForLibrary(plannedLibrary)); + var absentParameterNames = _.difference(_.keys(this.options.presenceOfParameters), presentParameterNames); + + for (var i = 0; i < presentParameterNames.length; i++) { + configGridPanelView._$mainArea.data("$inputBlock_" + presentParameterNames[i]).show(); + } + for (var i = 0; i < absentParameterNames.length; i++) { + configGridPanelView._$mainArea.data("$inputBlock_" + absentParameterNames[i]).hide(); + } + + // library label + configGridPanelView._$mainArea.data("$libraryLabel_no") .toggle(plannedLibraryAsArray.length == 0); + configGridPanelView._$mainArea.data("$libraryLabel_yes").toggle(plannedLibraryAsArray.length != 0); + } + + // Parent master's behaviour + RepresentationModule.getMasterById("entity._default").syncConfigGridPanelMainArea.apply(this, arguments); + }, + + + // ================================================================= + // config grid header + + _generateHeaderLabel1: function(viewHeaderView) { + return this._generateCollectionConfigTitle(viewHeaderView.options.config); + }, + + _generateHeaderLabel2: function(viewHeader) { + var rawConfigParameters = viewHeader.options.config.attributes.parameters.attributes; + var attributesOfDefinitionForCollection = viewHeader.dynamicDerivedConfigData.attributes.dynamicDefinitionForCollection.attributes; + var attributesOfDefinitionForOverlayedRecording = viewHeader.dynamicDerivedConfigData.attributes.dynamicDefinitionForOverlayedRecording.attributes; + + var labelParts = []; + + var collectionSize = attributesOfDefinitionForCollection.fullSize; + var sampleSize = attributesOfDefinitionForCollection.sampleSize; + var overlayedRecordingURI = rawConfigParameters.recordingURI; + var overlayedRecordingLabel = attributesOfDefinitionForOverlayedRecording.label; + + // collection size + if (_.isNumber(collectionSize)) { + var collectionSizeAsStr = collectionSize ? _.str.numberFormat(collectionSize) : "no"; + labelParts.push(_.str.sprintf("%s recording%s", collectionSizeAsStr, collectionSize !== 1 ? "s" : "")); + } else if (collectionSize === null) { + labelParts.push("updating..."); + } else { + if (attributesOfDefinitionForCollection.id === false) { + labelParts.push("an error occured"); + } + } + + // sample size + if (_.isNumber(sampleSize) && sampleSize !== collectionSize) { + labelParts.push(" (", sampleSize, " in the sample)"); + } + + // recordingURI + if (overlayedRecordingURI) { + if (_.isString(overlayedRecordingLabel)) { + labelParts.push(", ‘", overlayedRecordingLabel, "’ selected"); + } else if (overlayedRecordingLabel === null) { + //labelParts.push(", updating selected recording"); + } else { + //labelParts.push(", a problem with selected recording"); + } + } + return labelParts.join(""); + }, + + + // ================================================================= + // dynamic derived config data + + __upateMethodOfDynamicDerivedConfigData: function() { + if (this.attributes.dynamicDefinitionForCollection.attributes.errors) { + this.attributes.dynamicDefinitionForCollection.update(true); + } + if (this.attributes.dynamicDefinitionForOverlayedRecording.attributes.errors) { + this.attributes.dynamicDefinitionForOverlayedRecording.update(true); + } + }, + + generateDynamicDerivedConfigData: function(config, configGrid) { + var dynamicDefinitionForCollection = App.dynamicDefinitionProviderForCollections.get(config); + var dynamicDefinitionForOverlayedRecording = App.dynamicDefinitionProviderForRecordings.get(config); + + var dynamicDerivedConfigData = new RepresentationModule.DynamicDerivedConfigData({ + dynamicDefinitionForCollection: dynamicDefinitionForCollection, + dynamicDefinitionForOverlayedRecording: dynamicDefinitionForOverlayedRecording + }); + + dynamicDerivedConfigData.listenTo(dynamicDefinitionForCollection, "change", function() { + dynamicDerivedConfigData.trigger("change:dynamicDefinitionForCollection"); + dynamicDerivedConfigData.trigger("change"); + }); + dynamicDerivedConfigData.listenTo(dynamicDefinitionForOverlayedRecording, "change", function() { + dynamicDerivedConfigData.trigger("change:dynamicDefinitionForOverlayedRecording"); + dynamicDerivedConfigData.trigger("change"); + }); + + dynamicDerivedConfigData.update = this.__upateMethodOfDynamicDerivedConfigData; + + return dynamicDerivedConfigData; + }, + + + // ================================================================= + // dynamic derived vis instance data + + + // ----------------------------------------------------------------- + // dynamic derived vis instance data - base + + __optionsOfDynamicDerivedVisInstanceDataForBase: { + attributesToExcludeFromHash: ["apiResponse"], + customHashSuffixGenerator: function (attributes) { + if (attributes.apiResponse) { + return JSON.stringify(attributes.apiResponse.errors); + } else { + return typeof attributes.apiResponse; + } + } + }, + + + __upateMethodOfDynamicDerivedVisInstanceDataForBase: function(force) { + var visInstanceView = this.options.visInstanceView; + var dynamicDefinitionForCollection = visInstanceView.dynamicDerivedConfigDataForEntity.attributes.dynamicDefinitionForCollection; + 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) { + this.set({ + apiRequestURI: undefined, + apiRequestParamsHash: undefined, + apiResponse: undefined + }); + return; + } + requestParams.cid = collectionId; + + var apiRequestParamsHash = JSON.stringify(requestParams); + + if (!force && apiRequestParamsHash == this.attributes.apiRequestParamsHash) { + return; + } + + var _this = this; + var apiRequestURI = App.DataModule.CliopatriaAPI.request("getCollectionPerspective", requestParams, function(data){ + if (JSON.stringify(requestParams) != _this.attributes.apiRequestParamsHash) { + return; + } + _this.set({ + apiRequestParamsHash: undefined, + apiResponse: data + }); + }); + + this.set({ + apiRequestURI: apiRequestURI, + apiRequestParamsHash: apiRequestParamsHash, + apiResponse: null + }); + }, + + + generateDynamicDerivedVisInstanceDataForBase: function(visInstanceView) { + var optionsForThisDynamicDerivedVisInstanceDataForBase = _.clone(this.__optionsOfDynamicDerivedVisInstanceDataForBase); + optionsForThisDynamicDerivedVisInstanceDataForBase.visInstanceView = visInstanceView; + + var dynamicDerivedVisInstanceDataForBase = new RepresentationModule.DynamicDerivedVisInstanceData({ + apiRequestURI: undefined, + apiRequestParamsHash: undefined, + apiResponse: undefined + }, optionsForThisDynamicDerivedVisInstanceDataForBase); + + dynamicDerivedVisInstanceDataForBase.update = this.__upateMethodOfDynamicDerivedVisInstanceDataForBase; + + dynamicDerivedVisInstanceDataForBase.listenTo(visInstanceView.dynamicDerivedConfigDataForEntity, "change:dynamicDefinitionForCollection", 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("library") == "charm" +// && visInstanceView.options.viewConfig.getParameterValue("kind") == "key-relative-chord-seq") { +// throw new RepresentationModule.Error({type: "api-message_progress_base", derivedDataToUpdate: "base"}); +// } + + + var attributesOfDerivedConfigDataForEntity = visInstanceView.dynamicDerivedConfigDataForEntity.attributes; + var dynamicDefinitionForCollection = attributesOfDerivedConfigDataForEntity.dynamicDefinitionForCollection; + var attributesOfCollection = dynamicDefinitionForCollection ? dynamicDefinitionForCollection.attributes : {}; + + if (attributesOfCollection.id === null) { + throw new RepresentationModule.Error({type: "data-preparing_entity-derived"}); + } + if (attributesOfCollection.id === false) { + throw new RepresentationModule.Error({type: "api-error_entity-derived", apiErrors: attributesOfCollection.errors, coverTapAction: this.__coverTapActionThatUpdatesDynamicDerivedData, derivedDataToUpdate: "entity"}); + } + if (attributesOfCollection.id === "") { + throw new RepresentationModule.Error({type: "collection_no-recordings"}); + } + if (attributesOfCollection.id === undefined) { + throw new RepresentationModule.Error({type: "collection_undefined"}); + } + + var attribytesOfDerivedVisInstanceDataForBase = visInstanceView.dynamicDerivedVisInstanceDataForBase.attributes; + if (!attribytesOfDerivedVisInstanceDataForBase.apiResponse) { + throw new RepresentationModule.Error({type: "data-preparing_base"}); + } + if (attribytesOfDerivedVisInstanceDataForBase.apiResponse.errors) { + if (attribytesOfDerivedVisInstanceDataForBase.apiResponse.errors && attribytesOfDerivedVisInstanceDataForBase.apiResponse.errors[0]) { + var error0 = attribytesOfDerivedVisInstanceDataForBase.apiResponse.errors[0]; + if (error0.code == 11 || error0.code == 12 || error0.code == 13) { + + //FIXME this is a temp hack + var checkEvery = 2000; + var checkEveryRandomComponent = 500; + if (visInstanceView.autoRefreshTimeout) { + clearTimeout(visInstanceView.autoRefreshTimeout); + } + visInstanceView.autoRefreshTimeout = setTimeout(function() { + if (visInstanceView.dynamicDerivedVisInstanceDataForBase.attributes.apiResponse.errors) { + var error0 = attribytesOfDerivedVisInstanceDataForBase.apiResponse.errors[0]; + if (error0.code == 11 || error0.code == 12 || error0.code == 13) { + visInstanceView.dynamicDerivedVisInstanceDataForBase.update(); + } + } + }, checkEvery + Math.round(Math.random() * checkEveryRandomComponent)); + // END FIXME + + throw new RepresentationModule.Error({type: "api-message_progress_base", apiErrors: attribytesOfDerivedVisInstanceDataForBase.apiResponse.errors, coverTapAction: this.__coverTapActionThatUpdatesDynamicDerivedData, derivedDataToUpdate: "base"}); + + // FIXME errors like this should probably go to Master.view.xxx + } else if (error0.code == 20) { + throw new RepresentationModule.Error({type: "ok-count-0", apiErrors: attribytesOfDerivedVisInstanceDataForBase.apiResponse.errors}); + } + } + throw new RepresentationModule.Error({type: "api-error_base", apiErrors: attribytesOfDerivedVisInstanceDataForBase.apiResponse.errors, coverTapAction: this.__coverTapActionThatUpdatesDynamicDerivedData, derivedDataToUpdate: "base"}); + } + + }, + + + // ----------------------------------------------------------------- + // dynamic derived vis instance data - overlay + + + // ----------------------------------------------------------------- + // dynamic derived vis instance data - temp + + }); + }); +}, Logger);