drg_cms 0.6.1.1.1 → 0.6.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +25 -10
  3. data/app/assets/javascripts/drg_cms/drg_cms.js +99 -29
  4. data/app/assets/stylesheets/drg_cms/drg_cms.css +89 -12
  5. data/app/controllers/dc_application_controller.rb +60 -163
  6. data/app/controllers/dc_common_controller.rb +49 -45
  7. data/app/forms/all_options.yml +4 -1
  8. data/app/forms/dc_page.yml +4 -0
  9. data/app/helpers/cms_edit_helper.rb +31 -22
  10. data/app/helpers/cms_index_helper.rb +42 -21
  11. data/app/helpers/dc_application_helper.rb +31 -44
  12. data/app/models/concerns/dc_page_concern.rb +3 -2
  13. data/app/models/concerns/dc_piece_concern.rb +1 -1
  14. data/app/models/concerns/dc_site_concern.rb +1 -1
  15. data/app/models/concerns/dc_user_concern.rb +3 -3
  16. data/app/models/dc_filter.rb +16 -10
  17. data/app/models/drgcms_form_fields/date_picker.rb +2 -0
  18. data/app/models/drgcms_form_fields/drgcms_field.rb +2 -1
  19. data/app/models/drgcms_form_fields/embedded.rb +4 -2
  20. data/app/models/drgcms_form_fields/number_field.rb +4 -3
  21. data/app/models/drgcms_form_fields/readonly.rb +13 -17
  22. data/app/models/drgcms_form_fields/select.rb +8 -9
  23. data/app/models/drgcms_form_fields/text_autocomplete.rb +17 -11
  24. data/app/renderers/dc_page_renderer.rb +7 -6
  25. data/app/views/cmsedit/_edit_stuff.html.erb +5 -2
  26. data/app/views/cmsedit/edit.html.erb +2 -1
  27. data/app/views/cmsedit/index.html.erb +1 -1
  28. data/app/views/cmsedit/new.html.erb +3 -2
  29. data/config/locales/models_en.yml +2 -0
  30. data/config/locales/models_sl.yml +4 -3
  31. data/drg_cms.gemspec +16 -16
  32. data/lib/drg_cms/version.rb +1 -1
  33. data/lib/drg_cms.rb +44 -4
  34. metadata +29 -29
@@ -141,6 +141,7 @@ form:
141
141
  caption: ajax_call
142
142
  control: control_name.method_to_call
143
143
  when_new: false
144
+ show: default always readonly
144
145
  5:
145
146
  type: window
146
147
  controller: cmsedit
@@ -251,6 +252,7 @@ form:
251
252
  type: embedded
252
253
  load: default,delay,always
253
254
  form_name: dc_poll_item
255
+ readonly: no
254
256
  html:
255
257
  height: 800
256
258
  20:
@@ -264,7 +266,8 @@ form:
264
266
  40:
265
267
  name: customer_id
266
268
  type: text_autocomplete
267
- search:
269
+ search: model_name.method.additional_parameter
270
+ search:
268
271
  table: customer
269
272
  field: custumer_name
270
273
  method: search
@@ -99,6 +99,10 @@ form:
99
99
  eval: DcDesign.choices4_design(@parent.dc_get_site)
100
100
  html:
101
101
  include_blank: true
102
+ 15:
103
+ name: div_class
104
+ type: text_field
105
+ size: 20
102
106
 
103
107
  20:
104
108
  name: menu_id
@@ -91,32 +91,40 @@ end
91
91
  # normal link.
92
92
  ############################################################################
93
93
  def dc_actions_for_form(position)
94
- # create standard actions
94
+ # create standard actions
95
95
  std_actions = {1 => 'back', 2 => {'type' => 'submit', 'caption' => 'drgcms.save'},
96
96
  3 => {'type' => 'submit', 'caption' => 'drgcms.save&back'} }
97
- # when edit only
97
+ # when edit only
98
98
  unless @record.try(:id).nil?
99
99
  std_actions.merge!({6 => 'new'} )
100
100
  std_actions.merge!(@record.active ? {5 => 'disable'} : {5 => 'enable'} ) if @record.respond_to?('active')
