chr 0.2.1 → 0.2.4

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 (59) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -1
  3. data/Gruntfile.coffee +50 -16
  4. data/app/assets/javascripts/chr.coffee +9 -16
  5. data/app/assets/javascripts/chr/core/chr.coffee +38 -20
  6. data/app/assets/javascripts/chr/core/item.coffee +30 -24
  7. data/app/assets/javascripts/chr/core/list.coffee +30 -60
  8. data/app/assets/javascripts/chr/core/list_config.coffee +65 -0
  9. data/app/assets/javascripts/chr/core/list_pagination.coffee +27 -0
  10. data/app/assets/javascripts/chr/core/list_reorder.coffee +75 -0
  11. data/app/assets/javascripts/chr/core/list_search.coffee +41 -0
  12. data/app/assets/javascripts/chr/core/module.coffee +55 -32
  13. data/app/assets/javascripts/chr/core/utils.coffee +34 -13
  14. data/app/assets/javascripts/chr/core/view.coffee +70 -97
  15. data/app/assets/javascripts/chr/form/form.coffee +63 -49
  16. data/app/assets/javascripts/chr/form/input-checkbox.coffee +40 -27
  17. data/app/assets/javascripts/chr/form/input-color.coffee +26 -8
  18. data/app/assets/javascripts/chr/form/input-date.coffee +0 -0
  19. data/app/assets/javascripts/chr/form/input-file.coffee +81 -46
  20. data/app/assets/javascripts/chr/form/input-form.coffee +162 -0
  21. data/app/assets/javascripts/chr/form/input-form_reorder.coffee +67 -0
  22. data/app/assets/javascripts/chr/form/input-hidden.coffee +27 -11
  23. data/app/assets/javascripts/chr/form/input-list.coffee +60 -56
  24. data/app/assets/javascripts/chr/form/input-list_reorder.coffee +37 -0
  25. data/app/assets/javascripts/chr/form/input-password.coffee +31 -0
  26. data/app/assets/javascripts/chr/form/input-select.coffee +61 -35
  27. data/app/assets/javascripts/chr/form/input-string.coffee +55 -25
  28. data/app/assets/javascripts/chr/form/input-text.coffee +22 -5
  29. data/app/assets/javascripts/chr/store/mongosteen-array-store.coffee +1 -1
  30. data/app/assets/javascripts/chr/vendor/ace.js +18280 -0
  31. data/app/assets/javascripts/chr/vendor/marked.js +1272 -0
  32. data/app/assets/javascripts/chr/vendor/mode-html.js +2436 -0
  33. data/app/assets/javascripts/chr/vendor/mode-markdown.js +2820 -0
  34. data/app/assets/javascripts/chr/vendor/redactor.fixedtoolbar.js +110 -0
  35. data/app/assets/javascripts/input-html.coffee +78 -0
  36. data/app/assets/javascripts/input-markdown.coffee +88 -0
  37. data/app/assets/javascripts/input-redactor.coffee +66 -0
  38. data/app/assets/stylesheets/_chr.scss +6 -6
  39. data/app/assets/stylesheets/_input-redactor.scss +34 -0
  40. data/app/assets/stylesheets/core/_mixins.scss +75 -0
  41. data/app/assets/stylesheets/form/_input-checkbox.scss +18 -0
  42. data/app/assets/stylesheets/form/{_input_color.scss → _input-color.scss} +0 -0
  43. data/app/assets/stylesheets/form/{_input_file.scss → _input-file.scss} +1 -0
  44. data/app/assets/stylesheets/form/{_nested_form.scss → _input-form.scss} +0 -0
  45. data/app/assets/stylesheets/form/{_input_list.scss → _input-list.scss} +0 -0
  46. data/app/assets/stylesheets/form/_input-string.scss +8 -0
  47. data/bower.json +3 -2
  48. data/{app/assets/javascripts/chr-dist.js → dist/chr.js} +1472 -1337
  49. data/dist/input-ace.js +24936 -0
  50. data/dist/input-redactor.js +156 -0
  51. data/lib/chr/version.rb +1 -1
  52. data/package.json +2 -2
  53. metadata +29 -13
  54. data/app/assets/javascripts/chr/core/list-pagination.coffee +0 -26
  55. data/app/assets/javascripts/chr/core/list-reorder.coffee +0 -70
  56. data/app/assets/javascripts/chr/core/list-search.coffee +0 -37
  57. data/app/assets/javascripts/chr/form/nested-form.coffee +0 -164
  58. data/app/assets/stylesheets/form/_input_checkbox.scss +0 -91
  59. data/app/assets/stylesheets/form/_input_string.scss +0 -8
