class Pettanr.Views.Scroll.PlayModule class Pettanr.Views.Scroll.PlayModule.FooterSwitch extends Pettanr.View tagName: 'div' className: 'player-item-switch' events: { 'click': 'click' } initialize: (options) -> @scroll_panel = options.scroll_panel @panel = options.panel @visible = false @enabled = true @listenTo(@scroll_panel, 'sync', @render) render: () -> this.$el.html('') attr = { style: Pettanr.to_style({height: Pettanr.to_s(@height()) + 'px'}) } this.$el.attr(attr) face = if @visible '<' else '>' caption = new Tag.Span({content: face}) this.$el.append(@scroll_panel.get('t') + 1) this.$el.append(caption.render().el) if @enabled this height: () -> if @panel @panel.get('height') else 20 click: () -> return false if !@enabled @visible = !@visible @render() @trigger('click', @visible) enable: () -> @enabled = true @render() disable: () -> @enabled = false @visible = false @render() class Pettanr.Views.Scroll.PlayModule.Footer extends Pettanr.View tagName: 'div' className: 'player-item-footer' initialize: (options) -> @parent = options.parent @scroll = options.scroll @scroll_panel = options.scroll_panel @panel = options.panel render: () -> this.$el.html('') @hide() if @panel @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') }) 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')) ) @append_scroll_panel() }) else @append_scroll_panel() this append_scroll_panel: () -> l2 = new Tag.H3({ content: Pettanr.AppHelper.t_m('ScrollPanel') }) 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() if @is_movable() this.$el.append(@move_button.render().el) @append_rb() this.$el.append(@destroy_button.render().el) hide: () -> attr = { style: Pettanr.to_style({display: 'none'}) } this.$el.attr(attr) show: () -> attr = { style: Pettanr.to_style({display: 'inline'}) } this.$el.attr(attr) is_movable: () -> @parent.parent.views.length > 1 class Pettanr.Views.Scroll.PlayModule.PanelBody extends Pettanr.View tagName: 'div' className: 'player-item-panel' initialize: (options) -> @panel = options.panel render: () -> this.$el.html('') body = new Pettanr.Views.Panel.Body({ panel: @panel, spot: null }) @listenTo(body, 'http_get', @http_get) this.$el.append(body.render().el) this http_get: (url) -> @trigger('http_get', url) class Pettanr.Views.Scroll.PlayModule.Panel extends Pettanr.View tagName: 'li' className: 'player-item' initialize: (options) -> @parent = options.parent @scroll = options.scroll @scroll_panel = options.scroll_panel @panel = options.panel clear: () -> this.$el.html('') @scroll_panel.get_parent('panel', this, { success: (@panel) => @trigger('exist', this) @render() fail: (response, opt) => @panel = null @append_insert_point() this.$el.append('Not found') @append_footer_switch() @append_footer() @trigger('lost', response, opt) }) this render: () -> this.$el.html('') @panel = @panel.play() # retake panel for 'with_elements' mode @panel.fetch({ success: (model, response, opt) => @panel.attributes = @panel.decoded_attributes() @append_insert_point() body = new Pettanr.Views.Scroll.PlayModule.PanelBody({ panel: @panel }) @listenTo(body, 'http_get', @http_get) this.$el.append(body.render().el) @append_footer_switch() @append_footer() @trigger('ready', @panel) error: (item, response, opt) => @open_error_dialog(response, opt) }) this append_insert_point: () -> 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 }) @listenTo(move_to, 'click', @click_move_to) this.$el.append(@insert_point.clear().el) @append_rb() append_footer_switch: () -> @footer_switch = new Pettanr.Views.Scroll.PlayModule.FooterSwitch({ parent: this, scroll_panel: @scroll_panel, panel: @panel }) @listenTo(@footer_switch, 'click', @click_footer_switch) this.$el.append(@footer_switch.render().el) append_footer: () -> @footer = new Pettanr.Views.Scroll.PlayModule.Footer({ parent: this, scroll: @scroll, scroll_panel: @scroll_panel, panel: @panel, }) @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(@footer.render().el) hide: () -> @set_style({display: 'none'}) show: () -> @set_style({display: 'inline'}) set_style: (style) -> attr = {style: Pettanr.to_style(style)} this.$el.attr(attr) enable_footer_switch: () -> @footer_switch.enable() disable_footer_switch: () -> @footer_switch.disable() @footer.hide() show_insert_point: () -> @insert_point.show() hide_insert_point: () -> @insert_point.hide() click_footer_switch: (visible) -> if visible @footer.show() else @footer.hide() click_show: () -> @trigger('http_get', @panel.show_url()) click_author: (author) -> @trigger('http_get', author.show_url()) click_insert: () -> @trigger('click:insert', this) click_move: () -> @trigger('click:move', this) click_destroy: () -> @trigger('click:destroy', this) click_move_to: () -> @trigger('click:move_to', this) http_get: (url) -> @trigger('http_get', url) class Pettanr.Views.Scroll.PlayModule.InsertPoint extends Tag.Div clear: () -> this.$el.html('') @hide() @render() this hide: () -> @set_style({display: 'none'}) show: () -> @set_style({display: 'inline'}) set_style: (style) -> attr = {style: Pettanr.to_style(style)} this.$el.attr(attr) class Pettanr.Views.Scroll.PlayModule.EmptyNotice extends Tag.H2 clear: () -> this.$el.html('') @hide() @render() this hide: () -> @set_style({display: 'none'}) show: () -> @set_style({display: 'inline'}) set_style: (style) -> attr = {style: Pettanr.to_style(style)} this.$el.attr(attr) class Pettanr.Views.Scroll.PlayModule.Panels extends Pettanr.View tagName: 'ul' className: 'player' initialize: (options) -> @parent = options.parent @binder = options.binder @items = options.items @credits = options.credits @views = [] 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) => @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) @views.push(panel_view) this.$el.append(panel_view.clear().el) @refresh_empty_notice() create_panel_view: (scroll_panel) -> panel_view = new Pettanr.Views.Scroll.PlayModule.Panel({ parent: this, scroll: @binder, scroll_panel: scroll_panel, }) @listenTo(panel_view, 'exist', @exist) @listenTo(panel_view, 'lost', @lost) @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) @listenTo(panel_view, 'click:move_to', @click_move_to) panel_view exist: (panel_view) -> lost: (response, opt) -> ready: (panel) -> this.credits.push(panel.licensed_pictures()) 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 }) @listenTo(@dialog, 'pick', @pick) @listenTo(@dialog, 'open', @open_dialog) @listenTo(@dialog, 'close', @close_dialog) this.$el.append(@dialog.render().el) @dialog.start() @trigger('click:insert', @dialog) pick: (new_item, insert_point) -> @parent.appender.show() panel_view = @create_panel_view(new_item) ul = this.$el[0] 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: () -> @trigger('dialog:close', @dialog) if @dialog.is_catch() # stored panel back to player @back() click_move: (panel_view) -> @dialog = new Editor.Player.PanelMoveDialog({ parent: this, binder: @binder, target_model: Pettanr.ScrollPanel, from: panel_view }) @listenTo(@dialog, 'open', @open_dialog) @listenTo(@dialog, 'close', @close_dialog) this.$el.append(@dialog.render().el) @disable_footer_switch() @dialog.start(panel_view.panel) panel_view.hide() @show_insert_point() @trigger('click:move', @dialog) enable_footer_switch: () -> _.each @views, (panel_view) => panel_view.enable_footer_switch() disable_footer_switch: () -> _.each @views, (panel_view) => panel_view.disable_footer_switch() show_insert_point: () -> _.each @views, (panel_view) => panel_view.show_insert_point() hide_insert_point: () -> _.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] ul.insertBefore(from_panel_view.clear().el, li) 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}) remove_panel_view: (panel_view) -> @views = _.without(@views, panel_view) panel_view.remove() 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() render: () -> 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, '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) @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) 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) 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) -> @list = options.list @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(@authored_by, 'click', @click_authored_by) @listenTo(@body, 'http_get', @http_get) @listenTo(@body, 'click:insert', @click_insert) @listenTo(@body, 'click:move', @click_move) @listenTo(@body, 'dialog:close', @close_dialog) render: () -> this.$el.html('') this.$el.append(@header.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_pick: () -> @trigger('pick', @item) http_get: (url) -> @trigger('http_get', url) click_insert: (dialog) -> @trigger('insert', dialog) click_move: (dialog) -> @trigger('move', dialog) close_dialog: (dialog) -> @trigger('dialog:close', dialog)