Mercurial > hg > dml-open-vis
comparison 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 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:493bcb69166c |
---|---|
1 "use strict"; | |
2 | |
3 App.module("RepresentationModule", function(RepresentationModule, App, Backbone, Marionette, $, _, Logger) { | |
4 | |
5 RepresentationModule.addInitializer(function(options){ | |
6 | |
7 RepresentationModule.registerMaster({ | |
8 id: "entity.collection.default", | |
9 inherit: "entity._default", | |
10 | |
11 defaultConfigParameterValues: { | |
12 "library": "", | |
13 "year": "", | |
14 "genre": "", | |
15 "composer": "", | |
16 "performer": "", | |
17 "title": "", | |
18 "place": "", | |
19 "collection": "" | |
20 }, | |
21 | |
22 options: { | |
23 availableLibraries: ["bl", "charm", "ilm", "mazurka"], | |
24 librarySeparator: ";", | |
25 librarySeparatorAlternatives: /\,/g, | |
26 presenceOfParameters: { | |
27 "title": ["bl", "charm", "ilm", "mazurka"], | |
28 "year": ["bl", "charm", "mazurka"], // in ILM there is a release date (160 000 / 250 000) | |
29 "composer": ["bl", "charm", "mazurka"], | |
30 "performer": ["bl", "charm", "mazurka"], // artist in ILM | |
31 "collection": ["bl"], // (only for ethnographic, excludes composer) | |
32 "genre": ["ilm"], | |
33 "place": ["bl"], | |
34 }, | |
35 }, | |
36 | |
37 | |
38 // ================================================================= | |
39 // housekeeping | |
40 | |
41 extractCleanedConfigParameterValuesFromPlannedParameterValues: function(config) { | |
42 // Parent master's behaviour | |
43 var result = RepresentationModule.getMasterById("entity._default").extractCleanedConfigParameterValuesFromPlannedParameterValues.apply(this, arguments); | |
44 | |
45 // no need to remove recordingURI as there is no default value for it (it is removed automatically) | |
46 | |
47 //console.log("CLEANED BEFORE", result); | |
48 // remove all parameters that are not relevant to the chosen library | |
49 var presentParameterNames = _.keys(this._getPresentParameterNamesForLibrary(result.library)); | |
50 | |
51 for (var parameterName in result) { | |
52 if (result.hasOwnProperty(parameterName) && parameterName !== "library") { | |
53 if (presentParameterNames.indexOf(parameterName) == -1) { | |
54 delete result[parameterName]; | |
55 } | |
56 } | |
57 } | |
58 | |
59 //console.log("CLEANED AFTER", result); | |
60 return result; | |
61 }, | |
62 | |
63 | |
64 // ================================================================= | |
65 // config grid panel | |
66 | |
67 _parseLibraryStringToArray: function(library) { | |
68 var fixedLibrary = _.str.trim(library).replace(this.options.librarySeparatorAlternatives, this.options.librarySeparator).toLowerCase(); | |
69 if (!fixedLibrary.length) { | |
70 return []; | |
71 } else { | |
72 return _.map(fixedLibrary.split(this.options.librarySeparator), function(v) {return _.str.trim(v);}); | |
73 } | |
74 }, | |
75 | |
76 | |
77 _parseLibraryStringToObject: function(library) { | |
78 var result = {}; | |
79 var libraryAsArray = this._parseLibraryStringToArray(library); | |
80 for (var i = 0; i < libraryAsArray.length; i++) { | |
81 result[libraryAsArray[i]] = true; | |
82 } | |
83 return result; | |
84 }, | |
85 | |
86 | |
87 _restoreLibraryStringFromArray: function(libraryArray) { | |
88 libraryArray.sort(); | |
89 return libraryArray.length ? libraryArray.join(this.options.librarySeparator) : ""; | |
90 | |
91 }, | |
92 | |
93 _restoreLibraryStringFromObject: function(libraryObject) { | |
94 return this._restoreLibraryStringFromArray(_.keys(libraryObject)); | |
95 }, | |
96 | |
97 | |
98 _getPresentParameterNamesForLibrary: function(library) { | |
99 if (this._cachedPresentParameterNamesByLibrary === undefined) { | |
100 this._cachedPresentParameterNamesByLibrary = {}; | |
101 } | |
102 if (this._cachedPresentParameterNamesByLibrary[library] === undefined) { | |
103 var libraries = this._parseLibraryStringToArray(library); | |
104 var result = {}; | |
105 if (libraries.length) { | |
106 for (var parameterName in this.options.presenceOfParameters) { | |
107 var fieldPresence = this.options.presenceOfParameters[parameterName]; | |
108 if (_.intersection(libraries, fieldPresence).length == libraries.length) { | |
109 result[parameterName] = true; | |
110 } | |
111 } | |
112 } | |
113 this._cachedPresentParameterNamesByLibrary[library] = result; | |
114 } | |
115 | |
116 return this._cachedPresentParameterNamesByLibrary[library]; | |
117 }, | |
118 | |
119 | |
120 // ----------------------------------------------------------------- | |
121 // config grid panel - prepare | |
122 | |
123 prepareConfigGridPanelMainArea: function(configGridPanelView) { | |
124 configGridPanelView._$mainArea.data("$libraryLabel_yes", configGridPanelView._$mainArea.find(".cgpma__id_library-label_yes")); | |
125 configGridPanelView._$mainArea.data("$libraryLabel_no", configGridPanelView._$mainArea.find(".cgpma__id_library-label_no")); | |
126 | |
127 // Library tickboxes | |
128 for (var i = this.options.availableLibraries.length - 1; i >= 0; --i) { | |
129 var availableLibrary = this.options.availableLibraries[i]; | |
130 var $tickbox = configGridPanelView._$mainArea.find(".cgpma__id_" + availableLibrary); | |
131 configGridPanelView._$mainArea.data("$tickbox_library_" + availableLibrary, $tickbox); | |
132 $tickbox.data("libraryId", availableLibrary); | |
133 } | |
134 | |
135 // Parent master's behaviour | |
136 RepresentationModule.getMasterById("entity._default").prepareConfigGridPanelMainArea.apply(this, arguments); | |
137 }, | |
138 | |
139 | |
140 __panelInputChangeValueHandler: function(event) { | |
141 if (event.type == "tickboxchangevalue") { | |
142 var $thickbox = $(event.target); | |
143 var libraryId = $thickbox.data("libraryId"); | |
144 if (libraryId) { | |
145 var configGridPanelView = $thickbox.data("configGridPanelView"); | |
146 var $mainArea = configGridPanelView._$mainArea; | |
147 var master = $thickbox.data("configGridPanelView")._masterBehindMainArea; | |
148 if (!$mainArea.data("ignoreChangesInLibraryTickboxes")) { | |
149 var plannedLibraries = []; | |
150 for (var i = 0; i < master.options.availableLibraries.length; i++) { | |
151 var library = master.options.availableLibraries[i]; | |
152 if ($mainArea.data("$tickbox_library_" + library).tickbox("option", "value")) { | |
153 plannedLibraries.push(library); | |
154 } | |
155 }; | |
156 master.planConfigParameterUpdateWithRespectToValueAndDefaultValue(configGridPanelView._cachedConfig, "library", plannedLibraries.join(";")); | |
157 } | |
158 return; | |
159 }; | |
160 } | |
161 | |
162 // Parent master's behaviour | |
163 RepresentationModule.getMasterById("entity._default").__panelInputChangeValueHandler.apply(this, arguments); | |
164 }, | |
165 | |
166 | |
167 // ----------------------------------------------------------------- | |
168 // config grid panel - sync | |
169 | |
170 syncConfigGridPanelMainArea: function(configGridPanelView, instant) { | |
171 | |
172 // bl, charm, ilm tick boxes + field visibility | |
173 var library = this.getConfigParameterValueOrDefaultValue(configGridPanelView._cachedConfig, "library").toLowerCase(); | |
174 var plannedLibrary = this.getConfigPlannedParameterValueOrDefaultValue(configGridPanelView._cachedConfig, "library").toLowerCase(); | |
175 var libraryHash = library + plannedLibrary; | |
176 if (configGridPanelView._$mainArea.data("libraryCache") != libraryHash) { | |
177 configGridPanelView._$mainArea.data("libraryCache", libraryHash); | |
178 //var libraryAsObject = this._parseLibraryStringToObject(library); | |
179 var plannedLibraryAsArray = this._parseLibraryStringToArray(plannedLibrary); | |
180 var plannedLibraryAsObject = this._parseLibraryStringToObject(plannedLibrary); | |
181 | |
182 // tick boxes | |
183 configGridPanelView._$mainArea.data("ignoreChangesInLibraryTickboxes", true); | |
184 for (var i = this.options.availableLibraries.length - 1; i >= 0; --i) { | |
185 var availableLibrary = this.options.availableLibraries[i]; | |
186 var $tickbox = configGridPanelView._$mainArea.data("$tickbox_library_" + availableLibrary); | |
187 var value = (plannedLibraryAsObject[availableLibrary] !== undefined) ? "1" : ""; | |
188 var baseValue = (library !== plannedLibrary) | |
189 ? (value ? "" : "1") | |
190 : (value ? "1" : ""); | |
191 | |
192 $tickbox.tickbox("option", { | |
193 "value": value, | |
194 "baseValue": baseValue | |
195 }); | |
196 } | |
197 configGridPanelView._$mainArea.removeData("ignoreChangesInLibraryTickboxes"); | |
198 | |
199 // show / hide input blocks | |
200 var presentParameterNames = _.keys(this._getPresentParameterNamesForLibrary(plannedLibrary)); | |
201 var absentParameterNames = _.difference(_.keys(this.options.presenceOfParameters), presentParameterNames); | |
202 | |
203 for (var i = 0; i < presentParameterNames.length; i++) { | |
204 configGridPanelView._$mainArea.data("$inputBlock_" + presentParameterNames[i]).show(); | |
205 } | |
206 for (var i = 0; i < absentParameterNames.length; i++) { | |
207 configGridPanelView._$mainArea.data("$inputBlock_" + absentParameterNames[i]).hide(); | |
208 } | |
209 | |
210 // library label | |
211 configGridPanelView._$mainArea.data("$libraryLabel_no") .toggle(plannedLibraryAsArray.length == 0); | |
212 configGridPanelView._$mainArea.data("$libraryLabel_yes").toggle(plannedLibraryAsArray.length != 0); | |
213 } | |
214 | |
215 // Parent master's behaviour | |
216 RepresentationModule.getMasterById("entity._default").syncConfigGridPanelMainArea.apply(this, arguments); | |
217 }, | |
218 | |
219 | |
220 // ================================================================= | |
221 // config grid header | |
222 | |
223 _generateHeaderLabel1: function(viewHeaderView) { | |
224 return this._generateCollectionConfigTitle(viewHeaderView.options.config); | |
225 }, | |
226 | |
227 _generateHeaderLabel2: function(viewHeader) { | |
228 var rawConfigParameters = viewHeader.options.config.attributes.parameters.attributes; | |
229 var attributesOfDefinitionForCollection = viewHeader.dynamicDerivedConfigData.attributes.dynamicDefinitionForCollection.attributes; | |
230 var attributesOfDefinitionForOverlayedRecording = viewHeader.dynamicDerivedConfigData.attributes.dynamicDefinitionForOverlayedRecording.attributes; | |
231 | |
232 var labelParts = []; | |
233 | |
234 var collectionSize = attributesOfDefinitionForCollection.fullSize; | |
235 var sampleSize = attributesOfDefinitionForCollection.sampleSize; | |
236 var overlayedRecordingURI = rawConfigParameters.recordingURI; | |
237 var overlayedRecordingLabel = attributesOfDefinitionForOverlayedRecording.label; | |
238 | |
239 // collection size | |
240 if (_.isNumber(collectionSize)) { | |
241 var collectionSizeAsStr = collectionSize ? _.str.numberFormat(collectionSize) : "no"; | |
242 labelParts.push(_.str.sprintf("%s recording%s", collectionSizeAsStr, collectionSize !== 1 ? "s" : "")); | |
243 } else if (collectionSize === null) { | |
244 labelParts.push("updating..."); | |
245 } else { | |
246 if (attributesOfDefinitionForCollection.id === false) { | |
247 labelParts.push("an error occured"); | |
248 } | |
249 } | |
250 | |
251 // sample size | |
252 if (_.isNumber(sampleSize) && sampleSize !== collectionSize) { | |
253 labelParts.push(" (", sampleSize, " in the sample)"); | |
254 } | |
255 | |
256 // recordingURI | |
257 if (overlayedRecordingURI) { | |
258 if (_.isString(overlayedRecordingLabel)) { | |
259 labelParts.push(", ‘", overlayedRecordingLabel, "’ selected"); | |
260 } else if (overlayedRecordingLabel === null) { | |
261 //labelParts.push(", updating selected recording"); | |
262 } else { | |
263 //labelParts.push(", a problem with selected recording"); | |
264 } | |
265 } | |
266 return labelParts.join(""); | |
267 }, | |
268 | |
269 | |
270 // ================================================================= | |
271 // dynamic derived config data | |
272 | |
273 __upateMethodOfDynamicDerivedConfigData: function() { | |
274 if (this.attributes.dynamicDefinitionForCollection.attributes.errors) { | |
275 this.attributes.dynamicDefinitionForCollection.update(true); | |
276 } | |
277 if (this.attributes.dynamicDefinitionForOverlayedRecording.attributes.errors) { | |
278 this.attributes.dynamicDefinitionForOverlayedRecording.update(true); | |
279 } | |
280 }, | |
281 | |
282 generateDynamicDerivedConfigData: function(config, configGrid) { | |
283 var dynamicDefinitionForCollection = App.dynamicDefinitionProviderForCollections.get(config); | |
284 var dynamicDefinitionForOverlayedRecording = App.dynamicDefinitionProviderForRecordings.get(config); | |
285 | |
286 var dynamicDerivedConfigData = new RepresentationModule.DynamicDerivedConfigData({ | |
287 dynamicDefinitionForCollection: dynamicDefinitionForCollection, | |
288 dynamicDefinitionForOverlayedRecording: dynamicDefinitionForOverlayedRecording | |
289 }); | |
290 | |
291 dynamicDerivedConfigData.listenTo(dynamicDefinitionForCollection, "change", function() { | |
292 dynamicDerivedConfigData.trigger("change:dynamicDefinitionForCollection"); | |
293 dynamicDerivedConfigData.trigger("change"); | |
294 }); | |
295 dynamicDerivedConfigData.listenTo(dynamicDefinitionForOverlayedRecording, "change", function() { | |
296 dynamicDerivedConfigData.trigger("change:dynamicDefinitionForOverlayedRecording"); | |
297 dynamicDerivedConfigData.trigger("change"); | |
298 }); | |
299 | |
300 dynamicDerivedConfigData.update = this.__upateMethodOfDynamicDerivedConfigData; | |
301 | |
302 return dynamicDerivedConfigData; | |
303 }, | |
304 | |
305 | |
306 // ================================================================= | |
307 // dynamic derived vis instance data | |
308 | |
309 | |
310 // ----------------------------------------------------------------- | |
311 // dynamic derived vis instance data - base | |
312 | |
313 __optionsOfDynamicDerivedVisInstanceDataForBase: { | |
314 attributesToExcludeFromHash: ["apiResponse"], | |
315 customHashSuffixGenerator: function (attributes) { | |
316 if (attributes.apiResponse) { | |
317 return JSON.stringify(attributes.apiResponse.errors); | |
318 } else { | |
319 return typeof attributes.apiResponse; | |
320 } | |
321 } | |
322 }, | |
323 | |
324 | |
325 __upateMethodOfDynamicDerivedVisInstanceDataForBase: function(force) { | |
326 var visInstanceView = this.options.visInstanceView; | |
327 var dynamicDefinitionForCollection = visInstanceView.dynamicDerivedConfigDataForEntity.attributes.dynamicDefinitionForCollection; | |
328 if (!dynamicDefinitionForCollection) { // entity kind has changed (e.g. a grid was reset) | |
329 return; | |
330 } | |
331 var collectionId = dynamicDefinitionForCollection.attributes.id; | |
332 var requestParams = _.clone(visInstanceView.dynamicDerivedConfigDataForView.attributes.basePerspectiveRequestParams); | |
333 | |
334 if (!requestParams || !collectionId) { | |
335 this.set({ | |
336 apiRequestURI: undefined, | |
337 apiRequestParamsHash: undefined, | |
338 apiResponse: undefined | |
339 }); | |
340 return; | |
341 } | |
342 requestParams.cid = collectionId; | |
343 | |
344 var apiRequestParamsHash = JSON.stringify(requestParams); | |
345 | |
346 if (!force && apiRequestParamsHash == this.attributes.apiRequestParamsHash) { | |
347 return; | |
348 } | |
349 | |
350 var _this = this; | |
351 var apiRequestURI = App.DataModule.CliopatriaAPI.request("getCollectionPerspective", requestParams, function(data){ | |
352 if (JSON.stringify(requestParams) != _this.attributes.apiRequestParamsHash) { | |
353 return; | |
354 } | |
355 _this.set({ | |
356 apiRequestParamsHash: undefined, | |
357 apiResponse: data | |
358 }); | |
359 }); | |
360 | |
361 this.set({ | |
362 apiRequestURI: apiRequestURI, | |
363 apiRequestParamsHash: apiRequestParamsHash, | |
364 apiResponse: null | |
365 }); | |
366 }, | |
367 | |
368 | |
369 generateDynamicDerivedVisInstanceDataForBase: function(visInstanceView) { | |
370 var optionsForThisDynamicDerivedVisInstanceDataForBase = _.clone(this.__optionsOfDynamicDerivedVisInstanceDataForBase); | |
371 optionsForThisDynamicDerivedVisInstanceDataForBase.visInstanceView = visInstanceView; | |
372 | |
373 var dynamicDerivedVisInstanceDataForBase = new RepresentationModule.DynamicDerivedVisInstanceData({ | |
374 apiRequestURI: undefined, | |
375 apiRequestParamsHash: undefined, | |
376 apiResponse: undefined | |
377 }, optionsForThisDynamicDerivedVisInstanceDataForBase); | |
378 | |
379 dynamicDerivedVisInstanceDataForBase.update = this.__upateMethodOfDynamicDerivedVisInstanceDataForBase; | |
380 | |
381 dynamicDerivedVisInstanceDataForBase.listenTo(visInstanceView.dynamicDerivedConfigDataForEntity, "change:dynamicDefinitionForCollection", dynamicDerivedVisInstanceDataForBase.update); | |
382 dynamicDerivedVisInstanceDataForBase.listenTo(visInstanceView.dynamicDerivedConfigDataForView, "change:basePerspectiveRequestParams", dynamicDerivedVisInstanceDataForBase.update); | |
383 | |
384 dynamicDerivedVisInstanceDataForBase.update(); | |
385 | |
386 return dynamicDerivedVisInstanceDataForBase; | |
387 }, | |
388 | |
389 | |
390 verifyAllDataForVisInstanceBase: function(visInstanceView) { | |
391 this._verifyThatViewIsNotEmptyOrUnknown(visInstanceView); | |
392 | |
393 // if (visInstanceView.options.entityConfig.getParameterValue("library") == "charm" | |
394 // && visInstanceView.options.viewConfig.getParameterValue("kind") == "key-relative-chord-seq") { | |
395 // throw new RepresentationModule.Error({type: "api-message_progress_base", derivedDataToUpdate: "base"}); | |
396 // } | |
397 | |
398 | |
399 var attributesOfDerivedConfigDataForEntity = visInstanceView.dynamicDerivedConfigDataForEntity.attributes; | |
400 var dynamicDefinitionForCollection = attributesOfDerivedConfigDataForEntity.dynamicDefinitionForCollection; | |
401 var attributesOfCollection = dynamicDefinitionForCollection ? dynamicDefinitionForCollection.attributes : {}; | |
402 | |
403 if (attributesOfCollection.id === null) { | |
404 throw new RepresentationModule.Error({type: "data-preparing_entity-derived"}); | |
405 } | |
406 if (attributesOfCollection.id === false) { | |
407 throw new RepresentationModule.Error({type: "api-error_entity-derived", apiErrors: attributesOfCollection.errors, coverTapAction: this.__coverTapActionThatUpdatesDynamicDerivedData, derivedDataToUpdate: "entity"}); | |
408 } | |
409 if (attributesOfCollection.id === "") { | |
410 throw new RepresentationModule.Error({type: "collection_no-recordings"}); | |
411 } | |
412 if (attributesOfCollection.id === undefined) { | |
413 throw new RepresentationModule.Error({type: "collection_undefined"}); | |
414 } | |
415 | |
416 var attribytesOfDerivedVisInstanceDataForBase = visInstanceView.dynamicDerivedVisInstanceDataForBase.attributes; | |
417 if (!attribytesOfDerivedVisInstanceDataForBase.apiResponse) { | |
418 throw new RepresentationModule.Error({type: "data-preparing_base"}); | |
419 } | |
420 if (attribytesOfDerivedVisInstanceDataForBase.apiResponse.errors) { | |
421 if (attribytesOfDerivedVisInstanceDataForBase.apiResponse.errors && attribytesOfDerivedVisInstanceDataForBase.apiResponse.errors[0]) { | |
422 var error0 = attribytesOfDerivedVisInstanceDataForBase.apiResponse.errors[0]; | |
423 if (error0.code == 11 || error0.code == 12 || error0.code == 13) { | |
424 | |
425 //FIXME this is a temp hack | |
426 var checkEvery = 2000; | |
427 var checkEveryRandomComponent = 500; | |
428 if (visInstanceView.autoRefreshTimeout) { | |
429 clearTimeout(visInstanceView.autoRefreshTimeout); | |
430 } | |
431 visInstanceView.autoRefreshTimeout = setTimeout(function() { | |
432 if (visInstanceView.dynamicDerivedVisInstanceDataForBase.attributes.apiResponse.errors) { | |
433 var error0 = attribytesOfDerivedVisInstanceDataForBase.apiResponse.errors[0]; | |
434 if (error0.code == 11 || error0.code == 12 || error0.code == 13) { | |
435 visInstanceView.dynamicDerivedVisInstanceDataForBase.update(); | |
436 } | |
437 } | |
438 }, checkEvery + Math.round(Math.random() * checkEveryRandomComponent)); | |
439 // END FIXME | |
440 | |
441 throw new RepresentationModule.Error({type: "api-message_progress_base", apiErrors: attribytesOfDerivedVisInstanceDataForBase.apiResponse.errors, coverTapAction: this.__coverTapActionThatUpdatesDynamicDerivedData, derivedDataToUpdate: "base"}); | |
442 | |
443 // FIXME errors like this should probably go to Master.view.xxx | |
444 } else if (error0.code == 20) { | |
445 throw new RepresentationModule.Error({type: "ok-count-0", apiErrors: attribytesOfDerivedVisInstanceDataForBase.apiResponse.errors}); | |
446 } | |
447 } | |
448 throw new RepresentationModule.Error({type: "api-error_base", apiErrors: attribytesOfDerivedVisInstanceDataForBase.apiResponse.errors, coverTapAction: this.__coverTapActionThatUpdatesDynamicDerivedData, derivedDataToUpdate: "base"}); | |
449 } | |
450 | |
451 }, | |
452 | |
453 | |
454 // ----------------------------------------------------------------- | |
455 // dynamic derived vis instance data - overlay | |
456 | |
457 | |
458 // ----------------------------------------------------------------- | |
459 // dynamic derived vis instance data - temp | |
460 | |
461 }); | |
462 }); | |
463 }, Logger); |