@@ -1,39 +1,50 @@
1
1
  # -----------------------------------------------------------------------------
2
- # FORM
3
- # Generates form based on provided configuration schema.
4
- # If schema is not provided generates default form based on object keys.
2
+ # Author: Alexander Kravets <alex@slatestudio.com>,
3
+ # Slate Studio (http://www.slatestudio.com)
4
+ #
5
+ # Coding Guide:
6
+ # https://github.com/thoughtbot/guides/tree/master/style/coffeescript
5
7
  # -----------------------------------------------------------------------------
6
8
 
7
- @_chrFormInputs ?= {}
9
+ # -----------------------------------------------------------------------------
10
+ # FORM
11
+ # -----------------------------------------------------------------------------
12
+ # Generates form based on provided configuration schema. If schema is not
13
+ # provided generates default form based on object keys. This uses Rails
14
+ # conventions for managing names for attributes, arrays, hashs and nested
15
+ # objects.
16
+ #
17
+ # -----------------------------------------------------------------------------
8
18
 
9
19
  class @Form
10
20
  constructor: (@object, @config) ->
11
21
  @groups = []
12
22
  @inputs = {}
13
23
  @$el = $(@config.rootEl || '<form>')
14
- @schema = @_getSchema()
24
+ @schema = @_get_schema()
15
25
  @isRemoved = false
16
26
 
17
- @_buildSchema(@schema, @$el)
18
- @_addNestedFormRemoveButton()
27
+ @_build_schema(@schema, @$el)
28
+ @_add_nested_form_remove_button()
19
29
 
20
- #
21
- # SCHEMA
22
- #
23
30
 
24
- _getSchema: ->
31
+ # PRIVATE ===============================================
32
+
33
+ _get_schema: ->
25
34
  schema = @config.formSchema
26
35
  if @object
27
- schema ?= @_generateDefaultSchema()
36
+ schema ?= @_generate_default_schema()
28
37
  return schema
29
38
 
30
- _generateDefaultSchema: ->
39
+
40
+ _generate_default_schema: ->
31
41
  schema = {}
32
42
  for key, value of @object
33
- schema[key] = @_generateDefaultInputConfig(key, value)
43
+ schema[key] = @_generate_default_input_config(key, value)
34
44
  return schema
35
45
 
36
- _generateDefaultInputConfig: (fieldName, value) ->
46
+
47
+ _generate_default_input_config: (fieldName, value) ->
37
48
  config = {}
38
49
 
39
50
  if fieldName[0] == '_'
@@ -52,28 +63,29 @@ class @Form
52
63
 
53
64
  return config
54
65
 
55
- #
56
- # INPUTS
57
- #
58
66
 
59
- _buildSchema: (schema, $el) ->
67
+ # INPUTS ================================================
68
+
69
+ _build_schema: (schema, $el) ->
60
70
  for fieldName, config of schema
61
71
  if config.type == 'group'
62
- group = @_generateInputsGroup(fieldName, config)
72
+ group = @_generate_inputs_group(fieldName, config)
63
73
  $el.append group.$el
64
74
  else
65
- input = @_generateInput(fieldName, config)
75
+ input = @_generate_input(fieldName, config)
66
76
  $el.append input.$el
67
77
 
68
- _generateInputsGroup: (klassName, groupConfig) ->
78
+
79
+ _generate_inputs_group: (klassName, groupConfig) ->
69
80
  $group =$ """<div class='group #{ klassName }' />"""
