drg_cms 0.5.52.16 → 0.6.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (133) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/drg_cms/drg_cms.js +446 -144
  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 +625 -243
  6. data/app/assets/stylesheets/drg_cms/jstree.css +6 -12
  7. data/app/assets/stylesheets/drg_cms/select-multiple.css +18 -12
  8. data/app/assets/stylesheets/drg_cms_cms.css +1 -1
  9. data/app/controllers/cmsedit_controller.rb +536 -331
  10. data/app/controllers/dc_application_controller.rb +380 -117
  11. data/app/controllers/dc_common_controller.rb +105 -14
  12. data/app/{controllers → controls}/browse_models_control.rb +0 -0
  13. data/app/controls/dc_help_control.rb +126 -0
  14. data/app/{controllers → controls}/dc_page_control.rb +24 -8
  15. data/app/controls/dc_poll_result_control.rb +88 -0
  16. data/app/controls/dc_report.rb +225 -0
  17. data/app/{controllers → controls}/design_element_settings_control.rb +0 -0
  18. data/app/forms/all_options.yml +50 -9
  19. data/app/forms/cms_menu.yml +28 -18
  20. data/app/forms/dc_ad.yml +11 -22
  21. data/app/forms/dc_big_table.yml +1 -0
  22. data/app/forms/dc_big_table_value.yml +1 -0
  23. data/app/forms/dc_category.yml +2 -1
  24. data/app/forms/dc_design.yml +20 -16
  25. data/app/forms/dc_filter.yml +3 -6
  26. data/app/forms/dc_help_1.yml +109 -0
  27. data/app/forms/dc_journal.yml +3 -1
  28. data/app/forms/dc_json_ld.yml +59 -0
  29. data/app/forms/dc_key_value.yml +32 -0
  30. data/app/forms/dc_link.yml +1 -1
  31. data/app/forms/dc_menu.yml +2 -0
  32. data/app/forms/dc_menu_item.yml +2 -0
  33. data/app/forms/dc_page.yml +3 -5
  34. data/app/forms/dc_part.yml +1 -0
  35. data/app/forms/dc_piece.yml +1 -0
  36. data/app/forms/dc_poll.yml +19 -9
  37. data/app/forms/dc_poll_item.yml +2 -1
  38. data/app/forms/dc_poll_result.yml +83 -0
  39. data/app/forms/dc_poll_result_export.yml +35 -0
  40. data/app/forms/dc_seo.yml +33 -0
  41. data/app/forms/dc_simple_menu.yml +2 -0
  42. data/app/forms/dc_site.yml +4 -12
  43. data/app/forms/dc_user.yml +27 -11
  44. data/app/forms/dc_user_role.yml +3 -0
  45. data/app/forms/json_ld_schema.yml +168 -0
  46. data/app/helpers/cms_common_helper.rb +376 -0
  47. data/app/helpers/cms_edit_helper.rb +506 -0
  48. data/app/helpers/cms_helper.rb +268 -0
  49. data/app/helpers/cms_index_helper.rb +576 -0
  50. data/app/helpers/dc_application_helper.rb +183 -271
  51. data/app/models/concerns/dc_page_concern.rb +40 -6
  52. data/app/models/concerns/dc_policy_rule_concern.rb +20 -8
  53. data/app/models/concerns/dc_seo_concern.rb +66 -0
  54. data/app/models/concerns/dc_site_concern.rb +67 -44
  55. data/app/models/concerns/dc_user_concern.rb +62 -21
  56. data/app/models/dc_design.rb +30 -18
  57. data/app/models/dc_filter.rb +22 -13
  58. data/app/models/dc_json_ld.rb +152 -0
  59. data/app/models/dc_key_value.rb +48 -0
  60. data/app/models/dc_key_value_store.rb +1 -0
  61. data/app/models/dc_memory.rb +8 -1
  62. data/app/models/dc_page.rb +0 -1
  63. data/app/models/dc_permission.rb +49 -9
  64. data/app/models/dc_policy.rb +25 -14
  65. data/app/models/dc_policy_role.rb +22 -11
  66. data/app/models/dc_poll.rb +39 -19
  67. data/app/models/{drgcms_form_fields/drgcms_form_fields.rb → dc_poll_result.rb} +23 -2
  68. data/app/models/dc_temp.rb +140 -0
  69. data/app/models/dc_user_role.rb +2 -2
  70. data/app/models/drgcms_form_fields.rb +14 -6
  71. data/app/models/drgcms_form_fields/action.rb +61 -0
  72. data/app/models/drgcms_form_fields/check_box.rb +3 -0
  73. data/app/models/drgcms_form_fields/comment.rb +8 -4
  74. data/app/models/drgcms_form_fields/date_picker.rb +11 -9
  75. data/app/models/drgcms_form_fields/date_select.rb +1 -1
  76. data/app/models/drgcms_form_fields/{date_time_picker.rb → datetime_picker.rb} +12 -10
  77. data/app/models/drgcms_form_fields/datetime_select.rb +1 -1
  78. data/app/models/drgcms_form_fields/drgcms_field.rb +55 -9
  79. data/app/models/drgcms_form_fields/embedded.rb +26 -16
  80. data/app/models/drgcms_form_fields/file_field.rb +52 -0
  81. data/app/models/drgcms_form_fields/file_select.rb +2 -2
  82. data/app/models/drgcms_form_fields/hash_field.rb +90 -0
  83. data/app/models/drgcms_form_fields/hidden_field.rb +1 -1
  84. data/app/models/drgcms_form_fields/html_field.rb +1 -1
  85. data/app/models/drgcms_form_fields/link_to.rb +2 -2
  86. data/app/models/drgcms_form_fields/method.rb +66 -0
  87. data/app/models/drgcms_form_fields/multitext_autocomplete.rb +23 -14
  88. data/app/models/drgcms_form_fields/number_field.rb +15 -6
  89. data/app/models/drgcms_form_fields/radio.rb +96 -0
  90. data/app/models/drgcms_form_fields/readonly.rb +2 -2
  91. data/app/models/drgcms_form_fields/select.rb +92 -29
  92. data/app/models/drgcms_form_fields/text_area.rb +1 -1
  93. data/app/models/drgcms_form_fields/text_autocomplete.rb +29 -17
  94. data/app/models/drgcms_form_fields/text_field.rb +1 -1
  95. data/app/models/drgcms_form_fields/text_with_select.rb +6 -3
  96. data/app/models/drgcms_form_fields/tree_select.rb +29 -10
  97. data/app/{helpers → renderers}/dc_ad_renderer.rb +0 -0
  98. data/app/{helpers → renderers}/dc_big_menu_renderer.rb +1 -0
  99. data/app/{helpers → renderers}/dc_captcha_renderer.rb +0 -0
  100. data/app/{helpers → renderers}/dc_common_renderer.rb +0 -0
  101. data/app/{helpers → renderers}/dc_gallery_renderer.rb +1 -0
  102. data/app/{helpers → renderers}/dc_menu_renderer.rb +11 -4
  103. data/app/{helpers → renderers}/dc_page_renderer.rb +1 -0
  104. data/app/{helpers → renderers}/dc_part_renderer.rb +5 -4
  105. data/app/{helpers → renderers}/dc_piece_renderer.rb +1 -1
  106. data/app/{helpers → renderers}/dc_poll_renderer.rb +84 -48
  107. data/app/{helpers → renderers}/dc_renderer.rb +1 -0
  108. data/app/{helpers → renderers}/dc_simple_menu_renderer.rb +1 -0
  109. data/app/views/cmsedit/{remove_edit_stuff.js.erb → __remove_edit_stuff.js.erb} +0 -0
  110. data/app/views/cmsedit/{show.html.erb → __show.html.erb} +0 -0
  111. data/app/views/cmsedit/_edit_stuff.html.erb +4 -25
  112. data/app/views/cmsedit/_form.html.erb +4 -3
  113. data/app/views/cmsedit/_result.html.erb +2 -3
  114. data/app/views/cmsedit/edit.html.erb +4 -1
  115. data/app/views/cmsedit/index.html.erb +7 -1
  116. data/app/views/cmsedit/new.html.erb +3 -1
  117. data/app/views/dc_common/_help.html.erb +8 -0
  118. data/app/views/layouts/models.html.erb +2 -1
  119. data/config/locales/drgcms_en.yml +26 -3
  120. data/config/locales/drgcms_sl.yml +31 -5
  121. data/config/locales/models_en.yml +66 -18
  122. data/config/locales/models_sl.yml +71 -20
  123. data/drg_cms.gemspec +3 -3
  124. data/lib/drg_cms.rb +63 -1
  125. data/lib/drg_cms/version.rb +2 -2
  126. data/lib/generators/new_drg_form/new_drg_form_generator.rb +9 -2
  127. data/lib/tasks/database.rake +6 -56
  128. metadata +81 -63
  129. data/app/assets/stylesheets/drg_cms/__jquery-ui.css +0 -339
  130. data/app/helpers/application_helper.rb +0 -2
  131. data/app/helpers/cmsedit_helper.rb +0 -885
  132. data/app/models/dc_dummy.rb +0 -102
  133. data/test/fixtures/drg_cms_test_data.rb +0 -87
