OSDN Git Service

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