addError = ($field, msg) -> errors = getErrors $field errors.push "[#{$field.closest('.form-field').find('label').text()}]: #{window.hourglass.errorMessages[msg] || msg}" $field.data 'errors', errors getErrors = ($field) -> $field.data('errors') || [] clearErrors = ($field) -> $field.data 'errors', null isEmpty = ($field) -> $field.val() is '' validatePresence = ($field) -> addError $field, 'empty' if isEmpty $field validateByType = (type, $field, $form) -> switch type when 'activity_id' validatePresence $field unless isEmpty $form.find('[name*=project_id]') when 'issue_id' validatePresence $field unless isEmpty $form.find('#issue_text') when 'start' mStart = moment $field.val(), moment.ISO_8601 addError $field, 'invalid' unless mStart.isValid() addError $field, 'exceedsLimit' if $field.hasClass('js-validate-limit') and mStart.isBefore $field.data('mLimit') $stopField = $form.find('[name*=stop]') break if $stopField.length is 0 mStop = moment $stopField.val(), moment.ISO_8601 if $field.hasClass('js-allow-zero-duration') addError $field, 'invalidDuration' if mStart.isAfter mStop else addError $field, 'invalidDuration' if mStart.isSameOrAfter mStop when 'stop' mStop = moment $field.val(), moment.ISO_8601 addError $field, 'invalid' unless mStop.isValid() addError $field, 'exceedsLimit' if $field.hasClass('js-validate-limit') and mStop.isAfter $field.data('mLimit') $startField = $form.find('[name*=start]') break if $startField.length is 0 mStart = moment $startField.val(), moment.ISO_8601 if $field.hasClass('js-allow-zero-duration') addError $field, 'invalidDuration' if mStart.isAfter mStop else addError $field, 'invalidDuration' if mStart.isSameOrAfter mStop validateField = ($field, $form) -> clearErrors $field validatePresence $field if $field.prop('required') name = $field.attr('name') validateByType name.replace(/[a-z_]*\[([a-z_]*)]/, '$1'), $field, $form if name? hasErrors = getErrors($field).length > 0 $field.toggleClass('invalid', hasErrors) $field.prev().toggleClass('invalid', hasErrors) if $field.attr('type') is 'hidden' all_form_fields = ($form, filter = null) -> $fields = $form.find('input, select, textarea') if filter? then $fields.filter filter else $fields processValidation = ($form) -> hourglass.Utils.clearFlash() $invalidFields = all_form_fields $form, '.invalid' hourglass.Utils.showErrorMessage $invalidFields.map( -> getErrors $(@)).get() if $invalidFields.length > 0 $form.find(':submit').attr('disabled', $invalidFields.length > 0) validateSingleField = ($field, $form = $field.closest('form')) -> validateField $field, $form processValidation $form validateForm = ($form) -> all_form_fields($form, '[name]').each -> validateField $(@), $form processValidation $form @hourglass ?= {} @hourglass.FormValidator = validateField: validateSingleField isFieldValid: ($field, args...) -> validateSingleField $field, args... getErrors($field).length is 0 validateForm: validateForm