OSDN Git Service

fix:player append
[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.Panels extends Backbone.View\r
303   tagName: 'ul'\r
304   className: 'player'\r
305   \r
306   initialize: (options) ->\r
307     @parent = options.parent\r
308     @binder = options.binder\r
309     @items = options.items\r
310     @credits = options.credits\r
311     @views = []\r
312   \r
313   render: () ->\r
314     this.$el.html('')\r
315     _.each @items, (scroll_panel) =>\r
316       @append_scroll_panel(scroll_panel)\r
317     this\r
318   \r
319   append_scroll_panel: (scroll_panel) ->\r
320     return if not scroll_panel.has_panel()\r
321     panel_view = @create_panel_view(scroll_panel)\r
322     this.$el.append(panel_view.clear().el)\r
323   \r
324   create_panel_view: (scroll_panel) ->\r
325     panel_view = new Pettanr.Views.Scroll.PlayModule.Panel({\r
326       scroll: @binder, scroll_panel: scroll_panel,\r
327     })\r
328     @listenTo(panel_view, 'ready', @ready)\r
329     @listenTo(panel_view, 'click:insert', @click_insert)\r
330     @listenTo(panel_view, 'click:move', @click_move)\r
331     @listenTo(panel_view, 'click:destroy', @click_destroy)\r
332     @listenTo(panel_view, 'click:move_to', @click_move_to)\r
333     @views.push(panel_view)\r
334     panel_view\r
335   \r
336   ready: (panel) ->\r
337     this.credits.push(panel.licensed_pictures())\r
338   \r
339   click_insert: (panel_view = null) ->\r
340     @dialog = new Editor.Player.PanelInsertDialog({\r
341       parent: this, binder: @binder, target_model: Pettanr.ScrollPanel,\r
342       insert_point: panel_view\r
343     })\r
344     @listenTo(@dialog, 'pick', @pick)\r
345     @listenTo(@dialog, 'open', @open_dialog)\r
346     @listenTo(@dialog, 'close', @close_dialog)\r
347     this.$el.append(@dialog.render().el)\r
348     @dialog.start()\r
349     @trigger('click:insert', @dialog)\r
350   \r
351   pick: (new_item, insert_point) ->\r
352     @parent.appender.show()\r
353     panel_view = @create_panel_view(new_item)\r
354     ul = this.$el[0]\r
355     if insert_point\r
356       # insert before insert_point\r
357       li = insert_point.$el[0]\r
358       ul.insertBefore(panel_view.clear().el, li)\r
359     else\r
360       # append\r
361       this.$el.append(panel_view.clear().el)\r
362     @refresh_views()\r
363     @dialog.stop()\r
364   \r
365   open_dialog: () ->\r
366     @trigger('dialog:open', dialog)\r
367   \r
368   close_dialog: () ->\r
369     @trigger('dialog:close', @dialog)\r
370     if @dialog.is_catch()\r
371       # stored panel back to player\r
372       @back()\r
373   \r
374   click_move: (panel_view) ->\r
375     @dialog = new Editor.Player.PanelMoveDialog({\r
376       parent: this, binder: @binder, target_model: Pettanr.ScrollPanel,\r
377       from: panel_view\r
378     })\r
379     @listenTo(@dialog, 'open', @open_dialog)\r
380     @listenTo(@dialog, 'close', @close_dialog)\r
381     this.$el.append(@dialog.render().el)\r
382     @disable_footer_switch()\r
383     @dialog.start(panel_view.panel)\r
384     panel_view.hide()\r
385     @show_insert_point()\r
386     @trigger('click:move', @dialog)\r
387   \r
388   enable_footer_switch: () ->\r
389     _.each @views, (panel_view) =>\r
390       panel_view.enable_footer_switch()\r
391   \r
392   disable_footer_switch: () ->\r
393     _.each @views, (panel_view) =>\r
394       panel_view.disable_footer_switch()\r
395   \r
396   show_insert_point: () ->\r
397     _.each @views, (panel_view) =>\r
398       panel_view.show_insert_point()\r
399   \r
400   hide_insert_point: () ->\r
401     _.each @views, (panel_view) =>\r
402       panel_view.hide_insert_point()\r
403   \r
404   refresh_views: () ->\r
405     _.each @views, (panel_view) =>\r
406       Pettanr.cache.refresh(panel_view.scroll_panel)\r
407   \r
408   click_move_to: (to_panel_view) ->\r
409     @enable_footer_switch()\r
410     @listenTo(@dialog, 'success', @move_success)\r
411     @dialog.save(to_panel_view)\r
412   \r
413   move_success: (model, response) ->\r
414     from_panel_view = @create_panel_view(@dialog.from.scroll_panel)\r
415     @dialog.release()\r
416     @listenTo(from_panel_view, 'ready', @ready_from_panel_view)\r
417     ul = this.$el[0]\r
418     li = @dialog.to.$el[0]\r
419     ul.insertBefore(from_panel_view.clear().el, li)\r
420   \r
421   ready_from_panel_view: (panel) ->\r
422     @remove_panel_view(@dialog.from)\r
423     @dialog.stop()\r
424     @hide_insert_point()\r
425     @refresh_views()\r
426   \r
427   back: () ->\r
428     @hide_insert_point()\r
429     @enable_footer_switch()\r
430     @dialog.from.show()\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       @refresh_views()\r
437       @trigger('click:destroy')\r
438     Pettanr.Proxy.destroy(panel_view.scroll_panel, {success: success})\r
439   \r
440   remove_panel_view: (panel_view) ->\r
441     @views = _.without(@views, panel_view)\r
442     panel_view.remove()\r
443   \r
444 class Pettanr.Views.Scroll.PlayModule.Append extends Tag.Div\r
445   \r
446   initialize: (options) ->\r
447     super(options)\r
448     @enabled = false\r
449   \r
450   render: () ->\r
451     this.$el.html('')\r
452     if @enabled\r
453       @link = new Tag.A({\r
454         attr: {href: '/scroll_panels/new'},\r
455         content: I18n.t('scroll_panels.player.append')\r
456       })\r
457       @listenTo(@link, 'click', @click)\r
458       @content = @link.render().el\r
459       super()\r
460     this\r
461   \r
462   enable: () ->\r
463     @enabled = true\r
464     @show()\r
465   \r
466   disable: () ->\r
467     @enabled = false\r
468     @hide()\r
469   \r
470   hide: () ->\r
471     @set_style({display: 'none'})\r
472   \r
473   show: () ->\r
474     if @enabled\r
475       @set_style({display: 'inline'})\r
476     else\r
477       @hide()\r
478   \r
479   set_style: (style) ->\r
480     attr = {style: Pettanr.to_style(style)}\r
481     this.$el.attr(attr)\r
482     @render()\r
483   \r
484   click: () ->\r
485     @trigger('click')\r
486   \r
487 class Pettanr.Views.Scroll.PlayModule.Body extends Backbone.View\r
488   tagName: 'div'\r
489   \r
490   initialize: (options) ->\r
491     @parent = options.parent\r
492     @binder = options.binder\r
493     @list = options.list\r
494     @pager = options.pager\r
495     @items = @list.items()\r
496   \r
497   render_empty: () ->\r
498     this.$el.html('')\r
499     this.$el.append((new Tag.H2({content: I18n.t('scrolls.play.empty')})).render().el)\r
500     this\r
501   \r
502   render: () ->\r
503     if @items.length < 1\r
504       @render_empty()\r
505     else\r
506       this.$el.html('')\r
507       # paginate(@pager)\r
508       credits = new Pettanr.Views.Scroll.PlayModule.Credits({parent: this})\r
509       @panels = new Pettanr.Views.Scroll.PlayModule.Panels({\r
510         parent: this,\r
511         binder: @binder,\r
512         items: @items,\r
513         credits: credits,\r
514       })\r
515       @listenTo(credits, 'click:credit:icon', @click_credit_icon)\r
516       @listenTo(@panels, 'click:insert', @click_insert)\r
517       @listenTo(@panels, 'click:move', @click_move)\r
518       @listenTo(@panels, 'dialog:close', @close_dialog)\r
519       @listenTo(@pager, 'page', @continue)\r
520       this.$el.append(@panels.render().el)\r
521       rb = new Tag.RowBreak()\r
522       this.$el.append(rb.render().el)\r
523       @appender = new Pettanr.Views.Scroll.PlayModule.Append({\r
524       })\r
525       @listenTo(@appender, 'click', @click_append)\r
526       this.$el.append(@appender.render().el)\r
527       if !@pager.hasNextPage()\r
528         @appender.enable()\r
529       this.$el.append(@pager.render().el)\r
530       this.$el.append(credits.render().el)\r
531       rb = new Tag.RowBreak()\r
532       this.$el.append(rb.render().el)\r
533       this\r
534   \r
535   click_credit_icon: (item) ->\r
536     @trigger('http_get', item.show_url())\r
537   \r
538   click_append: () ->\r
539     @panels.click_insert()\r
540   \r
541   click_insert: (dialog) ->\r
542     @appender.hide()\r
543     @trigger('click:insert', dialog)\r
544   \r
545   click_move: (dialog) ->\r
546     @appender.hide()\r
547     @trigger('click:move', dialog)\r
548   \r
549   close_dialog: (dialog) ->\r
550     @appender.show()\r
551     @trigger('dialog:close', dialog)\r
552   \r
553   continue: (page) ->\r
554     params = _.clone(@pager.params)\r
555     params['page'] = page\r
556     continue_list = Locmare.ListGroup.list(\r
557       @list.list_group_name, @list.list_name, params\r
558     )\r
559     continue_list.open(() =>\r
560       _.each continue_list.items(), (scroll_panel) =>\r
561         @items.push(scroll_panel)\r
562         @panels.append_scroll_panel(scroll_panel)\r
563       @list = continue_list\r
564       continue_pager = Locmare.ListGroupModule.LibModule.PlayPager.factory(@list.page_status, params)\r
565       @listenTo(continue_pager, 'page', @continue)\r
566       @pager.$el.replaceWith(continue_pager.render().el)\r
567       @pager = continue_pager\r
568       if !@pager.hasNextPage()\r
569         @appender.enable()\r
570     )\r
571   \r
572 class Pettanr.Views.Scroll.Play extends Backbone.View\r
573   tagName: 'div'\r
574   className: 'show'\r
575   \r
576   initialize: (options) ->\r
577     @item = options.item\r
578     @list = options.list\r
579     @pager = options.pager\r
580     icon_url = Pettanr.url(@item.table_name(), 'show', {id: @item.get('id')})\r
581     caption_url = Pettanr.url(@item.table_name(), 'play', {id: @item.get('id')})\r
582     prof_url = Pettanr.url(@item.table_name(), 'show', {id: @item.get('id'), format: 'prof'})\r
583     @header = new Pettanr.Views.Scroll.PlayModule.Header({\r
584       item: @item, \r
585       caption: @item.get('title'), \r
586       icon_url: icon_url,\r
587       caption_url: caption_url,\r
588       prof_url: prof_url\r
589     })\r
590     @author = new Pettanr.Views.Show.HeaderAuthor({item: @item})\r
591     @body = new Pettanr.Views.Scroll.PlayModule.Body({\r
592       parent: this,\r
593       binder: @item,\r
594       list: @list, \r
595       pager: @pager\r
596     })\r
597     # @owner = new Pettanr.Views.Scroll.PlayModule.Owner({item: @item})\r
598     @listenTo(@header, 'click:pick', @click_pick)\r
599     @listenTo(@header, 'click:icon', @click_show)\r
600     @listenTo(@header, 'click:caption', @click_play)\r
601     @listenTo(@header, 'click:prof', @click_prof)\r
602     @listenTo(@author, 'click:author', @click_author)\r
603     @listenTo(@body, 'http_get', @http_get)\r
604     @listenTo(@body, 'click:insert', @click_insert)\r
605     @listenTo(@body, 'click:move', @click_move)\r
606     @listenTo(@body, 'dialog:close', @close_dialog)\r
607   \r
608   render: () ->\r
609     this.$el.html('')\r
610     this.$el.append(@header.render().el)\r
611     this.$el.append(@author.render().el)\r
612     this.$el.append(@body.render().el)\r
613     # this.$el.append(@owner.render().el) if @item.is_own()\r
614     this\r
615   \r
616   click_show: () ->\r
617     @trigger('http_get', @item.show_url())\r
618   \r
619   click_play: () ->\r
620     @trigger('http_get', @item.play_url())\r
621   \r
622   click_prof: () ->\r
623     @trigger('http_get', @item.prof_url())\r
624   \r
625   click_author: () ->\r
626     @trigger('http_get', @author.author.show_url())\r
627   \r
628   click_pick: () ->\r
629     @trigger('pick', @item)\r
630   \r
631   http_get: (url) ->\r
632     @trigger('http_get', url)\r
633   \r
634   click_insert: (dialog) ->\r
635     @trigger('insert', dialog)\r
636   \r
637   click_move: (dialog) ->\r
638     @trigger('move', dialog)\r
639   \r
640   close_dialog: (dialog) ->\r
641     @trigger('dialog:close', dialog)\r
642   \r