70
81
  if groupConfig.inputs
71
- @_buildSchema(groupConfig.inputs, $group)
82
+ @_build_schema(groupConfig.inputs, $group)
72
83
  group = { $el: $group, klassName: klassName, onInitialize: groupConfig.onInitialize }
73
84
  @groups.push group
74
85
  return group
75
86
 
76
- _generateInput: (fieldName, inputConfig) ->
87
+
88
+ _generate_input: (fieldName, inputConfig) ->
77
89
  if @object
78
90
  value = @object[fieldName]
79
91
  else
@@ -82,49 +94,45 @@ class @Form
82
94
  value ?= ''
83
95
 
84
96
  inputName = inputConfig.name || fieldName
85
- input = @_renderInput(inputName, inputConfig, value)
97
+ input = @_render_input(inputName, inputConfig, value)
86
98
  @inputs[fieldName] = input
87
99
  return input
88
100
 
89
- _renderInput: (name, config, value) ->
101
+
102
+ _render_input: (name, config, value) ->
90
103
  inputConfig = $.extend {}, config
91
104
 
92
- inputConfig.label ?= @_titleizeLabel(name)
105
+ inputConfig.label ?= name.titleize()
93
106
  inputConfig.type ?= 'string'
94
107
  inputConfig.klass ?= 'stacked'
95
108
  inputConfig.klassName = name
96
109
 
97
- inputClass = _chrFormInputs[inputConfig.type]
98
- inputClass ?= _chrFormInputs['string']
110
+ inputClass = chr.formInputs[inputConfig.type]
111
+ inputClass ?= chr.formInputs['string']
99
112
 
100
113
  inputName = if @config.namePrefix then "#{ @config.namePrefix }[#{ name }]" else "[#{ name }]"
101
114
 
102
115
  # add prefix for nested form inputs
103
116
  if inputConfig.type == 'form'
104
- inputConfig.namePrefix = inputName.replace("[#{ name }]", "[#{name}_attributes]")
117
+ inputConfig.namePrefix = inputName.replace("[#{ name }]", "[#{ name }_attributes]")
105
118
  else
106
119
  inputConfig.namePrefix = @config.namePrefix
107
120
 
108
121
  return new inputClass(inputName, value, inputConfig, @object)
109
122
 
110
- _titleizeLabel: (value) ->
111
- value.titleize().replace('Id', 'ID')
112
123
 
113
- #
114
- # NESTED
115
- #
124
+ # NESTED ================================================
116
125
 
117
- _addNestedFormRemoveButton: ->
126
+ _add_nested_form_remove_button: ->
118
127
  if @config.removeButton
119
- # add special hidden input to the form
128
+ # add hidden input to the form
120
129
  fieldName = '_destroy'
121
- input = @_renderInput(fieldName, { type: 'hidden' }, false)
130
+ input = @_render_input(fieldName, { type: 'hidden' }, false)
122
131
  @inputs[fieldName] = input
123
132
  @$el.append input.$el
124
- # add button
133
+ # remove button
125
134
  @$removeButton =$ """<a href='#' class='nested-form-delete'>Delete</a>"""
126
135
  @$el.append @$removeButton
127
- # handle click event
128
136
  @$removeButton.on 'click', (e) =>
129
137
  e.preventDefault()
130
138
  if confirm('Are you sure?')
@@ -133,6 +141,7 @@ class @Form
133
141
  @isRemoved = true
134
142
  @config.onRemove?(this)
135
143
 
144
+
136
145
  _forms: ->
137
146
  forms = [ @ ]
138
147
  addNestedForms = (form) ->
@@ -144,39 +153,41 @@ class @Form
144
153
 
145
154
  return forms
146
155
 
147
- #
148
- # PUBLIC
149
- #
156
+
157
+ # PUBLIC ================================================
150
158
 
151
159
  destroy: ->
160
+ group.destroy?() for group in @groups
161
+ input.destroy?() for name, input of @inputs
152
162
  @$el.remove()
153
163
 
164
+
154
165
  serialize: (obj={}) ->
