OSDN Git Service

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