UNPKG

coffeescript-ui

Version:
219 lines (179 loc) 4.39 kB
### * 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.MultiInput extends CUI.DataFieldInput constructor: (opts) -> super(opts) @addClass("cui-multi-input") if @_textarea @addClass("cui-multi-input--textarea") initOpts: -> super() @addOpts textarea: default: false check: Boolean spellcheck: default: false check: Boolean placeholder: check: "PlainObject" onFocus: check: Function onClick: check: Function onKeyup: check: Function onBlur: check: Function control: mandatory: true check: (v) -> v instanceof CUI.MultiInputControl content_size: default: false check: Boolean readOpts: -> super() @__inputs = null disable: -> super() if not @__inputs return for inp in @__inputs inp.disable() return enable: -> super() if not @__inputs return for inp in @__inputs inp.enable() return remove: -> if @__inputs for input in @__inputs input.destroy() delete @__inputs return super() initValue: -> if CUI.util.isNull(v = @__data[@_name]) v = @__data[@_name] = {} for key in @_control.getKeys() if not v.hasOwnProperty(key.name) v[key.name] = "" @ setData: (data) -> super(data) @setDataOnInputs() setDataOnInputs: -> if not @__inputs return input_data = CUI.util.copyObject(@getValue(), true) for input in @__inputs input.setData(input_data) if @_undo_support v = @getInitValue()[input.getName()] else v = @getValue()[input.getName()] input.setCheckChangedValue(v) setInputVisibility: -> # the "append" re-orders the input, if needed names = (key.name for key in @_control.getKeys()) # sort input by key @__inputs.sort (a, b) => CUI.util.compareIndex( names.indexOf(a.getOpt("name")) names.indexOf(b.getOpt("name")) ) ok = false for inp in @__inputs CUI.dom.append(@__multiInputDiv, inp.DOM) if @_control.isEnabled(inp.getName()) inp.show() ok = true else inp.hide() if not ok console.warn("MulitInput.setInputVisibility: No input visible.", input: @__inputs, control: @_control) CUI.Events.trigger type: "content-resize" node: @DOM return getUniqueIdForLabel: -> @__initInputs() for inp in @__inputs if @_control.isEnabled(inp.getName()) return inp.getUniqueIdForLabel() null focus: -> for inp in @__inputs if @_control.isEnabled(inp.getName()) inp.focus() return return displayValue: -> super() for input in @__inputs input.displayValue() @ __initInputs: -> if @__inputs return @__multiInputDiv = CUI.dom.div("cui-multi-input-container") CUI.Events.listen type: "multi-input-control-update" node: @__multiInputDiv call: (ev) => # console.debug ev.getType(), @__multiInputDiv[0], @_control.getKeys() @setInputVisibility() # DOM.registerEvent(multiInputDiv, "easydbui-multi-input-control-update") # multiInputDiv.on "easydbui-multi-input-control-update", (ev) @__inputs = [] for key, idx in @_control.getKeys() input_opts = class: "cui-multi-input-input" textarea: @_textarea spellcheck: @_spellcheck onBlur: @_onBlur onClick: @_onClick onFocus: @_onFocus onKeyup: @_onKeyup name: key.name undo_support: false content_size: @_content_size placeholder: @_placeholder?[key.name] input = new CUI.MultiInputInput(input_opts) input.render() do (input, key) => btn = new CUI.defaults.class.Button text: key.tag tabindex: null disabled: !@_control.hasUserControl() onClick: (ev, btn) => @_control.showUserControl(ev, btn, @__multiInputDiv) role: "multi-input-tag" class: "cui-multi-input-tag-button" tooltip: key.tooltip input.append(btn, "right") CUI.Events.listen type: "data-changed" node: input call: (ev) => values = CUI.util.copyObject(@getValue()) values[key.name] = input.getValue() ev.stopImmediatePropagation() @storeValue(values) @__inputs.push(input) return render: -> super() @__initInputs() if @hasData() @setDataOnInputs() @replace(@__multiInputDiv) @setInputVisibility() @