@@ -1,6 +1,5 @@
1
- #coding: utf-8
2
1
  #--
3
- # Copyright (c) 2012-2013 Damjan Rems
2
+ # Copyright (c) 2012+ Damjan Rems
4
3
  #
5
4
  # Permission is hereby granted, free of charge, to any person obtaining
6
5
  # a copy of this software and associated documentation files (the
@@ -45,7 +44,12 @@ layout false
45
44
  # JSON array [label, value, id] of first 20 documents that confirm to query.
46
45
  ########################################################################
47
46
  def autocomplete
48
- # return '' unless session[:edit_mode] > 0 #
47
+ # table parameter must be defined. If not, get it from search parameter
48
+ if params['table'].nil? and params['search'].match(/\./)
49
+ name = params['search'].split('.').first
50
+ params['table'] = name.underscore
51
+ end
52
+
49
53
  return render plain: t('drgcms.not_authorized') unless dc_user_can(DcPermission::CAN_VIEW)
50
54
  # TODO Double check if previous line works as it should.
51
55
  table = params['table'].classify.constantize
@@ -55,7 +59,7 @@ def autocomplete
55
59
  a = if params['search'].match(/\./)
56
60
  name, method = params['search'].split('.')
57
61
  table.send(method, params['input']).inject([]) do |r,v|
