drg_cms 0.6.0.8 → 0.6.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +25 -10
  3. data/app/assets/javascripts/drg_cms/drg_cms.js +208 -81
  4. data/app/assets/stylesheets/drg_cms/drg_cms.css +298 -93
  5. data/app/assets/stylesheets/drg_cms/select-multiple.css +1 -1
  6. data/app/controllers/cmsedit_controller.rb +174 -167
  7. data/app/controllers/dc_application_controller.rb +230 -196
  8. data/app/controllers/dc_common_controller.rb +88 -50
  9. data/app/controls/dc_help_control.rb +138 -0
  10. data/app/controls/dc_report.rb +12 -16
  11. data/app/forms/all_options.yml +14 -5
  12. data/app/forms/cms_menu.yml +7 -1
  13. data/app/forms/dc_big_table.yml +0 -2
  14. data/app/forms/dc_big_table_value.yml +0 -2
  15. data/app/forms/dc_category.yml +2 -1
  16. data/app/forms/dc_design.yml +2 -2
  17. data/app/forms/dc_folder_permission.yml +0 -2
  18. data/app/forms/dc_help_1.yml +110 -0
  19. data/app/forms/dc_journal.yml +3 -1
  20. data/app/forms/dc_json_ld.yml +0 -3
  21. data/app/forms/dc_link.yml +1 -1
  22. data/app/forms/dc_menu.yml +8 -12
  23. data/app/forms/dc_menu_item.yml +2 -3
  24. data/app/forms/dc_page.yml +7 -2
  25. data/app/forms/dc_part.yml +1 -0
  26. data/app/forms/dc_piece.yml +1 -0
  27. data/app/forms/dc_policy.yml +2 -5
  28. data/app/forms/dc_poll.yml +13 -16
  29. data/app/forms/dc_seo.yml +1 -2
  30. data/app/forms/dc_simple_menu.yml +3 -2
  31. data/app/forms/dc_site.yml +5 -8
  32. data/app/forms/dc_user.yml +27 -11
  33. data/app/forms/dc_user_role.yml +3 -0
  34. data/app/helpers/cms_common_helper.rb +68 -4
  35. data/app/helpers/cms_edit_helper.rb +73 -55
  36. data/app/helpers/cms_helper.rb +70 -32
  37. data/app/helpers/cms_index_helper.rb +155 -102
  38. data/app/helpers/dc_application_helper.rb +132 -109
  39. data/app/models/concerns/dc_page_concern.rb +14 -4
  40. data/app/models/concerns/dc_piece_concern.rb +1 -1
  41. data/app/models/concerns/dc_policy_rule_concern.rb +20 -8
  42. data/app/models/concerns/dc_site_concern.rb +56 -44
  43. data/app/models/concerns/dc_user_concern.rb +58 -19
  44. data/app/models/dc_big_table.rb +2 -2
  45. data/app/models/dc_design.rb +29 -19
  46. data/app/models/dc_filter.rb +28 -22
  47. data/app/models/dc_key_value_store.rb +1 -0
  48. data/app/models/dc_permission.rb +19 -9
  49. data/app/models/dc_policy.rb +25 -14
  50. data/app/models/dc_policy_role.rb +22 -11
  51. data/app/models/dc_temp.rb +8 -1
  52. data/app/models/dc_user_role.rb +2 -2
  53. data/app/models/drgcms_form_fields/comment.rb +11 -2
  54. data/app/models/drgcms_form_fields/date_picker.rb +2 -0
  55. data/app/models/drgcms_form_fields/drgcms_field.rb +2 -1
  56. data/app/models/drgcms_form_fields/embedded.rb +9 -10
  57. data/app/models/drgcms_form_fields/file_field.rb +1 -1
  58. data/app/models/drgcms_form_fields/file_select.rb +2 -2
  59. data/app/models/drgcms_form_fields/hash_field.rb +11 -7
  60. data/app/models/drgcms_form_fields/link_to.rb +2 -2
  61. data/app/models/drgcms_form_fields/method.rb +5 -4
  62. data/app/models/drgcms_form_fields/multitext_autocomplete.rb +1 -1
  63. data/app/models/drgcms_form_fields/number_field.rb +4 -3
  64. data/app/models/drgcms_form_fields/readonly.rb +13 -17
  65. data/app/models/drgcms_form_fields/select.rb +24 -25
  66. data/app/models/drgcms_form_fields/text_autocomplete.rb +22 -14
  67. data/app/renderers/dc_page_renderer.rb +7 -6
  68. data/app/renderers/dc_poll_renderer.rb +16 -20
  69. data/app/views/cmsedit/_edit_stuff.html.erb +5 -2
  70. data/app/views/cmsedit/_form.html.erb +3 -2
  71. data/app/views/cmsedit/_result.html.erb +21 -18
  72. data/app/views/cmsedit/edit.html.erb +4 -1
  73. data/app/views/cmsedit/index.html.erb +3 -2
  74. data/app/views/cmsedit/new.html.erb +5 -2
  75. data/app/views/dc_common/_help.html.erb +17 -0
  76. data/app/views/layouts/models.html.erb +2 -1
  77. data/config/locales/drgcms_en.yml +17 -2
  78. data/config/locales/drgcms_sl.yml +20 -2
  79. data/config/locales/models_en.yml +7 -5
  80. data/config/locales/models_sl.yml +12 -9
  81. data/drg_cms.gemspec +16 -16
  82. data/lib/drg_cms/version.rb +1 -1
  83. data/lib/drg_cms.rb +94 -2
  84. metadata +32 -30
  85. data/app/models/__dc_dummy.rb +0 -102