101
101
  std_actions.merge!({7 => 'refresh'} )
102
102
  end
103
+ # readonly
104
+ std_actions = { 1 => 'back' } if @form['readonly']
105
+
103
106
  actions = @form['form']['actions']
104
- # shortcut for actions: standard
107
+ # shortcut for actions: standard
105
108
  actions = nil if actions.class == String && actions == 'standard'
106
- # standard actions
107
109
  actions = std_actions if actions.nil?
108
- # readonly
109
- actions = {1 => 'back'} if @form['readonly']
110
- actions = {1 => 'close'} if params[:window_close]
111
- # Actions are strictly forbidden
112
- if @form['form']['actions'] and dc_dont?(@form['form']['actions'])
110
+
111
+ # Actions are strictly forbidden
112
+ if @form['form']['actions'] && dc_dont?(@form['form']['actions'])
113
113
  actions = []
114
114
  elsif actions['standard']
115
115
  actions.merge!(std_actions)
116
116
  actions['standard'] = nil
117
117
  end
118
- # Update save and save&back
119
- actions.each do |k,v|
118
+ # request for close window button present
119
+ if actions.class == Hash
120
+ case params[:window_close]
121
+ when '0' then actions[1] = 'close'; actions[3] = nil
122
+ when '1' then actions = { 1 => 'close' }
123
+ when '2' then actions = { 1 => 'close' }
124
+ end
125
+ end
126
+ # Update save and save&back
127
+ actions.each do |k, v|
120
128
  if v.class == String
121
129
  if v.match(/save\&back/i)
122
130
  actions[k] = {'type' => 'submit', 'caption' => 'drgcms.save&back'}
@@ -125,10 +133,10 @@ def dc_actions_for_form(position)
125
133
  end
126
134
  end
127
135
  end
128
- # remove standard option and sort so that standard actions come first
136
+ # remove standard option and sort so that standard actions come first
129
137
  actions.delete('standard')