155
- # NOTE: this serializes everything except file inputs
166
+ # serialize everything except file inputs
156
167
  obj[input.name] = input.value for input in @$el.serializeArray()
157
168
 
158
169
  for form in @_forms()
159
- # NOTE: serialize file inputs for all forms (root and nested)
170
+ # serialize file inputs for all forms (including nested)
160
171
  for name, input of form.inputs
161
172
  if input.config.type == 'file' or input.config.type == 'image'
162
173
  file = input.$input.get()[0].files[0]
163
174
  obj["__FILE__#{ input.name }"] = file
164
- # NOTE: when no file uploaded and no file selected, send
165
- # remove flag so carrierwave does not catch _old_ value
166
- if not file and not input.filename then obj[input.removeName()] = 'true'
175
+ if input.isEmpty() then obj[input.removeName()] = 'true'
167
176
 
168
- # NOTE: remove fields with ignoreOnSubmission
177
+ # remove fields with ignoreOnSubmission
169
178
  for name, input of form.inputs
170
179
  if input.config.ignoreOnSubmission
171
180
  delete obj[name]
172
181
 
173
182
  return obj
174
183
 
184
+
175
185
  hash: (hash={}) ->
176
186
  for name, input of @inputs
177
187
  input.hash(hash)
178
188
  return hash
179
189
 
190
+
180
191
  initializePlugins: ->
181
192
  for group in @groups
182
193
  group.onInitialize?(@, group)
@@ -184,6 +195,7 @@ class @Form
184
195
  for name, input of @inputs
185
196
  input.initialize()
186
197
 
198
+
187
199
  showValidationErrors: (errors) ->
188
200
  @hideValidationErrors()
189
201
  for inputName, messages of errors
@@ -191,10 +203,12 @@ class @Form
191
203
  firstMessage = messages[0]
192
204
  input.showErrorMessage(firstMessage)
193
205
 
206
+
194
207
  hideValidationErrors: ->
195
208
  for inputName, input of @inputs
196
209
  input.hideErrorMessage()
197
210
 
211
+
198
212
  updateValues: (object) ->
199
213
  for name, value of object
200
214
  if @inputs[name]
@@ -1,69 +1,82 @@
1
+ # -----------------------------------------------------------------------------
2
+ # Author: Alexander Kravets <alex@slatestudio.com>,
3
+ # Slate Studio (http://www.slatestudio.com)
4
+ #
5
+ # Coding Guide:
6
+ # https://github.com/thoughtbot/guides/tree/master/style/coffeescript
7
+ # -----------------------------------------------------------------------------
8
+
1
9
  # -----------------------------------------------------------------------------
2
10
  # INPUT CHECKBOX
3
11
  # -----------------------------------------------------------------------------
4
12
  class @InputCheckbox extends InputString
5
- _safeValue: ->
13
+ constructor: (@name, @value, @config, @object) ->
14
+ @_create_el()
15
+ @_add_input()
16
+ @_add_label()
17
+
18
+ return this
19
+
20
+
21
+ # PRIVATE ===============================================
22
+
23
+ _create_el: ->
24
+ @$el =$ "<label for='#{ @name }' class='input-#{ @config.type } input-#{ @config.klass } #{ @config.klassName }'>"
25
+
26
+
27
+ _safe_value: ->
6
28
  if not @value or @value == 'false' or @value == 0 or @value == '0'
7
29
  return false
8
30
  else
9
31
  return true
10
32
 
11
- _addInput: ->
12
- # NOTE: for boolean checkbox to be serialized correctly we need a hidden false
13
- # value which is used by default and overriden by checked value
33
+
34
+ _add_input: ->
35
+ # for boolean checkbox to be serialized correctly we need a hidden false
36
+ # value which is used by default and overriden by checked value
14
37
  @$false_hidden_input =$ "<input type='hidden' name='#{ @name }' value='false' />"
15
38
  @$el.append @$false_hidden_input
16
39
 