@@ -41,9 +41,10 @@
41
41
  # its control's would be found in model_embedded_controls.rb. By convention module names
42
42
  # are declared in camel case, so our dc_page_controls.rb declares DrgcmsControls::DcPageControls module.
43
43
  #
44
- # Controls (among other) may contain 6 fixed callback methods.
44
+ # Controls (among other) may contain 7 callback methods.
45
45
  # These methods are:
46
46
  # * dc_new_record
47
+ # * dc_dup_record
47
48
  # * dc_before_edit
48
49
  # * dc_before_save
49
50
  # * dc_after_save
@@ -67,7 +68,7 @@
67
68
  # if dc_user_can(DcPermission::CAN_READ)
68
69
  # dc_page.where(created_by: session[:user_id])
69
70
  # else
70
- # flash[:error] = 'You can not perform this operation!'
71
+ # flash[:error] = 'User can not perform this operation!'
71
72
  # nil
72
73
  # end
73
74
  # end
@@ -76,7 +77,6 @@
76
77
  ########################################################################
77
78
  class CmseditController < DcApplicationController
78
79
  before_action :check_authorization, :except => [:login, :logout, :test, :run]
79
- before_action :dc_reload_patches if Rails.env.development?
80
80
  protect_from_forgery with: :null_session, only: Proc.new { |c| c.request.format.json? }
81
81
 
82
82
  layout 'cms'
@@ -88,7 +88,7 @@ def index
88
88
  @form['result_set'] ||= {}
89
89
  redirected = (@form['table'] == 'dc_memory' ? process_in_memory : process_collections)
90
90
  return if redirected
91
- #
91
+
92
92
  call_callback_method(@form['result_set']['footer'] || 'dc_footer')
93
93
  respond_to do |format|
94
94
  format.html { render action: :index }
@@ -108,9 +108,9 @@ end
108
108
  ########################################################################
109
109
  def show
110
110
  find_record
111
+ # before_show callback
111
112
  if (m = callback_method('before_show') )
112
113
  ret = call_callback_method(m)
113
- # Don't do anything if return is false
114
114
  if ret.class == FalseClass
115
115
  @form['readonly'] = nil # must be
116
116
  return index
@@ -148,20 +148,21 @@ def logout
148
148
  end
149
149
 
150
150
  ########################################################################
151
- # Logout action. Used to logout direct from CMS.
152
- #
153
- # Logout can be called directly with url http://site.com/cmsedit/logout
151
+ # Shortcut for setting currently selected site in development. Will search
152
+ # for dc_site document with site name 'test' and set alias_for to site
153
+ # url parameter.
154
154
  ########################################################################
155
155
  def set_test_site
156
156
  # only in development
157
- return dc_render_404 if !Rails.env.development?
157
+ return dc_render_404 unless Rails.env.development?
158
+
158
159
  alias_site = DcSite.find_by(:name => params[:site])
159
160
  return dc_render_404 unless alias_site
161
+
160
162
  # update alias for
161
- site = DcSite.find_by(:name => 'test')
163
+ site = DcSite.find_by(:name => 'test')
162
164
  site.alias_for = params[:site]
163
165
  site.save
164
- # redirect to root
165
166
  redirect_to '/'
166
167
  end
167
168
 
@@ -169,17 +170,17 @@ end
169
170
  # New action.
170
171
  ########################################################################
171
172
  def new
172
- # clear flash messages.
173
+ # clear flash messages.
173
174
  flash[:error] = flash[:warning] = flash[:info] = nil
174
175
  create_new_empty_record
176
+ # before_new callback
175
177
  if (m = callback_method('before_new') )
176
178
  ret = call_callback_method(m)
177
- # Don't do anything if return is false
178
179
  return index if ret.class == FalseClass
179
180
  end
180
181
  table = @tables.last[1] + '.'
181
- # initial values set on page
182
- if cookies[:record] and cookies[:record].size > 0
182
+ # initial values set on page
183
+ if cookies[:record] && cookies[:record].size > 0
183
184
  Marshal.load(cookies[:record]).each do |k,v|
184
185
  k = k.to_s
185
186
  if k.match(table)
@@ -188,15 +189,14 @@ def new
188
189
  end
189
190
  end
190
191
  end
191
- # initial values set in url
192
+ # initial values set in url (params)
192
193
  params.each do |k,v|
193
194
  if k.match(table)
194
195
  field = k.split('.').last
195
196
  @record.send("#{field}=", v) if @record.respond_to?(field)
196
197
  end
197
198
  end
198
- # This is how we set default values for new record
199
- #dc_new_record() if respond_to?('dc_new_record')
199
+ # new_record callback. Set default values for new record
200
200
  if (m = callback_method('new_record') ) then call_callback_method(m) end
201
201
  @parms['action'] = 'create'
202
202
  end
@@ -204,19 +204,21 @@ end
204
204
  ########################################################################
205
205
  # Duplicate embedded document. Since embedded documents are returned differently
206
206
  # then top level document. Subroutine of duplicate_socument.
