coffeescript-ui
Version:
Coffeescript User Interface System
379 lines (313 loc) • 8.55 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.DataTable extends CUI.DataFieldInput
:
plus_button_tooltip: null
minus_button_tooltip: null
initOpts: ->
super()
# VALUE can have __class in each row, this sets a class on the tree node
fields:
mandatory: true
check: (v) ->
CUI.util.isArray(v) or CUI.util.isFunction(v)
new_rows:
default: "edit"
check: ["edit", "append", "remove_only", "none"]
no_header:
check: Boolean
# autoSizeGridX:
# default: false
# check: Boolean
rowMove:
default: false
check: Boolean
# used in DataTableNode
onBeforeRowRemove:
check: Function
# used in DataTableNode
onRowRemove:
check: Function
onRowSelect:
check: Function
onRowDeselect:
check: Function
onNodeAdd:
check: Function
footer_right:
check: (v) ->
CUI.util.isContent(v)
# own buttons
buttons:
mandatory: true
default: []
check: (v) ->
CUI.util.isArray(v)
chunk_size:
default: 0
mandatory: true
check: (v) ->
v >= 0
padded:
check: Boolean
default: false
readOpts: ->
super()
= null
= null
= 0
CUI.util.assert(not ( and ), "new CUI.DataTable", "opts.chunk_size and opts.rowMove are mutually exclusive.", opts: )
@
getFieldList: ->
getFieldsByName: (name, found_fields = []) ->
for field in
if field.getName() == name
found_fields.push(field)
field.getFieldsByName?(name, found_fields)
found_fields
debug: ->
super()
?.debug()
getFieldOpts: ->
field_opts = []
for _field in
field = CUI.util.copyObject(_field, true)
if not field.form
field.form = {}
if not CUI.util.isString(field.form.label)
field.form.label = field.name
field_opts.push(field)
field_opts
init: ->
= []
for field in
.push(CUI.DataField.new(field))
@
disable: ->
super()
?.setInactive(true, null)
@
enable: ->
super()
?.setInactive(false, null)
@
getDefaultValue: ->
[]
addRow: (data={}) ->
.push(data)
# console.debug "creating new data node"
new_node = new CUI.DataTableNode
dataTable: @
data: data
dataRowIdx: .length-1
rows:
?(node)
if > 0
= Math.floor((.length-1) / ) *
else
.appendRow(new_node)
# console.debug "data-changed on CUI.DataTable PLUS storing values:", CUI.util.dump()
new_node
updateButtons: ->
if .getSelectedRows().length == 0
.disable()
else
.enable()
getFooter: ->
buttons = .slice(0)
if != "none"
if != "remove_only"
buttons.push
icon: "plus"
tooltip: text: CUI.DataTable.defaults.plus_button_tooltip
group: "plus-minus"
onClick: =>
= new CUI.defaults.class.Button
icon: "minus"
group: "plus-minus"
tooltip: text: CUI.DataTable.defaults.minus_button_tooltip
disabled: true
onClick: =>
for row in .getSelectedRows()
row.remove()
if > 0
return
buttons.push()
if > 0
buttons.push
onConstruct: (btn) =>
= btn
icon: "left"
disabled: true
group: "navi"
onClick: =>
= -
page_data = {}
load_page = =>
= (page_data.page - 1) *
= new CUI.NumberInput
group: "navi"
placeholder: "henk"
data: page_data
name: 'page'
onBlur: (input) =>
input.setValue(null)
onDataChanged: =>
CUI.scheduleCallback
ms: 1000
call: load_page
return
.start()
buttons.push()
buttons.push
onConstruct: (btn) =>
= btn
icon: "right"
disabled: true
group: "navi"
onClick: =>
= +
if buttons.length
new CUI.Buttonbar(buttons: buttons)
else
return null
render: ->
super()
cols = []
colClasses = []
maxis = []
= new CUI.ListViewHeaderRow()
for f, idx in
if f.getOpt("form")?.column == "maximize" or
f instanceof CUI.DataTable
maxis.push(idx)
if maxis.length == 0
# push the last as max
maxis.push(.length-1)
for f, idx in
if CUI.util.idxInArray(idx, maxis) > -1
cols.push("maximize")
else if f.getOpt("form")?.column
cols.push(f._form.column)
else if f.isResizable()
cols.push("auto")
else
cols.push("fixed")
name = f.getName()
label = f._form.label
cls = []
if name
cls.push("cui-data-table-column-field-name-"+name)
cls.push("cui-data-table-column-field-type-"+CUI.util.toDash(f.getElementClass()))
if f._form?.rotate_90
cls.push("cui-lv-td-rotate-90")
colClasses.push(cls)
.addColumn new CUI.ListViewHeaderColumn
rotate_90: f._form?.rotate_90
label:
text: label
multiline: true
= new CUI.ListView
class: "cui-lv--has-datafields"
selectableRows: != "none"
padded:
onSelect: (ev, info) =>
?(ev, info)
onDeselect: =>
?()
onRowMove: (display_from_i, display_to_i, after) =>
fr = .fixedRowsCount
display_from_i = + display_from_i
display_to_i = + display_to_i
CUI.util.moveInArray(display_from_i-fr, display_to_i-fr, , after)
CUI.Events.trigger
type: "data-changed"
node:
cols: cols
fixedRows: if then 0 else 1
footer_left:
footer_right:
fixedCols: if then 1 else 0
colResize: if then false else true
colClasses: colClasses
rowMove:
# rowMovePlaceholder: not
maximize:
maximize_horizontal:
maximize_vertical:
if
.setInactive(true, null)
CUI.Events.listen
type: "data-changed"
node:
call: (ev, info) =>
# we need hide our internal events and
# present us as a whole
ev.stopPropagation()
# store value triggers a new data-changed
# console.debug "data-changed on CUI.DataTable storing values:", CUI.util.dump()
return
@
displayValue: ->
.removeAllRows()
if not
.appendRow()
= CUI.util.copyObject(, true)
if > 0
len = .length
if >= len
= Math.max( - )
page = Math.floor( / )
last_page = Math.ceil(len / )-1
sep = ' / '
placeholder = (page+1)+sep+(last_page+1)
.setMin(1)
.setMax(last_page+1)
.setValue(null)
.setPlaceholder(placeholder)
CUI.dom.setAttribute(.getElement(), "data-max-chars", (""+(last_page+1)).length*2+sep.length)
if page > 0
.enable()
else
.disable()
if page < last_page
.enable()
else
.disable()
CUI.util.assert(CUI.util.isArray(), "DataTable.displayValue", "\"value\" needs to be Array.", data: , value: )
if
if > 0
rows_sliced = .slice(, + )
else
rows_sliced =
for row, idx in rows_sliced
node = new CUI.DataTableNode
dataTable: @
data: row
class: row.__class
dataRowIdx: idx
rows:
check_changed_data: ?[idx]
?(node)
.appendRow(node, true)
.appendDeferredRows()
@