coffeescript-ui
Version:
Coffeescript User Interface System
314 lines (249 loc) • 6.57 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.FormPopover extends CUI.Form
constructor: (opts) ->
super(opts)
# console.debug "FormPopover",
= null
= null
@
initOpts: ->
super()
popover:
default: {}
check: "PlainObject"
button:
default: {}
check: (v) ->
CUI.util.isPlainObject(v) and not v.onClick
trigger_data_changed_while_open:
default: false
check: Boolean
renderDisplayButton:
check: Function
renderDisplayContent:
check: Function
readOpts: ->
super()
if
=
delete()
= CUI.util.isFunction()
if
CUI.util.assert( != true, "new CUI.FormPopover", "opts.data_not_for_others cannot be set to true if fields are created on open by a Function.", opts: )
init: ->
if not
return super()
()
# don't initFields here, if fields are a function
# ()
setDataOnOthers: ->
if
false
else
super()
isChanged: ->
if
super()
else
false
getFields: (func="") ->
if func in ["render", "displayValue"]
return []
if func in [
"show"
"hide"
"remove"
"enable"
"disable"
"getFieldsByName"
"hasUserData"
"getFieldByIdx"
"setFormDepth"
"getDataFields"
]
return or []
CUI.util.assert(, "FormPopover.getFields("+func+")", "Fields not rendered yet. This is a programming error in CUI.")
return super()
# this is for the button container
initTemplate: ->
vl = new CUI.VerticalLayout
maximize: false
bottom: {}
(vl.getLayout())
hasContentForAppend: ->
# FormPopver always shows a button
true
render: ->
button_opts = CUI.util.copyObject(, true)
button_opts.onClick = =>
()
CUI.mergeMap button_opts,
left: true
text: ""
= new CUI.defaults.class.Button(button_opts)
("cui-data-field-input")
# this means the button's text is rendered by
# the "renderDisplay" function
if
("cui-form-popover-has-button-text")
(, "center")
# ((), "center")
CUI.DataField::render.call(@)
@
getButton: ->
displayValue: ->
CUI.DataField::displayValue.call(@)
()
callOnFields: (func, args...) ->
for df in ()
# console.debug df.getName(), func, args
df[func].apply(df, args)
@
__renderDisplay: ->
if
display = (@, )
else if
render = (@, )
else if not
text = "Data not set."
display = CUI.dom.textEmpty(text)
else
display = text = ""
# console.debug("display", display,.getGroupData())
if
if render == false
.deactivate()
else if render == true
.activate()
else if render instanceof CUI.Icon
.setIcon(render)
.setText()
else
.setIcon()
.setText(render)
if != null
# console.debug "FormPopover.__renderDisplay: triggering list-view-resize:", , render
CUI.Events.trigger
type: "content-resize"
node:
= render
else
if == null or != display
(display, "bottom")
if != null
CUI.Events.trigger
type: "content-resize"
node:
bubble: false
= display
()
@
# overwritten in FormModal
initPopover: (opts) ->
new CUI.Popover(opts)
getPopoverOpts: ->
pop_opts = CUI.util.copyObject(, true)
if not pop_opts.backdrop
pop_opts.backdrop = {}
if not pop_opts.backdrop.policy
pop_opts.backdrop.policy = "click"
if not pop_opts.pane
pop_opts.pane = {}
CUI.util.assert(CUI.util.isPlainObject(pop_opts.pane), "new CUI.FormPopover", "opts.pane must be PlainObject", opts: pop_opts)
CUI.util.mergeMap(pop_opts.pane, padded: true)
if CUI.util.isEmpty(pop_opts.class)
pop_opts.class = ""
pop_opts.class += " cui-form-popover-popover"
# console.debug "getPopoverOpts", pop_opts
pop_opts
getPopover: ->
renderAsBlock: ->
false
renderTable: ->
super()
().addClass()
return
removeFields: ->
("remove")
= null
= null
@
__openPopover: ->
# console.time "FormPopover"
pop_opts = ()
if
# dynamic fields, we need to reload the form
if
()
()
("setData", )
if not
()
= true
("start")
if not pop_opts.hasOwnProperty("element")
pop_opts.element =
onHide = pop_opts.onHide
pop_opts.onHide = (pop, ev) =>
()
onHide?(pop, ev)
onShow = pop_opts.onShow
if onShow
pop_opts.onShow = (pop) =>
onShow?(pop, @)
pop_opts.pane.content = ()
= (pop_opts)
CUI.Events.listen
type: "data-changed"
node:
call: (ev, info={}) =>
# console.debug("data changed on popover, render display", @, )
()
= info
if
()
return
# ()
.show()
("focus")
# console.timeEnd "FormPopover"
__closePopover: ->
("focus")
CUI.dom.remove(().DOM)
.destroy()
= null
()
@
# this calls the "onHide" function
closePopover: ->
?.hide()
hide: (trigger_event=false) ->
()
super(trigger_event)
__triggerDataChanged: ->
if
()
= null
triggerDataChanged: ->
CUI.Events.trigger
type: "data-changed"
node:
info:
disable: ->
super()
?.disable()
enable: ->
super()
?.enable()
destroy: ->
super()
?.destroy()
= null