formagic 0.3.4 → 0.3.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +2 -2
  3. data/app/assets/javascripts/formagic.coffee +2 -0
  4. data/app/assets/javascripts/formagic/form.coffee +9 -39
  5. data/app/assets/javascripts/formagic/group.coffee +1 -11
  6. data/app/assets/javascripts/formagic/inputs/array.coffee +8 -26
  7. data/app/assets/javascripts/formagic/inputs/checkbox.coffee +3 -20
  8. data/app/assets/javascripts/formagic/inputs/color.coffee +2 -16
  9. data/app/assets/javascripts/formagic/inputs/date.coffee +6 -24
  10. data/app/assets/javascripts/formagic/inputs/datetime.coffee +6 -27
  11. data/app/assets/javascripts/formagic/inputs/document.coffee +9 -25
  12. data/app/assets/javascripts/formagic/inputs/documents.coffee +11 -32
  13. data/app/assets/javascripts/formagic/inputs/documents_reorder.coffee +1 -12
  14. data/app/assets/javascripts/formagic/inputs/file.coffee +2 -22
  15. data/app/assets/javascripts/formagic/inputs/hash.coffee +1 -4
  16. data/app/assets/javascripts/formagic/inputs/hidden.coffee +2 -19
  17. data/app/assets/javascripts/formagic/inputs/html.coffee +2 -18
  18. data/app/assets/javascripts/formagic/inputs/image.coffee +3 -2
  19. data/app/assets/javascripts/formagic/inputs/list.coffee +2 -21
  20. data/app/assets/javascripts/formagic/inputs/list_reorder.coffee +1 -12
  21. data/app/assets/javascripts/formagic/inputs/list_typeahead.coffee +1 -13
  22. data/app/assets/javascripts/formagic/inputs/markdown.coffee +2 -18
  23. data/app/assets/javascripts/formagic/inputs/password.coffee +2 -14
  24. data/app/assets/javascripts/formagic/inputs/redactor.coffee +2 -18
  25. data/app/assets/javascripts/formagic/inputs/redactor_character.coffee +1 -13
  26. data/app/assets/javascripts/formagic/inputs/redactor_images.coffee +0 -13
  27. data/app/assets/javascripts/formagic/inputs/select.coffee +2 -21
  28. data/app/assets/javascripts/formagic/inputs/select2.coffee +0 -13
  29. data/app/assets/javascripts/formagic/inputs/select2_multiple.coffee +90 -0
  30. data/app/assets/javascripts/formagic/inputs/select2_single.coffee +57 -0
  31. data/app/assets/javascripts/formagic/inputs/string.coffee +13 -34
  32. data/app/assets/javascripts/formagic/inputs/text.coffee +2 -13
  33. data/app/assets/javascripts/formagic/inputs/url.coffee +3 -12
  34. data/app/assets/stylesheets/formagic.scss +2 -0
  35. data/app/assets/stylesheets/formagic/actions.scss +9 -0
  36. data/app/assets/stylesheets/formagic/form.scss +16 -24
  37. data/app/assets/stylesheets/formagic/nested-form.scss +3 -9
  38. data/app/assets/stylesheets/formagic/select.scss +24 -5
  39. data/app/assets/stylesheets/formagic/url.scss +5 -0
  40. data/lib/formagic/version.rb +1 -1
  41. metadata +6 -2
@@ -1,32 +1,20 @@
1
1
  # -----------------------------------------------------------------------------
2
2
  # Author: Alexander Kravets <alex@slatestudio.com>,
3
3
  # Slate Studio (http://www.slatestudio.com)
4
- #
5
- # Coding Guide:
6
- # https://github.com/thoughtbot/guides/tree/master/style/coffeescript
7
- # -----------------------------------------------------------------------------
8
-
9
4
  # -----------------------------------------------------------------------------
10
5
  # INPUT PASSWORD
11
6
  # -----------------------------------------------------------------------------
12
7
  class @InputPassword extends InputString
13
-
14
- # PRIVATE ===============================================
8
+ # PRIVATE ===================================================================
15
9
 
16
10
  _add_input: ->
17
11
  @$input =$ "<input type='password' name='#{ @name }' value='#{ @value }' />"