207
+ #
208
+ #TODO Works for two embedded levels. Dies with third and more levels.
207
209
  ########################################################################
208
210
  def duplicate_embedded(source) #:nodoc:
209
- # TODO Works for two embedded levels. Dies with third and more levels.
210
211
  dest = {}
211
212
  source.each do |attribute_name, value|
212
213
  next if attribute_name == '_id' # don't duplicate _id
214
+
213
215
  if value.class == Array
214
216
  dest[attribute_name] = []
215
217
  value.each do |ar|
216
218
  dest[attribute_name] << duplicate_embedded(ar)
217
219
  end
218
- else
219
- # if duplicate string must be added. Useful for unique attributes
220
+ else
221
+ # if duplicate, string dup is added. For unique fields
220
222
  add_duplicate = params['dup_fields'].to_s.match(attribute_name + ',')
221
223
  dest[attribute_name] = value
222
224
  dest[attribute_name] << ' dup' if add_duplicate
@@ -229,20 +231,23 @@ end
229
231
 
230
232
  ########################################################################
231
233
  # Will create duplicate document of source document. This method is used for
232
- # duplicating document and is called from create action.
234
+ # duplicating document and is subroutine of create action.
233
235
  ########################################################################
234
236
  def duplicate_document(source)
237
+ params['dup_fields'] += ',' if params['dup_fields'] # for easier field matching
235
238
  dest = {}
236
239
  source.attribute_names.each do |attribute_name|
237
240
  next if attribute_name == '_id' # don't duplicate _id
238
- # if duplicate, string must be added. Useful for unique attributes
241
+
242
+ # if duplicate, string dup is added. For unique fields
239
243
  add_duplicate = params['dup_fields'].to_s.match(attribute_name + ',')
240
244
  dest[attribute_name] = source[attribute_name]
241
245
  dest[attribute_name] << ' dup' if add_duplicate
242
246
  end
243
- # embedded documents
247
+ # embedded documents
244
248
  source.embedded_relations.keys.each do |embedded_name|
245
249
  next if source[embedded_name].nil? # it happens
250
+
246
251
  dest[embedded_name] = []
247
252
  source[embedded_name].each do |embedded|
248
253
  dest[embedded_name] << duplicate_embedded(embedded)
@@ -257,42 +262,44 @@ end
257
262
  # Create (or duplicate) action. Action is also used for turning filter on.
258
263
  ########################################################################
259
264
  def create
260
- # abusing create for turning filter on
265
+ # abusing create for turning filter on
261
266
  return index if params[:filter].to_s == 'on'
262
- # not authorized
267
+
268
+ # not authorized
263
269
  unless dc_user_can(DcPermission::CAN_CREATE)
264
270
  flash[:error] = t('drgcms.not_authorized')
265
271
  return index
266
272
  end
267
- #
268
- if params['id'].nil? # create record
269
- # Prevent double form submit
273
+
274
+ # create document
275
+ if params['id'].nil?
276
+ # Prevent double form submit
270
277
  params[:form_time_stamp] = params[:form_time_stamp].to_i
271
278
  session[:form_time_stamp] ||= 0
272
279
  return index if params[:form_time_stamp] <= session[:form_time_stamp]
280
+
273
281
  session[:form_time_stamp] = params[:form_time_stamp]
274
- #
275
282
  create_new_empty_record
276
283
  if save_data
277
284
  flash[:info] = t('drgcms.doc_saved')
278
285
  params[:return_to] = 'index' if params[:commit] == t('drgcms.save&back') # save & back
279
286
  return process_return_to(params[:return_to]) if params[:return_to]
280
287
 
281
- @parms['id'] = @record.id # must be set, for proper update link
282
- params[:id] = @record.id # must be set, for find_record
288
+ @parms['id'] = @record.id # must be set, for proper update link
289
+ params[:id] = @record.id # must be set, for find_record
283
290
  edit
284
291
  else # error
285
292
  return process_return_to(params[:return_to]) if params[:return_to]
293
+
286
294
  render action: :new
287
295
  end
288
296
  else # duplicate record
289
297
  find_record
290
- params['dup_fields'] += ',' if params['dup_fields'] # for easier field matching
291
298
  new_doc = duplicate_document(@record)
292
299
  create_new_empty_record(new_doc)
293
- update_standards()
300
+ if (m = callback_method('dup_record')) then call_callback_method(m) end
301
+ update_standards
294
302
  @record.save!
295
-
296
303
  index
297
304
  end
298
305
  end
@@ -304,7 +311,7 @@ def edit
304
311
  find_record
305
312
  if (m = callback_method('before_edit') )
306
313
  ret = call_callback_method(m)
307
- # Don't do anything if return is false
314
+ # don't do anything if return is false
308
315
  return index if ret.class == FalseClass
309
316
  end
310
317
  @parms['action'] = 'update'
@@ -316,29 +323,25 @@ end
316
323
  ########################################################################
317
324
  def update
318
325
  find_record
319
- # check if record was not updated in mean time
326
+ # check if record was not updated in mean time
320
327
  if @record.respond_to?(:updated_at)
321
328
  if params[:last_updated_at].to_i != @record.updated_at.to_i
322
329
  flash[:error] = t('drgcms.updated_by_other')
323
330
  return render(action: :edit)
324
331
  end
325
332
  end
