OSDN Git Service

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