58
- r << { label: v[0], value: v[0], id: v[1].to_s }
62
+ r << { label: v[0], value: v[0], id: (v[1] || v[0]).to_s }
59
63
  end
60
64
  # simply search which will search and return field_name defined in params['search']
61
65
  else
@@ -64,7 +68,7 @@ def autocomplete
64
68
  end
65
69
  end
66
70
 
67
- render inline: a.to_json, formats: 'js'
71
+ render plain: a.to_json
68
72
  end
69
73
 
70
74
  ########################################################################
@@ -88,13 +92,24 @@ end
88
92
  ##########################################################################
89
93
  def toggle_edit_mode
90
94
  session[:edit_mode] ||= 0
91
- # called without logged in
92
- if session[:edit_mode] < 1
93
- dc_render_404
94
- else
95
- session[:edit_mode] = (session[:edit_mode] == 1) ? 2 : 1
96
- redirect_to params[:return_to]
95
+ # error when not logged in
96
+ return dc_render_404 if session[:edit_mode] < 1
97
+ # if return_to_ypos parameter is present it will forward it and thus scroll to
98
+ # aproximate position it was when toggle was clicked
99
+ session[:edit_mode] = (session[:edit_mode] == 1) ? 2 : 1
100
+ uri = Rack::Utils.parse_nested_query(request.url)
101
+ # it parses only on & so first (return_to) parameter also contains url
102
+ url = uri.first.last
103
+ if (i = url.index('return_to_ypos')).to_i > 0
104
+ url = url[0,i-1]
105
+ end
106
+ # offset CMS menu
107
+ if (ypos = uri['return_to_ypos'].to_i) > 0
108
+ ypos += session[:edit_mode] == 2 ? 250 : -250
97
109
  end
110
+ url << (url.match(/\?/) ? '&' : '?')
111
+ url << "return_to_ypos=#{ypos}"
112
+ redirect_to url
98
113
  end
99
114
 
100
115
  ####################################################################
@@ -109,6 +124,8 @@ def process_login
109
124
  if user and user.authenticate(params[:record][:password])
110
125
  fill_login_data(user, params[:record][:remember_me].to_i == 1)
111
126
  return redirect_to params[:return_to] || '/'
127
+ else
128
+ clear_login_data # on the safe side
112
129
  end
113
130
  end
114
131
  flash[:error] = t('drgcms.invalid_username')
@@ -133,7 +150,6 @@ def login
133
150
  if user and user.active
134
151
  fill_login_data(user, true)
135
152
  return redirect_to params[:return_to]
136
-
137
153
  else
138
154
  clear_login_data # on the safe side
139
155
  end
@@ -149,7 +165,7 @@ end
149
165
  def restore_from_journal
150
166
  # Only administrators can perform this operation
151
167
  unless dc_user_has_role('admin')