130
- actions = actions.to_a.sort {|x,y| x[0] <=> y[0]}
131
- # Add spinner to the beginning
138
+ actions = actions.to_a.sort { |x, y| x[0] <=> y[0] }
139
+ # Add spinner to the beginning
132
140
  html = %Q[<span class="dc-spinner">#{fa_icon('spinner lg spin')}</span><ul class="dc-menu #{position}">]
133
141
 
134
142
  actions.each do |key, options|
@@ -136,12 +144,12 @@ def dc_actions_for_form(position)
136
144
  next if options.nil? # yes it happends
137
145
  parms = @parms.clone
138
146
  if options.class == String
139
- next if params[:readonly] and !options.match(/back|close/)
147
+ next if @form['readonly'] and !options.match(/back|close/)
140
148
 
141
149
  html << '<li class="dc-link dc-animate">'
142
150
  html << case
143
151
  when (options == 'back' or options == 'cancle') then
144
- # If return_to is present link directly to URL
152
+ # If return_to is present link directly to URL
145
153
  if parms['xreturn_to'] # disabled for now
146
154
  dc_link_to( 'drgcms.back','arrow-left', parms['return_to'] )
147
155
  else
@@ -186,6 +194,9 @@ def dc_actions_for_form(position)
186
194
  html << '</td>'
187
195
  # non standard actions
188
196
  else
197
+ # action will be displayed when show: always or readonly option is declared and form is readonly
198
+ next if @form['readonly'] && !%w[readonly always].include?(options['show'].to_s)
199
+
189
200
  options['title'] = t("#{options['title'].downcase}", options['title']) if options['title']
190
201
  html << case
191
202
  # submit button
@@ -447,11 +458,10 @@ end
447
458
  # Returns username for id. Subroutine of dc_document_statistics
448
459
  ###########################################################################
449
460
  def dc_document_user_for(field_name) #:nodoc:
450
- if @record[field_name]
451
- u = DcUser.find(@record[field_name])
452
- return u ? u.name : @record[field_name]
453
- end
454
- # nil
461
+ return if @record[field_name].nil?
462
+
463
+ user = DcUser.find(@record[field_name])
464
+ user ? user.name : @record[field_name]
455
465
  end
456
466
 
457
467
  ############################################################################
@@ -502,5 +512,4 @@ def dc_top_bottom_line(location, options)
502
512
  end
503
513
  end
504
514
 
505
-
506
515
  end
@@ -32,14 +32,17 @@ module CmsIndexHelper
32
32
  ############################################################################
33
33
  # Creates action div for cmsedit index action.
34
34
  ############################################################################
35
- def dc_actions_for_index()
35
+ def dc_actions_for_index
36
36
  @js = @form['script'] || @form['js'] || ''
37
37
  @css = @form['css'] || ''
38
- return '' if @form['index'].nil? or @form['readonly']
38
+ return '' if @form['index'].nil?
39
+
39
40
  actions = @form['index']['actions']
40
41
  return '' if actions.blank?
41
42
 
42
43
  std_actions = {2 => 'new', 3 => 'sort', 4 => 'filter' }
44
+ std_actions.delete(2) if @form['readonly']
45
+
43
46
  if actions.class == String
44
47
  actions = dc_define_standard_actions(actions, std_actions)
45
48
  elsif actions['standard']
@@ -60,6 +63,7 @@ def dc_actions_for_index()
60
63
  only_actions.each do |key, options|
61
64
  session[:form_processing] = "index:actions: #{key}=#{options}"
62
65
  next if options.nil? # must be
66
+
63
67
  url = @parms.clone
64
68
  yaml = options.class == String ? {'type' => options} : options # if single definition simulate type parameter
65
69
  action = yaml['type'].to_s.downcase
@@ -114,9 +118,13 @@ def dc_actions_for_index()
114
118
  dc_link_to(caption,'plus', url, yhtml )
115
119
 
116
120
  # menu
117
- when action == 'menu' then
118
- caption = t(options['caption'], options['caption']) + '&nbsp;' + fa_icon('caret-down lg')
119
- caption + eval(options['eval'])
121
+ when action == 'menu' then
122
+ if options['caption']
123
+ caption = t(options['caption'], options['caption']) + '&nbsp;' + fa_icon('caret-down lg')
124
+ caption + eval(options['eval'])
125
+ else # when caption is false, provide own actions
126
+ eval(options['eval'])
127
+ end
120
128
  =begin
121
129
  # reorder
122
130
  when action == 'reorder' then
@@ -262,7 +270,7 @@ end
262
270
  ############################################################################
263
271
  def dc_actions_for_result(document)
264
272
  actions = @form['result_set']['actions']
265
- return '' if actions.nil? or @form['readonly']
273
+ return '' if actions.nil? || @form['readonly']
266
274
 
267
275
  actions, width = dc_actions_column()
268
276
  html = %Q[<ul class="actions" style="width: #{width}px;">]
@@ -278,21 +286,27 @@ def dc_actions_for_result(document)
278
286
  else
279
287
  html << '<li class="dc-link">'
280
288
  html << case
289
+ when yaml['type'] == 'check' then
290
+ check_box_tag("check-#{document.id}", false,false,{ class: 'dc-check' })
291
+
281
292
  when yaml['type'] == 'edit' then
282
293
  parms['action'] = 'edit'
283
294
  parms['id'] = document.id
284
295
  dc_link_to( nil, 'pencil lg', parms )
296
+
285
297
  when yaml['type'] == 'duplicate' then
286
298
  parms['id'] = document.id
287
299
  # duplicate string will be added to these fields.
288
300
  parms['dup_fields'] = yaml['dup_fields']
289
301
  parms['action'] = 'create'
290
302
  dc_link_to( nil, 'copy lg', parms, data: { confirm: t('drgcms.confirm_dup') }, method: :post )
303
+
291
304
  when yaml['type'] == 'delete' then
292
305
  parms['action'] = 'destroy'
293
306
  parms['id'] = document.id
294
307
  #parms['return_to'] = request.url
295
308
  dc_link_to( nil, 'remove lg', parms, data: { confirm: t('drgcms.confirm_delete') }, method: :delete )
309
+
296
310
  # undocumented so far
297
311
  when yaml['type'] == 'edit_embedded'
298
312
  parms['controller'] = 'cmsedit'
@@ -314,11 +328,14 @@ end
314
328
  ############################################################################
315
329
  # Creates header div for result set.
316
330
  ############################################################################
317
- def dc_header_for_result()
331
+ def dc_header_for_result
318
332
  html = '<div class="dc-result-header">'
319
333
  if @form['result_set']['actions'] and !@form['readonly']
320
334
  ignore, width = dc_actions_column()
321
- html << %Q[<div class="actions" style="width:#{width}px;"></div>]
335
+ if width > 0 && @form['result_set']['actions'][0].to_s == 'check'
336
+ check_all = fa_icon('check-square-o', class: 'dc-check-all')
337
+ end
338
+ html << %Q[<div class="actions" style="width:#{width}px;">#{check_all}</div>]
322
339
  end
323
340
  # preparation for sort icon
324
341
  sort_field, sort_direction = nil, nil
@@ -336,7 +353,8 @@ def dc_header_for_result()
336
353
  label = (v['name'] ? "helpers.label.#{@form['table']}.#{v['name']}" : '') if label.nil?
337
354
  label = t(label) if label.match(/\./)
338
355
  # no sorting when embedded documents or custom filter is active
339
- sort_ok = @form['result_set'].nil? || (@form['result_set'] && @form['result_set']['filter'].nil?)
356
+ #sort_ok = @form['result_set'].nil? || (@form['result_set'] && @form['result_set']['filter'].nil?)
357
+ sort_ok = true
340
358
  sort_ok = sort_ok || (@form['index'] && @form['index']['sort'])
341
359
  sort_ok = sort_ok && !dc_dont?(v['sort'], false)
342
360
  if @tables.size == 1 and sort_ok
@@ -387,11 +405,13 @@ def dc_format_value(value, format=nil)
387
405
  return '' if value.nil?
388
406
 
389
407
  klass = value.class.to_s
390
- if klass.match(/time|date/i)
391
- CmsCommonHelper.dc_format_date_time(value, format)
392
- elsif format.to_s[0] == 'N'
393
- return '' if value == 0 and format.match('z')
408
+ return CmsCommonHelper.dc_format_date_time(value, format) if klass.match(/time|date/i)
409
+
410
+ format = format.to_s.upcase
411
+ if format[0] == 'N'
412
+ return '' if value == 0 && format.match('Z')
394
413
 
414
+ format.gsub!('Z', '')
395
415
  dec = format[1].blank? ? nil : format[1].to_i
396
416
  sep = format[2].blank? ? nil : format[2]
397
417
  del = format[3].blank? ? nil : format[3]
@@ -416,6 +436,7 @@ end
416
436
  ############################################################################
417
437
  def dc_columns_for_result(document)
418
438
  return '' unless @form['result_set']['columns']
439
+
419
440
  html = ''
420
441
  @form['result_set']['columns'].sort.each do |k,v|
421
442
  session[:form_processing] = "result_set:columns: #{k}=#{v}"
@@ -455,6 +476,14 @@ def dc_columns_for_result(document)
455
476
  html.html_safe
456
477
  end
457
478
 
479
+ ############################################################################
480
+ # Split eval expression to array by parameters.
481
+ # Ex. Will split dc_name4_value(one ,"two") => ['dc_name4_value', 'one', 'two']
482
+ ############################################################################
483
+ def dc_eval_to_array(expression)
484
+ expression.split(/\ |\,|\(|\)/).delete_if {|e| e.blank? }.map {|e| e.gsub(/\'|\"/,'').strip }
485
+ end
486
+
458
487
  private
459
488
 
460
489
  ############################################################################
@@ -474,14 +503,6 @@ def dc_process_eval(evaluate, parameters)
474
503
  end
475
504
  end
476
505
 
477
- ############################################################################
478
- # Split eval expression to array by parameters.
479
- # Will split dc_name4_value(one ,"two") => ['dc_name4_value', 'one', 'two']
480
- ############################################################################
481
- def dc_eval_to_array(expression)
482
- expression.split(/\ |\,|\(|\)/).delete_if {|e| e.blank? }.map {|e| e.gsub(/\'|\"/,'').strip }
483
- end
484
-
485
506
  ############################################################################
486
507
  # Process eval option for field value.
487
508
  # Used for processing single field column on result_set or form head.
@@ -1,4 +1,3 @@
1
- #coding: utf-8
2
1
  #--
3
2
  # Copyright (c) 2012+ Damjan Rems
4
3
  #
@@ -95,17 +94,17 @@ end
95
94
  ############################################################################
96
95
  def dc_render(renderer, opts={})
97
96
  return dc_render_design_part(renderer[:part]) if renderer.class == Hash
98
- #
97
+
99
98
  opts[:edit_mode] = session[:edit_mode]
100
99
  opts[:editparams] = {}
101
100
 
102
101
  opts = @options.merge(opts) # merge options with parameters passed on site, page, design ...
103
102
  opts.symbolize_keys! # this makes lots of things easier
104
- # Create renderer object
103
+ # Create renderer object
105
104
  klass = renderer.to_s.downcase
106
105
  klass += '_renderer' unless klass.match('_renderer') #
107
106
  obj = Kernel.const_get(klass.classify, Class.new).new(self, opts) rescue nil
108
- #
107
+
109
108
  if obj
110
109
  html = obj.render_html
111
110
  @css << obj.render_css.to_s
@@ -133,7 +132,7 @@ def dc_replace_in_design(opts={})
133
132
  design = opts[:piece] ? DcPiece.find(name: opts[:piece]).script : dc_get_site.design
134
133
  layout = opts[:layout] || (dc_get_site.site_layout.size > 2 ? dc_get_site.site_layout : nil)
135
134
  if opts[:replace]
136
- # replace more than one part of code
135
+ # replace more than one part of code
137
136
  if opts[:replace].class == Array
138
137
  0.upto(opts[:replace].size - 1) {|i| design.sub!(opts[:replace][i], opts[:with][i])}
139
138
  else
@@ -179,13 +178,12 @@ end
179
178
  #
180
179
  # This helper is replacement dc_render_from_site method which will soon be deprecated.
181
180
  ########################################################################
182
- def dc_render_design_part(part)
183
-
181
+ def dc_render_design_part(part)
184
182
  case
185
183
  when part.nil? then logger.error('ERROR dc_render_design_part! part is NIL !'); ''
186
- # Send as array. Part may be defined with options on page. First element has
187
- # name of element which defines what to do. If not defined default behaviour is
188
- # called. That is what is defined in second part of array.
184
+ # Send as array. Part may be defined with options on page. First element has
185
+ # name of element which defines what to do. If not defined default behaviour is
186
+ # called. That is what is defined in second part of array.
189
187
  when part.class == Array then
190
188
  if @options.dig(:settings, part.first)
191
189
  #TODO to be defined
@@ -196,9 +194,9 @@ def dc_render_design_part(part)
196
194
  when part.class == Proc then
197
195
  result = part.call
198
196
  result.class == Array ? result.first : result
199
- # Send as string. Evaluate content of string
197
+ # Send as string. Evaluate content of string
200
198
  when part.class == String then eval part
201
- # For future maybe. Just call objects to_s method.
199
+ # For future maybe. Just call objects to_s method.
202
200
  else
203
201
  part.to_s
204
202
  end.html_safe
@@ -231,9 +229,9 @@ end
231
229
  ########################################################################
232
230
  # Helper for rendering top CMS menu when in editing mode
233
231
  ########################################################################
234
- def dc_page_top()
235
- if @design and !@design.rails_view.blank?
236
- # Evaluate parameters in design body
232
+ def dc_page_top
233
+ if @design && @design.rails_view.present?
234
+ # Evaluate parameters in design body
237
235
  eval(@design.body)
238
236
  end
239
237
  session[:edit_mode] > 0 ? render(partial: 'cmsedit/edit_stuff') : ''
@@ -282,18 +280,18 @@ end
282
280
  def dc_edit_title
283
281
  session[:form_processing] = "form:title:"
284
282
  title = @form['form']['title']
285
- # defined as form:title:edit
283
+ # defined as form:title:edit
286
284
  if title and title['edit'] and !@form['readonly']
287
285
  t( title['edit'], title['edit'] )
288
286
  elsif title and title['show'] and @form['readonly']
289
287
  t( title['show'], title['show'] )
290
288
  else
291
- # concatenate title
289
+ # concatenate title
292
290
  c = (@form['readonly'] ? t('drgcms.show') : t('drgcms.edit')) + " : "
293
291
  c << (@form['title'] ? t( @form['title'], @form['title'] ) : t_tablename(@form['table'])) + ' : '
294
292
  title = (title and title['field']) ? title['field'] : @form['form']['edit_title']
295
293
  dc_deprecate('form:edit_title will be deprecated. Use form:title:field instead.') if @form['form']['edit_title']
296
- #
294
+
297
295
  c << "#{@record[ title ]} : " if title and @record.respond_to?(title)
298
296
  c << @record.id if @record
299
297
  end
@@ -309,15 +307,11 @@ end
309
307
  def dc_new_title()
310
308
  session[:form_processing] = "form:title:"
311
309
  title = @form['form']['title']
312
- # defined as form:title:new
310
+ # defined as form:title:new
313
311
  if title and title['new']
314
312
  t( title['new'], title['new'] )
315
313
  else
316
- if @form['table'] == 'dc_dummy'
317
- dc_deprecate('dc_dummy will be deprecated. Use dc_memory instead.')
318
- @form['table'] = 'dc_memory'
319
- end
320
- # in memory variables
314
+ # in memory structures
321
315
  if @form['table'] == 'dc_memory'
322
316
  t( @form['title'], @form['title'] )
323
317
  else
@@ -366,7 +360,8 @@ end
366
360
  # Returns icon code if icon is specified
367
361
  ############################################################################
368
362
  def dc_icon_for_link(icon)
369
- return nil unless icon
363
+ return nil if icon.nil?
364
+
370
365
  if icon.match(/\./)
371
366
  _origin.image_tag(icon, class: 'dc-link-img dc-animate')
372
367
  elsif icon.match('<i')
@@ -439,22 +434,13 @@ end
439
434
  # Therefore it is very unwise to use non ascii chars for table (collection) names.
440
435
  #
441
436
  # Parameters:
442
- # [string] String. String to be converted into decamelized string.
437
+ # [Object] model_string. String or model to be converted into decamelized string.
443
438
  #
444
439
  # Returns:
445
440
  # String. Decamelized string.
446
441
  ########################################################################
447
- def decamelize_type(string)
448
- return nil if string.nil?
449
- r = ''
450
- string.to_s.each_char do |c|
451
- r << case
452
- when r.size == 0 then c.downcase
453
- when c.downcase != c then '_' + c.downcase
454
- else c
455
- end
456
- end
457
- r
442
+ def decamelize_type(model_string)
443
+ model_string ? model_string.to_s.underscore : nil
458
444
  end
459
445
 
460
446
  ####################################################################
@@ -468,11 +454,12 @@ end
468
454
  # String. HTML code formatted for display.
469
455
  ####################################################################
470
456
  def dc_error_messages_for(doc)
471
- return '' unless doc and doc.errors.any?
457
+ return '' unless doc && doc.errors.any?
458
+
472
459
  msgs = ''
473
- doc.errors.each do |attribute, errors_array|
474
- label = t("helpers.label.#{decamelize_type(doc.class)}.#{attribute}", attribute)
475
- msgs << "<li>#{label} : #{errors_array}</li>"
460
+ doc.errors.each do |error|
461
+ label = t("helpers.label.#{decamelize_type(doc.class)}.#{error.attribute}", error.attribute)
462
+ msgs << "<li>#{label} : #{error.message}</li>"
476
463
  end
477
464
 
478
465
  c = <<eot
@@ -555,14 +542,14 @@ end
555
542
  # Create edit link with edit picture. Subroutine of dc_page_edit_menu.
556
543
  ####################################################################
557
544
  def dc_link_menu_tag(title) #:nodoc:
558
- html = %Q[
545
+ html = %(
559
546
  <dl>
560
547
  <dt><div class='drgcms_popmenu' href="#">
561
548
  #{_origin.fa_icon('file-text-o lg', class: 'dc-inline-link', title: title)}
562
549
  </div></dt>
563
550
  <dd>
564
551
  <ul class=' div-hidden drgcms_popmenu_class'>
565
- ]
552
+ )
566
553
 
567
554
  yield html
568
555
  html << "</ul></dd></dl>"
@@ -756,7 +743,7 @@ end
756
743
  ##########################################################################
757
744
  # Returns choices for creating collection edit select field on CMS top menu.
758
745
  ##########################################################################
759
- def dc_choices4_cmsmenu()
746
+ def dc_choices4_cmsmenu
760
747
  menus = {}
761
748
  DrgCms.paths(:forms).reverse.each do |path|
762
749
  filename = "#{path}/cms_menu.yml"
@@ -36,11 +36,12 @@ field :subject_link, type: String, default: ''
36
36
  field :alt_link, type: String, default: ''
37
37
  field :sub_subject, type: String, default: ''
38
38
  field :picture, type: String
39
- field :gallery, type: Boolean, default: false
39
+ field :gallery, type: Mongoid::Boolean, default: false
40
40
  field :body, type: String, default: ''
41
41
  field :css, type: String, default: ''
42
42
  field :script, type: String, default: ''
43
43
  field :params, type: String
44
+ field :div_class, type: String
44
45
  field :menu_id, type: String
45
46
  field :author_id, type: BSON::ObjectId
46
47
  field :dc_poll_id, type: BSON::ObjectId
@@ -50,7 +51,7 @@ field :user_name, type: String
50
51
  field :valid_from, type: DateTime
51
52
  field :valid_to, type: DateTime
52
53
  field :comments, type: Integer, default: 1 # 0 => not allowed, 1 => allowed
53
- field :active, type: Boolean, default: true
54
+ field :active, type: Mongoid::Boolean, default: true
54
55
  field :created_by, type: BSON::ObjectId
55
56
  field :updated_by, type: BSON::ObjectId
56
57
  field :kats, type: Array # Categories
@@ -45,7 +45,7 @@ module DcPieceConcern
45
45
  field :div_id, type: String
46
46
  field :site_id, type: BSON::ObjectId
47
47
  field :order, type: Integer, default: 0
48
- field :active, type: Boolean, default: true
48
+ field :active, type: Mongoid::Boolean, default: true
49
49
  field :valid_from, type: DateTime
50
50
  field :valid_to, type: DateTime
51
51
 
@@ -47,7 +47,7 @@ field :menu_class, type: String, default: 'DcSimpleMenu'
47
47
  field :request_processor, type: String
48
48
  field :files_directory, type: String
49
49
  field :logo, type: String
50
- field :active, type: Boolean, default: true
50
+ field :active, type: Mongoid::Boolean, default: true
51
51
  field :created_by, type: BSON::ObjectId
52
52
  field :updated_by, type: BSON::ObjectId
53
53
  field :menu_name, type: String
@@ -50,13 +50,13 @@ field :picture, type: String
50
50
  field :birthdate, type: Date
51
51
  field :about, type: String
52
52
  field :last_visit, type: Time
53
- field :active, type: Boolean, default: true
53
+ field :active, type: Mongoid::Boolean, default: true
54
54
  field :valid_from, type: Date
55
55
  field :valid_to, type: Date
56
56
  field :created_by, type: BSON::ObjectId
57
57
  field :updated_by, type: BSON::ObjectId
58
58
 
59
- field :group, type: Boolean, default: false # false => User, true => Group
59
+ field :group, type: Mongoid::Boolean, default: false # false => User, true => Group
60
60
  field :member, type: Array
61
61
 
62
62
  embeds_many :dc_user_roles
@@ -151,7 +151,7 @@ private
151
151
  # when entry is left empty.
152
152
  ##########################################################################
153
153
  def do_before_save
154
- self.name = "#{title} #{first_name} #{middle_name + ' ' unless middle_name.blank?}#{last_name}".strip
154
+ self.name = "#{title} #{first_name} #{middle_name + ' ' unless middle_name.blank?}#{last_name}".squish
155
155
  # to ensure unique e-mail
156
156
  self.email = "unknown@#{id}" if email.blank?
157
157
  end
@@ -106,8 +106,9 @@ end
106
106
  ############################################################################
107
107
  # Return filter input field for entering variable filter values on index form
108
108
  ############################################################################
109
- def self.get_filter_field(parent)
109
+ def self.get_filter_field(parent)
110
110
  return '' if parent.session[ parent.form['table'] ].nil?
111
+
111
112
  filter = parent.session[ parent.form['table'] ][:filter]
112
113
  return '' if filter.nil?
113
114
 
@@ -115,8 +116,11 @@ def self.get_filter_field(parent)
115
116
  return '' if filter.nil?
116
117
 
117
118
  field = get_field_form_definition(filter['field'], parent)
118
- return '' if field.nil? and filter['input'].nil?
119
- field = {} if field.nil?
119
+ return '' if field.nil? && filter['input'].nil?
120
+
121
+ saved_readonly = parent.form['readonly']
122
+ parent.form['readonly'] = nil # must be
123
+ field ||= {}
120
124
  # If field has choices available in labels, use them. This is most likely select input field.
121
125
  if field['name']
122
126
  choices = parent.t('helpers.label.' + parent.form['table'] + '.choices4_' + field['name'] )
@@ -129,23 +133,25 @@ def self.get_filter_field(parent)
129
133
  field['type'] = filter['input'] if filter['input'].to_s.size > 5
130
134
  field['type'] ||= 'text_field'
131
135
  field['readonly'] = false # must be
132
- field['html'] ||= {}
133
- field['html']['size'] = 20
136
+ field['html'] ||= {}
137
+ field['html']['size'] = 20
134
138
  # Start with last entered value
135
139
  field['html']['value'] = filter['value'] unless filter['value'] == '#NIL'
136
140
  field['html']['selected'] = field['html']['value'] # for select field
137
141
  # url for filter ON action
138
142
  field['html']['data-url'] = parent.url_for(
139
- controller: 'cmsedit',action: :index, filter: 'on',
143
+ controller: 'cmsedit', action: :index, filter: 'on',
140
144
  table: parent.form['table'], form_name: parent.params['form_name'])
141
145
  url = field['html']['data-url']
142
146
  # remove if present
143
147
  field['with_new'] = nil if field['with_new']
144
- # create input field object
148
+ # create input field object
145
149
  klas_string = field['type'].camelize
146
150
  klas = DrgcmsFormFields::const_get(klas_string) rescue nil
151
+ parent.form['readonly'] = saved_readonly
147
152
  return '' if klas.nil?
148
- # return data from object and create html code to display field
153
+
154
+ # return data from object and create html code to display field
149
155
  object = klas.new(parent, nil, field).render rescue nil
150
156
  # Error. Forget filter and return
151
157
  if object.nil?
@@ -153,11 +159,11 @@ def self.get_filter_field(parent)
153
159
  return ''
154
160
  end
155
161
  js = object.js.blank? ? '' : parent.javascript_tag(object.js)
156
- %Q[<li class="no-background">
162
+ %(<li class="no-background">
157
163
  <span class="filter_field" data-url="#{url}">#{object.html}
158
164
  #{parent.fa_icon('search lg', class: 'record_filter_field_icon')}
159
165
  #{js}</span>
160
- </li>]
166
+ </li>)
161
167
  end
162
168
 
163
169
  ######################################################################
@@ -78,6 +78,8 @@ def render
78
78
  @yaml['options']['lang'] ||= "'#{I18n.locale}'"
79
79
  @yaml['options']['format'] ||= "'#{t('datetimepicker.formats.date')}'"
80
80
  @yaml['options']['timepicker'] = false
81
+ @yaml['options']['scrollMonth'] ||= false
82
+ @yaml['options']['scrollInput'] ||= false
81
83
 
82
84
  record = record_text_for(@yaml['name'])
83
85
  @html << @parent.text_field(record, @yaml['name'], @yaml['html'])
@@ -135,7 +135,8 @@ def ro_standard(value=nil)
135
135
  @record.respond_to?(@yaml['name']) ? @record.send(@yaml['name']) : nil
136
136
  end
137
137
  end
138
- @html << (value.blank? ? '' : "<div class='dc-readonly'>#{value}</div>")
138
+ #@html << (value.blank? ? '' : "<div class='dc-readonly'>#{value}</div>")
139
+ @html << %(<div id="#{@yaml['name']}" class="dc-readonly">#{value}</div>)
139
140
  self
140
141
  end
141
142