18
12
  @$input.on 'keyup', (e) => @$input.trigger('change')
19
13
  @$el.append @$input
20
14
 
21
-
22
- # PUBLIC ================================================
15
+ # PUBLIC ====================================================================
23
16
 
24
17
  updateValue: (@value) ->
25
18
  @$input.val(@value)
26
19
 
27
-
28
20
  chr.formInputs['password'] = InputPassword
29
-
30
-
31
-
32
-
@@ -1,32 +1,23 @@
1
1
  # -----------------------------------------------------------------------------
2
2
  # Author: Alexander Kravets <alex@slatestudio.com>,
3
3
  # Slate Studio (http://www.slatestudio.com)
4
- #
5
- # Coding Guide:
6
- # https://github.com/thoughtbot/guides/tree/master/style/coffeescript
7
- # -----------------------------------------------------------------------------
8
-
9
4
  # -----------------------------------------------------------------------------
10
5
  # INPUT REDACTOR
11
6
  # -----------------------------------------------------------------------------
12
- #
13
7
  # Dependencies:
14
8
  #= require vendor/redactor.table
15
9
  #= require vendor/redactor.fixedtoolbar
16
10
  #= require ./redactor_character
17
11
  # -----------------------------------------------------------------------------
18
-
19
12
  class @InputRedactor extends InputString
20
-
21
- # PRIVATE ===============================================
13
+ # PRIVATE ===================================================================
22
14
 
23
15
  _add_input: ->
24
16
  @$el.css('opacity', 0)
25
17
  @$input =$ "<textarea class='redactor' name='#{ @name }' rows=1>#{ @_safe_value() }</textarea>"
26
18
  @$el.append @$input
27
19
 
28
-
29
- # PUBLIC ================================================
20
+ # PUBLIC ====================================================================
30
21
 
31
22
  initialize: ->
32
23
  @config.beforeInitialize?(this)
@@ -37,17 +28,10 @@ class @InputRedactor extends InputString
37
28
 
38
29
  @config.onInitialize?(this)
39
30
 
40
-
41
31
  updateValue: (@value) ->
42
32
  @_trigger_change = false
43
33
  @$input.redactor('code.set', @value)
44
34
 
45
-
46
35
  include(InputRedactor, redactorCharacter)
47
36
 
48
-
49
37
  chr.formInputs['redactor'] = InputRedactor
50
-
51
-
52
-
53
-
@@ -1,11 +1,6 @@
1
1
  # -----------------------------------------------------------------------------
2
2
  # Author: Alexander Kravets <alex@slatestudio.com>,
3
3
  # Slate Studio (http://www.slatestudio.com)
4
- #
5
- # Coding Guide:
6
- # https://github.com/thoughtbot/guides/tree/master/style/coffeescript
7
- # -----------------------------------------------------------------------------
8
-
9
4
  # -----------------------------------------------------------------------------
10
5
  # REDACTOR CUSTOM VERSION
11
6
  #= require ./redactor_images
@@ -17,8 +12,7 @@ console.log ':: [redactor-character] change $.fx.speeds.fast from 200 to 10 ::'
17
12
  $.fx.speeds.fast = 10
18
13
 
19
14
  @redactorCharacter =
20
-
21
- # PRIVATE ===============================================
15
+ # PRIVATE ===================================================================
22
16
 
23
17
  # TODO: fixed toolbar disabled on mobile
24
18
  _redactor_options: ->
@@ -41,7 +35,6 @@ $.fx.speeds.fast = 10
41
35
 
42
36
  return config
43
37
 
44
-
45
38
  _get_default_config: () ->
46
39
  focus: false
47
40
  imageFloatMargin: '20px'
@@ -70,8 +63,3 @@ $.fx.speeds.fast = 10
70
63
 
71
64
  initCallback: ->
72
65
  new RedactorImages(this)
73
-
74
-
75
-
76
-
77
-
@@ -1,15 +1,9 @@
1
1
  # -----------------------------------------------------------------------------
2
2
  # Author: Alexander Kravets <alex@slatestudio.com>,
3
3
  # Slate Studio (http://www.slatestudio.com)