152
- return render inline: { 'msg_info' => (t ('drgcms.not_authorized')) }.to_json, formats: 'js'
168
+ return render plain: { 'msg_info' => (t ('drgcms.not_authorized')) }.to_json
153
169
  end
154
170
  # selected fields to hash
155
171
  restore = {}
@@ -178,7 +194,7 @@ def restore_from_journal
178
194
  # TODO Error checking
179
195
  { 'msg_info' => (t ('drgcms.dc_journal.restored')) }
180
196
  end
181
- render inline: result.to_json, formats: 'js'
197
+ render plain: result.to_json
182
198
  end
183
199
 
184
200
  ########################################################################
@@ -236,8 +252,83 @@ def paste_clipboard
236
252
  dc_render_ajax(div: 'result', value: result )
237
253
  end
238
254
 
255
+ ########################################################################
256
+ # Will add new json_ld element with blank structure into dc_json_ld field on a
257
+ # document.
258
+ ########################################################################
259
+ def add_json_ld_schema
260
+ edited_document = DcJsonLd.find_document_by_ids(params[:table], params[:ids])
261
+ yaml = YAML.load_file( dc_find_form_file('json_ld_schema') )
262
+ schema_data = yaml[params[:schema]]
263
+ # Existing document
264
+ if edited_document.dc_json_lds.find_by(type: "@#{params[:schema]}")
265
+ return render json: {'msg_error' => t('helpers.help.dc_json_ld.add_error', schema: params[:schema] ) }
266
+ else
267
+ add_empty_json_ld_schema(edited_document, schema_data, params[:schema], params[:schema], yaml)
268
+ end
269
+ render json: {'reload_' => 1}
270
+ end
271
+
272
+ ########################################################################
273
+ # Will provide help data
274
+ ########################################################################
275
+ def help
276
+ form_name = params[:form_name] || params[:table]
277
+ @form = form_name ? YAML.load_file(dc_find_form_file(form_name)) : {}
278
+ return render json: {} if @form.nil?
279
+
280
+ help_file_name = @form['help'] || @form['extend'] || params[:form_name] || params[:table]
281
+ help_file_name = find_help_file(help_file_name)
282
+ @help = YAML.load_file(help_file_name) if help_file_name
283
+ # no auto generated help on index action
284
+ return render json: {} if params[:type] == 'index' && @help.nil?
285
+
286
+ render json: { popup: render_to_string(partial: 'help') }
287
+ end
288
+
239
289
  protected
240
290
 
291
+ ########################################################################
292
+ # Will search for help file and return it's path if found
293
+ ########################################################################
294
+ def find_help_file(help_file_name)
295
+ file_name = nil
296
+ DrgCms.paths(:forms).reverse.each do |path|
297
+ f = "#{path}/help/#{help_file_name}.#{I18n.locale}"
298
+ file_name = f and break if File.exist?(f)
299
+ end
300
+ file_name
301
+ end
302
+
303
+ ########################################################################
304
+ # Subroutine of add_json_ld_schema for adding one element
305
+ ########################################################################
306
+ def add_empty_json_ld_schema(edited_document, schema, schema_name, schema_type, yaml) #:nodoc
307
+ data = {}
308
+ doc = DcJsonLd.new
309
+ doc.name = schema_name
310
+ doc.type = schema_type
311
+
312
+ edited_document.dc_json_lds << doc
313
+ schema.each do |element_name, element|
314
+ next if element_name == 'level' # skip level element
315
+ if yaml[element['type']]
316
+ if element['n'].to_s == '1'
317
+ # single element
318
+ doc_1 = yaml[element['type'] ]
319
+ data[element_name] = doc_1
320
+ else
321
+ # array
322
+ add_empty_json_ld_schema(doc, yaml[element['type']], element_name, element['type'], yaml)
323
+ end
324
+ else
325
+ data[element_name] = element['text']
326
+ end
327
+ end
328
+ doc.data = data.to_yaml
329
+ doc.save
330
+ end
331
+
241
332
  ########################################################################
242
333
  # Update some anomalies in json data on paste_clipboard action.
243
334
  ########################################################################