17
- @$input =$ "<input type='checkbox' name='#{ @name }' id='#{ @name }' value='true' #{ if @_safeValue() then 'checked' else '' } />"
40
+ @$input =$ "<input type='checkbox' id='#{ @name }' name='#{ @name }' value='true' #{ if @_safe_value() then 'checked' else '' } />"
18
41
  @$el.append @$input
19
42
 
20
- #
21
- # PUBLIC
22
- #
23
-
24
- constructor: (@name, @value, @config, @object) ->
25
- @$el =$ "<label for='#{ @name }' class='input-#{ @config.type } input-#{ @config.klass } #{ @config.klassName }'>"
26
43
 
27
- @_addInput()
28
- @_addLabel()
29
-
30
- return this
44
+ # PUBLIC ================================================
31
45
 
32
46
  updateValue: (@value) ->
33
- @$input.prop('checked', @_safeValue())
47
+ @$input.prop('checked', @_safe_value())
48
+
34
49
 
35
50
  hash: (hash={}) ->
36
51
  hash[@config.klassName] = @$input.prop('checked')
37
52
  return hash
38
53
 
39
- _chrFormInputs['checkbox'] = InputCheckbox
54
+
55
+ chr.formInputs['checkbox'] = InputCheckbox
56
+
40
57
 
41
58
  # -----------------------------------------------------------------------------
42
59
  # INPUT CHECKBOX SWITCH
43
60
  # -----------------------------------------------------------------------------
44
61
  class @InputCheckboxSwitch extends InputCheckbox
45
- _addInput: ->
62
+
63
+ # PRIVATE ===============================================
64
+
65
+ _add_input: ->
46
66
  @$switch =$ "<div class='switch'>"
47
67
  @$el.append @$switch
48
68
 
49
69
  @$false_hidden_input =$ "<input type='hidden' name='#{ @name }' value='false' />"
50
70
  @$switch.append @$false_hidden_input
51
71
 
52
- @$input =$ "<input type='checkbox' name='#{ @name }' id='#{ @name }' value='true' #{ if @_safeValue() then 'checked' else '' } />"
72
+ @$input =$ "<input type='checkbox' id='#{ @name }' name='#{ @name }' value='true' #{ if @_safe_value() then 'checked' else '' } />"
53
73
  @$switch.append @$input
54
74
 
55
75
  @$checkbox =$ "<div class='checkbox'>"
56
76
  @$switch.append @$checkbox
57
77
 
58
- constructor: (@name, @value, @config, @object) ->
59
- @$el =$ "<label for='#{ @name }' class='input-#{ @config.type } input-#{ @config.klass } #{ @config.klassName }'>"
60
-
61
- @_addLabel()
62
- @_addInput()
63
-
64
- return this
65
78
 
66
- _chrFormInputs['switch'] = InputCheckboxSwitch
79
+ chr.formInputs['switch'] = InputCheckboxSwitch
67
80
 
68
81
 
69
82
 
@@ -1,33 +1,51 @@
1
+ # -----------------------------------------------------------------------------
2
+ # Author: Alexander Kravets <alex@slatestudio.com>,
3
+ # Slate Studio (http://www.slatestudio.com)
4
+ #
5
+ # Coding Guide:
6
+ # https://github.com/thoughtbot/guides/tree/master/style/coffeescript
7
+ # -----------------------------------------------------------------------------
8
+
1
9
  # -----------------------------------------------------------------------------
2
10
  # INPUT COLOR
3
11
  # -----------------------------------------------------------------------------
4
12
  class @InputColor extends InputString
5
- _addColorPreview: ->
13
+
14
+ # PRIVATE ===============================================
15
+
16
+ _add_color_preview: ->
6
17
  @$colorPreview =$ "<div class='preview'>"
7
18
  @$el.append @$colorPreview
8
19
 
9
- _updateColorPreview: ->
20
+
21
+ _update_color_preview: ->
10
22
  @$colorPreview.css { 'background-color': "##{ @$input.val() }" }
11
23
 
12
- _validateInputValue: ->
24
+
25
+ _validate_input_value: ->
13
26
  if (/^(?:[0-9a-f]{3}){1,2}$/i).test(@$input.val())
