X-Git-Url: http://git.osdn.net/view?p=pettanr%2Fpettanr.git;a=blobdiff_plain;f=app%2Fassets%2Fjavascripts%2Fviews%2Fscrolls%2Fplay.js.coffee;h=5dfdd6361927683c5aa716c1e3477bc603c01859;hp=8aa8c10c618f989c2c157ded1d68438092deb78b;hb=6feb1c7f35b819955c56b14b6cfb7d1c21c0cffa;hpb=9179eea069c4cf5ed4d05e4fa1f5bd33fd9af0cf diff --git a/app/assets/javascripts/views/scrolls/play.js.coffee b/app/assets/javascripts/views/scrolls/play.js.coffee index 8aa8c10c..5dfdd636 100644 --- a/app/assets/javascripts/views/scrolls/play.js.coffee +++ b/app/assets/javascripts/views/scrolls/play.js.coffee @@ -1,15 +1,5 @@ class Pettanr.Views.Scroll.PlayModule -class Pettanr.Views.Scroll.PlayModule.Header extends Pettanr.Views.Show.Header - - initialize: (options) -> - super(options) - -class Pettanr.Views.Scroll.PlayModule.Owner extends Pettanr.Views.Show.Owner - - initialize: (options) -> - super(options) - -class Pettanr.Views.Scroll.PlayModule.FooterSwitch extends Backbone.View +class Pettanr.Views.Scroll.PlayModule.FooterSwitch extends Pettanr.View tagName: 'div' className: 'player-item-switch' events: { @@ -21,6 +11,7 @@ class Pettanr.Views.Scroll.PlayModule.FooterSwitch extends Backbone.View @panel = options.panel @visible = false @enabled = true + @listenTo(@scroll_panel, 'sync', @render) render: () -> this.$el.html('') @@ -52,7 +43,7 @@ class Pettanr.Views.Scroll.PlayModule.FooterSwitch extends Backbone.View @visible = false @render() -class Pettanr.Views.Scroll.PlayModule.Footer extends Backbone.View +class Pettanr.Views.Scroll.PlayModule.Footer extends Pettanr.View tagName: 'div' className: 'player-item-footer' @@ -64,44 +55,55 @@ class Pettanr.Views.Scroll.PlayModule.Footer extends Backbone.View render: () -> this.$el.html('') @hide() - retriever = @panel.author() - @listenTo(retriever, 'retrieve', @retrieve_author) - retriever.retrieve() - this - - retrieve_author: (@author) -> - @panel_icon = new Pettanr.Views.Panel.Icon({item: @panel, half: true}) - @author_icon = new Pettanr.Views.Author.Icon({item: @author, half: true}) - @new_scroll_panel = new Pettanr.ScrollPanel() - @insert_button = new Pettanr.Views.Show.LinkedNewButton({item: @new_scroll_panel, dic_name: 'scroll_panels.player.before_insert'}) - @move_button = new Pettanr.Views.Show.LinkedEditButton({item: @scroll_panel, dic_name: 'scroll_panels.player.move'}) - @destroy_button = new Pettanr.Views.Show.LinkedDestroyButton({item: @scroll_panel, dic_name: 'scroll_panels.player.destroy'}) - @listenTo(@panel_icon, 'click', @click_panel) - @listenTo(@author_icon, 'click', @click_author) - @listenTo(@insert_button, 'click', @click_insert) - @listenTo(@move_button, 'click', @click_move) - @listenTo(@destroy_button, 'click', @click_destroy) - l1 = new Tag.H3({ - content: Pettanr.AppHelper.t_m('Panel') - }) - l2 = new Tag.H3({ - content: Pettanr.AppHelper.t_m('ScrollPanel') + @panel.get_parent('author', this, { + success: (@author) => + @panel_face_button = @panel.mini_face_button({ + context: this, + click: () -> + @trigger('click:panel') + }) + @author_face_button = @author.mini_face_button({ + context: this, + click: () -> + @trigger('click:author', @author) + }) + l1 = new Tag.H3({ + content: Pettanr.AppHelper.t_m('Panel') + }) + l2 = new Tag.H3({ + content: Pettanr.AppHelper.t_m('ScrollPanel') + }) + this.$el.append(l1.render().el) + this.$el.append(@panel_face_button.render().el) + this.$el.append(@author_face_button.render().el) + this.$el.append( + Pettanr.AppHelper.distance_of_time_in_words_to_now(@panel.get('updated_at')) + ) + this.$el.append(l2.render().el) + if @scroll.is_own() + @new_scroll_panel = new Pettanr.ScrollPanel() + @insert_button = new Pettanr.View.Button.ItemAction(@new_scroll_panel, 'new', 'scroll_panels.player.before_insert', { + context: this, + click: () -> + @trigger('click:insert') + }) + @move_button = new Pettanr.View.Button.ItemAction(@scroll_panel, 'edit', 'scroll_panels.player.move', { + context: this, + click: () -> + @trigger('click:move') + }) + @destroy_button = new Pettanr.View.Button.ItemAction(@scroll_panel, 'destroy', 'scroll_panels.player.destroy', { + context: this, + click: () -> + @trigger('click:destroy') + }) + this.$el.append(@insert_button.render().el) + @append_rb() + this.$el.append(@move_button.render().el) + @append_rb() + this.$el.append(@destroy_button.render().el) }) - this.$el.append(l1.render().el) - this.$el.append(@panel_icon.render().el) - this.$el.append(@author_icon.render().el) - this.$el.append( - Pettanr.AppHelper.distance_of_time_in_words_to_now(@panel.get('updated_at')) - ) - this.$el.append(l2.render().el) - if @scroll.is_own() - this.$el.append(@insert_button.render().el) - rb = new Tag.RowBreak() - this.$el.append(rb.render().el) - this.$el.append(@move_button.render().el) - rb = new Tag.RowBreak() - this.$el.append(rb.render().el) - this.$el.append(@destroy_button.render().el) + this hide: () -> attr = { @@ -115,50 +117,7 @@ class Pettanr.Views.Scroll.PlayModule.Footer extends Backbone.View } this.$el.attr(attr) - click_panel: () -> - @trigger('click:panel') - - click_author: () -> - @trigger('click:author') - - click_insert: () -> - @trigger('click:insert') - - click_move: () -> - @trigger('click:move') - - click_destroy: () -> - @trigger('click:destroy') - -class Pettanr.Views.Scroll.PlayModule.Credits extends Backbone.View - tagName: 'div' - className: 'credits' - - initialize: (options) -> - @parent = options.parent - @licensed_pictures = {} - - render: () -> - this.$el.html('') - this - - push: (retrievers) -> - _.each retrievers, (retriever) => - @listenTo(retriever, 'retrieve', @retrieve_picture) - retriever.retrieve() - - retrieve_picture: (picture) -> - pid = picture.get('id') - return if @licensed_pictures[pid] - @licensed_pictures[pid] = picture - credit = picture.credit_view() - @listenTo(credit, 'click:icon', @click_credit_icon) - this.$el.append(credit.render().el) - - click_credit_icon: (item) -> - @trigger('click:credit:icon', item) - -class Pettanr.Views.Scroll.PlayModule.PanelBody extends Backbone.View +class Pettanr.Views.Scroll.PlayModule.PanelBody extends Pettanr.View tagName: 'div' className: 'player-item-panel' @@ -174,7 +133,7 @@ class Pettanr.Views.Scroll.PlayModule.PanelBody extends Backbone.View this.$el.append(body.render().el) this -class Pettanr.Views.Scroll.PlayModule.Panel extends Backbone.View +class Pettanr.Views.Scroll.PlayModule.Panel extends Pettanr.View tagName: 'li' className: 'player-item' @@ -184,53 +143,54 @@ class Pettanr.Views.Scroll.PlayModule.Panel extends Backbone.View clear: () -> this.$el.html('') - retriever = @scroll_panel.panel() - @listenTo(retriever, 'retrieve', @retrieve_panel) - retriever.retrieve() + @scroll_panel.get_parent('panel', this, { + success: (@panel) => + @render() + }) this - retrieve_panel: (@panel) -> - @render() - render: () -> this.$el.html('') - @panel = @panel.with_elements() # retake panel for 'with_elements' mode - @panel.fetch({cache: true}).done => - @panel.attributes = @panel.replaced_attributes() - body = new Pettanr.Views.Scroll.PlayModule.PanelBody({ - panel: @panel - }) - @footer_switch = new Pettanr.Views.Scroll.PlayModule.FooterSwitch({ - scroll_panel: @scroll_panel, - panel: @panel - }) - @listenTo(@footer_switch, 'click', @click_footer_switch) - move_to = new Tag.A({ - attr: {href: '/' + @scroll_panel.edit_url()}, - content: I18n.t('scroll_panels.player.move_to') - }) - @insert_point = new Pettanr.Views.Scroll.PlayModule.InsertPoint({ - class_name: 'insert-point', content: move_to.render().el - }) - @footer = new Pettanr.Views.Scroll.PlayModule.Footer({ - scroll: @scroll, - scroll_panel: @scroll_panel, - panel: @panel, - }) - @listenTo(move_to, 'click', @click_move_to) - @listenTo(@footer, 'click:panel', @click_show) - @listenTo(@footer, 'click:author', @click_author) - @listenTo(@footer, 'click:insert', @click_insert) - @listenTo(@footer, 'click:move', @click_move) - @listenTo(@footer, 'click:edit', @click_edit) - @listenTo(@footer, 'click:destroy', @click_destroy) - this.$el.append(@insert_point.clear().el) - rb = new Tag.RowBreak() - this.$el.append(rb.render().el) - this.$el.append(body.render().el) - this.$el.append(@footer_switch.render().el) - this.$el.append(@footer.render().el) - @trigger('ready', @panel) + @panel = @panel.play() # retake panel for 'with_elements' mode + @panel.fetch({ + success: (model, response, opt) => + @panel.attributes = @panel.decoded_attributes() + body = new Pettanr.Views.Scroll.PlayModule.PanelBody({ + panel: @panel + }) + @footer_switch = new Pettanr.Views.Scroll.PlayModule.FooterSwitch({ + scroll_panel: @scroll_panel, + panel: @panel + }) + @listenTo(@footer_switch, 'click', @click_footer_switch) + move_to = new Tag.A({ + attr: {href: '/' + @scroll_panel.edit_url()}, + content: I18n.t('scroll_panels.player.move_to') + }) + @insert_point = new Pettanr.Views.Scroll.PlayModule.InsertPoint({ + class_name: 'insert-point', content: move_to.render().el + }) + @footer = new Pettanr.Views.Scroll.PlayModule.Footer({ + scroll: @scroll, + scroll_panel: @scroll_panel, + panel: @panel, + }) + @listenTo(move_to, 'click', @click_move_to) + @listenTo(@footer, 'click:panel', @click_show) + @listenTo(@footer, 'click:author', @click_author) + @listenTo(@footer, 'click:insert', @click_insert) + @listenTo(@footer, 'click:move', @click_move) + @listenTo(@footer, 'click:edit', @click_edit) + @listenTo(@footer, 'click:destroy', @click_destroy) + this.$el.append(@insert_point.clear().el) + @append_rb() + this.$el.append(body.render().el) + this.$el.append(@footer_switch.render().el) + this.$el.append(@footer.render().el) + @trigger('ready', @panel) + error: (item, response, opt) => + @open_error_dialog(response, opt) + }) this hide: () -> @@ -265,8 +225,8 @@ class Pettanr.Views.Scroll.PlayModule.Panel extends Backbone.View click_show: () -> @trigger('http_get', @panel.show_url()) - click_author: () -> - @trigger('http_get', @panel.author().show_url()) + click_author: (author) -> + @trigger('http_get', author.show_url()) click_insert: () -> @trigger('click:insert', this) @@ -298,7 +258,13 @@ class Pettanr.Views.Scroll.PlayModule.InsertPoint extends Tag.Div attr = {style: Pettanr.to_style(style)} this.$el.attr(attr) -class Pettanr.Views.Scroll.PlayModule.Append extends Tag.Div +class Pettanr.Views.Scroll.PlayModule.EmptyNotice extends Tag.H2 + + clear: () -> + this.$el.html('') + @hide() + @render() + this hide: () -> @set_style({display: 'none'}) @@ -310,7 +276,7 @@ class Pettanr.Views.Scroll.PlayModule.Append extends Tag.Div attr = {style: Pettanr.to_style(style)} this.$el.attr(attr) -class Pettanr.Views.Scroll.PlayModule.Panels extends Backbone.View +class Pettanr.Views.Scroll.PlayModule.Panels extends Pettanr.View tagName: 'ul' className: 'player' @@ -323,28 +289,32 @@ class Pettanr.Views.Scroll.PlayModule.Panels extends Backbone.View render: () -> this.$el.html('') + @empty_notice = new Pettanr.Views.Scroll.PlayModule.EmptyNotice({content: I18n.t('scrolls.play.empty')}) + this.$el.append(@empty_notice.clear().el) _.each @items, (scroll_panel) => - return if not scroll_panel.has_panel() - panel_view = @create_panel_view(scroll_panel) - this.$el.append(panel_view.clear().el) - rb = new Tag.RowBreak() - this.$el.append(rb.render().el) - link = new Tag.A({ - attr: {href: '/scroll_panels/new'}, - content: I18n.t('scroll_panels.player.append') - }) - @listenTo(link, 'click', @click_append) - @appender = new Pettanr.Views.Scroll.PlayModule.Append({ - content: link.render().el - }) - this.$el.append(@appender.render().el) + @append_scroll_panel(scroll_panel) + @refresh_empty_notice() this + refresh_empty_notice: () -> + if @views.length < 1 + @empty_notice.show() + else + @empty_notice.hide() + this + + append_scroll_panel: (scroll_panel) -> + return if not scroll_panel.has_panel() + panel_view = @create_panel_view(scroll_panel) + this.$el.append(panel_view.clear().el) + @refresh_empty_notice() + create_panel_view: (scroll_panel) -> panel_view = new Pettanr.Views.Scroll.PlayModule.Panel({ scroll: @binder, scroll_panel: scroll_panel, }) @listenTo(panel_view, 'ready', @ready) + @listenTo(panel_view, 'http_get', @http_get) @listenTo(panel_view, 'click:insert', @click_insert) @listenTo(panel_view, 'click:move', @click_move) @listenTo(panel_view, 'click:destroy', @click_destroy) @@ -355,7 +325,10 @@ class Pettanr.Views.Scroll.PlayModule.Panels extends Backbone.View ready: (panel) -> this.credits.push(panel.licensed_pictures()) - click_insert: (panel_view) -> + http_get: (url) -> + @trigger('http_get', url) + + click_insert: (panel_view = null) -> @dialog = new Editor.Player.PanelInsertDialog({ parent: this, binder: @binder, target_model: Pettanr.ScrollPanel, insert_point: panel_view @@ -367,21 +340,28 @@ class Pettanr.Views.Scroll.PlayModule.Panels extends Backbone.View @dialog.start() @trigger('click:insert', @dialog) - click_append: () -> - @click_insert(@appender) - pick: (new_item, insert_point) -> + @parent.appender.show() panel_view = @create_panel_view(new_item) ul = this.$el[0] - li = insert_point.$el[0] - ul.insertBefore(panel_view.clear().el, li) + if insert_point + # insert before insert_point + li = insert_point.$el[0] + ul.insertBefore(panel_view.clear().el, li) + else + # append + this.$el.append(panel_view.clear().el) + @refresh_views() + @dialog.stop() open_dialog: () -> @trigger('dialog:open', dialog) close_dialog: () -> - @appender.show() @trigger('dialog:close', @dialog) + if @dialog.is_catch() + # stored panel back to player + @back() click_move: (panel_view) -> @dialog = new Editor.Player.PanelMoveDialog({ @@ -391,7 +371,6 @@ class Pettanr.Views.Scroll.PlayModule.Panels extends Backbone.View @listenTo(@dialog, 'open', @open_dialog) @listenTo(@dialog, 'close', @close_dialog) this.$el.append(@dialog.render().el) - @appender.hide() @disable_footer_switch() @dialog.start(panel_view.panel) panel_view.hide() @@ -414,12 +393,18 @@ class Pettanr.Views.Scroll.PlayModule.Panels extends Backbone.View _.each @views, (panel_view) => panel_view.hide_insert_point() + refresh_views: () -> + _.each @views, (panel_view) => + Pettanr.cache.refresh(panel_view.scroll_panel) + click_move_to: (to_panel_view) -> + @enable_footer_switch() @listenTo(@dialog, 'success', @move_success) @dialog.save(to_panel_view) move_success: (model, response) -> from_panel_view = @create_panel_view(@dialog.from.scroll_panel) + @dialog.release() @listenTo(from_panel_view, 'ready', @ready_from_panel_view) ul = this.$el[0] li = @dialog.to.$el[0] @@ -427,12 +412,21 @@ class Pettanr.Views.Scroll.PlayModule.Panels extends Backbone.View ready_from_panel_view: (panel) -> @remove_panel_view(@dialog.from) + @dialog.stop() + @hide_insert_point() + @refresh_views() + + back: () -> @hide_insert_point() + @enable_footer_switch() + @dialog.from.show() click_destroy: (panel_view) -> success = (model, response) => @remove_panel_view(panel_view) panel_view.remove() + @refresh_empty_notice() + @refresh_views() @trigger('click:destroy') Pettanr.Proxy.destroy(panel_view.scroll_panel, {success: success}) @@ -440,86 +434,178 @@ class Pettanr.Views.Scroll.PlayModule.Panels extends Backbone.View @views = _.without(@views, panel_view) panel_view.remove() -class Pettanr.Views.Scroll.PlayModule.Body extends Backbone.View +class Pettanr.Views.Scroll.PlayModule.Append extends Tag.Div + + initialize: (options) -> + super(options) + @enabled = false + + render: () -> + this.$el.html('') + if @enabled + @link = new Tag.A({ + attr: {href: '/scroll_panels/new'}, + content: I18n.t('scroll_panels.player.append') + }) + @listenTo(@link, 'click', @click) + @content = @link.render().el + super() + this + + enable: () -> + @enabled = true + @show() + + disable: () -> + @enabled = false + @hide() + + hide: () -> + @set_style({display: 'none'}) + + show: () -> + if @enabled + @set_style({display: 'inline'}) + else + @hide() + + set_style: (style) -> + attr = {style: Pettanr.to_style(style)} + this.$el.attr(attr) + @render() + + click: () -> + @trigger('click') + +class Pettanr.Views.Scroll.PlayModule.Body extends Pettanr.View tagName: 'div' initialize: (options) -> @parent = options.parent @binder = options.binder @list = options.list + @pager = options.pager @items = @list.items() - if @items.length < 1 - @render_empty() - else - @render() - - render_empty: () -> - this.$el.html('') - this.$el.append((new Tag.H2({content: I18n.t('scrolls.play.empty')})).render().el) - this render: () -> this.$el.html('') # paginate(@pager) - credits = new Pettanr.Views.Scroll.PlayModule.Credits({parent: this}) - panels = new Pettanr.Views.Scroll.PlayModule.Panels({ + credits = new Pettanr.View.Credits(this, {icon: true}) + @panels = new Pettanr.Views.Scroll.PlayModule.Panels({ parent: this, binder: @binder, items: @items, credits: credits, }) @listenTo(credits, 'click:credit:icon', @click_credit_icon) - @listenTo(panels, 'click:insert', @click_insert) - @listenTo(panels, 'click:move', @click_move) - @listenTo(panels, 'dialog:close', @close_dialog) - this.$el.append(panels.render().el) + @listenTo(@panels, 'click:insert', @click_insert) + @listenTo(@panels, 'click:move', @click_move) + @listenTo(@panels, 'dialog:close', @close_dialog) + this.$el.append(@panels.render().el) + @append_rb() + @appender = new Pettanr.Views.Scroll.PlayModule.Append({ + }) + @listenTo(@appender, 'click', @click_append) + this.$el.append(@appender.render().el) + if @is_appendable() + @appender.enable() + if @pager + @listenTo(@pager, 'page', @continue) + this.$el.append(@pager.render().el) this.$el.append(credits.render().el) - rb = new Tag.RowBreak() - this.$el.append(rb.render().el) - # paginate(@pager) + @append_rb() this + is_appendable: () -> + return true if _.isEmpty(@items) + if @pager and @pager.hasNextPage() + false + else + this.$el.html('') + # paginate(@pager) + credits = new Pettanr.View.Credits(this, {icon: true}) + @panels = new Pettanr.Views.Scroll.PlayModule.Panels({ + parent: this, + binder: @binder, + items: @items, + credits: credits, + }) + @listenTo(credits, 'click:credit:icon', @click_credit_icon) + @listenTo(@panels, 'http_get', @http_get) + @listenTo(@panels, 'click:insert', @click_insert) + @listenTo(@panels, 'click:move', @click_move) + @listenTo(@panels, 'dialog:close', @close_dialog) + @listenTo(@pager, 'page', @continue) + this.$el.append(@panels.render().el) + @append_rb() + @appender = new Pettanr.Views.Scroll.PlayModule.Append({ + }) + @listenTo(@appender, 'click', @click_append) + this.$el.append(@appender.render().el) + if !@pager.hasNextPage() + @appender.enable() + this.$el.append(@pager.render().el) + this.$el.append(credits.render().el) + @append_rb() + true + click_credit_icon: (item) -> @trigger('http_get', item.show_url()) + click_append: () -> + @panels.click_insert() + + http_get: (url) -> + @trigger('http_get', url) + click_insert: (dialog) -> + @appender.hide() @trigger('click:insert', dialog) click_move: (dialog) -> + @appender.hide() @trigger('click:move', dialog) close_dialog: (dialog) -> + @appender.show() @trigger('dialog:close', dialog) -class Pettanr.Views.Scroll.Play extends Backbone.View - tagName: 'div' - className: 'show' + continue: (page) -> + params = _.clone(@pager.params) + params['page'] = page + continue_list = Locmare.ListGroup.list( + @list.list_group_name, @list.list_name, params + ) + continue_list.open(this, { + success: (next_page_items) => + _.each next_page_items, (scroll_panel) => + @items.push(scroll_panel) + @panels.append_scroll_panel(scroll_panel) + @list = continue_list + continue_pager = Locmare.ListGroupModule.LibModule.PlayPager.factory(@list.page_status, params) + @listenTo(continue_pager, 'page', @continue) + @pager.$el.replaceWith(continue_pager.render().el) + @pager = continue_pager + if !@pager.hasNextPage() + @appender.enable() + }) + +class Pettanr.Views.Scroll.Play extends Pettanr.View.Show initialize: (options) -> - @item = options.item @list = options.list - icon_url = Pettanr.url(@item.table_name(), 'show', {id: @item.get('id')}) - caption_url = Pettanr.url(@item.table_name(), 'play', {id: @item.get('id')}) - prof_url = Pettanr.url(@item.table_name(), 'show', {id: @item.get('id'), format: 'prof'}) - @header = new Pettanr.Views.Scroll.PlayModule.Header({ - item: @item, - caption: @item.get('title'), - icon_url: icon_url, - caption_url: caption_url, - prof_url: prof_url - }) - @author = new Pettanr.Views.Show.HeaderAuthor({item: @item}) + @pager = options.pager + @header = new Pettanr.View.Show.Header(@item, this, @binder_header_options()) + @authored_by = @item.authored_by() @body = new Pettanr.Views.Scroll.PlayModule.Body({ parent: this, binder: @item, list: @list, + pager: @pager }) # @owner = new Pettanr.Views.Scroll.PlayModule.Owner({item: @item}) @listenTo(@header, 'click:pick', @click_pick) - @listenTo(@header, 'click:icon', @click_show) - @listenTo(@header, 'click:caption', @click_play) - @listenTo(@header, 'click:prof', @click_prof) - @listenTo(@author, 'click:author', @click_author) + @listenTo(@authored_by, 'click', @click_authored_by) @listenTo(@body, 'http_get', @http_get) @listenTo(@body, 'click:insert', @click_insert) @listenTo(@body, 'click:move', @click_move) @@ -528,23 +614,11 @@ class Pettanr.Views.Scroll.Play extends Backbone.View render: () -> this.$el.html('') this.$el.append(@header.render().el) - this.$el.append(@author.render().el) + this.$el.append(@authored_by.render().el) this.$el.append(@body.render().el) # this.$el.append(@owner.render().el) if @item.is_own() this - click_show: () -> - @trigger('http_get', @item.show_url()) - - click_play: () -> - @trigger('http_get', @item.play_url()) - - click_prof: () -> - @trigger('http_get', @item.prof_url()) - - click_author: () -> - @trigger('http_get', @author.author.show_url()) - click_pick: () -> @trigger('pick', @item)