comparison src/DML/MainVisBundle/Resources/assets/marionette/modules/RepresentationModule/RepresentationModule.31-Master.view.collection.list.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: "view.collection.list",
9 inherit: "view._",
10
11 options: {
12 canHaveBase: true,
13 canHaveOverlay: true,
14 canHaveTemp: false,
15 flyingCircleSpeedMin: 200,
16 flyingCircleSpeedMax: 500,
17 flyingCircleDistanceForMaxSpeed: 500,
18
19 rowHeight: 15
20 },
21
22 defaultConfigParameterValues: {
23 limit: 10,
24 offset: 0,
25 sortBy: "label",
26 widthToHeightRatio: undefined
27 },
28
29 _cachedMusicRecordingsButtonRight: null,
30 _cachedMusicRecordingsButtonTop: null,
31
32
33 // =================================================================
34 // config grid header
35
36 _generateHeaderLabelSuffix: function(headerView) {
37 return "";
38 //return _.str.sprintf(" (up to %s)", this.getConfigParameterValueOrDefaultValue(headerView.options.config, "limit"));
39 },
40
41
42 // =================================================================
43 // dynamic derived vis instance data
44
45
46 // -----------------------------------------------------------------
47 // dynamic derived vis instance data - overlay
48
49 __upateMethodOfDynamicDerivedVisInstanceDataForOverlay: function(force) {
50 this.set({
51 recordingURI: this.options.entityConfigForCollection.getParameterValue("recordingURI"),
52 recordingURIs: this.options.entityConfigsForRecordings.map(function(entityConfigForRecording) {
53 return entityConfigForRecording.getParameterValue("recordingURI");
54 })
55 });
56 },
57
58
59 generateDynamicDerivedVisInstanceDataForOverlay: function(visInstanceView) {
60 if (this._getVisInstanceViewComparisonMode(visInstanceView)) {
61 return new RepresentationModule.DynamicDerivedVisInstanceData();
62 }
63
64 var optionsForThisDynamicDerivedVisInstanceDataForOverlay = {};
65 optionsForThisDynamicDerivedVisInstanceDataForOverlay.entityConfigForCollection = visInstanceView.options.entityConfig;
66 optionsForThisDynamicDerivedVisInstanceDataForOverlay.entityConfigsForRecordings = visInstanceView.options.state.get("musicRecordingGrid").get("entityConfigs");
67
68 var dynamicDerivedVisInstanceDataForOverlay = new RepresentationModule.DynamicDerivedVisInstanceData({
69 recordingURI: undefined,
70 recordingURIs: [],
71 }, optionsForThisDynamicDerivedVisInstanceDataForOverlay);
72
73 dynamicDerivedVisInstanceDataForOverlay.update = this.__upateMethodOfDynamicDerivedVisInstanceDataForOverlay;
74
75 dynamicDerivedVisInstanceDataForOverlay.listenTo(optionsForThisDynamicDerivedVisInstanceDataForOverlay.entityConfigForCollection, "change:properties", dynamicDerivedVisInstanceDataForOverlay.update);
76 dynamicDerivedVisInstanceDataForOverlay.listenTo(visInstanceView.options.state.get("musicRecordingGrid"), "change", dynamicDerivedVisInstanceDataForOverlay.update);
77
78 dynamicDerivedVisInstanceDataForOverlay.update();
79
80 return dynamicDerivedVisInstanceDataForOverlay;
81
82 },
83
84
85 // =================================================================
86 // vis instance rendering
87
88 calculateVisInstanceContentHeight: function(viewConfig, entityWidth) {
89 var fixedLimit = Math.max(0, 1 * this.getConfigParameterValueOrDefaultValue(viewConfig, "limit"));
90 if (!(fixedLimit > 0 && Math.floor(fixedLimit) === +fixedLimit)) {
91 fixedLimit = 0;
92 }
93 return fixedLimit * this.options.rowHeight
94 + this.options.visInstanceContentPaddingTop
95 + this.options.visInstanceContentPaddingBottom;
96 },
97
98
99 // -----------------------------------------------------------------
100 // vis instance rendering - base
101
102 _generateCustomParamsForBasePerspectiveRequestParams: function(viewConfig) {
103 var result = {
104 "limit": this.getConfigParameterValueOrDefaultValue(viewConfig, "limit", true),
105 "offset": this.getConfigParameterValueOrDefaultValue(viewConfig, "offset", true),
106 "sort_by": this.getConfigParameterValueOrDefaultValue(viewConfig, "sortBy", true),
107 };
108 return result;
109 },
110
111
112 __domEventHandlerToSetSelectedRecording: function() {
113 var $this = $(this);
114 var visInstanceView = $this.data("visInstanceView");
115 var recordingURI = $this.data("recordingURI");
116 if (visInstanceView.options.entityConfig.getParameterValue("recordingURI") == recordingURI) {
117 //visInstanceView.options.entityConfig.updateParameter("recordingURI", undefined);
118 } else {
119 visInstanceView.options.entityConfig.updateParameter("recordingURI", recordingURI);
120 }
121 },
122
123 __domEventHandlerToPlayAudio: function(event) {
124 var $this = $(this);
125
126 // if (!_.isEventAnAttemptToOpenANewTab(event)) {
127 App.play($this.data("recordingURI"));
128 event.preventDefault();
129 return false;
130 // }
131 },
132
133 __domEventHandlerToAnalyseRecording: function() {
134 var $this = $(this);
135 var _this = $this.data("master");
136 var recordingURI = $this.parent().data("recordingURI");
137 var existingRecordingConfigsByRecordingURI = {};
138 var recordingConfigs = App.context.get("state").get("musicRecordingGrid").get("entityConfigs");
139
140 recordingConfigs.each(function(recordingConfig) {
141 existingRecordingConfigsByRecordingURI[recordingConfig.getParameterValue("recordingURI")] = recordingConfig;
142 });
143
144 var nowAdding = !existingRecordingConfigsByRecordingURI[recordingURI];
145 if (nowAdding) {
146 // add
147 recordingConfigs.add(new App.ContextModule.Config({
148 parameters: {
149 recordingURI: recordingURI
150 }
151 }));
152 } else {
153 // remove
154 recordingConfigs.remove(existingRecordingConfigsByRecordingURI[recordingURI]);
155 }
156
157 // launch the flying circle
158 var $flyingCircle = $.bem.generateElement("vic-list", "flying-circle", [nowAdding ? "type_adding" : "type_removing"]);
159 if (!_this._cachedMusicRecordingsButtonRight) {
160 var $modeChanger = $(".main-menu-bar__item_action_change-mode");
161 _this._cachedMusicRecordingsButtonRight = $modeChanger.width() / 2;
162 _this._cachedMusicRecordingsButtonTop = $modeChanger.height() / 2;
163 }
164
165 $flyingCircle.appendTo(document.body);
166 var initialOffset = $($this[0]).offset();
167 var targetOffset = {
168 "left": $(window).width() - _this._cachedMusicRecordingsButtonRight,
169 "top": _this._cachedMusicRecordingsButtonTop,
170 };
171
172 // Flip initial and target if the circle is returning
173 if (!nowAdding) {
174 var bubble = initialOffset;
175 initialOffset = targetOffset;
176 targetOffset = bubble;
177 };
178
179 $flyingCircle.css(initialOffset);
180
181 var flyingDistance = Math.sqrt(
182 Math.pow(targetOffset.left - initialOffset.left, 2) +
183 Math.pow(targetOffset.top - initialOffset.top, 2)
184 );
185 var speed = (_this.options.flyingCircleSpeedMax - _this.options.flyingCircleSpeedMin)
186 * Math.min(1, flyingDistance / _this.options.flyingCircleDistanceForMaxSpeed)
187 + _this.options.flyingCircleSpeedMin;
188 $flyingCircle.animate(targetOffset, speed, _this.__removeFlyingCircleAfterAnimation);
189
190 // show a notification if needed
191 var notificationHasBeenShown = App.DataModule.Storage.getStrCache(RepresentationModule, "master_view.collection.list_flying-square-notification-shown");
192 if (!notificationHasBeenShown) {
193 App.showNotification({
194 "content": $("#notification-content_flying-circle").html(),
195 "id": "flying-circle",
196 "modifiers": ["ttl_20"]
197 });
198
199 App.context.get("state").once("change:musicRecordingsGridIsShown", function() {
200 App.hideNotification("flying-circle");
201 });
202 App.DataModule.Storage.setStrCache(RepresentationModule, "master_view.collection.list_flying-square-notification-shown", "1");
203 }
204
205 // explicitly remove tooltip
206 $this.trigger("mouseup");
207 },
208
209 __removeFlyingCircleAfterAnimation: function() {
210 $(this).remove();
211 },
212
213 _doRenderVisInstanceViewBaseWithKnownComparisonMode: function(visInstanceView, comparisonMode) {
214 var _this = this;
215
216 var items = visInstanceView.dynamicDerivedVisInstanceDataForBase.attributes.apiResponse.items;
217
218 var bankOf$analyzeByRecordingURI = {};
219 var $list = $.bem.generateBlock("vic-list");
220 for (var i = 0; i < items.length; i++) {
221 var item = items[i];
222 var $item = $.bem.generateElement("vic-list", "item")
223 .data("recordingURI", item.uri)
224 .data("visInstanceView", visInstanceView);
225
226 // Label
227 $.bem.generateElement("vic-list", "item-label")
228 .text(item.label)
229 .appendTo($item);
230
231 // Year
232 if (item.date) {
233 var year = item.date.indexOf("/") > 0 ? item.date.slice(-4) : item.date.slice(0, 4);
234 $.bem.generateElement("vic-list", "item-year")
235 .text(year)
236 .appendTo($item);
237 }
238 // Audio
239 if (item.audio && item.audio.length) {
240 $.bem.generateElement("span", "vic-list", "item-command", ["action_audio"])
241 //.attr("href", item.audio[0])
242 .data("recordingURI", item.uri)
243 .data("master", _this)
244 .click(this.__domEventHandlerToPlayAudio)
245 .attr("title", "play this recording")
246 .append("<i/>")
247 .appendTo($item);
248 }
249
250 // Analyze
251 var $analyse = $.bem.generateElement("vic-list", "item-command", ["action_analyze"])
252 .click(this.__domEventHandlerToAnalyseRecording)
253 .attr("title", " ")
254 .data("master", _this)
255 .append("<i/>")
256 .appendTo($item);
257 bankOf$analyzeByRecordingURI[item.uri] = $analyse;
258
259 $item.click(this.__domEventHandlerToSetSelectedRecording);
260
261 $list.append($item);
262 }
263
264 App.TooltipModule.convertTitlesToTooltips($list);
265 $list.data("bankOf$analyzeByRecordingURI", bankOf$analyzeByRecordingURI);
266 visInstanceView.$content.empty().append($list);
267 },
268
269
270 // -----------------------------------------------------------------
271 // vis instance rendering - overlay
272
273 _calculateVisInstanceRenderingHashForOverlay: function(visInstanceView) {
274 return visInstanceView._cachedSizeHash
275 //+ visInstanceView.options.viewConfig.getHashForParameters()
276 //+ visInstanceView.dynamicDerivedConfigDataForEntity.getHash()
277 //+ visInstanceView.dynamicDerivedConfigDataForView.getHash()
278 + visInstanceView.dynamicDerivedVisInstanceDataForOverlay.getHash();
279 //
280 //
281 // return visInstanceView.options.entityConfig.getParameterValue("recordingURI")
282 // + App.context
283 // .attributes.state
284 // .attributes.musicRecordingGrid
285 // .attributes.entityConfigs
286 // .length;
287 },
288
289 _doRenderVisInstanceViewOverlayWithKnownComparisonMode: function(visInstanceView, comparisonMode) {
290 var recordingURI = visInstanceView.options.entityConfig.getParameterValue("recordingURI");
291 visInstanceView.$content.children(0).children().each(function() {
292 var $listItem = $(this);
293 var listItemRecordingURI = $listItem.data("recordingURI");
294 $listItem.toggleClass("vic-list__item_status_selected", recordingURI == listItemRecordingURI);
295 });
296
297 var existingRecordingConfigsByRecordingURI = {};
298 var recordingConfigs = App.context.get("state").get("musicRecordingGrid").get("entityConfigs");
299
300 recordingConfigs.each(function(recordingConfig) {
301 existingRecordingConfigsByRecordingURI[recordingConfig.getParameterValue("recordingURI")] = recordingConfig;
302 });
303
304 var bankOf$analyzeByRecordingURI = visInstanceView.$content.children(0).data("bankOf$analyzeByRecordingURI");
305
306 _.each(bankOf$analyzeByRecordingURI, function($analyze, recordingURI) {
307 var exists = !! existingRecordingConfigsByRecordingURI[recordingURI];
308 $analyze.toggleClass("vic-list__item-command_status_toggled", exists);
309 $analyze.attr("tooltip-title", exists ? "remove this recording from the ‘music recordings’ grid" : "add this recording to the ‘music recordings’ grid");
310
311 });
312 },
313 });
314 });
315 }, Logger);