14
27
  @hideErrorMessage()
15
28
  else
16
29
  @showErrorMessage('Invalid hex value')
17
30
 
31
+
32
+ # PUBLIC ================================================
33
+
18
34
  initialize: ->
19
- @_addColorPreview()
20
- @_updateColorPreview()
35
+ @$input.attr('placeholder', @config.placeholder || 'e.g. #eee')
36
+
37
+ @_add_color_preview()
38
+ @_update_color_preview()
21
39
 
22
40
  @$input.on 'change keyup', (e) =>
23
41
  @hideErrorMessage()
24
- @_validateInputValue()
25
- @_updateColorPreview()
42
+ @_validate_input_value()
43
+ @_update_color_preview()
26
44
 
27
45
  @config.onInitialize?(this)
28
46
 
29
47
 
30
- _chrFormInputs['color'] = InputColor
48
+ chr.formInputs['color'] = InputColor
31
49
 
32
50
 
33
51
 
File without changes
@@ -1,81 +1,116 @@
1
+ # -----------------------------------------------------------------------------
2
+ # Author: Alexander Kravets <alex@slatestudio.com>,
3
+ # Slate Studio (http://www.slatestudio.com)
4
+ #
5
+ # Coding Guide:
6
+ # https://github.com/thoughtbot/guides/tree/master/style/coffeescript
7
+ # -----------------------------------------------------------------------------
8
+
1
9
  # -----------------------------------------------------------------------------
2
10
  # INPUT FILE
3
11
  # -----------------------------------------------------------------------------
4
12
  class @InputFile extends InputString
5
- _addInput: ->
6
- @$el.addClass 'empty'
7
- if @filename
8
- @$link =$ "<a href='#{ @value.url }' target='_blank' title='#{ @filename }'>#{ @filename }</a>"
9
- @$el.append @$link
10
- @$el.removeClass 'empty'
13
+ constructor: (@name, @value, @config, @object) ->
14
+ @_create_el()
11
15
 
12
- @$input =$ "<input type='file' name='#{ @name }' id='#{ @name }' />"
16
+ @_add_label()
17
+ @_add_input()
18
+ @_update_state()
19
+
20
+ return this
21
+
22
+
23
+ # PRIVATE ===============================================
24
+
25
+ _create_el: ->
26
+ @$el =$ "<div class='input-#{ @config.type } input-#{ @config.klass } #{ @config.klassName }'>"
27
+
28
+
29
+ _add_input: ->
30
+ @$link =$ "<a href='#' target='_blank' title=''></a>"
31
+ @$el.append(@$link)
32
+
33
+ @$input =$ "<input type='file' name='#{ @name }' id='#{ @name }'>"
13
34
  @$el.append @$input
14
35
 
15
- _addRemoveCheckbox: ->
16
- # NOTE: this is Rails (CarrierWave) approach to remove files, might not be
17
- # generic, so we should consider to move it to store.
18
- if @filename
19
- removeInputName = @removeName()
36
+ @_add_remove_checkbox()
20
37
 
21
- @$removeLabel =$ "<label for='#{ removeInputName }'>Remove</label>"
22
- @$link.after @$removeLabel
23
38
 
24
- @$hiddenRemoveInput =$ "<input type='hidden' name='#{ removeInputName }' value='false'>"
25
- @$removeInput =$ "<input type='checkbox' name='#{ removeInputName }' id='#{ removeInputName }' value='true'>"
39
+ _add_remove_checkbox: ->
40
+ removeInputName = @removeName()
41
+ @$removeLabel =$ "<label for='#{ removeInputName }'>Remove</label>"
42
+ @$hiddenRemoveInput =$ "<input type='hidden' name='#{ removeInputName }' value='false'>"
43
+ @$removeInput =$ "<input type='checkbox' name='#{ removeInputName }' id='#{ removeInputName }' value='true'>"
44
+ @$link.after(@$removeLabel)
45
+ @$link.after(@$removeInput)
46
+ @$link.after(@$hiddenRemoveInput)
26
47
 