@@ -0,0 +1,126 @@
1
+ #--
2
+ # Copyright (c) 2021+ 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
+
24
+ ######################################################################
25
+ # Controls for creating help files
26
+ ######################################################################
27
+ module DcHelpControl
28
+
29
+ ######################################################################
30
+ # Will fill dc_temp with help documents found in a defined project directory.
31
+ ######################################################################
32
+ def project_refresh
33
+ DcTemp.clear(temp_key)
34
+ if params[:record][:select_project].present?
35
+ # far less complicated if saved to session
36
+ session[:help_project] = params[:record][:select_project]
37
+ session[:help_lang] = params[:record][:lang_1]
38
+ help_dir_name = "#{session[:help_project]}/help/"
39
+ # create help directory if not yet exists
40
+ FileUtils.mkdir(help_dir_name) unless File.exist?(help_dir_name)
41
+ Dir["#{help_dir_name}*"].each do |file_name|
42
+ lang = File.extname(file_name).sub('.','')
43
+ next unless lang == session[:help_lang]
44
+
45
+ DcTemp.new(key: temp_key,
46
+ project: session[:help_project],
47
+ form_name: File.basename(file_name,'.*'),
48
+ lang: lang,
49
+ updated_at: File.mtime(file_name)).save
50
+ end
51
+ end
52
+ render json: { url: url_for(controller: :cmsedit, table: :dc_temp, form_name: :dc_help_1) }
53
+ end
54
+
55
+ ######################################################################
56
+ # Will populate fields with default values
57
+ ######################################################################
58
+ def dc_new_record
59
+ @record.project = session[:help_project]
60
+ @record.lang = session[:help_lang]
61
+ end
62
+
63
+ ######################################################################
64
+ # Will read data from help file
65
+ ######################################################################
66
+ def dc_before_edit
67
+ file_name = "#{session[:help_project]}/help/#{@record.form_name}.#{session[:help_lang]}"
68
+ data = YAML.load_file(file_name)
69
+ @record.index = data['index']
70
+ @record.form = data['form']
71
+ flash[:warning] = "Use only in development!" unless Rails.env.development?
72
+ end
73
+
74
+ ######################################################################
75
+ # Will save data to help file
76
+ ######################################################################
77
+ def dc_before_save
78
+ rec = params[:record]
79
+ file_name = "#{session[:help_project]}/help/#{@record.form_name}.#{@record.lang}"
80
+ data = { 'index' => @record.index, 'form' => @record.form }
81
+ File.write(file_name, data.to_yaml)
82
+ end
83
+
84
+ ######################################################################
85
+ # Will return query to report data
86
+ ######################################################################
87
+ def data_filter
88
+ DcTemp.where(key: temp_key).order_by(order: 1)
89
+ end
90
+
91
+ private
92
+
93
+ ######################################################################
94
+ # Will return choices for select project input field on a form
95
+ ######################################################################
96
+ def self.choices_for_project
97
+ r = DrgCms.paths(:forms).map do |path|
98
+ path = path.to_s
99
+ a = path.split('/')
100
+ project = a[a.size - 3]
101
+ project = if project == 'app'
102
+ a[a.size - 4] + ' : ' + a.last(2).join('/')
103
+ else
104
+ project + ' : ' + a.last
105
+ end
106
+ [project, path]
107
+ end
108
+ [[I18n.t('drgcms.dc_help.project'), nil]] + r.sort
109
+ end
110
+
111
+ ######################################################################
112
+ # Will return choices for selecting help file name, based on forms already
113
+ # present in forms directory.
114
+ ######################################################################
115
+ def self.choices_for_form_name(session)
116
+ Dir["#{session[:help_project]}/*.yml"].map { |file_name| File.basename(file_name,'.*') }.sort
117
+ end
118
+
119
+ ######################################################################
120
+ # Will return temp key for data saved in dc_temp file
121
+ ######################################################################
122
+ def temp_key
123
+ "dc-help-#{session[:user_id]}"
124
+ end
125
+
126
+ end
@@ -31,12 +31,29 @@ module DcPageControl
31
31
  # Called when new empty record is created
32
32
  ######################################################################
33
33
  def dc_new_record()
