UNPKG

coffeescript-ui

Version:
274 lines (218 loc) 6.89 kB
### * coffeescript-ui - Coffeescript User Interface System (CUI) * Copyright (c) 2013 - 2016 Programmfabrik GmbH * MIT Licence * https://github.com/programmfabrik/coffeescript-ui, http://www.coffeescript-ui.org ### CUI.Template.loadTemplateText(require('./Tabs.html')); class CUI.Tabs extends CUI.SimplePane @defaults: overflow_button_tooltip: null initOpts: -> super() # @removeOpt("header_right") @removeOpt("header_center") @removeOpt("content") @removeOpt("force_footer") @removeOpt("force_header") @addOpts tabs: mandatory: true check: (v) -> CUI.util.isArray(v) and v.length > 0 #autoSizeY: # default: false # check: Boolean active_idx: check: 'Integer' appearance: check: ['normal', 'mini'] orientation: check: ['vertical', 'horizontal'] mandatory: true default: 'horizontal' #header_right: {} #footer_right: {} #footer_left: {} forceHeader: -> true forceFooter: -> true __checkOverflowButton: -> if not @__maximize_horizontal return header_dim = CUI.dom.getDimensions(@__header) # console.debug "header_dim", header_dim.scrollWidth, header_dim.clientWidth if header_dim.scrollWidth > header_dim.clientWidth @__overflowBtn.show() CUI.dom.addClass(@__pane_header.DOM, "cui-tabs-pane-header--overflow") @__dragscroll = new CUI.Dragscroll element: @__buttonbar.DOM scroll_element: @__header else @__dragscroll?.destroy() @__dragscroll = null @__overflowBtn.hide() CUI.dom.removeClass(@__pane_header.DOM, "cui-tabs-pane-header--overflow") @ __setActiveMarker: -> btn = @getActiveTab()?.getButton().DOM if not btn CUI.dom.hideElement(@__tabs_marker) return CUI.dom.showElement(@__tabs_marker) btn_dim = CUI.dom.getDimensions(btn) CUI.dom.setStyle @__tabs_marker, left: btn_dim.offsetLeft width: btn_dim.borderBoxWidth @ init: -> super() # slider to mark active tab @__tabs_marker = CUI.dom.element("DIV", class: "cui-tabs-active-marker") @__tabs_bodies = new CUI.Template name: "tabs-bodies" CUI.dom.addClass(@__pane_header.DOM, "cui-tabs-pane-header") if @_appearance == 'mini' CUI.dom.addClass(@__pane_header.DOM, "cui-tabs-pane-header--mini") @removeClass('cui-pane--padded') if @_padded @addClass('cui-tabs--padded') @addClass('cui-tabs--'+@_orientation) @__buttonbar = new CUI.Buttonbar() pane_key = "center" @__pane_header.append(@__buttonbar, pane_key) @__pane_header.append(@__tabs_marker, pane_key) @__header = @__pane_header[pane_key]() CUI.Events.listen type: "scroll" node: @__header call: (ev) => dim = CUI.dom.getDimensions(@__header) CUI.dom.setClass(@__pane_header.DOM, "cui-tabs-pane-header--scroll-at-end", dim.horizontalScrollbarAtEnd) CUI.dom.setClass(@__pane_header.DOM, "cui-tabs-pane-header--scroll-at-start", dim.horizontalScrollbarAtStart) @__overflowBtn = new CUI.Button icon: "ellipsis_h" class: "cui-tab-header-button-overflow" icon_right: false size: if @_appearance == "mini" then "mini" else undefined tooltip: text: CUI.Tabs.defaults.overflow_button_tooltip menu: items: => btns = [] for tab in @__tabs do (tab) => btns.push text: tab.getText() active: tab == @getActiveTab() onClick: => tab.activate() btns @__overflowBtn.hide() @__pane_header.prepend(@__overflowBtn, "right") @getLayout().append(@__tabs_bodies, "center") if @_appearance == "mini" @addClass("cui-tabs--mini") @__tabs = [] for tab, idx in @_tabs if not tab continue if tab instanceof CUI.Tab _tab = @addTab(tab) else if CUI.util.isPlainObject(tab) _tab = @addTab(new CUI.Tab(tab)) else CUI.util.assert(false, "new #{@__cls}", "opts.tabs[#{idx}] must be PlainObject or Tab but is #{CUI.util.getObjectClass(tab)}", opts: @opts) if @_appearance == "mini" _tab.getButton().setSize("mini") @__tabs[@_active_idx or 0].activate() CUI.dom.waitForDOMInsert(node: @getLayout()) .done => if @isDestroyed() return CUI.Events.listen node: @getLayout() type: "viewport-resize" call: => @__checkOverflowButton() @__setActiveMarker() CUI.util.assert( CUI.dom.isInDOM(@getLayout().DOM),"Tabs getting DOM insert event without being in DOM." ) @__checkOverflowButton() @__setActiveMarker() @addClass("cui-tabs") @__max_width = -1 @__max_height = -1 @ setFooterRight: (content) -> # @tabs.map.footer.css("display","") @replace(content, "footer_right") setFooterLeft: (content) -> # @tabs.map.footer.css("display","") @replace(content, "footer_left") addTab: (tab) -> CUI.util.assert(tab instanceof CUI.Tab, "#{@__cls}.addTab", "Tab must be instance of Tab but is #{CUI.util.getObjectClass(tab)}", tab: tab) if not @hasTab(tab) @__tabs.push(tab) CUI.Events.listen node: tab type: "tab_activate" call: => if @__overflowBtn.isShown() CUI.dom.scrollIntoView(tab.getButton().DOM) if CUI.__ng__ if not @_maximize_vertical # set left margin on first tab # console.debug "style", @__tabs[0].DOM[0], -100*CUI.util.idxInArray(tab, @__tabs)+"%" CUI.dom.setStyle(@__tabs[0].DOM, marginLeft: -100*CUI.util.idxInArray(tab, @__tabs)+"%") @__active_tab = tab @__setActiveMarker() CUI.dom.setAttribute(@DOM, "active-tab-idx", CUI.util.idxInArray(tab, @__tabs)) # console.error @__uniqueId, "activate" CUI.Events.listen node: tab type: "tab_deactivate" call: => # console.error @__uniqueId, "deactivate" @__active_tab = null CUI.dom.setAttribute(@DOM, "active-tab-idx", "") CUI.Events.listen node: tab type: "tab_destroy" call: => idx = @__tabs.indexOf(tab) CUI.util.removeFromArray(tab, @__tabs) idx-- @__tabs[idx]?.activate() tab_padded = tab.getSetOpt("padded") if (tab_padded != false and @_padded) or (tab_padded == true) tab.addClass("cui-tab--padded") tab.hide() tab.initButton(@) @__buttonbar.addButton(tab.getButton()) @__tabs_bodies.append(tab) tab # true or false if a tab exists hasTab: (tab_or_idx_or_name) -> @getTab(tab_or_idx_or_name) getTab: (tab_or_idx_or_name) -> found_tab = null # console.debug tab_or_idx_or_name, @, @__tabs.length if CUI.util.isString(tab_or_idx_or_name) for tab in @__tabs # console.debug tab._name, tab_or_idx_or_name if tab._name == tab_or_idx_or_name found_tab = tab break else if tab_or_idx_or_name instanceof CUI.Tab if @__tabs.indexOf(tab_or_idx_or_name) > -1 found_tab = tab_or_idx_or_name else found_tab = @__tabs[tab_or_idx_or_name] return found_tab getActiveTab: -> @__active_tab activate: (tab_or_idx_or_name) -> tab = @getTab(tab_or_idx_or_name) tab.activate() @