UNPKG

kdf

Version:

KD: a non-document focused UI Framework for web applications.

147 lines (116 loc) 4.37 kB
{JsPath} = require './../../../libs/jspath.js' KDView = require './../../core/view.coffee' module.exports = class KDFormView extends KDView @findChildInputs = (parent)-> inputs = [] subViews = parent.getSubViews() if subViews.length > 0 subViews.forEach (subView)-> inputs.push subView if subView instanceof KDInputView inputs = inputs.concat KDFormView.findChildInputs subView return inputs @sanitizeFormOptions = (options) -> for key, option of options option.title ?= key option.key = key option ### INSTANCE LEVEL ### constructor:(options = {}, data)-> options.tagName = "form" options.cssClass = KD.utils.curry "kdformview", options.cssClass options.callback or= noop # a Function options.customData or= {} # an Object of key/value pairs options.bind or= "submit" # a String of space separated event names super options,data @unsetClass "kdview" @valid = null @setCallback options.callback @customData = {} childAppended:(child)-> child.associateForm? @ @emit 'inputWasAdded', child if child instanceof KDInputView super getCustomData:(path)-> if path JsPath.getAt @customData, path else @customData addCustomData:(path, value)-> if 'string' is typeof path JsPath.setAt @customData, path, value else for own key, value of path JsPath.setAt @customData, key, value removeCustomData:(path)-> path = path.split '.' if 'string' is typeof path [pathUntil..., last] = path isArrayElement = not isNaN +last if isArrayElement JsPath.spliceAt @customData, pathUntil, last else JsPath.deleteAt @customData, path serializeFormData:(data={})-> for inputData in @getDomElement().serializeArray() data[inputData.name] = inputData.value data # this should be removed, this overrides KDObject::getData() and serialize is not enough for data collection - SY getData: -> formData = $.extend {},@getCustomData() @serializeFormData formData formData getFormData: -> inputs = KDFormView.findChildInputs @ formData = @getCustomData() or {} inputs.forEach (input)-> formData[input.getName()] = input.getValue() if input.getName() formData focusFirstElement:-> KDFormView.findChildInputs(@)[0].$().trigger "focus" setCallback:(callback)-> @formCallback = callback getCallback:-> @formCallback reset:-> @getElement().reset() submit:(event)-> KD.utils.stopDOMEvent event form = this inputs = KDFormView.findChildInputs form validationCount = 0 toBeValidatedInputs = [] validInputs = [] formData = @getCustomData() or {} @once "FormValidationFinished", (isValid = yes)-> form.valid = isValid if isValid form.getCallback()?.call form, formData, event form.emit "FormValidationPassed" else form.emit "FormValidationFailed" # put to be validated inputs in a queue inputs.forEach (input)-> inputOptions = input.getOptions() if inputOptions.validate or inputOptions.required toBeValidatedInputs.push input else # put regular input values to formdata name = input.getName() value = input.getValue() formData[name] = value if name toBeValidatedInputs.forEach (inputToBeValidated)-> # wait for the validation result of each input do -> inputToBeValidated.once "ValidationResult", (result)-> validationCount++ validInputs.push inputToBeValidated if result # check if all inputs were validated if toBeValidatedInputs.length is validationCount # check if all inputs were valid if validInputs.length is toBeValidatedInputs.length # put valid inputs to formdata formData[input.getName()] = input.getValue() for input in validInputs else valid = no # tell validation was finished form.emit "FormValidationFinished", valid inputToBeValidated.validate null, event # if no validation is required mimic as all were validated form.emit "FormValidationFinished" if toBeValidatedInputs.length is 0