chr 0.2.1 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
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