27
- @$link.after @$removeInput
28
- @$link.after @$hiddenRemoveInput
29
48
 
30
- constructor: (@name, @value, @config, @object) ->
31
- @$el =$ "<div class='input-#{ @config.type } input-#{ @config.klass } #{ @config.klassName }'>"
49
+ _update_inputs: ->
50
+ @$link.html(@filename).attr('title', @filename).attr('href', @value.url)
51
+
52
+
53
+ _update_state: (@filename=null) ->
54
+ @$input.val('')
55
+ @$removeInput.prop('checked', false)
32
56
 
33
- # NOTE: carrierwave filename workaround
34
- @filename = null
35
57
  if @value.url
36
58
  @filename = _last(@value.url.split('/'))
37
- if @filename == '_old_' then @filename = null
59
+ if @filename == '_old_' then @filename = null # carrierwave filename workaround
60
+
61
+ if @filename
62
+ @$el.removeClass('empty')
63
+ @_update_inputs()
64
+ else
65
+ @$el.addClass('empty')
38
66
 
39
- @_addLabel()
40
- @_addInput()
41
- @_addRemoveCheckbox()
42
67
 
43
- return this
68
+ # PUBLIC ================================================
69
+
70
+ # when no file uploaded and no file selected, send remove flag so
71
+ # carrierwave does not catch _old_ value
72
+ isEmpty: ->
73
+ ( ! @$input.get()[0].files[0] && ! @filename )
74
+
44
75
 
45
- removeName: -> @name.reverse().replace('[', '[remove_'.reverse()).reverse()
76
+ removeName: ->
77
+ @name.reverse().replace('[', '[remove_'.reverse()).reverse()
46
78
 
47
- updateValue: (@value) ->
48
- # TODO: this method required to enable version switch for objects history
49
79
 
80
+ updateValue: (@value, @object) ->
81
+ @_update_state()
82
+
83
+
84
+ chr.formInputs['file'] = InputFile
50
85
 
51
- _chrFormInputs['file'] = InputFile
52
86
 
53
87
  # -----------------------------------------------------------------------------
54
88
  # INPUT FILE IMAGE
55
89
  # -----------------------------------------------------------------------------
90
+ # Config options:
91
+ # thumbnail(object) - method that returns thumbnail for input
92
+ # -----------------------------------------------------------------------------
56
93
  class @InputFileImage extends InputFile
57
- _addInput: ->
58
- @$el.addClass 'empty'
59
- if @filename
60
- @$link =$ "<a href='#{ @value.url }' target='_blank' title='#{ @filename }'>#{ @filename }</a>"
61
- @$el.append @$link
94
+ _add_input: ->
95
+ @$link =$ "<a href='#' target='_blank' title=''></a>"
96
+ @$el.append @$link
62
97
 
63
- thumbnailImageUrl = @value.url
64
- thumbnailImage = @value[@config.thumbnailFieldName]
98
+ @$thumb =$ "<img src='' />"
99
+ @$el.append @$thumb
65
100
 
66
- if thumbnailImage
67
- thumbnailImageUrl = thumbnailImage.url
101
+ @$input =$ "<input type='file' name='#{ @name }' id='#{ @name }' />"
102
+ @$el.append @$input
68
103
 
69
- @$thumb =$ "<img src='#{ thumbnailImageUrl }' />"
70
- @$el.append @$thumb
104
+ @_add_remove_checkbox()
71
105
 
72
- @$el.removeClass 'empty'
73
106
 
74
- @$input =$ "<input type='file' name='#{ @name }' id='#{ @name }' />"
75
- @$el.append @$input
107
+ _update_inputs: ->
108
+ @$link.html(@filename).attr('title', @filename).attr('href', @value.url)
109
+ image_thumb_url = if @config.thumbnail then @config.thumbnail(@object) else @value.url
110
+ @$thumb.attr('src', image_thumb_url).attr('alt', @filename)
76
111
 
77
112
 
78
- _chrFormInputs['image'] = InputFileImage
113
+ chr.formInputs['image'] = InputFileImage
79
114
 
80
115
 
81
116