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);