coffeescript-ui
Version:
Coffeescript User Interface System
198 lines (158 loc) • 4.36 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
###
class CUI.Tooltip extends CUI.LayerPane
constructor: (opts) ->
super(opts)
CUI.util.assert(CUI.util.xor(, ), "new #{@__cls}", "One of opts.text or opts.content must be set.", opts: )
= =>
if
if == true or (@)
CUI.dom.addClass(, "cui-dom-element-has-tooltip-on-hover")
()
return
if
CUI.dom.addClass(, "cui-dom-element-has-tooltip-on-click")
CUI.Events.listen
type: "click"
instance:
node:
call: (ev) =>
if ev.hasModifierKey()
return
()
return
initOpts: ->
super()
element:
mandatory: true
text:
check: (v) ->
CUI.util.isString(v) or CUI.util.isFunction(v)
markdown:
mandatory: true
default: false
check: Boolean
content:
check: (v) ->
CUI.util.isString(v) or CUI.util.isFunction(v) or CUI.util.isElement(v) or CUI.util.isArray(v) or CUI.util.isElement(v?.DOM)
# hide/show on click on element
on_click:
mandatory: true
default: false
check: Boolean
# hide/show on click on hover
on_hover:
check: (v) ->
CUI.util.isBoolean(v) or CUI.util.isFunction(v)
return
readOpts: ->
if not .hasOwnProperty("on_hover")
.on_hover = not .on_click
# if CUI.util.isUndef(.anchor)
# .anchor = .element
if .on_click
if not .backdrop
.backdrop = {}
if not .backdrop.policy
.backdrop.policy = "click"
if CUI.util.isUndef(.backdrop)
.backdrop = false
# .role = "tooltip"
.pointer = "arrow"
.check_for_element = true
.placement = .placement or "n"
super()
CUI.util.assert(not ( and ), "new CUI.Tooltip", "opts.on_click and opts.on_hover cannot be used together.", opts: )
@
: null # global to store currently shown tooltip
setElement: ->
# we don't set the element
focusOnHide: (ev) ->
focusOnShow: (ev) ->
showTimeout: ->
?.destroy()
= new CUI.Events.MouseIsStill
ms:
node:
call: (ev) =>
(ev)
CUI.Events.listen
type: ["click", "dblclick", "mouseout"]
capture: true
node:
only_once: true
call: (ev) =>
CUI.setTimeout
ms:
call: =>
(ev)
return
show: (ev) ->
if
super(ev)
else
()
.done =>
super(ev)
@
getElementOpenClass: ->
null
fillContent: ->
dfr = new CUI.Deferred()
dfr.fail =>
if not .isDestroyed()
.empty("center")
fill_text = (text) =>
if CUI.util.isEmpty(text)
return dfr.reject()
fill_content(new CUI.Label(markdown: , text: text, multiline: true))
fill_content = (content) =>
if not content or .isDestroyed()
return dfr.reject()
.replace(content, "center")
dfr.resolve()
if CUI.util.isFunction()
ret = .call(@, @)
if CUI.util.isPromise(ret)
ret.done (text) ->
fill_text(text)
ret.fail ->
dfr.reject()
else
fill_text(ret)
else if CUI.util.isFunction()
ret = .call(@, @)
if CUI.util.isPromise(ret)
ret.done (text) ->
fill_content(text)
ret.fail (xhr) ->
dfr.reject(xhr)
else
fill_content(ret)
else if not CUI.util.isEmpty()
fill_text()
else
fill_content()
if not CUI.util.isFunction() and not CUI.util.isFunction()
# avoid this next time
= true
else
= false
dfr.promise()
preventOverflow: ->
super()
CUI.dom.width(, ._css_width)
resetLayer: ->
super()
CUI.dom.setStyleOne(, "max-width", .width/2)
destroy: ->
?.destroy()
CUI.Events.ignore(instance: )
super()
CUI.dom.removeClass(, "cui-dom-element-has-tooltip-on-hover cui-dom-element-has-tooltip-on-click")