drg_cms 0.5.52.12 → 0.6.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (125) hide show
  1. checksums.yaml +5 -5
  2. data/app/assets/javascripts/drg_cms/drg_cms.js +395 -120
  3. data/app/assets/javascripts/drg_cms/jstree.min.js +6 -6
  4. data/app/assets/javascripts/drg_cms_application.js +1 -1
  5. data/app/assets/stylesheets/drg_cms/drg_cms.css +476 -215
  6. data/app/assets/stylesheets/drg_cms/jstree.css +6 -12
  7. data/app/assets/stylesheets/drg_cms/select-multiple.css +19 -13
  8. data/app/assets/stylesheets/drg_cms_cms.css +1 -1
  9. data/app/controllers/cmsedit_controller.rb +474 -233
  10. data/app/controllers/dc_application_controller.rb +264 -41
  11. data/app/controllers/dc_common_controller.rb +75 -63
  12. data/app/{controllers → controls}/browse_models_control.rb +0 -0
  13. data/app/{controllers → controls}/dc_page_control.rb +24 -8
  14. data/app/controls/dc_poll_result_control.rb +88 -0
  15. data/app/controls/dc_report.rb +227 -0
  16. data/app/{controllers → controls}/design_element_settings_control.rb +0 -0
  17. data/app/forms/all_options.yml +70 -12
  18. data/app/forms/cms_menu.yml +26 -17
  19. data/app/forms/dc_ad.yml +11 -22
  20. data/app/forms/dc_big_table.yml +1 -0
  21. data/app/forms/dc_big_table_value.yml +1 -0
  22. data/app/forms/dc_design.yml +19 -16
  23. data/app/forms/dc_filter.yml +3 -6
  24. data/app/forms/dc_gallery.yml +53 -0
  25. data/app/forms/dc_json_ld.yml +59 -0
  26. data/app/forms/dc_key_value.yml +32 -0
  27. data/app/forms/dc_link.yml +16 -10
  28. data/app/forms/dc_menu_item.yml +6 -0
  29. data/app/forms/dc_page.yml +2 -7
  30. data/app/forms/dc_poll.yml +16 -9
  31. data/app/forms/dc_poll_item.yml +2 -1
  32. data/app/forms/dc_poll_result.yml +83 -0
  33. data/app/forms/dc_poll_result_export.yml +35 -0
  34. data/app/forms/dc_removed_url.yml +42 -0
  35. data/app/forms/dc_seo.yml +33 -0
  36. data/app/forms/dc_site.yml +2 -6
  37. data/app/forms/json_ld_schema.yml +168 -0
  38. data/app/helpers/cms_common_helper.rb +311 -0
  39. data/app/helpers/cms_edit_helper.rb +498 -0
  40. data/app/helpers/cms_helper.rb +230 -0
  41. data/app/helpers/cms_index_helper.rb +564 -0
  42. data/app/helpers/dc_application_helper.rb +195 -268
  43. data/app/models/{dc_dummy.rb → __dc_dummy.rb} +0 -0
  44. data/app/models/concerns/dc_page_concern.rb +31 -6
  45. data/app/models/concerns/dc_seo_concern.rb +66 -0
  46. data/app/models/concerns/dc_site_concern.rb +12 -1
  47. data/app/models/concerns/dc_user_concern.rb +5 -3
  48. data/app/models/dc_design.rb +2 -0
  49. data/app/models/dc_filter.rb +37 -20
  50. data/app/models/dc_gallery.rb +64 -0
  51. data/app/models/dc_json_ld.rb +152 -0
  52. data/app/models/dc_key_value.rb +48 -0
  53. data/app/models/dc_link.rb +1 -0
  54. data/app/models/dc_memory.rb +26 -4
  55. data/app/models/dc_page.rb +1 -2
  56. data/app/models/dc_permission.rb +30 -0
  57. data/app/models/dc_poll.rb +39 -19
  58. data/app/models/dc_poll_result.rb +46 -0
  59. data/app/models/dc_removed_url.rb +54 -0
  60. data/app/models/dc_temp.rb +140 -0
  61. data/app/models/drgcms_form_fields.rb +6 -1642
  62. data/app/models/drgcms_form_fields/action.rb +61 -0
  63. data/app/models/drgcms_form_fields/check_box.rb +72 -0
  64. data/app/models/drgcms_form_fields/comment.rb +53 -0
  65. data/app/models/drgcms_form_fields/date_picker.rb +104 -0
  66. data/app/models/drgcms_form_fields/date_select.rb +68 -0
  67. data/app/models/drgcms_form_fields/datetime_picker.rb +89 -0
  68. data/app/models/drgcms_form_fields/datetime_select.rb +73 -0
  69. data/app/models/drgcms_form_fields/drgcms_field.rb +287 -0
  70. data/app/models/drgcms_form_fields/embedded.rb +97 -0
  71. data/app/models/drgcms_form_fields/file_field.rb +52 -0
  72. data/app/models/drgcms_form_fields/file_select.rb +70 -0
  73. data/app/models/drgcms_form_fields/hash_field.rb +86 -0
  74. data/app/models/drgcms_form_fields/hidden_field.rb +52 -0
  75. data/app/models/drgcms_form_fields/html_field.rb +70 -0
  76. data/app/models/drgcms_form_fields/journal_diff.rb +60 -0
  77. data/app/models/drgcms_form_fields/link_to.rb +69 -0
  78. data/app/models/drgcms_form_fields/method.rb +65 -0
  79. data/app/models/drgcms_form_fields/multitext_autocomplete.rb +204 -0
  80. data/app/models/drgcms_form_fields/number_field.rb +92 -0
  81. data/app/models/drgcms_form_fields/password_field.rb +62 -0
  82. data/app/models/drgcms_form_fields/radio.rb +96 -0
  83. data/app/models/drgcms_form_fields/readonly.rb +79 -0
  84. data/app/models/drgcms_form_fields/select.rb +226 -0
  85. data/app/models/drgcms_form_fields/submit_tag.rb +58 -0
  86. data/app/models/drgcms_form_fields/text_area.rb +68 -0
  87. data/app/models/drgcms_form_fields/text_autocomplete.rb +155 -0
  88. data/app/models/drgcms_form_fields/text_field.rb +56 -0
  89. data/app/models/drgcms_form_fields/text_with_select.rb +95 -0
  90. data/app/models/drgcms_form_fields/tree_select.rb +169 -0
  91. data/app/{helpers → renderers}/dc_ad_renderer.rb +0 -0
  92. data/app/{helpers → renderers}/dc_big_menu_renderer.rb +1 -0
  93. data/app/{helpers → renderers}/dc_captcha_renderer.rb +0 -0
  94. data/app/{helpers → renderers}/dc_common_renderer.rb +0 -0
  95. data/app/renderers/dc_gallery_renderer.rb +95 -0
  96. data/app/{helpers → renderers}/dc_menu_renderer.rb +11 -4
  97. data/app/{helpers → renderers}/dc_page_renderer.rb +21 -3
  98. data/app/{helpers → renderers}/dc_part_renderer.rb +5 -4
  99. data/app/{helpers → renderers}/dc_piece_renderer.rb +1 -1
  100. data/app/{helpers → renderers}/dc_poll_renderer.rb +86 -51
  101. data/app/{helpers → renderers}/dc_renderer.rb +1 -0
  102. data/app/{helpers → renderers}/dc_simple_menu_renderer.rb +1 -0
  103. data/app/views/cmsedit/{remove_edit_stuff.js.erb → __remove_edit_stuff.js.erb} +0 -0
  104. data/app/views/cmsedit/{show.html.erb → __show.html.erb} +0 -0
  105. data/app/views/cmsedit/_edit_stuff.html.erb +4 -25
  106. data/app/views/cmsedit/_form.html.erb +4 -3
  107. data/app/views/cmsedit/_result.html.erb +2 -3
  108. data/app/views/cmsedit/edit.html.erb +2 -1
  109. data/app/views/cmsedit/index.html.erb +6 -1
  110. data/app/views/cmsedit/new.html.erb +1 -1
  111. data/config/locales/drgcms_en.yml +15 -3
  112. data/config/locales/drgcms_sl.yml +18 -6
  113. data/config/locales/models_en.yml +103 -19
  114. data/config/locales/models_sl.yml +102 -17
  115. data/drg_cms.gemspec +3 -3
  116. data/lib/drg_cms.rb +6 -2
  117. data/lib/drg_cms/version.rb +2 -2
  118. data/lib/generators/new_drg_form/new_drg_form_generator.rb +9 -2
  119. data/lib/tasks/database.rake +6 -56
  120. data/lib/tasks/dc_cleanup.rake +1 -1
  121. metadata +106 -61
  122. data/app/assets/stylesheets/drg_cms/__jquery-ui.css +0 -339
  123. data/app/helpers/application_helper.rb +0 -2
  124. data/app/helpers/cmsedit_helper.rb +0 -844
  125. data/test/fixtures/drg_cms_test_data.rb +0 -87
