OSDN Git Service

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