326
- #
327
- if dc_user_can(DcPermission::CAN_EDIT_ALL) or
328
- ( @record.respond_to?('created_by') and
329
- @record.created_by == session[:user_id] and
330
- dc_user_can(DcPermission::CAN_EDIT) )
331
- #
333
+
334
+ if dc_user_can(DcPermission::CAN_EDIT_ALL) ||
335
+ (@record.respond_to?('created_by') && @record.created_by == session[:user_id] && dc_user_can(DcPermission::CAN_EDIT))
336
+
332
337
  if save_data
333
338
  params[:return_to] = 'index' if params[:commit] == t('drgcms.save&back') # save & back
334
339
  @parms['action'] = 'update'
335
- # Process return_to link
340
+ # Process return_to
336
341
  return process_return_to(params[:return_to]) if params[:return_to]
337
342
  else
338
343
  # do not forget before_edit callback
339
- if m = callback_method('before_edit')
340
- call_callback_method(m)
341
- end
344
+ if m = callback_method('before_edit') then call_callback_method(m) end
342
345
  return render action: :edit
343
346
  end
344
347
  else
@@ -352,7 +355,7 @@ end
352
355
  ########################################################################
353
356
  def destroy
354
357
  find_record
355
- # Which permission is required to delete
358
+ # check permission required to delete
356
359
  permission = if params['operation'].nil?
357
360
  if @record.respond_to?('created_by') # needs can_delete_all if created_by is present and not owner
358
361
  (@record.created_by == session[:user_id]) ? DcPermission::CAN_DELETE : DcPermission::CAN_DELETE_ALL
@@ -367,38 +370,39 @@ def destroy
367
370
  end
368
371
  end
369
372
  ok2delete = dc_user_can(permission)
370
- #
373
+
371
374
  case
372
- # not authorized
375
+ # not authorized
373
376
  when !ok2delete then
374
377
  flash[:error] = t('drgcms.not_authorized')
375
378
  return index
376
-
379
+
380
+ # delete document
377
381
  when params['operation'].nil? then
378
- # Process before delete callback
382
+ # before_delete callback
379
383
  if (m = callback_method('before_delete') )
380
384
  ret = call_callback_method(m)
381
- # Don't do anything if return is false
385
+ # don't do anything if return is false
382
386
  return index if ret.class == FalseClass
383
387
  end
384
- # document deleted
388
+
385
389
  if @record.destroy
386
390
  save_journal(:delete)
387
391
  flash[:info] = t('drgcms.record_deleted')
388
- # Process after delete callback
392
+ # after_delete callback
389
393
  if (m = callback_method('after_delete') )
390
394
  call_callback_method(m)
391
395
  elsif params['after-delete'].to_s.match('return_to')
392
396
  params[:return_to] = params['after-delete']
393
397
  end
394
- # Process return_to link
398
+ # Process return_to link
395
399
  return process_return_to(params[:return_to]) if params[:return_to]
396
400
  else
397
401
  flash[:error] = dc_error_messages_for(@record)
398
402
  end
399
403
  return index
400
404
 
401
- # deaktivate document
405
+ # deactivate document
402
406
  when params['operation'] == 'disable' then
403
407
  if @record.respond_to?('active')
404
408
  @record.active = false
@@ -408,7 +412,7 @@ def destroy
408
412
  flash[:info] = t('drgcms.doc_disabled')
409
413
  end
410
414
 
411
- # reaktivate document
415
+ # reactivate document
412
416
  when params['operation'] == 'enable' then
413
417
  if @record.respond_to?('active')
414
418
  @record.active = true
@@ -418,11 +422,11 @@ def destroy
418
422
  flash[:info] = t('drgcms.doc_enabled')
419
423
  end
420
424
 
421
- # reorder documents
425
+ #TODO reorder documents
422
426
  when params['operation'] == 'reorder' then
423
427
 
424
428
  end
425
- #
429
+
426
430
  @parms['action'] = 'update'
427
431
  render action: :edit
428
432
  end
@@ -498,7 +502,7 @@ def user_has_permission?(permission, collection_name)
498
502
  end
499
503
 
500
504
  ########################################################################
501
- # Merges two forms when current form extends other form. Subroutine of read_drg_cms_form.
505
+ # Merges two forms when current form extends other form. Subroutine of read_drg_form.
502
506
  # With a little help of https://www.ruby-forum.com/topic/142809
503
507
  ########################################################################
504
508
  def forms_merge(hash1, hash2)
@@ -510,8 +514,8 @@ def forms_merge(hash1, hash2)
510
514
  end
511
515
  target[key] = hash2[key] == '/' ? nil : hash2[key]
512
516
  end
513
- # delete keys with nil value
514
- target.delete_if{ |k,v| v.nil? }
517
+ # delete keys with nil value
518
+ target.delete_if { |k, v| v.nil? }
515
519
  end
516
520
 
517
521
  ########################################################################
@@ -521,13 +525,13 @@ end
521
525
  # [Parameters:]
522
526
  # [extend_option] : Value of @form['extend'] option
523
527
  ########################################################################
524
- def extend_drg_cms_form(extend_option)
528
+ def extend_drg_form(extend_option)
525
529
  form_file_name = dc_find_form_file(extend_option)
526
- @form_js << read_js_drg_cms_form(form_file_name)
530
+ @form_js << read_js_drg_form(form_file_name)
527
531
  form = YAML.load_file( form_file_name )