4
- #
5
- # Coding Guide:
6
- # https://github.com/thoughtbot/guides/tree/master/style/coffeescript
7
- # -----------------------------------------------------------------------------
8
-
9
4
  # -----------------------------------------------------------------------------
10
5
  # REDACTOR IMAGES
11
6
  # -----------------------------------------------------------------------------
12
-
13
7
  class @RedactorImages
14
8
  constructor: (@redactor) ->
15
9
 
@@ -41,7 +35,6 @@ class @RedactorImages
41
35
  <label class="redactor-image-link-option"><input type="checkbox" id="redactor-image-link-blank"> Open link in new tab</label>
42
36
  </section>"""
43
37
 
44
-
45
38
  update: ($image) ->
46
39
  @redactor.image.hideResize()
47
40
  @redactor.buffer.set()
@@ -85,7 +78,6 @@ class @RedactorImages
85
78
  @redactor.observe.images()
86
79
  @redactor.code.sync()
87
80
 
88
-
89
81
  _show_edit: ($image) ->
90
82
  $link = $image.closest('a')
91
83
 
@@ -126,7 +118,6 @@ class @RedactorImages
126
118
 
127
119
  @redactor.modal.show()
128
120
 
129
-
130
121
  # for some reason when image is a link, tooltip is shown with the image edit dialog,
131
122
  # add e.stopPropagation() to skip tooltip callback
132
123
  _load_editable_controls: ($image) ->
@@ -160,7 +151,3 @@ class @RedactorImages
160
151
  @redactor.image.editter.css('margin-left', '-' + editerWidth/2 + 'px')
161
152
 
162
153
  return @redactor.image.loadResizableControls($image, imageBox)
163
-
164
-
165
-
166
-
@@ -1,30 +1,21 @@
1
1
  # -----------------------------------------------------------------------------
2
2
  # Author: Alexander Kravets <alex@slatestudio.com>,
3
3
  # Slate Studio (http://www.slatestudio.com)
4
- #
5
- # Coding Guide:
6
- # https://github.com/thoughtbot/guides/tree/master/style/coffeescript
7
- # -----------------------------------------------------------------------------
8
-
9
4
  # -----------------------------------------------------------------------------
10
5
  # INPUT SELECT
11
6
  # -----------------------------------------------------------------------------
12
-
13
7
  class @InputSelect extends InputString
14
-
15
- # PRIVATE ===============================================
8
+ # PRIVATE ===================================================================
16
9
 
17
10
  _create_el: ->
18
11
  @$el =$ "<div class='form-input input-#{ @config.type } input-#{ @config.klassName }'>"
19
12
 
20
-
21
13
  _add_input: ->
22
14
  @$input =$ """<select name='#{ @name }'></select>"""
23
15
  @$el.append @$input
24
16
 
25
17
  @_add_options()
26
18
 
27
-
28
19
  _add_options: ->
29
20
  if @config.optionsHashFieldName
30
21
  @value = String(@value)
@@ -42,33 +33,28 @@ class @InputSelect extends InputString
42
33
  else if @config.optionsHash
43
34
  @_add_hash_options()
44
35
 
45
-
46
36
  _add_collection_options: ->
47
37
  for o in @config.collection.data
48
38
  title = o[@config.collection.titleField]
49
39
  value = o[@config.collection.valueField]
50
40
  @_add_option(title, value)
51
41
 
52
-
53
42
  _add_list_options: ->
54
43
  data = @config.optionsList
55
44
  for o in data
56
45
  @_add_option(o, o)
57
46
 
58
-
59
47
  _add_hash_options: ->
60
48
  data = @config.optionsHash
61
49
  for value, title of data
62
50
  @_add_option(title, value)
63
51
 
64
-
65
52
  _add_option: (title, value) ->
66
53
  selected = if @value == value then 'selected' else ''
67
54
  $option =$ """<option value='#{ value }' #{ selected }>#{ title }</option>"""
68
55
  @$input.append $option
69
56
 
70
-
71
- # PUBLIC ================================================
57
+ # PUBLIC ====================================================================
72
58
 
73
59
  updateValue: (@value, @object) ->
74
60
  @$input.html('')
