OSDN Git Service

8aa8c10c618f989c2c157ded1d68438092deb78b
[pettanr/pettanr.git] / app / assets / javascripts / views / scrolls / play.js.coffee
1 class Pettanr.Views.Scroll.PlayModule\r
2 class Pettanr.Views.Scroll.PlayModule.Header extends Pettanr.Views.Show.Header\r
3   \r
4   initialize: (options) ->\r
5     super(options)\r
6   \r
7 class Pettanr.Views.Scroll.PlayModule.Owner extends Pettanr.Views.Show.Owner\r
8   \r
9   initialize: (options) ->\r
10     super(options)\r
11   \r
12 class Pettanr.Views.Scroll.PlayModule.FooterSwitch extends Backbone.View\r
13   tagName: 'div'\r
14   className: 'player-item-switch'\r
15   events: {\r
16     'click': 'click'\r
17   }\r
18   \r
19   initialize: (options) ->\r
20     @scroll_panel = options.scroll_panel\r
21     @panel = options.panel\r
22     @visible = false\r
23     @enabled = true\r
24   \r
25   render: () ->\r
26     this.$el.html('')\r
27     attr = {\r
28       style: Pettanr.to_style({height: Pettanr.to_s(@panel.get('height')) + 'px'})\r
29     }\r
30     this.$el.attr(attr)\r
31     face =  if @visible\r
32       '<'\r
33     else\r
34       '>'\r
35     caption = new Tag.Span({content: face})\r
36     this.$el.append(@scroll_panel.get('t') + 1)\r
37     this.$el.append(caption.render().el) if @enabled\r
38     this\r
39   \r
40   click: () ->\r
41     return false if !@enabled\r
42     @visible = !@visible\r
43     @render()\r
44     @trigger('click', @visible)\r
45   \r
46   enable: () ->\r
47     @enabled = true\r
48     @render()\r
49   \r
50   disable: () ->\r
51     @enabled = false\r
52     @visible = false\r
53     @render()\r
54   \r
55 class Pettanr.Views.Scroll.PlayModule.Footer extends Backbone.View\r
56   tagName: 'div'\r
57   className: 'player-item-footer'\r
58   \r
59   initialize: (options) ->\r
60     @scroll = options.scroll\r
61     @scroll_panel = options.scroll_panel\r
62     @panel = options.panel\r
63   \r
64   render: () ->\r
65     this.$el.html('')\r
66     @hide()\r
67     retriever = @panel.author()\r
68     @listenTo(retriever, 'retrieve', @retrieve_author)\r
69     retriever.retrieve()\r
70     this\r
71   \r
72   retrieve_author: (@author) -> \r
73     @panel_icon = new Pettanr.Views.Panel.Icon({item: @panel, half: true})\r
74     @author_icon = new Pettanr.Views.Author.Icon({item: @author, half: true})\r
75     @new_scroll_panel = new Pettanr.ScrollPanel()\r
76     @insert_button = new Pettanr.Views.Show.LinkedNewButton({item: @new_scroll_panel, dic_name: 'scroll_panels.player.before_insert'})\r
77     @move_button = new Pettanr.Views.Show.LinkedEditButton({item: @scroll_panel, dic_name: 'scroll_panels.player.move'})\r
78     @destroy_button = new Pettanr.Views.Show.LinkedDestroyButton({item: @scroll_panel, dic_name: 'scroll_panels.player.destroy'})\r
79     @listenTo(@panel_icon, 'click', @click_panel)\r
80     @listenTo(@author_icon, 'click', @click_author)\r
81     @listenTo(@insert_button, 'click', @click_insert)\r
82     @listenTo(@move_button, 'click', @click_move)\r
83     @listenTo(@destroy_button, 'click', @click_destroy)\r
84     l1 = new Tag.H3({\r
85       content: Pettanr.AppHelper.t_m('Panel')\r
86     })\r
87     l2 = new Tag.H3({\r
88       content: Pettanr.AppHelper.t_m('ScrollPanel')\r
89     })\r
90     this.$el.append(l1.render().el)\r
91     this.$el.append(@panel_icon.render().el)\r
92     this.$el.append(@author_icon.render().el)\r
93     this.$el.append(\r
94       Pettanr.AppHelper.distance_of_time_in_words_to_now(@panel.get('updated_at'))\r
95     )\r
96     this.$el.append(l2.render().el)\r
97     if @scroll.is_own()\r
98       this.$el.append(@insert_button.render().el)\r
99       rb = new Tag.RowBreak()\r
100       this.$el.append(rb.render().el)\r
101       this.$el.append(@move_button.render().el)\r
102       rb = new Tag.RowBreak()\r
103       this.$el.append(rb.render().el)\r
104       this.$el.append(@destroy_button.render().el)\r
105   \r
106   hide: () ->\r
107     attr = {\r
108       style: Pettanr.to_style({display: 'none'})\r
109     }\r
110     this.$el.attr(attr)\r
111   \r
112   show: () ->\r
113     attr = {\r
114       style: Pettanr.to_style({display: 'inline'})\r
115     }\r
116     this.$el.attr(attr)\r
117   \r
118   click_panel: () ->\r
119     @trigger('click:panel')\r
120   \r
121   click_author: () ->\r
122     @trigger('click:author')\r
123   \r
124   click_insert: () ->\r
125     @trigger('click:insert')\r
126   \r
127   click_move: () ->\r
128     @trigger('click:move')\r
129   \r
130   click_destroy: () ->\r
131     @trigger('click:destroy')\r
132   \r
133 class Pettanr.Views.Scroll.PlayModule.Credits extends Backbone.View\r
134   tagName: 'div'\r
135   className: 'credits'\r
136   \r
137   initialize: (options) ->\r
138     @parent = options.parent\r
139     @licensed_pictures = {}\r
140   \r
141   render: () ->\r
142     this.$el.html('')\r
143     this\r
144   \r
145   push: (retrievers) ->\r
146     _.each retrievers, (retriever) =>\r
147       @listenTo(retriever, 'retrieve', @retrieve_picture)\r
148       retriever.retrieve()\r
149   \r
150   retrieve_picture: (picture) ->\r
151     pid = picture.get('id')\r
152     return if @licensed_pictures[pid]\r
153     @licensed_pictures[pid] = picture\r
154     credit = picture.credit_view()\r
155     @listenTo(credit, 'click:icon', @click_credit_icon)\r
156     this.$el.append(credit.render().el)\r
157   \r
158   click_credit_icon: (item) ->\r
159     @trigger('click:credit:icon', item)\r
160   \r
161 class Pettanr.Views.Scroll.PlayModule.PanelBody extends Backbone.View\r
162   tagName: 'div'\r
163   className: 'player-item-panel'\r
164   \r
165   initialize: (options) ->\r
166     @panel = options.panel\r
167   \r
168   render: () ->\r
169     this.$el.html('')\r
170     body = new Pettanr.Views.Panel.Body({\r
171       panel: @panel,\r
172       spot: null\r
173     })\r
174     this.$el.append(body.render().el)\r
175     this\r
176   \r
177 class Pettanr.Views.Scroll.PlayModule.Panel extends Backbone.View\r
178   tagName: 'li'\r
179   className: 'player-item'\r
180   \r
181   initialize: (options) ->\r
182     @scroll = options.scroll\r
183     @scroll_panel = options.scroll_panel\r
184   \r
185   clear: () ->\r
186     this.$el.html('')\r
187     retriever = @scroll_panel.panel()\r
188     @listenTo(retriever, 'retrieve', @retrieve_panel)\r
189     retriever.retrieve()\r
190     this\r
191   \r
192   retrieve_panel: (@panel) ->\r
193     @render()\r
194   \r
195   render: () ->\r
196     this.$el.html('')\r
197     @panel = @panel.with_elements() # retake panel for 'with_elements' mode\r
198     @panel.fetch({cache: true}).done =>\r
199       @panel.attributes = @panel.replaced_attributes()\r
200       body = new Pettanr.Views.Scroll.PlayModule.PanelBody({\r
201         panel: @panel\r
202       })\r
203       @footer_switch = new Pettanr.Views.Scroll.PlayModule.FooterSwitch({\r
204         scroll_panel: @scroll_panel,\r
205         panel: @panel\r
206       })\r
207       @listenTo(@footer_switch, 'click', @click_footer_switch)\r
208       move_to = new Tag.A({\r
209         attr: {href: '/' + @scroll_panel.edit_url()},\r
210         content: I18n.t('scroll_panels.player.move_to')\r
211       })\r
212       @insert_point = new Pettanr.Views.Scroll.PlayModule.InsertPoint({\r
213         class_name: 'insert-point', content: move_to.render().el\r
214       })\r
215       @footer = new Pettanr.Views.Scroll.PlayModule.Footer({\r
216         scroll: @scroll,\r
217         scroll_panel: @scroll_panel,\r
218         panel: @panel,\r
219       })\r
220       @listenTo(move_to, 'click', @click_move_to)\r
221       @listenTo(@footer, 'click:panel', @click_show)\r
222       @listenTo(@footer, 'click:author', @click_author)\r
223       @listenTo(@footer, 'click:insert', @click_insert)\r
224       @listenTo(@footer, 'click:move', @click_move)\r
225       @listenTo(@footer, 'click:edit', @click_edit)\r
226       @listenTo(@footer, 'click:destroy', @click_destroy)\r
227       this.$el.append(@insert_point.clear().el)\r
228       rb = new Tag.RowBreak()\r
229       this.$el.append(rb.render().el)\r
230       this.$el.append(body.render().el)\r
231       this.$el.append(@footer_switch.render().el)\r
232       this.$el.append(@footer.render().el)\r
233       @trigger('ready', @panel)\r
234     this\r
235   \r
236   hide: () ->\r
237     @set_style({display: 'none'})\r
238   \r
239   show: () ->\r
240     @set_style({display: 'inline'})\r
241   \r
242   set_style: (style) ->\r
243     attr = {style: Pettanr.to_style(style)}\r
244     this.$el.attr(attr)\r
245   \r
246   enable_footer_switch: () ->\r
247     @footer_switch.enable()\r
248   \r
249   disable_footer_switch: () ->\r
250     @footer_switch.disable()\r
251     @footer.hide()\r
252   \r
253   show_insert_point: () ->\r
254     @insert_point.show()\r
255   \r
256   hide_insert_point: () ->\r
257     @insert_point.hide()\r
258   \r
259   click_footer_switch: (visible) ->\r
260     if visible\r
261       @footer.show()\r
262     else\r
263       @footer.hide()\r
264   \r
265   click_show: () ->\r
266     @trigger('http_get', @panel.show_url())\r
267   \r
268   click_author: () ->\r
269     @trigger('http_get', @panel.author().show_url())\r
270   \r
271   click_insert: () ->\r
272     @trigger('click:insert', this)\r
273   \r
274   click_move: () ->\r
275     @trigger('click:move', this)\r
276   \r
277   click_destroy: () ->\r
278     @trigger('click:destroy', this)\r
279   \r
280   click_move_to: () ->\r
281     @trigger('click:move_to', this)\r
282   \r
283 class Pettanr.Views.Scroll.PlayModule.InsertPoint extends Tag.Div\r
284   \r
285   clear: () ->\r
286     this.$el.html('')\r
287     @hide()\r
288     @render()\r
289     this\r
290   \r
291   hide: () ->\r
292     @set_style({display: 'none'})\r
293   \r
294   show: () ->\r
295     @set_style({display: 'inline'})\r
296   \r
297   set_style: (style) ->\r
298     attr = {style: Pettanr.to_style(style)}\r
299     this.$el.attr(attr)\r
300   \r
301 class Pettanr.Views.Scroll.PlayModule.Append extends Tag.Div\r
302   \r
303   hide: () ->\r
304     @set_style({display: 'none'})\r
305   \r
306   show: () ->\r
307     @set_style({display: 'inline'})\r
308   \r
309   set_style: (style) ->\r
310     attr = {style: Pettanr.to_style(style)}\r
311     this.$el.attr(attr)\r
312   \r
313 class Pettanr.Views.Scroll.PlayModule.Panels extends Backbone.View\r
314   tagName: 'ul'\r
315   className: 'player'\r
316   \r
317   initialize: (options) ->\r
318     @parent = options.parent\r
319     @binder = options.binder\r
320     @items = options.items\r
321     @credits = options.credits\r
322     @views = []\r
323   \r
324   render: () ->\r
325     this.$el.html('')\r
326     _.each @items, (scroll_panel) =>\r
327       return if not scroll_panel.has_panel()\r
328       panel_view = @create_panel_view(scroll_panel)\r
329       this.$el.append(panel_view.clear().el)\r
330     rb = new Tag.RowBreak()\r
331     this.$el.append(rb.render().el)\r
332     link = new Tag.A({\r
333       attr: {href: '/scroll_panels/new'},\r
334       content: I18n.t('scroll_panels.player.append')\r
335     })\r
336     @listenTo(link, 'click', @click_append)\r
337     @appender = new Pettanr.Views.Scroll.PlayModule.Append({\r
338       content: link.render().el\r
339     })\r
340     this.$el.append(@appender.render().el)\r
341     this\r
342   \r
343   create_panel_view: (scroll_panel) ->\r
344     panel_view = new Pettanr.Views.Scroll.PlayModule.Panel({\r
345       scroll: @binder, scroll_panel: scroll_panel,\r
346     })\r
347     @listenTo(panel_view, 'ready', @ready)\r
348     @listenTo(panel_view, 'click:insert', @click_insert)\r
349     @listenTo(panel_view, 'click:move', @click_move)\r
350     @listenTo(panel_view, 'click:destroy', @click_destroy)\r
351     @listenTo(panel_view, 'click:move_to', @click_move_to)\r
352     @views.push(panel_view)\r
353     panel_view\r
354   \r
355   ready: (panel) ->\r
356     this.credits.push(panel.licensed_pictures())\r
357   \r
358   click_insert: (panel_view) ->\r
359     @dialog = new Editor.Player.PanelInsertDialog({\r
360       parent: this, binder: @binder, target_model: Pettanr.ScrollPanel,\r
361       insert_point: panel_view\r
362     })\r
363     @listenTo(@dialog, 'pick', @pick)\r
364     @listenTo(@dialog, 'open', @open_dialog)\r
365     @listenTo(@dialog, 'close', @close_dialog)\r
366     this.$el.append(@dialog.render().el)\r
367     @dialog.start()\r
368     @trigger('click:insert', @dialog)\r
369   \r
370   click_append: () ->\r
371     @click_insert(@appender)\r
372   \r
373   pick: (new_item, insert_point) ->\r
374     panel_view = @create_panel_view(new_item)\r
375     ul = this.$el[0]\r
376     li = insert_point.$el[0]\r
377     ul.insertBefore(panel_view.clear().el, li)\r
378   \r
379   open_dialog: () ->\r
380     @trigger('dialog:open', dialog)\r
381   \r
382   close_dialog: () ->\r
383     @appender.show()\r
384     @trigger('dialog:close', @dialog)\r
385   \r
386   click_move: (panel_view) ->\r
387     @dialog = new Editor.Player.PanelMoveDialog({\r
388       parent: this, binder: @binder, target_model: Pettanr.ScrollPanel,\r
389       from: panel_view\r
390     })\r
391     @listenTo(@dialog, 'open', @open_dialog)\r
392     @listenTo(@dialog, 'close', @close_dialog)\r
393     this.$el.append(@dialog.render().el)\r
394     @appender.hide()\r
395     @disable_footer_switch()\r
396     @dialog.start(panel_view.panel)\r
397     panel_view.hide()\r
398     @show_insert_point()\r
399     @trigger('click:move', @dialog)\r
400   \r
401   enable_footer_switch: () ->\r
402     _.each @views, (panel_view) =>\r
403       panel_view.enable_footer_switch()\r
404   \r
405   disable_footer_switch: () ->\r
406     _.each @views, (panel_view) =>\r
407       panel_view.disable_footer_switch()\r
408   \r
409   show_insert_point: () ->\r
410     _.each @views, (panel_view) =>\r
411       panel_view.show_insert_point()\r
412   \r
413   hide_insert_point: () ->\r
414     _.each @views, (panel_view) =>\r
415       panel_view.hide_insert_point()\r
416   \r
417   click_move_to: (to_panel_view) ->\r
418     @listenTo(@dialog, 'success', @move_success)\r
419     @dialog.save(to_panel_view)\r
420   \r
421   move_success: (model, response) ->\r
422     from_panel_view = @create_panel_view(@dialog.from.scroll_panel)\r
423     @listenTo(from_panel_view, 'ready', @ready_from_panel_view)\r
424     ul = this.$el[0]\r
425     li = @dialog.to.$el[0]\r
426     ul.insertBefore(from_panel_view.clear().el, li)\r
427   \r
428   ready_from_panel_view: (panel) ->\r
429     @remove_panel_view(@dialog.from)\r
430     @hide_insert_point()\r
431   \r
432   click_destroy: (panel_view) ->\r
433     success = (model, response) =>\r
434       @remove_panel_view(panel_view)\r
435       panel_view.remove()\r
436       @trigger('click:destroy')\r
437     Pettanr.Proxy.destroy(panel_view.scroll_panel, {success: success})\r
438   \r
439   remove_panel_view: (panel_view) ->\r
440     @views = _.without(@views, panel_view)\r
441     panel_view.remove()\r
442   \r
443 class Pettanr.Views.Scroll.PlayModule.Body extends Backbone.View\r
444   tagName: 'div'\r
445   \r
446   initialize: (options) ->\r
447     @parent = options.parent\r
448     @binder = options.binder\r
449     @list = options.list\r
450     @items = @list.items()\r
451     if @items.length < 1\r
452       @render_empty()\r
453     else\r
454       @render()\r
455   \r
456   render_empty: () ->\r
457     this.$el.html('')\r
458     this.$el.append((new Tag.H2({content: I18n.t('scrolls.play.empty')})).render().el)\r
459     this\r
460   \r
461   render: () ->\r
462     this.$el.html('')\r
463     # paginate(@pager)\r
464     credits = new Pettanr.Views.Scroll.PlayModule.Credits({parent: this})\r
465     panels = new Pettanr.Views.Scroll.PlayModule.Panels({\r
466       parent: this,\r
467       binder: @binder,\r
468       items: @items,\r
469       credits: credits,\r
470     })\r
471     @listenTo(credits, 'click:credit:icon', @click_credit_icon)\r
472     @listenTo(panels, 'click:insert', @click_insert)\r
473     @listenTo(panels, 'click:move', @click_move)\r
474     @listenTo(panels, 'dialog:close', @close_dialog)\r
475     this.$el.append(panels.render().el)\r
476     this.$el.append(credits.render().el)\r
477     rb = new Tag.RowBreak()\r
478     this.$el.append(rb.render().el)\r
479     # paginate(@pager)\r
480     this\r
481   \r
482   click_credit_icon: (item) ->\r
483     @trigger('http_get', item.show_url())\r
484   \r
485   click_insert: (dialog) ->\r
486     @trigger('click:insert', dialog)\r
487   \r
488   click_move: (dialog) ->\r
489     @trigger('click:move', dialog)\r
490   \r
491   close_dialog: (dialog) ->\r
492     @trigger('dialog:close', dialog)\r
493   \r
494 class Pettanr.Views.Scroll.Play extends Backbone.View\r
495   tagName: 'div'\r
496   className: 'show'\r
497   \r
498   initialize: (options) ->\r
499     @item = options.item\r
500     @list = options.list\r
501     icon_url = Pettanr.url(@item.table_name(), 'show', {id: @item.get('id')})\r
502     caption_url = Pettanr.url(@item.table_name(), 'play', {id: @item.get('id')})\r
503     prof_url = Pettanr.url(@item.table_name(), 'show', {id: @item.get('id'), format: 'prof'})\r
504     @header = new Pettanr.Views.Scroll.PlayModule.Header({\r
505       item: @item, \r
506       caption: @item.get('title'), \r
507       icon_url: icon_url,\r
508       caption_url: caption_url,\r
509       prof_url: prof_url\r
510     })\r
511     @author = new Pettanr.Views.Show.HeaderAuthor({item: @item})\r
512     @body = new Pettanr.Views.Scroll.PlayModule.Body({\r
513       parent: this,\r
514       binder: @item,\r
515       list: @list, \r
516     })\r
517     # @owner = new Pettanr.Views.Scroll.PlayModule.Owner({item: @item})\r
518     @listenTo(@header, 'click:pick', @click_pick)\r
519     @listenTo(@header, 'click:icon', @click_show)\r
520     @listenTo(@header, 'click:caption', @click_play)\r
521     @listenTo(@header, 'click:prof', @click_prof)\r
522     @listenTo(@author, 'click:author', @click_author)\r
523     @listenTo(@body, 'http_get', @http_get)\r
524     @listenTo(@body, 'click:insert', @click_insert)\r
525     @listenTo(@body, 'click:move', @click_move)\r
526     @listenTo(@body, 'dialog:close', @close_dialog)\r
527   \r
528   render: () ->\r
529     this.$el.html('')\r
530     this.$el.append(@header.render().el)\r
531     this.$el.append(@author.render().el)\r
532     this.$el.append(@body.render().el)\r
533     # this.$el.append(@owner.render().el) if @item.is_own()\r
534     this\r
535   \r
536   click_show: () ->\r
537     @trigger('http_get', @item.show_url())\r
538   \r
539   click_play: () ->\r
540     @trigger('http_get', @item.play_url())\r
541   \r
542   click_prof: () ->\r
543     @trigger('http_get', @item.prof_url())\r
544   \r
545   click_author: () ->\r
546     @trigger('http_get', @author.author.show_url())\r
547   \r
548   click_pick: () ->\r
549     @trigger('pick', @item)\r
550   \r
551   http_get: (url) ->\r
552     @trigger('http_get', url)\r
553   \r
554   click_insert: (dialog) ->\r
555     @trigger('insert', dialog)\r
556   \r
557   click_move: (dialog) ->\r
558     @trigger('move', dialog)\r
559   \r
560   close_dialog: (dialog) ->\r
561     @trigger('dialog:close', dialog)\r
562   \r