coffeescript-ui
Version:
Coffeescript User Interface System
243 lines (194 loc) • 4.8 kB
text/coffeescript
class CUI.DataForm extends CUI.DataTable
render: ->
CUI.DataFieldInput::render.call(@)
CUI.Events.listen
type: "data-changed"
node:
call: =>
if
new CUI.Sortable
element:
selector: ".cui-drag-handle-row"
create: (ev, target) ->
data = CUI.dom.data(target, "data")
if not data
return false
if data._new
ev.stopPropagation()
return false
return true
allowSort: (ev, from_idx, to_idx) =>
!![to_idx]
sorted: (ev, from_idx, to_idx) =>
console.debug from_idx, ">", to_idx
CUI.util.moveInArray(from_idx, to_idx, , from_idx < to_idx)
@
initOpts: ->
super()
level:
default: 0
mandatory: true
check: (v) ->
CUI.util.isPosInt(v)
init: ->
super()
if .length > 1
else
if
readOpts: ->
super()
= []
getFieldOpts: ->
field_opts = super()
for fopts in field_opts
if fopts.type == CUI.DataForm
fopts.level = +1
if field_opts.length == 1
delete(fopts.form.label)
field_opts
getForm: (data) ->
fields = []
for fopts in
if fopts.type == CUI.DataForm
fopts.level = +1
fields.push(fopts)
new_form = new CUI.SimpleForm
fields: fields
data: data
onDataChanged: (data, element, ev) =>
if data._new
# we need to create a new row
delete(data._new)
.push(data)
ev.stopPropagation()
# CUI.dom.setAttribute(new_form.DOM, "cui-form-depth", + 1)
new_form
__updateView: ->
__removeEmptyRows: ->
# makes sure that one empty row is at the end and not more
while .length > 0
row = [.length-1]
if row._empty
# remove row
else
break
@
__storeValue: ->
__updateEmptyInRows: ->
for row in
if
delete(row._empty)
else
row._empty = true
return
hasUserData: (data) ->
if not super(data)
return false
rows = data[]
if rows.length == 0
return false
for row in rows
if
return true
return false
rowHasUserData: (row) ->
for f in
if f.hasUserData(row)
return true
return false
renderAsBlock: ->
.length > 1
displayValue: ->
=
# console.warn "display", , rows.length
for row in
# console.warn "initData", ,
return
__appendNewRow: ->
if not in ["edit", "append"]
return
__updateButtons: ->
for row in
info =
info.trash?.show()
if .length >= 2
CUI.dom.removeClass(info.move, 'is-hidden')
else
CUI.dom.addClass(info.move, 'is-hidden')
return
__findRowInfo: (row) ->
idx = CUI.util.idxInArray(null, , (v) ->
v.data == row
)
CUI.util.assert(idx > -1, "DataForm.__removeRow", "row not found", row: row, registry: )
info = [idx]
info.idx = idx
info
__removeRow: (row) ->
info =
CUI.dom.remove(info.dom)
.splice(info.idx, 1)
CUI.util.removeFromArray(row, )
@
__appendRow: (data) ->
if
move = CUI.dom.element("DIV", class: "cui-drag-handle-row")
if != "none"
trash = new CUI.defaults.class.Button
icon: "fa-trash-o"
appearance: "flat"
onMouseenter: =>
CUI.dom.addClass(hl, "cui-data-form-row--trash")
onMouseleave: =>
CUI.dom.removeClass(hl, "cui-data-form-row--trash")
onClick: =>
CUI.decide(?.call(@, data))
.done =>
?.call(@, data)
return
hl = new CUI.HorizontalLayout
maximize_vertical: false
class: "cui-data-form-row"
maximize_horizontal:
left:
content: move
right:
content: trash
center:
content: .start()
CUI.dom.data(hl.DOM, "data", data)
if data._new
CUI.dom.addClass(move, 'is-hidden')
trash.hide()
.push
data: data
dom: hl.DOM
trash: trash
move: move