@@ -76,9 +62,4 @@ class @InputSelect extends InputString
76
62
 
77
63
  @$input.val(@value).prop('selected', true)
78
64
 
79
-
80
65
  chr.formInputs['select'] = InputSelect
81
-
82
-
83
-
84
-
@@ -1,20 +1,12 @@
1
1
  # -----------------------------------------------------------------------------
2
2
  # Author: Alexander Kravets <alex@slatestudio.com>,
3
3
  # Slate Studio (http://www.slatestudio.com)
4
- #
5
- # Coding Guide:
6
- # https://github.com/thoughtbot/guides/tree/master/style/coffeescript
7
- # -----------------------------------------------------------------------------
8
-
9
4
  # -----------------------------------------------------------------------------
10
5
  # INPUT SELECT 2
11
6
  # -----------------------------------------------------------------------------
12
- #
13
7
  # Dependencies:
14
8
  #= require vendor/select2
15
- #
16
9
  # -----------------------------------------------------------------------------
17
-
18
10
  class @InputSelect2 extends InputSelect
19
11
  initialize: ->
20
12
  @config.beforeInitialize?(this)
@@ -25,9 +17,4 @@ class @InputSelect2 extends InputSelect
25
17
 
26
18
  @config.onInitialize?(this)
27
19
 
28
-
29
20
  chr.formInputs['select2'] = InputSelect2
