OSDN Git Service

fix: player insert
[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   \r
24   render: () ->\r
25     this.$el.html('')\r
26     attr = {\r
27       style: Pettanr.to_style({height: Pettanr.to_s(@panel.get('height')) + 'px'})\r
28     }\r
29     this.$el.attr(attr)\r
30     face = if @visible\r
31       '<'\r
32     else\r
33       '>'\r
34     caption = new Tag.Span({content: face})\r
35     this.$el.append(@scroll_panel.get('t') + 1)\r
36     this.$el.append(caption.render().el)\r
37     this\r
38   \r
39   click: () ->\r
40     @visible = !@visible\r
41     @render()\r
42     @trigger('click', @visible)\r
43   \r
44 class Pettanr.Views.Scroll.PlayModule.Footer extends Backbone.View\r
45   tagName: 'div'\r
46   className: 'player-item-footer'\r
47   \r
48   initialize: (options) ->\r
49     @scroll = options.scroll\r
50     @scroll_panel = options.scroll_panel\r
51     @panel = options.panel\r
52   \r
53   render: () ->\r
54     this.$el.html('')\r
55     @hide()\r
56     retriever = @panel.author()\r
57     @listenTo(retriever, 'retrieve', @retrieve_author)\r
58     retriever.retrieve()\r
59     this\r
60   \r
61   retrieve_author: (@author) -> \r
62     @panel_icon = new Pettanr.Views.Panel.Icon({item: @panel, half: true})\r
63     @author_icon = new Pettanr.Views.Author.Icon({item: @author, half: true})\r
64     @new_scroll_panel = new Pettanr.ScrollPanel()\r
65     @insert_button = new Pettanr.Views.Show.LinkedNewButton({item: @new_scroll_panel, dic_name: 'scroll_panels.player.before_insert'})\r
66     @move_button = new Pettanr.Views.Show.LinkedEditButton({item: @scroll_panel, dic_name: 'scroll_panels.player.move'})\r
67     @destroy_button = new Pettanr.Views.Show.LinkedDestroyButton({item: @scroll_panel, dic_name: 'scroll_panels.player.destroy'})\r
68     @listenTo(@panel_icon, 'click', @click_panel)\r
69     @listenTo(@author_icon, 'click', @click_author)\r
70     @listenTo(@insert_button, 'click', @click_insert)\r
71     @listenTo(@move_button, 'click', @click_move)\r
72     @listenTo(@destroy_button, 'click', @click_destroy)\r
73     l1 = new Tag.H3({\r
74       content: Pettanr.AppHelper.t_m('Panel')\r
75     })\r
76     l2 = new Tag.H3({\r
77       content: Pettanr.AppHelper.t_m('ScrollPanel')\r
78     })\r
79     this.$el.append(l1.render().el)\r
80     this.$el.append(@panel_icon.render().el)\r
81     this.$el.append(@author_icon.render().el)\r
82     this.$el.append(\r
83       Pettanr.AppHelper.distance_of_time_in_words_to_now(@panel.get('updated_at'))\r
84     )\r
85     this.$el.append(l2.render().el)\r
86     if @scroll.is_own()\r
87       this.$el.append(@insert_button.render().el)\r
88       rb = new Tag.RowBreak()\r
89       this.$el.append(rb.render().el)\r
90       this.$el.append(@move_button.render().el)\r
91       rb = new Tag.RowBreak()\r
92       this.$el.append(rb.render().el)\r
93       this.$el.append(@destroy_button.render().el)\r
94   \r
95   hide: () ->\r
96     attr = {\r
97       style: Pettanr.to_style({display: 'none'})\r
98     }\r
99     this.$el.attr(attr)\r
100   \r
101   show: () ->\r
102     attr = {\r
103       style: Pettanr.to_style({display: 'inline'})\r
104     }\r
105     this.$el.attr(attr)\r
106   \r
107   click_panel: () ->\r
108     @trigger('click:panel')\r
109   \r
110   click_author: () ->\r
111     @trigger('click:author')\r
112   \r
113   click_insert: () ->\r
114     @trigger('click:insert')\r
115   \r
116   click_move: () ->\r
117     @trigger('click:move')\r
118   \r
119   click_destroy: () ->\r
120     @trigger('click:destroy')\r
121   \r
122 class Pettanr.Views.Scroll.PlayModule.Credits extends Backbone.View\r
123   tagName: 'div'\r
124   className: 'credits'\r
125   \r
126   initialize: (options) ->\r
127     @parent = options.parent\r
128     @licensed_pictures = {}\r
129   \r
130   render: () ->\r
131     this.$el.html('')\r
132     this\r
133   \r
134   push: (retrievers) ->\r
135     _.each retrievers, (retriever) =>\r
136       @listenTo(retriever, 'retrieve', @retrieve_picture)\r
137       retriever.retrieve()\r
138   \r
139   retrieve_picture: (picture) ->\r
140     pid = picture.get('id')\r
141     return if @licensed_pictures[pid]\r
142     @licensed_pictures[pid] = picture\r
143     credit = picture.credit_view()\r
144     @listenTo(credit, 'click:icon', @click_credit_icon)\r
145     this.$el.append(credit.render().el)\r
146   \r
147   click_credit_icon: (item) ->\r
148     @trigger('click:credit:icon', item)\r
149   \r
150 class Pettanr.Views.Scroll.PlayModule.PanelBody extends Backbone.View\r
151   tagName: 'div'\r
152   className: 'player-item-panel'\r
153   \r
154   initialize: (options) ->\r
155     @panel = options.panel\r
156   \r
157   render: () ->\r
158     this.$el.html('')\r
159     body = new Pettanr.Views.Panel.Body({\r
160       panel: @panel,\r
161       spot: null\r
162     })\r
163     this.$el.append(body.render().el)\r
164     this\r
165   \r
166 class Pettanr.Views.Scroll.PlayModule.Panel extends Backbone.View\r
167   tagName: 'li'\r
168   className: 'player-item'\r
169   \r
170   initialize: (options) ->\r
171     @scroll = options.scroll\r
172     @scroll_panel = options.scroll_panel\r
173   \r
174   clear: () ->\r
175     this.$el.html('')\r
176     retriever = @scroll_panel.panel()\r
177     @listenTo(retriever, 'retrieve', @retrieve_panel)\r
178     retriever.retrieve()\r
179     this\r
180   \r
181   retrieve_panel: (@panel) ->\r
182     @render()\r
183   \r
184   render: () ->\r
185     this.$el.html('')\r
186     @panel = @panel.with_elements() # retake panel for 'with_elements' mode\r
187     @panel.fetch({cache: true}).done =>\r
188       @panel.attributes = @panel.replaced_attributes()\r
189       body = new Pettanr.Views.Scroll.PlayModule.PanelBody({\r
190         panel: @panel\r
191       })\r
192       btn = new Pettanr.Views.Scroll.PlayModule.FooterSwitch({\r
193         scroll_panel: @scroll_panel,\r
194         panel: @panel\r
195       })\r
196       @listenTo(btn, 'click', @click_footer_switch)\r
197       @footer = new Pettanr.Views.Scroll.PlayModule.Footer({\r
198         scroll: @scroll,\r
199         scroll_panel: @scroll_panel,\r
200         panel: @panel,\r
201       })\r
202       @listenTo(@footer, 'click:panel', @click_show)\r
203       @listenTo(@footer, 'click:author', @click_author)\r
204       @listenTo(@footer, 'click:insert', @click_insert)\r
205       @listenTo(@footer, 'click:move', @click_move)\r
206       @listenTo(@footer, 'click:edit', @click_edit)\r
207       @listenTo(@footer, 'click:destroy', @click_destroy)\r
208       this.$el.append(body.render().el)\r
209       this.$el.append(btn.render().el)\r
210       this.$el.append(@footer.render().el)\r
211       @trigger('ready', @panel)\r
212     this\r
213   \r
214   hide: () ->\r
215     @set_style({display: 'none'})\r
216   \r
217   show: () ->\r
218     @set_style({display: 'inline'})\r
219   \r
220   set_style: (style) ->\r
221     attr = {style: Pettanr.to_style(style)}\r
222     this.$el.attr(attr)\r
223   \r
224   click_footer_switch: (visible) ->\r
225     if visible\r
226       @footer.show()\r
227     else\r
228       @footer.hide()\r
229   \r
230   click_show: () ->\r
231     @trigger('http_get', @panel.show_url())\r
232   \r
233   click_author: () ->\r
234     @trigger('http_get', @panel.author().show_url())\r
235   \r
236   click_insert: () ->\r
237     @trigger('click:insert', this)\r
238   \r
239   click_move: () ->\r
240     @trigger('click:move', this)\r
241   \r
242   click_destroy: () ->\r
243     @trigger('click:destroy', this)\r
244   \r
245 class Pettanr.Views.Scroll.PlayModule.Append extends Tag.Div\r
246   \r
247 class Pettanr.Views.Scroll.PlayModule.Panels extends Backbone.View\r
248   tagName: 'ul'\r
249   className: 'player'\r
250   \r
251   initialize: (options) ->\r
252     @parent = options.parent\r
253     @binder = options.binder\r
254     @items = options.items\r
255     @credits = options.credits\r
256     @views = []\r
257   \r
258   render: () ->\r
259     this.$el.html('')\r
260     _.each @items, (scroll_panel) =>\r
261       return if not scroll_panel.has_panel()\r
262       panel_view = @create_panel_view(scroll_panel)\r
263       this.$el.append(panel_view.clear().el)\r
264     rb = new Tag.RowBreak()\r
265     this.$el.append(rb.render().el)\r
266     link = new Tag.A({\r
267       attr: {href: '/scroll_panels/new'},\r
268       content: I18n.t('scroll_panels.player.append')\r
269     })\r
270     @listenTo(link, 'click', @click_append)\r
271     @appender = new Pettanr.Views.Scroll.PlayModule.Append({\r
272       content: link.render().el\r
273     })\r
274     this.$el.append(@appender.render().el)\r
275     this\r
276   \r
277   create_panel_view: (scroll_panel) ->\r
278     panel_view = new Pettanr.Views.Scroll.PlayModule.Panel({\r
279       scroll: @binder, scroll_panel: scroll_panel,\r
280     })\r
281     @listenTo(panel_view, 'ready', @ready)\r
282     @listenTo(panel_view, 'click:insert', @click_insert)\r
283     @listenTo(panel_view, 'click:move', @click_move)\r
284     @listenTo(panel_view, 'click:destroy', @click_destroy)\r
285     @views.push(panel_view)\r
286     panel_view\r
287   \r
288   ready: (panel) ->\r
289     this.credits.push(panel.licensed_pictures())\r
290   \r
291   click_insert: (panel_view) ->\r
292     @trigger('click:insert')\r
293     @dialog = new Editor.Player.PanelInsertDialog({\r
294       parent: this, binder: @binder, target_model: Pettanr.ScrollPanel,\r
295       insert_point: panel_view\r
296     })\r
297     @listenTo(@dialog, 'pick', @pick)\r
298     @listenTo(@dialog, 'dialog:open', @open_dialog)\r
299     @listenTo(@dialog, 'dialog:close', @close_dialog)\r
300     this.$el.append(@dialog.render().el)\r
301     @dialog.start()\r
302   \r
303   click_append: () ->\r
304     @click_insert(@appender)\r
305   \r
306   pick: (new_item, insert_point) ->\r
307     panel_view = @create_panel_view(new_item)\r
308     ul = this.$el[0]\r
309     li = insert_point.$el[0]\r
310     ul.insertBefore(panel_view.clear().el, li)\r
311     @dialog.remove()\r
312   \r
313   open_dialog: (dialog) ->\r
314     @trigger('dialog:open', dialog)\r
315   \r
316   close_dialog: (dialog) ->\r
317     @trigger('dialog:close', dialog)\r
318   \r
319   click_move: (panel_view) ->\r
320     @trigger('click:move')\r
321     @dialog = new Editor.Player.PanelMoveDialog({\r
322       parent: this\r
323     })\r
324     this.$el.append(@dialog.render().el)\r
325     _this = this\r
326     @dialog.$el.dialog({\r
327       autoOpen: false,\r
328       width: 500, \r
329       height: 500,\r
330       close: (ui, event) ->\r
331         _this.remove()\r
332     })\r
333     @listenTo(@dialog, 'success', @success)\r
334     @dialog.start(panel_view.panel)\r
335     panel_view.hide()\r
336   \r
337   show_insert_point: () ->\r
338     _.each @views, (panel_view) =>\r
339       panel_view.show_insert_point\r
340   \r
341   click_destroy: (panel_view) ->\r
342     success = (model, response) =>\r
343       panel_view.remove()\r
344       @trigger('click:destroy')\r
345     Pettanr.Proxy.destroy(panel_view.scroll_panel, {success: success})\r
346   \r
347   remove_panel_view: (panel_view) ->\r
348     @views = _.without(@views, panel_view)\r
349     panel_view.remove()\r
350   \r
351 class Pettanr.Views.Scroll.PlayModule.Body extends Backbone.View\r
352   tagName: 'div'\r
353   \r
354   initialize: (options) ->\r
355     @parent = options.parent\r
356     @binder = options.binder\r
357     @list = options.list\r
358     @items = @list.items()\r
359     if @items.length < 1\r
360       @render_empty()\r
361     else\r
362       @render()\r
363   \r
364   render_empty: () ->\r
365     this.$el.html('')\r
366     this.$el.append((new Tag.H2({content: I18n.t('scrolls.play.empty')})).render().el)\r
367     this\r
368   \r
369   render: () ->\r
370     this.$el.html('')\r
371     # paginate(@pager)\r
372     credits = new Pettanr.Views.Scroll.PlayModule.Credits({parent: this})\r
373     panels = new Pettanr.Views.Scroll.PlayModule.Panels({\r
374       parent: this,\r
375       binder: @binder,\r
376       items: @items,\r
377       credits: credits,\r
378     })\r
379     @listenTo(credits, 'click:credit:icon', @click_credit_icon)\r
380     this.$el.append(panels.render().el)\r
381     this.$el.append(credits.render().el)\r
382     rb = new Tag.RowBreak()\r
383     this.$el.append(rb.render().el)\r
384     # paginate(@pager)\r
385     this\r
386   \r
387   click_credit_icon: (item) ->\r
388     @trigger('http_get', item.show_url())\r
389   \r
390 class Pettanr.Views.Scroll.Play extends Backbone.View\r
391   tagName: 'div'\r
392   className: 'show'\r
393   \r
394   initialize: (options) ->\r
395     @item = options.item\r
396     @list = options.list\r
397     icon_url = Pettanr.url(@item.table_name(), 'show', {id: @item.get('id')})\r
398     caption_url = Pettanr.url(@item.table_name(), 'play', {id: @item.get('id')})\r
399     prof_url = Pettanr.url(@item.table_name(), 'show', {id: @item.get('id'), format: 'prof'})\r
400     @header = new Pettanr.Views.Scroll.PlayModule.Header({\r
401       item: @item, \r
402       caption: @item.get('title'), \r
403       icon_url: icon_url,\r
404       caption_url: caption_url,\r
405       prof_url: prof_url\r
406     })\r
407     @author = new Pettanr.Views.Show.HeaderAuthor({item: @item})\r
408     @body = new Pettanr.Views.Scroll.PlayModule.Body({\r
409       parent: this,\r
410       binder: @item,\r
411       list: @list, \r
412     })\r
413     # @owner = new Pettanr.Views.Scroll.PlayModule.Owner({item: @item})\r
414     @listenTo(@header, 'click:pick', @click_pick)\r
415     @listenTo(@header, 'click:icon', @click_show)\r
416     @listenTo(@header, 'click:caption', @click_play)\r
417     @listenTo(@header, 'click:prof', @click_prof)\r
418     @listenTo(@author, 'click:author', @click_author)\r
419     @listenTo(@body, 'http_get', @http_get)\r
420   \r
421   render: () ->\r
422     this.$el.html('')\r
423     this.$el.append(@header.render().el)\r
424     this.$el.append(@author.render().el)\r
425     this.$el.append(@body.render().el)\r
426     # this.$el.append(@owner.render().el) if @item.is_own()\r
427     this\r
428   \r
429   click_show: () ->\r
430     @trigger('http_get', @item.show_url())\r
431   \r
432   click_play: () ->\r
433     @trigger('http_get', @item.play_url())\r
434   \r
435   click_prof: () ->\r
436     @trigger('http_get', @item.prof_url())\r
437   \r
438   click_author: () ->\r
439     @trigger('http_get', @author.author.show_url())\r
440   \r
441   click_pick: () ->\r
442     @trigger('pick', @item)\r
443   \r
444   http_get: (url) ->\r
445     @trigger('http_get', url)\r
446   \r