summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/views/form_view.js.coffee
blob: 43183537527867ea0de6d19a257e4b639c4a0aeb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#= require ./auto_view

class csx.FormView extends csx.AutoView
  hideErrors: () ->
    @$(':input').removeClass('is-invalid')
    @$('.invalid-feedback').html('')

  showError: (field, message) ->
    @$(field).addClass('is-invalid').siblings('.invalid-feedback').html(message)

  renderErrors: (errors) ->
    @hideErrors()
    _.each _.keys(errors), (key) =>
      @showError(@field(key), errors[key])

  render: ->
    @renderErrors(@model.validationError)

  onInput: (event) ->
    $element = $(event.target)
    @model.set(@fieldNameFor($element), @valueFor($element))
    @$('input[type=submit]').prop('disabled', !@model.isValid())
    @render()

  onSubmit: (event) ->
    if !@model.isValid()
      @$('input[type=submit]').prop('disabled', true)
      event.preventDefault()
      event.stopPropagation()
    @render()

  valueFor: (element) ->
    if element.is(':checkbox')
      element.prop('checked')
    else
      element.val()

  fieldName: (name) ->
    return name if _.isEmpty(@modelKey)
    "#{@modelKey}_#{name}"

  field: (name) -> @$("##{@fieldName(name)}")
  fieldNameFor: (element) -> element.attr('id').replace("#{@modelKey}_", '')