30
-
31
-
32
-
33
-
@@ -0,0 +1,90 @@
1
+ # -----------------------------------------------------------------------------
2
+ # Author: Alexander Kravets <alex@slatestudio.com>,
3
+ # Slate Studio (http://www.slatestudio.com)
4
+ # -----------------------------------------------------------------------------
5
+ # SELECT MULTIPLE
6
+ # -----------------------------------------------------------------------------
7
+ # Dependencies:
8
+ #= require ./select2
9
+ # -----------------------------------------------------------------------------
10
+ class @InputSelect2Multiple extends InputSelect2
11
+ initialize: ->
12
+ @config.beforeInitialize?(this)
13
+
14
+ target = @config.target
15
+ titleFieldName = @config.titleField
16
+
17
+ # Remove name from the select input so it's value is not send to the server
18
+ @$input.attr('name', '').attr('multiple', true)
19
+
20
+ # Attach hidden input to store value
21
+ @$hiddenInput =$ "<input type='hidden' name='[__LIST__#{ target }]' />"
22
+ @$el.append @$hiddenInput
23
+
24
+ # Add handler that updates hidden value on select change (updated by select2)
25
+ @$input.on 'change', (e) =>
26
+ @_update_hidden_input_value()
27
+
28
+ # These methods run while initialization only
29
+ @_initialize_selected_values()
30
+ @_update_hidden_input_value()
31
+
32
+ options =
33
+ placeholder: @config.placeholder
34
+ multiple: true
35
+ width: '100%'
36
+ ajax:
37
+ url: @config.url
38
+ dataType: 'json'
39
+ delay: 250
40
+ cache: true
41
+ minimumInputLength: 2
42
+ data: (params) -> { search: params.term, page: 1, perPage: 20 }
43
+ processResults: (data, page) ->
44
+ { results: $.map data, (i) -> { id: i._id, text: i[titleFieldName] } }
45
+
46
+ # https://select2.github.io/options.html
47
+ $.extend(options, @config.pluginOptions || {})
48
+ @$input.select2(options)
49
+
50
+ @config.onInitialize?(this)
51
+
52
+ # PRIVATE =====================================================================
53
+
54
+ _selected_ids: ->
55
+ $.map @$input.children(':selected'), (option) ->
56
+ $(option).attr('value')
57
+
58
+ _selected_ids_and_names: ->
59
+ $.map input.$input.children(':selected'), (option) ->
60
+ { _id: $(option).attr('value'), name: $(option).text() }
61
+
62
+ # Add initial values to be shown by select2
63
+ _initialize_selected_values: ->
64
+ titleFieldName = @config.titleField
65
+ for o in @value
66
+ @$input.append """
67
+ <option value='#{ o._id }' selected>
68
+ #{ o[titleFieldName] }
69
+ </option>"""
70
+
71
+ # Pass value to hidden input in list format (split ids with ,)
72
+ _update_hidden_input_value: ->
73
+ selectedValues = @_selected_ids()
74
+ val = selectedValues.join('|||')
75
+ @$hiddenInput.val(val)
76
+
77
+ # PUBLIC ======================================================================
78
+
79
+ # Override default updateValue method
80
+ updateValue: (@value) ->
81
+ @$input.html('')
82
+ @_initialize_selected_values()
83
+ @_update_hidden_input_value()
84
+
85
+ # Override hash method to cache values properly
86
+ hash: (hash={}) ->
87
+ hash[@config.klassName] = @_selected_ids_and_names()
88
+ return hash
89
+
90
+ chr.formInputs['selectMultiple'] = InputSelect2Multiple
@@ -0,0 +1,57 @@
1
+ # -----------------------------------------------------------------------------
2
+ # Author: Alexander Kravets <alex@slatestudio.com>,
3
+ # Slate Studio (http://www.slatestudio.com)
4
+ # -----------------------------------------------------------------------------
5
+ # SELECT SINGLE
6
+ # -----------------------------------------------------------------------------
7
+ # Dependencies:
8
+ #= require ./select2
9
+ # -----------------------------------------------------------------------------
10
+ # Configuration example:
11
+ #
12
+ # category_id:
13
+ # type: 'selectSingle'
14
+ # label: 'Category'
15
+ # titleField: 'title'
16
+ # url: "/admin/categories.json"
17
+ # relatedTitleField: 'category_title'
18
+ # -----------------------------------------------------------------------------
19
+ class @InputSelect2Multiple extends InputSelect2
20
+ initialize: ->
21
+ @config.beforeInitialize?(this)
22
+
23
+ titleFieldName = @config.titleField
24
+ @_initialize_options_hash(titleFieldName)
25
+
26
+ options =
27
+ placeholder: @config.placeholder
28
+ width: "100%"
29
+ ajax:
30
+ url: @config.url
31
+ dataType: 'json'
32
+ delay: 250
33
+ cache: true
34
+ minimumInputLength: 2
35
+ data: (params) -> { search: params.term, page: 1 }
36
+ processResults: (data, page) ->
37
+ { results: $.map data, (i) -> { id: i._id, text: i[titleFieldName] } }
38
+
39
+ # https://select2.github.io/options.html
40
+ $.extend(options, @config.pluginOptions || {})
41
+ @$input.select2(options)
42
+
43
+ @config.onInitialize?(this)
44
+
45
+ # PRIVATE ===================================================================
46
+
47
+ _initialize_options_hash: ->
48
+ @config.optionsHash = {}
49
+ if @object
50
+ relatedObjectId = @object[@config.fieldName]
51
+ relatedObjectTitle = @object[@config.relatedTitleField]
52
+ if ! relatedObjectTitle
53
+ relatedObjectTitle = 'None'
54
+ @config.optionsHash[relatedObjectId] = relatedObjectTitle
55
+ @_add_options()
56
+
57
+ chr.formInputs['selectSingle'] = InputSelect2Multiple
@@ -1,11 +1,6 @@
1
1
  # -----------------------------------------------------------------------------
2
2
  # Author: Alexander Kravets <alex@slatestudio.com>,
3
3
  # Slate Studio (http://www.slatestudio.com)
4
- #
5
- # Coding Guide:
6
- # https://github.com/thoughtbot/guides/tree/master/style/coffeescript
7
- # -----------------------------------------------------------------------------
8
-
9
4
  # -----------------------------------------------------------------------------
10
5
  # INPUT STRING
11
6
  # -----------------------------------------------------------------------------
@@ -21,7 +16,6 @@
21
16
  #
22
17
  # Dependencies:
23
18
  #= require vendor/jquery.typeahead
24
- #
25
19
  # -----------------------------------------------------------------------------
26
20
  class @InputString
27
21
  constructor: (@name, @value, @config, @object) ->
@@ -35,8 +29,7 @@ class @InputString
35
29
 
36
30
  return this
37
31
 
38
-
39
- # PRIVATE ===============================================
32
+ # PRIVATE ===================================================================
40
33
 