528
532
  @form = forms_merge(form, @form)
529
- # If combined form contains tabs and fields options, merge fields into tabs
530
- if @form['form']['tabs'] and @form['form']['fields']
533
+ # If combined form contains tabs and fields options, merge fields into tabs
534
+ if @form['form']['tabs'] && @form['form']['fields']
531
535
  @form['form']['tabs']['fields'] = @form['form']['fields']
532
536
  @form['form']['fields'] = nil
533
537
  end
@@ -540,54 +544,59 @@ end
540
544
  # [Parameters:]
541
545
  # [include_option] : Value of @form['include'] option
542
546
  ########################################################################
543
- def include_drg_cms_form(include_option)
547
+ def include_drg_form(include_option)
544
548
  includes = include_option.class == Array ? include_option : include_option.split(/\,|\;/)
545
549
  includes.each do |include_file|
546
550
  form_file_name = dc_find_form_file(include_file)
547
- @form_js << read_js_drg_cms_form(form_file_name)
551
+ @form_js << read_js_drg_form(form_file_name)
548
552
  form = YAML.load_file(form_file_name)
549
553
  @form = forms_merge(@form, form)
550
554
  end
551
555
  end
552
556
 
553
557
  ########################################################################
554
- # Will read data from form_file_name.js if it exists.
558
+ # Will read data from form_file_name.js if exists.
555
559
  #
556
560
  # [Parameters:]
557
561
  # [form_file_name] : Physical form filename
558
562
  ########################################################################
559
- def read_js_drg_cms_form(form_file_name)
563
+ def read_js_drg_form(form_file_name)
560
564
  js_form_file_name = form_file_name.sub('.yml','.js')
561
565
  File.read(js_form_file_name) rescue ''
562
566
  end
563
567
 
564
568
  ########################################################################
565
- # Read drgcms form into yaml object. Subroutine of check_authorization.
569
+ # Read DRG form into @form object. Subroutine of check_authorization.
566
570
  ########################################################################
567
- def read_drg_cms_form
571
+ def read_drg_form
568
572
  table_name = decamelize_type(params[:table].strip)
569
573
  @tables = table_name.split(';').inject([]) { |r,v| r << [(v.classify.constantize rescue nil), v] }
570
- # split ids passed when embedded document
574
+
575
+ # split ids passed when embedded document
571
576
  ids = params[:ids].to_s.strip.downcase
572
577
  @ids = ids.split(';').inject([]) { |r,v| r << v }
573
- # form_name defaults to last table specified
578
+
579
+ # form_name defaults to last table specified
574
580
  form_name = params[:form_name] || @tables.last[1]
575
581
  @form_js = ''
576
- # dynamicaly generated form
582
+
583
+ # dynamically generated form
577
584
  @form = if params[:form_name] == 'method'
578
- dc_eval_class_method(params[:form_method], params)
579
- else
580
- form_file_name = dc_find_form_file(form_name)
581
- @form_js = read_js_drg_cms_form(form_file_name)
582
- YAML.load_file(form_file_name)
583
- end
584
- # form includes or extends another form file
585
- include_drg_cms_form(@form['include']) if @form['include']
586
- extend_drg_cms_form(@form['extend']) if @form['extend']
585
+ dc_eval_class_method(params[:form_method], params)
586
+ else
587
+ form_file_name = dc_find_form_file(form_name)
588
+ @form_js = read_js_drg_form(form_file_name)
589
+ YAML.load_file(form_file_name)
590
+ end
591
+
592
+ # form includes or extends another form file
593
+ include_drg_form(@form['include']) if @form['include']
594
+ extend_drg_form(@form['extend']) if @form['extend']
587
595
  @form['script'] = (@form['script'].blank? ? @form_js : @form['script'] + @form_js)
588
- # add readonly key to form if readonly parameter is passed in url
596
+ # add readonly key to form if readonly parameter is passed in url
589
597
  @form['readonly'] = 1 if params['readonly'] #and %w(1 yes true).include?(params['readonly'].to_s.downcase.strip)
