Mercurial > hg > dml-open-vis
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); |