41
34
  _safe_value: ->
42
35
  if typeof(@value) == 'object'
@@ -44,26 +37,28 @@ class @InputString
44
37
  else
45
38
  return _escapeHtml(@value)
46
39
 
47
-
48
40
  _create_el: ->
49
41
  @$el =$ "<label for='#{ @name }' class='#{ @config.klass } input-#{ @config.type } input-#{ @config.klassName }'>"
50
42
 
51
-
52
43
  _add_label: ->
53
- if @config.label != false
54
- @$label =$ "<span class='label'>#{ @config.label }</span>"
55
- @$errorMessage =$ "<span class='error-message'></span>"
56
- @$label.append(@$errorMessage)
57
- @$el.append(@$label)
44
+ @$label =$ "<span class='label'>"
45
+ @$labelTitle =$ "<span class='label-title'>#{ @config.label }</span>"
46
+ @$errorMessage =$ "<span class='error-message'></span>"
47
+ @$label.append(@$labelTitle)
48
+ @$label.append(@$errorMessage)
49
+ @$el.append(@$label)
58
50
 
51
+ if @config.label == false
52
+ @$labelTitle.hide()
59
53
 
60
54
  _add_input: ->
61
- @$input =$ "<input type='text' name='#{ @name }' value='#{ @_safe_value() }' />"
55
+ @$input =$ """
56
+ <input type='text' id='#{ @name }' name='#{ @name }' value='#{ @_safe_value() }' />
57
+ """
62
58
  # trigger change event on keyup so value is cached while typing
63
59
  @$input.on 'keyup', (e) => @$input.trigger('change')
64
60
  @$el.append @$input
65
61
 
66
-
67
62
  if @config.options and $.isArray(@config.options)
68
63
  data = new Bloodhound
69
64
  datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value')
@@ -83,25 +78,21 @@ class @InputString
83
78
  source: data.ttAdapter()
84
79
  })
85
80
 
86
-
87
81
  _add_placeholder: ->
88
82
  @$input.attr 'placeholder', @config.type
89
83
 
90
84
  if @config.placeholder
91
85
  @$input.attr 'placeholder', @config.placeholder
92
86
 
93
-
94
87
  _add_disabled: ->
95
88
  if @config.disabled
96
89
  @$input.prop('disabled', true)
97
90
  @$el.addClass('input-disabled')
98
91
 
99
-
100
92
  _add_required: ->
101
93
  if @config.required
102
94
  @$el.addClass('input-required')
103
95
 
104
-
105
96
  _add_limit: ->
106
97
  if @config.limit
107
98
  @$charCounter =$ "<span class='input-character-counter'></span>"
@@ -110,7 +101,6 @@ class @InputString
110
101
  @_update_character_counter()
111
102
  @_update_character_counter()
112
103
 
113
-
114
104
  _update_character_counter: ->
115
105
  characters = @$input.val().length
116
106
  left = @config.limit - characters
@@ -121,40 +111,29 @@ class @InputString
121
111
  else
122
112
  @$charCounter.html("(#{ left })")
123
113
 
124
-
125
114
  if characters > @config.limit
126
115
  @$charCounter.addClass('exceeds')
127
116
  else
128
117
  @$charCounter.removeClass('exceeds')
129
118
 
130
-
131
- # PUBLIC ================================================
119
+ # PUBLIC ====================================================================
132
120
 
133
121
  initialize: ->
134
122
  @config.onInitialize?(this)
135
123
 
136
-
137
124
  hash: (hash={}) ->
138
125
  hash[@config.klassName] = @$input.val()
139
126
  return hash
140
127
 
141
-
142
128
  updateValue: (@value) ->
143
129
  @$input.val(@value)
144
130
 
145
-
146
131
  showErrorMessage: (message) ->
147
132
  @$el.addClass('error')
148
133
  @$errorMessage.html(message)
149
134
 
150
-
151
135
  hideErrorMessage: ->
152
136
  @$el.removeClass('error')
153
137
  @$errorMessage.html('')
154
138
 
155
-
156
139
  chr.formInputs['string'] = InputString
157
-
158
-
159
-
160
-