@@ -0,0 +1,79 @@
1
+ #--
2
+ # Copyright (c) 2012+ Damjan Rems
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #++
23
+ module DrgcmsFormFields
24
+
25
+ ###########################################################################
26
+ # Implementation of readonly DRG CMS form field.
27
+ #
28
+ # Readonly field value is just painted on form.
29
+ #
30
+ # ===Form options:
31
+ # * +name:+ field name
32
+ # * +type:+ readonly
33
+ # * +eval:+ value will be provided by evaluating expression. Usually dc_name4_id helper
34
+ # can be used to get value. Example: dc_name4_id,model_name_in_lower_case,field_name
35
+ #
36
+ # * +readonly:+ yes (can be applied to any field type)
37
+ #
38
+ # Form example:
39
+ # 10:
40
+ # name: user
41
+ # type: readonly
42
+ # html:
43
+ # size: 50
44
+ # 20:
45
+ # name: created_by
46
+ # type: readonly
47
+ # eval: dc_name4_id,dc_user,name
48
+ ###########################################################################
49
+ class Readonly < DrgcmsField
50
+
51
+ ###########################################################################
52
+ # Render readonly field html code
53
+ ###########################################################################
54
+ def render
55
+ @html << @parent.hidden_field('record', @yaml['name']) # retain field as hidden field
56
+ @html << '<div class="dc-readonly">'
57
+
58
+ @html << if @yaml['eval']
59
+ if @yaml['eval'].match('dc_name4_id')
60
+ a = @yaml['eval'].split(',')
61
+ if a.size == 3
62
+ @parent.dc_name4_id(a[1], a[2], nil, @record[ @yaml['name'] ])
63
+ else
64
+ @parent.dc_name4_id(a[1], a[2], a[3], @record[ @yaml['name'] ])
65
+ end
66
+
67
+ # @parent.dc_name4_id(a[1], a[2], @record[ @yaml['name'] ])
68
+ else
69
+ eval( "#{@yaml['eval']} '#{@record.send(@yaml['name'])}'")
70
+ end
71
+ else
72
+ @parent.dc_format_value(@record.send(@yaml['name']),@yaml['format'])
73
+ end
74
+ @html << '</div>'
75
+ self
76
+ end
77
+ end
78
+
79
+ end
@@ -0,0 +1,226 @@
1
+ #--
2
+ # Copyright (c) 2012+ Damjan Rems
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #++
23
+ module DrgcmsFormFields
24
+
25
+ ###########################################################################
26
+ # Implementation of select DRG CMS form field.
27
+ #
28
+ # ===Form options:
29
+ # * +name:+ field name (required)
30
+ # * +type:+ select (required)
31
+ # * +choices:+ Values for choices separated by comma. Values can also be specified like description:value.
32
+ # In the example description will be shown to user, but value will be saved to document.
33
+ # choices: 'OK:0,Ready:1,Error:2'
34
+ # choices: Ruby,Pyton,PHP
35
+ # * +eval:+ Choices will be provided by evaluating expression
36
+ # * eval: dc_choices4('model_name','description_field_name','_id'); dc_choices4 helper will provide data for select field.
37
+ # * eval: ModelName.choices4_field; ModelName class will define method choices4_field which
38
+ # will provide data for select field.
39
+ # * collection_name.search_field_name.method_name; When searching is more complex custom search
40
+ # method may be defined in CollectionName model which will provide result set for search.
41
+ # * If choices or eval is not defined choices will be provided from translation helpers. For example:
42
+ # Collection has field status choices for field may be provided by en.helpers.model_name.choices4_status
43
+ # entry of english translation. English is of course default translation. If you provide translations in
44
+ # your local language then select choices will be localized.
45
+ # en.helpers.model_name.choices4_status: 'OK:0,Ready:1,Error:2'
46
+ # sl.helpers.model_name.choices4_status: 'V redu:0,Pripravljen:1,Napaka:2'
47
+ # * +depend:+ Select options may depend on a value in some other field. If depend option is specified
48
+ # then chices must be provided by class method and defined in eval option.
49
+ # * +html:+ html options which apply to select field (optional)
50
+ #
51
+ # Form example:
52
+ # 30:
53
+ # name: type
54
+ # type: select
55
+ # 40:
56
+ # name: parent
57
+ # type: select
58
+ # eval: DcCategory.values_for_parent
59
+ # html:
60
+ # include_blank: true
61
+ # 50:
62
+ # name: company
63
+ # type: select
64
+ # choices: Audi,BMW,Mercedes
65
+ # or
66
+ # choices: helpers.label.model.choices4_field
67
+ # 60:
68
+ # name: type
69
+ # type: select
70
+ # eval: Cars.choices4_type
71
+ # depend: company
72
+ ###########################################################################
73
+ class Select < DrgcmsField
74
+
75
+ ###########################################################################
76
+ # Choices are defined in helper as:
77
+ # helper.label.table_name.choices_for_fieldname or
78
+ # choices4_tablename_fieldname
79
+ ###########################################################################
80
+ def choices_in_helper(helper = nil)
81
+ helper ||= "helpers.label.#{@form['table']}.choices4_#{@yaml['name']}"
82
+ c = t(helper)
83
+ if c.match( 'translation missing' )
84
+ helper = "choices_for_#{@form['table']}_#{@yaml['name']}"
85
+ return "Error. #{helper} not defined" if c.match( 'translation missing' )
86
+ end
87
+ c
88
+ end
89
+
90
+ ###########################################################################
91
+ # Choices are defined by evaluating an expression. This is most common class
92
+ # method defined in a class. eg. SomeClass.get_choices4
93
+ ###########################################################################
94
+ def choices_in_eval(e)
95
+ e.strip!
96
+ if @yaml['depend'].nil?
97
+ method = e.split(/\ |\(/).first
98
+ return eval(e) if respond_to?(method) # id method defined here
99
+ return eval('@parent.'+e) if @parent.respond_to?(method) # is method defined in helpers
100
+ # eval whatever it is there
101
+ eval e
102
+ else
103
+ # add event listener to depend field
104
+ @js << %(
105
+ $(document).ready(function() {
106
+ $('#record_#{@yaml['depend']}').change( function(e) { update_select_depend('record_#{@yaml['name']}', 'record_#{@yaml['depend']}','#{e}');});
107
+ $('#_record_#{@yaml['depend']}').change( function(e) { update_select_depend('record_#{@yaml['name']}', '_record_#{@yaml['depend']}','#{e}');});
108
+ });
109
+ )
110
+ # depend field might be virtual field. It's value should be set in params
111
+ depend_value = @yaml['depend'][0] == '_' ? @parent.params["p_#{@yaml['depend']}"] : @record[@yaml['depend']]
112
+
113
+ e << " '#{depend_value}'"
114
+ eval e
115
+ end
116
+ end
117
+
118
+ ###########################################################################
119
+ # Create choices array for select field.
120
+ ###########################################################################
121
+ def get_choices
122
+ begin
123
+ choices = case
124
+ when @yaml['choices'] then
125
+ @yaml['choices'].match('helpers.') ? choices_in_helper(@yaml['choices']) : @yaml['choices']
126
+ when @yaml['eval'] then
127
+ choices_in_eval(@yaml['eval'])
128
+ else
129
+ choices_in_helper()
130
+ end
131
+ # Convert string to Array
132
+ choices.class == String ?
133
+ choices.chomp.split(',').inject([]) { |r,v| r << (v.match(':') ? v.split(':') : v ) } :
134
+ choices
135
+ rescue Exception => e
136
+ Rails.logger.debug "Error in select eval. #{e.message}\n"
137
+ ['error'] # return empty array when error occures
138
+ end
139
+ end
140
+
141
+ ###########################################################################
142
+ # Will add code to view more data about selected option in a window
143
+ ###########################################################################
144
+ def add_view_code
145
+ return '' if (data = @record.send(@yaml['name'])).blank?
146
+ ar = @yaml['view'].split(/\ |\,/).delete_if {|e| e.blank?}
147
+ table, form_name = *ar
148
+ url = @parent.url_for(controller: :cmsedit, id: data, action: :edit, table: table, form_name: form_name, readonly: true, window_close: 1 )
149
+ icon = @parent.fa_icon('eye')
150
+ %(<span class="dc-window-open" data-url="#{url}">#{icon}</span>)
151
+ end
152
+
153
+ ###########################################################################
154
+ # Return value when readonly is required
155
+ ###########################################################################
156
+ def ro_standard
157
+ value = @record.respond_to?(@yaml['name']) ? @record.send(@yaml['name']) : nil
158
+ return self if value.blank?
159
+
160
+ choices = get_choices()
161
+ if value.class == Array # multiple choices
162
+ html = ''
163
+ value.each do |element|
164
+ choices.each do |choice|
165
+ if choice.to_s == element.to_s
166
+ html << '<br>' if html.size > 0
167
+ html << "#{element.to_s}"
168
+ end
169
+ end
170
+ end
171
+ return super(html)
172
+ else
173
+ choices.each do |choice|
174
+ if choice.class == Array
175
+ return super(choice.first) if choice.last.to_s == value.to_s
176
+ else
177
+ return super(choice) if choice.to_s == value.to_s
178
+ end
179
+ end
180
+ end
181
+ super('')
182
+ end
183
+
184
+ ###########################################################################
185
+ # Render select field html code
186
+ ###########################################################################
187
+ def render
188
+ return ro_standard if @readonly
189
+ set_initial_value('html','selected')
190
+ # separate options and html part
191
+ @yaml['html'].symbolize_keys!
192
+ html_part = {}
193
+ html_part[:class] = @yaml['html'].delete(:class) if @yaml['html'][:class]
194
+ html_part[:id] = @yaml['html'].delete(:id) if @yaml['html'][:id]
195
+ html_part[:style] = @yaml['html'].delete(:style) if @yaml['html'][:style]
196
+ record = record_text_for(@yaml['name'])
197
+ if @yaml['multiple']
198
+ html_part[:multiple] = true
199
+ @html << @parent.select(record, @yaml['name'], get_choices, @yaml['html'], html_part)
200
+ @js << "$('##{record}_#{@yaml['name']}').selectMultiple();"
201
+ else
202
+ @html << @parent.select(record, @yaml['name'], get_choices, @yaml['html'], html_part)
203
+ # add code for view more data
204
+ @html << add_view_code() if @yaml['view']
205
+ end
206
+ self
207
+ end
208
+
209
+ ###########################################################################
210
+ # Return value.
211
+ ###########################################################################
212
+ def self.get_data(params, name)
213
+ if params['record'][name].class == Array
214
+ params['record'][name].delete_if {|e| e.blank? }
215
+ return nil if params['record'][name].size == 0
216
+
217
+ # convert to BSON objects
218
+ is_id = BSON::ObjectId.legal?(params['record'][name].first)
219
+ return params['record'][name].map{ |e| BSON::ObjectId.from_string(e) } if is_id
220
+ return params['record'][name]
221
+ end
222
+ params['record'][name]
223
+ end
224
+
225
+ end
226
+ end
@@ -0,0 +1,58 @@
1
+ #--
2
+ # Copyright (c) 2012+ Damjan Rems
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #++
23
+ module DrgcmsFormFields
24
+
25
+ ###########################################################################
26
+ # Create submit_tag form field. submit_tag form field is mostly used by polls but can
27
+ # be also incorporated in the middle of form.
28
+ #
29
+ # ===Form options:
30
+ # * +type:+ submit_tag (required)
31
+ # * +caption:+ Submit field caption
32
+ # * +icon:+ Icon
33
+ # * +html:+ html options which apply to link_to (optional)
34
+ #
35
+ # Form example:
36
+ # 40:
37
+ # type: submit_tag
38
+ # caption: translate.this
39
+ # icon: check
40
+ ###########################################################################
41
+ class SubmitTag < DrgcmsField
42
+
43
+ ###########################################################################
44
+ # Render submit_tag field html code
45
+ ###########################################################################
46
+ def render
47
+ @yaml['html'] ||= {}
48
+ @yaml['html']['class'] ||= 'dc-submit'
49
+ @yaml['html'].symbolize_keys!
50
+ text = @yaml['caption'] || @yaml['text']
51
+ text = t(@yaml['text']) if text.match(/\./)
52
+
53
+ @html << @parent.submit_tag(text, @yaml['html'])
54
+ self
55
+ end
56
+ end
57
+
58
+ end
@@ -0,0 +1,68 @@
1
+ #--
2
+ # Copyright (c) 2012+ Damjan Rems
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #++
23
+ module DrgcmsFormFields
24
+
25
+ ###########################################################################
26
+ # Implementation of text_area DRG CMS form field.
27
+ #
28
+ # ===Form options:
29
+ # * +type:+ text_area (required)
30
+ # * +name:+ Field name (required)
31
+ # * +html:+ html options which apply to text_area field (optional)
32
+ #
33
+ # Form example:
34
+ # 10:
35
+ # name: css
36
+ # type: text_area
37
+ # html:
38
+ # size: 100x30
39
+ ###########################################################################
40
+ class TextArea < DrgcmsField
41
+
42
+ ###########################################################################
43
+ # Return value for readonly field
44
+ ###########################################################################
45
+ def ro_standard
46
+ value = @record[@yaml['name']]
47
+ @html << "<div class='dc-readonly'>#{value.gsub("\n",'<br>')}</div>" unless value.blank?
48
+ self
49
+ end
50
+
51
+ ###########################################################################
52
+ # Render text_area field html code
53
+ ###########################################################################
54
+ def render
55
+ #return ro_standard if @readonly
56
+ set_initial_value
57
+ #
58
+ # @yaml['html'] ||= {}
59
+ # value_send_as = 'p_' + @yaml['name']
60
+ # @yaml['html']['value'] = @parent.params[value_send_as] if @parent.params[value_send_as]
61
+
62
+ record = record_text_for(@yaml['name'])
63
+ @html << @parent.text_area(record, @yaml['name'], @yaml['html'])
64
+ self
65
+ end
66
+
67
+ end
68
+ end
@@ -0,0 +1,155 @@
1
+ #--
2
+ # Copyright (c) 2012+ Damjan Rems
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #++
23
+ module DrgcmsFormFields
24
+
25
+ ###########################################################################
26
+ # Implementation of text_autocomplete DRG CMS form field.
27
+ #
28
+ # ===Form options:
29
+ # * +name:+ field name (required)
30
+ # * +type:+ text_autocomplete (required)
31
+ # * +table+ Collection (table) name. When defined search must contain field name
32
+ # * +with_new+ Will add an icon for shortcut to add new document to collection
33
+ # * +is_id+ Field value represent value as id. If false, field will use entered value and not value selected with autocomplete. Default is true.
34
+ # * +search:+ Search may consist of three parameters from which are separated either by dot (.)
35
+ # * search_field_name; when table option is defined search must define field name which will be used for search query
36
+ # * collection_name.search_field_name; Same as above except that table options must be ommited.
37
+ # * collection_name.search_field_name.method_name; When searching is more complex custom search
38
+ # method may be defined in CollectionName model which will provide result set for search.
39
+ #
40
+ # Form example:
41
+ # 10:
42
+ # name: user_id
43
+ # type: text_autocomplete
44
+ # search: dc_user.name
45
+ # is_id: false
46
+ # html:
47
+ # size: 30
48
+ ###########################################################################
49
+ class TextAutocomplete < DrgcmsField
50
+
51
+ ###########################################################################
52
+ # Render text_autocomplete field html code
53
+ ###########################################################################
54
+ def render
55
+ # Return descriptive text and put it into input field
56
+ # search field name
57
+ if @yaml['search'].class == Hash
58
+ table = @yaml['search']['table']
59
+ ret_name = @yaml['search']['field']
60
+ method = @yaml['search']['method']
61
+ elsif @yaml['search'].match(/\./)
62
+ table, ret_name, method = @yaml['search'].split('.')
63
+ else
64
+ ret_name = @yaml['search']
65
+ end
66
+ # determine table name
67
+ if @yaml['table']
68
+ table = if @yaml['table'].class == String
69
+ @yaml['table']
70
+ elsif @yaml['table']['eval']
71
+ eval @yaml['table']['eval']
72
+ else
73
+ Rails.logger.error "Field #{ @yaml['name'] }: Invalid table parameter!"
74
+ nil
75
+ end
76
+ end
77
+ return 'Table or field keyword not defined!' unless (table and ret_name)
78
+ # TODO check if table exists
79
+ t = table.classify.constantize
80
+ # find record and return value of field
81
+ value_send_as = 'p_' + @yaml['name']
82
+ value = if @parent.params[value_send_as]
83
+ @parent.params[value_send_as]
84
+ elsif @record and @record[@yaml['name']]
85
+ @record[@yaml['name']]
86
+ end
87
+ # Found value to be written in field. If field is not found write out value.
88
+ if value
89
+ record = t.find(value) unless @yaml['not_id'] # don't if it's is not an id
90
+ value_displayed = record ? record.send(ret_name) : value
91
+ end
92
+ # return if readonly
93
+ return ro_standard(value_displayed) if @readonly
94
+ # Add method back, so autocomplete will know that it must search for method inside class
95
+ ret_name = "#{ret_name}.#{method}" if method
96
+ @yaml['html'] ||= {}
97
+ @yaml['html']['value'] = value_displayed
98
+ @yaml['html']['placeholder'] ||= t('drgcms.search_placeholder') || nil
99
+ #
100
+ _name = '_' + @yaml['name']
101
+ record = record_text_for(@yaml['name'])
102
+ @html << '<span class="dc-text-autocomplete">' + @parent.text_field(record, _name, @yaml['html']) + '<span></span>'
103
+ if @yaml['with_new']
104
+ @html << ' ' +
105
+ @parent.fa_icon('plus-square lg', class: 'in-edit-add', title: t('drgcms.new'),
106
+ style: "vertical-align: top;", 'data-table' => @yaml['with_new'] )
107
+ end
108
+ @html << '</span>' + @parent.hidden_field(record, @yaml['name'], value: value) # actual value will be in hidden field
109
+ # JS stuff
110
+ # allow unselected values on is_id: false option
111
+ not_id = @parent.dc_dont?(@yaml['is_id'], false)
112
+ not_id_code = %(
113
+ if (ui.item == null) {
114
+ $("##{record}_#{@yaml['name']}").val($("##{record}__#{@yaml['name']}").val() );
115
+ return;
116
+ } ) if not_id
117
+ #
118
+ @js << <<EOJS
119
+ $(document).ready(function() {
120
+ $("##{record}_#{_name}").autocomplete( {
121
+ source: function(request, response) {
122
+ $.ajax({
123
+ url: '/dc_common/autocomplete',
124
+ type: "POST",
125
+ dataType: "json",
126
+ data: { input: request.term, table: "#{table}", search: "#{ret_name}" #{(',id: "'+@yaml['id'] + '"') if @yaml['id']} },
127
+ success: function(data) {
128
+ response( $.map( data, function(key) {
129
+ return key;
130
+ }));
131
+ }
132
+ });
133
+ },
134
+ change: function (event, ui) {
135
+ #{not_id_code}
136
+ $("##{record}_#{@yaml['name']}").val(ui.item.id);
137
+
138
+ },
139
+ minLength: 2
140
+ });
141
+ });
142
+ EOJS
143
+
144
+ self
145
+ end
146
+
147
+ ###########################################################################
148
+ # Return value. Return nil if input field is empty
149
+ ###########################################################################
150
+ def self.get_data(params, name)
151
+ params['record']["_#{name}"].blank? ? nil : params['record'][name]
152
+ end
153
+
154
+ end
155
+ end