34
- @record.design_id = params[:design_id] if params[:design_id]
35
- return unless params[:page_id]
36
- #
37
- if page = DcPage.find(params[:page_id])
38
- @record.design_id = page.design_id
39
- @record.menu = page.menu
34
+ # Called from menu. Fill in values, that could be obtained from menu
35
+ if params[:from_menu]
36
+ # find menu and submenu. Menu class is defined in Site.
37
+ menu_a = params[:id].split(';')
38
+ menu = dc_get_site.menu_klass.find(menu_a.shift)
39
+ menu_items_method = "#{dc_get_site.menu_class}_items".underscore
40
+ menu_i = menu.send(menu_items_method).find(menu_a.shift)
41
+ while menu_a.size > 0 do menu_i = menu_i.send(menu_items_method).find(menu_a.shift) end
42
+ # Fill values for form
43
+ @record.subject = menu_i.caption
44
+ @record.dc_site_id = menu.dc_site_id
45
+ @record.menu_id = params[:id]
46
+ # set update_menu on save parameter
47
+ params['p__update_menu'] = '1'
48
+ else
49
+ @record.design_id = params[:design_id] if params[:design_id]
50
+ return unless params[:page_id]
51
+ # inherit some values from currently active page
52
+ if page = DcPage.find(params[:page_id])
53
+ @record.design_id = page.design_id
54
+ @record.menu = page.menu
55
+ @record.dc_site_id = page.dc_site_id
56
+ end
40
57
  end
41
58
  end
42
59
 
@@ -44,8 +61,7 @@ end
44
61
  # Called just after record is saved to DB.
45
62
  ######################################################################
46
63
  def dc_after_save()
47
- if params[:_record] and params[:_record][:_update_menu] == '1'
48
- # menu_class = dc_get_site.menu_class.classify.constantize
64
+ if params.dig(:_record,:_update_menu).to_s == '1'
49
65
  dc_get_site.menu_klass.update_menu_item_link(@record)
50
66
  end
51
67
  end
@@ -0,0 +1,88 @@
1
+ #encoding: utf-8
2
+ #--
3
+ # Copyright (c) 2014+ Damjan Rems
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining
6
+ # a copy of this software and associated documentation files (the
7
+ # "Software"), to deal in the Software without restriction, including
8
+ # without limitation the rights to use, copy, modify, merge, publish,
9
+ # distribute, sublicense, and/or sell copies of the Software, and to
10
+ # permit persons to whom the Software is furnished to do so, subject to
11
+ # the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be
14
+ # included in all copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
+ #++
24
+
25
+ ######################################################################
26
+ # DrgcmsControls for DcPage model.
27
+ ######################################################################
28
+ module DcPollResultControl
29
+
30
+ ######################################################################
31
+ # Filter result data when filter is set
32
+ ######################################################################
33
+ def poll_filter()
34
+ get_query
35
+ end
36
+
37
+ ######################################################################
38
+ # Filter action called. Update url to reflect filter conditions and reload form.
39
+ ######################################################################
40
+ def do_filter
41
+ url = url_for(controller: :cmsedit, action: :index, table: :dc_poll_result,
42
+ 'record[dc_poll_id]' => params[:record][:dc_poll_id],
43
+ 'record[start_date]' => params[:record][:start_date],
44
+ 'record[end_date]' => params[:record][:end_date]
45
+ )
46
+ dc_render_ajax(operation: :url, value: url)
47
+ end
48
+
49
+ ######################################################################
50
+ # Export data to file
51
+ ######################################################################
52
+ def do_export
53
+ c, keys = '', []
54
+ get_query.to_a.each do |doc|
55
+ # ensure, that fields are always in same order
56
+ data = YAML.load(doc.data)
57
+ if c.blank?
58
+ data.each {|k,v| keys << k}
59
+ c << I18n.t('helpers.label.dc_poll_result.created_at') + "\t"
60
+ c << keys.join("\t") + "\n"
61
+ end
62
+ c << doc.created_at.strftime(I18n.t('date.formats.default') ) + "\t"
63
+ keys.each {|k| c << data[k] + "\t"}
64
+ c << "\n"
65
+ end
66
+ File.write(Rails.root.join('public','export.csv'), c)
67
+ dc_render_ajax(operation: :window, value: 'export.csv')
68
+ end
69
+
70
+ private
71
+ ######################################################################
72
+ # Creates query for Poll results
73
+ ######################################################################
74
+ def get_query()
75
+ if params.dig(:record,:dc_poll_id).nil?
76
+ qry = DcPollResult.all
77
+ else
78
+ qry = DcPollResult.where(dc_poll_id: params[:record][:dc_poll_id])
79
+ unless params[:record][:start_date].blank?
80
+ start_date = DrgcmsFormFields::DatePicker.get_data(params,'start_date').beginning_of_day
81
+ end_date = DrgcmsFormFields::DatePicker.get_data(params,'end_date').end_of_day
82
+ qry = qry.and(:created_at.gt => start_date).and(:created_at.lt => end_date)
83
+ end
84
+ end
85
+ qry
86
+ end
87
+
88
+ end