590
- # !!!!!! Always use strings for key names since @parms['table'] != @parms[:table]
598
+
599
+ # !!!!!! Always use strings for key names since @parms['table'] != @parms[:table]
591
600
  @parms = { 'table' => table_name, 'ids' => params[:ids], 'form_name' => form_name,
592
601
  'return_to' => params['return_to'], 'edit_only' => params['edit_only'],
593
602
  'readonly' => params['readonly']
@@ -643,7 +652,7 @@ def check_authorization
643
652
  (table.size < 3 or !dc_user_can(DcPermission::CAN_VIEW))
644
653
  return render(action: 'error', locals: { error: t('drgcms.not_authorized')} )
645
654
  end
646
- read_drg_cms_form
655
+ read_drg_form
647
656
  return render( plain: t('drgcms.form_error') ) if @form.nil?
648
657
 
649
658
  # Permissions can be also defined on form
@@ -672,12 +681,12 @@ end
672
681
  ########################################################################
673
682
  # Creates new empty record for new and create action.
674
683
  ########################################################################
675
- def create_new_empty_record(initial_data=nil) #:nodoc:
684
+ def create_new_empty_record(initial_data = nil) #:nodoc:
676
685
  if @tables.size == 1
677
686
  @record = @tables.first[0].new(initial_data)
678
687
  else
679
688
  rec = @tables.first[0].find(@ids.first) # top most record
680
- 1.upto(@tables.size - 2) { |i| rec = rec.send(@tables[i][1].pluralize).find(@ids[i]) } # find embedded childrens by ids
689
+ 1.upto(@tables.size - 2) { |i| rec = rec.send(@tables[i][1].pluralize).find(@ids[i]) } # find embedded children by ids
681
690
  @record = rec.send(@tables.last[1].pluralize).new(initial_data) # new record
682
691
  end
683
692
  end
@@ -689,9 +698,9 @@ def update_standards(record = @record)
689
698
  record.updated_by = session[:user_id] if record.respond_to?('updated_by')
690
699
  if record.new_record?
691
700
  record.created_by = session[:user_id] if record.respond_to?('created_by')
692
- # set this only initialy. Allow to be set to nil on updates. This documents can then belong to all sites
693
- # and will be directly visible only to admins
694
- record.dc_site_id = dc_get_site._id if record.respond_to?('dc_site_id') and record.dc_site_id.nil?
701
+ # set this only initialy. Allow to be set to nil on updates. Document can then belong to all sites
702
+ # and will be directly visible only to admins
703
+ record.dc_site_id = dc_get_site.id if record.respond_to?('dc_site_id') && record.dc_site_id.nil?
695
704
  end
696
705
  end
697
706
 
@@ -703,17 +712,16 @@ end
703
712
  # [changes] Current document changed fields.
704
713
  ########################################################################
705
714
  def save_journal(operation, changes = {})
706
- # return unless session[:save_journal]
707
715
  if operation == :delete
708
- @record.attributes.each {|k,v| changes[k] = v}
709
- # elsif operation == :new
710
- # changes = {}
716
+ @record.attributes.each { |k, v| changes[k] = v }
711
717
  end
712
- #
713
- if (operation != :update) or changes.size > 0
714
- # determine site_id
718
+ changes.except!('created_at', 'updated_at', 'created_by', 'updated_by')
719
+
720
+ if (operation != :update) || changes.size > 0
721
+ # determine site_id
715
722
  site_id = @record.site_id if @record.respond_to?('site_id')
716
- site_id = dc_get_site._id if site_id.nil? and dc_get_site
723
+ site_id = dc_get_site._id if site_id.nil? && dc_get_site
724
+
717
725
  DcJournal.create(site_id: site_id,
718
726
  operation: operation,
719
727
  user_id: session[:user_id],
@@ -731,23 +739,23 @@ end
731
739
  # Returns callback method name or nil if not defined.
732
740
  ########################################################################
733
741
  def callback_method(key) #:nodoc:
734
- data_key = key.gsub('_','-') # data fields translate _ to -
735
- cb = case
742
+ data_key = key.gsub('_', '-') # convert _ to -
743
+ callback = case
736
744
  when params['data'] && params['data'][data_key] then params['data'][data_key]
737
- # if dc_ + key method is present in model then it will be called automatically
745
+ # dc_ + key method is present then call it automatically
738
746
  when @form['form'][key] then @form['form'][key]
739
747
  when respond_to?('dc_' + key) then 'dc_' + key
740
748
  when params[data_key] then params[data_key]
741
749
  else nil
742
750
  end
743
- #
751
+
744
752
  ret = case
745
- when cb.nil? then cb # otherwise there will be errors in next lines
746
- when cb.match('eval ') then cb.sub('eval ','')
747
- when cb.match('return_to ')
748
- params[:return_to] = cb.sub('return_to ','')
753
+ when callback.nil? then callback # otherwise there will be errors in next lines
754
+ when callback.match('eval ') then callback.sub('eval ','')
755
+ when callback.match('return_to ')
756
+ params[:return_to] = callback.sub('return_to ','')
749
757
  return nil
750
- else cb
758
+ else callback
751
759
  end
752
760
  ret
753
761
  end
@@ -786,16 +794,16 @@ end
786
794
 
787
795
  ########################################################################
788
796
  # Since tabs have been introduced on form it is a little more complicated
789
- # to get all edit fields on form. This method does it. Subroutine of save_data.
797
+ # to collect all edit fields on form. This method does it. Subroutine of save_data.
790
798
  ########################################################################
791
- def fields_on_form() #:nodoc:
799
+ def fields_on_form #:nodoc:
792
800
  form_fields = []
793
801
  if @form['form']['fields']
794
- # read only field elements (key is Integer)
795
- @form['form']['fields'].each {|key,options| form_fields << options if key.class == Integer }
802
+ # read only field elements (key is Integer)
803
+ @form['form']['fields'].each { |key, options| form_fields << options if key.class == Integer }
796
804
  else
797
805
  @form['form']['tabs'].keys.each do |tab|
798
- @form['form']['tabs'][tab].each {|key,options| form_fields << options if key.class == Integer }
806
+ @form['form']['tabs'][tab].each { |key, options| form_fields << options if key.class == Integer }
799
807
  end
800
808
  end
801
809
  form_fields
@@ -808,7 +816,7 @@ end
808
816
  def save_data
809
817
  form_fields = fields_on_form()
810
818
  return true if form_fields.size == 0
811
- #
819
+
812
820
  form_fields.each do |v|
813
821
  session[:form_processing] = v['name'] # for debuging
814
822
  next if v['type'].nil? or v['name'].nil? or
@@ -821,20 +829,21 @@ def save_data
821
829
  value = DrgcmsFormFields.const_get(v['type'].camelize).get_data(params, v['name'])
822
830
  @record.send("#{v['name']}=", value)
823
831
  end
824
- # controls callback method
832
+ # before_save callback
825
833
  if (m = callback_method('before_save') )
826
834
  ret = call_callback_method(m)
827
- # dont's save if callback method returns false
835
+ # don't save if callback returns false
828
836
  return false if ret.class == FalseClass
829
837
  end
830
- # save data
838
+
839
+ # save data
831
840
  changes = @record.changes
832
841
  update_standards() if changes.size > 0 # update only if there has been some changes
833
842
  if (saved = @record.save)
834
843
  operation = @record.new_record? ? :new : :update
835
- save_journal(operation, changes)
836
- # callback methods
837
- if (m = callback_method('after_save') ) then call_callback_method(m) end
844
+ save_journal(operation, @record.previous_changes)
845
+ # after_save callback
846
+ if (m = callback_method('after_save') ) then call_callback_method(m) end
838
847
  end
839
848
  saved
840
849
  end
@@ -844,20 +853,18 @@ end
844
853
  # in select_fields and deny_fields
845
854
  ########################################################################
846
855
  def separated_to_symbols(data)
847
- data.chomp.split(',').inject([]) {|r,element| r << element.strip.downcase.to_sym }
856
+ data.chomp.split(',').map { |e| e.strip.downcase.to_sym }
848
857
  end
849
858
 
850
859
  ########################################################################
851
- # Will process select_fields and deny_fields if specified
860
+ # Will process only (select_fields) and without (deny_fields) option
852
861
  ########################################################################
853
862
  def process_select_and_deny_fields
854
- if @form['result_set']['select_fields']
855
- @records = @records.only( separated_to_symbols(@form['result_set']['select_fields']) )
856
- end
857
- # deny fields specified
858
- if @form['result_set']['deny_fields']
859
- @records = @records.without( separated_to_symbols(@form['result_set']['deny_fields']) )
860
- end
863
+ only = @form['result_set']['select_fields'] || @form['result_set']['only']
864
+ @records = @records.only( separated_to_symbols(only) ) if only
865
+
866
+ without = @form['result_set']['deny_fields'] || @form['result_set']['without']
867
+ @records = @records.without( separated_to_symbols(without) ) if without
861
868
  end
862
869
 
863
870
  ########################################################################
@@ -867,18 +874,18 @@ def check_sort_options() #:nodoc:
867
874
  table_name = @tables.first[1]
868
875
  old_sort = session[table_name][:sort].to_s
869
876
  sort, direction = old_sort.split(' ')
870
- # sort is requested
877
+
871
878
  if params['sort']
872
879
  # reverse sort if same selected
873
880
  if params['sort'] == sort
874
881
  direction = (direction == '1') ? '-1' : '1'
875
882
  end
876
- direction ||= 1
883
+ direction ||= '1'
877
884
  sort = params[:sort]
878
885
  session[table_name][:sort] = "#{params['sort']} #{direction}"
879
886
  session[table_name][:page] = 1
880
887
  end
881
- @records.sort( sort => direction.to_i ) if session[table_name][:sort]
888
+ @records.sort( sort => direction.to_i ) if session[table_name][:sort] && @records.class == Mongoid::Criteria
882
889
  params['sort'] = nil # otherwise there is problem with other links
883
890
  end
884
891
 
@@ -921,45 +928,45 @@ def set_session_filter(table_name)
921
928
  return if params[:filter_oper] && params[:filter_field].blank?
922
929
 
923
930
  filter_value = if params[:filter_value].nil?
924
- # NIL indicates that no filtering is needed
931
+ #NIL indicates that no filtering is needed
925
932
  '#NIL'
926
933
  else
927
934
  if params[:filter_value].class == String and params[:filter_value][0] == '@'
928
- # Internal value. Remove leading @ and evaluate expression
935
+ # Internal value. Remove leading @ and evaluate expression
929
936
  expression = DcInternals.get(params[:filter_value])
930
937
  eval(expression) rescue nil
931
938
  else
932
- # No filter when empty
939
+ # No filter when empty
933
940
  params[:filter_value] == '' ? '#NIL' : params[:filter_value]
934
941
  end
935
942
  end
936
- # if filter field parameter is omitted then just set filter value
943
+ # if filter field parameter is omitted then just set filter value
937
944
  session[table_name][:filter] =
938
945
  if params[:filter_field].nil?
939
946
  saved = YAML.load(session[table_name][:filter])
940
947
  saved['value'] = filter_value
941
948
  saved.to_yaml
942
949
  else
943
- # As field defined. Split name and alternative input field
950
+ # as field defined. Split name and alternative input field
944
951
  field = if params[:filter_field].match(' as ')
945
952
  params[:filter_input] = params[:filter_field].split(' as ').last.strip
946
953
  params[:filter_field].split(' as ').first.strip
947
954
  else
948
955
  params[:filter_field]
949
956
  end
950
- #
957
+
951
958
  {'field' => field,
952
959
  'operation' => params[:filter_oper],
953
960
  'value' => filter_value,
954
961
  'input' => params[:filter_input],
955
962
  'table' => table_name }.to_yaml
956
963
  end
957
- # must be. Otherwise kaminari includes parameter on paging
958
- params[:filter] = nil
959
- params[:filter_id] = nil
960
- params[:filter_oper] = nil
961
- params[:filter_input] = nil
962
- params[:filter_field] = nil
964
+ # must be. Otherwise kaminari includes parames on paging links
965
+ params[:filter] = nil
966
+ params[:filter_id] = nil
967
+ params[:filter_oper] = nil
968
+ params[:filter_input] = nil
969
+ params[:filter_field] = nil
963
970
  end
964
971
 
965
972
  ########################################################################
@@ -969,31 +976,27 @@ def check_filter_options() #:nodoc:
969
976
  table_name = @tables.first[1]
970
977
  model = @tables.first[0]
971
978
  session[table_name] ||= {}
972
- # process page
979
+ # page is set
973
980
  session[table_name][:page] = params[:page] if params[:page]
974
- # new filter is applied
981
+ # new filter is applied
975
982
  if params[:filter]
976
983
  set_session_filter(table_name)
977
984
  session[table_name][:page] = 1
978
985
  end
979
- # if data model has field dc_site_id ensure that only documents which belong to the site are selected.
986
+ # if data model has field dc_site_id ensure that only documents which belong to the site are selected.
980
987
  site_id = dc_get_site._id if dc_get_site
981
- # dont't filter site if no dc_site_id field or user is ADMIN
988
+
989
+ # don't filter site if no dc_site_id field or user is ADMIN
982
990
  site_id = nil if !model.method_defined?('dc_site_id') or dc_user_can(DcPermission::CAN_ADMIN)
983
991
  site_id = nil if session[table_name][:filter].to_s.match('dc_site_id')
984
- #
992
+
985
993
  if @records = DcFilter.get_filter(session[table_name][:filter])
986
994
  @records = @records.and(dc_site_id: site_id) if site_id
987
995
  else
988
- @records = if site_id
989
- model.where(dc_site_id: site_id)
990
- else
991
- model
992
- end
996
+ @records = site_id ? model.where(dc_site_id: site_id) : model
993
997
  end
994
- # select only fields or deny fields specified
995
998
  process_select_and_deny_fields
996
- # pagination if required
999
+ # pagination if required
997
1000
  per_page = (@form['result_set']['per_page'] || 30).to_i
998
1001
  @records = @records.page(session[table_name][:page]).per(per_page) if per_page > 0
999
1002
  end
@@ -1002,30 +1005,34 @@ end
1002
1005
  # Process index action for normal collections.
1003
1006
  ########################################################################
1004
1007
  def process_collections #:nodoc
1005
- # If result_set is not defined on form, then it will fail. :return_to should know where to go
1008
+ # If result_set is not defined on form, then it will fail. :return_to should know where to go
1006
1009
  if @form['result_set'].nil?
1007
- process_return_to(params[:return_to] || 'reload')
1010
+ process_return_to(params[:return_to] || 'reload')
1008
1011
  return true
1009
1012
  end
1010
- # for now enable only filtering of top level documents
1013
+ # when result set is evaluated as Rails helper
1014
+ @form['result_set']['type'] ||= 'default'
1015
+ return unless @form['result_set']['type'] == 'default'
1016
+
1017
+ # for now enable only filtering of top level documents
1011
1018
  if @tables.size == 1
1012
1019
  check_filter_options()
1013
1020
  check_sort_options()
1014
1021
  end
1015
- # result set is defined by filter method in control object
1022
+ # result set is defined by filter method in control object
1016
1023
  form_filter = @form['result_set']['filter']
1017
1024
  if form_filter
1018
1025
  if respond_to?(form_filter)
1019
1026
  @records = send(form_filter)
1020
- # something went wrong. flash[] should have explanation.
1027
+ # something went wrong. flash[] should have explanation.
1021
1028
  if @records.class == FalseClass
1022
1029
  @records = []
1023
1030
  render(action: :index)
1024
1031
  return true
1025
1032
  end
1026
1033
  process_select_and_deny_fields
1027
- # pagination but only if not already set
1028
- unless (@form['table'] == 'dc_memory' or @records.options[:limit])
1034
+ # pagination but only if not already set
1035
+ unless (@form['table'] == 'dc_memory' || @records.options[:limit])
1029
1036
  per_page = (@form['result_set']['per_page'] || 30).to_i
1030
1037
  @records = @records.page(params[:page]).per(per_page) if per_page > 0
1031
1038
  end
@@ -1036,10 +1043,10 @@ def process_collections #:nodoc
1036
1043
  if @tables.size > 1
1037
1044
  rec = @tables.first[0].find(@ids.first) # top most document.id
1038
1045
  1.upto(@tables.size - 2) { |i| rec = rec.send(@tables[i][1].pluralize).find(@ids[i]) } # find embedded childrens by ids
1039
- # TO DO. When field name is different then pluralized class name. Not working yet.
1046
+ # TO DO. When field name is different then pluralized class name. Not working yet.
1040
1047
  embedded_field_name = @tables.last[0] ? @tables.last[1].pluralize : @tables.last[1]
1041
1048
  @records = rec.send(embedded_field_name) # current embedded set
1042
- # sort by order if order field is present in model
1049
+ # sort by order if order field is present in model
1043
1050
  if @tables.last[1].classify.constantize.respond_to?(:order)
1044
1051
  @records = @records.order_by('order asc')
1045
1052
  end