coffeescript-ui
Version:
Coffeescript User Interface System
274 lines (218 loc) • 6.89 kB
text/coffeescript
###
* 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
:
overflow_button_tooltip: null
initOpts: ->
super()
#
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
return
header_dim = CUI.dom.getDimensions()
# console.debug "header_dim", header_dim.scrollWidth, header_dim.clientWidth
if header_dim.scrollWidth > header_dim.clientWidth
.show()
CUI.dom.addClass(.DOM, "cui-tabs-pane-header--overflow")
= new CUI.Dragscroll
element: .DOM
scroll_element:
else
?.destroy()
= null
.hide()
CUI.dom.removeClass(.DOM, "cui-tabs-pane-header--overflow")
@
__setActiveMarker: ->
btn = ?.getButton().DOM
if not btn
CUI.dom.hideElement()
return
CUI.dom.showElement()
btn_dim = CUI.dom.getDimensions(btn)
CUI.dom.setStyle ,
left: btn_dim.offsetLeft
width: btn_dim.borderBoxWidth
@
init: ->
super()
# slider to mark active tab
= CUI.dom.element("DIV", class: "cui-tabs-active-marker")
= new CUI.Template
name: "tabs-bodies"
CUI.dom.addClass(.DOM, "cui-tabs-pane-header")
if == 'mini'
CUI.dom.addClass(.DOM, "cui-tabs-pane-header--mini")
if
= new CUI.Buttonbar()
pane_key = "center"
.append(, pane_key)
.append(, pane_key)
= [pane_key]()
CUI.Events.listen
type: "scroll"
node:
call: (ev) =>
dim = CUI.dom.getDimensions()
CUI.dom.setClass(.DOM, "cui-tabs-pane-header--scroll-at-end", dim.horizontalScrollbarAtEnd)
CUI.dom.setClass(.DOM, "cui-tabs-pane-header--scroll-at-start", dim.horizontalScrollbarAtStart)
= new CUI.Button
icon: "ellipsis_h"
class: "cui-tab-header-button-overflow"
icon_right: false
size: if == "mini" then "mini" else undefined
tooltip: text: CUI.Tabs.defaults.overflow_button_tooltip
menu:
items: =>
btns = []
for tab in
do (tab) =>
btns.push
text: tab.getText()
active: tab ==
onClick: =>
tab.activate()
btns
.hide()
.prepend(, "right")
.append(, "center")
if == "mini"
= []
for tab, idx in
if not tab
continue
if tab instanceof CUI.Tab
_tab =
else if CUI.util.isPlainObject(tab)
_tab =
else
CUI.util.assert(false, "new #{@__cls}", "opts.tabs[#{idx}] must be PlainObject or Tab but is #{CUI.util.getObjectClass(tab)}", opts: )
if == "mini"
_tab.getButton().setSize("mini")
[ or 0].activate()
CUI.dom.waitForDOMInsert(node: )
.done =>
if
return
CUI.Events.listen
node:
type: "viewport-resize"
call: =>
CUI.util.assert( CUI.dom.isInDOM(.DOM),"Tabs getting DOM insert event without being in DOM." )
= -1
= -1
@
setFooterRight: (content) ->
# .map.footer.css("display","")
setFooterLeft: (content) ->
# .map.footer.css("display","")
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
.push(tab)
CUI.Events.listen
node: tab
type: "tab_activate"
call: =>
if .isShown()
CUI.dom.scrollIntoView(tab.getButton().DOM)
if CUI.__ng__
if not
# set left margin on first tab
# console.debug "style", [0].DOM[0], -100*CUI.util.idxInArray(tab, )+"%"
CUI.dom.setStyle([0].DOM, marginLeft: -100*CUI.util.idxInArray(tab, )+"%")
= tab
CUI.dom.setAttribute(, "active-tab-idx", CUI.util.idxInArray(tab, ))
# console.error , "activate"
CUI.Events.listen
node: tab
type: "tab_deactivate"
call: =>
# console.error , "deactivate"
= null
CUI.dom.setAttribute(, "active-tab-idx", "")
CUI.Events.listen
node: tab
type: "tab_destroy"
call: =>
idx = .indexOf(tab)
CUI.util.removeFromArray(tab, )
idx--
[idx]?.activate()
tab_padded = tab.getSetOpt("padded")
if (tab_padded != false and ) or
(tab_padded == true)
tab.addClass("cui-tab--padded")
tab.hide()
tab.initButton(@)
.addButton(tab.getButton())
.append(tab)
tab
# true or false if a tab exists
hasTab: (tab_or_idx_or_name) ->
getTab: (tab_or_idx_or_name) ->
found_tab = null
# console.debug tab_or_idx_or_name, @, .length
if CUI.util.isString(tab_or_idx_or_name)
for tab in
# 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 .indexOf(tab_or_idx_or_name) > -1
found_tab = tab_or_idx_or_name
else
found_tab = [tab_or_idx_or_name]
return found_tab
getActiveTab: ->
activate: (tab_or_idx_or_name) ->
tab =
tab.activate()
@