OSDN Git Service

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