drg_cms 0.6.1.4 → 0.6.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +203 -24
  3. data/app/assets/fonts/ibm-plex-sans-300.woff2 +0 -0
  4. data/app/assets/fonts/ibm-plex-sans-400.woff2 +0 -0
  5. data/app/assets/fonts/ibm-plex-sans-500.woff2 +0 -0
  6. data/app/assets/fonts/ibm-plex-sans-600.woff2 +0 -0
  7. data/app/assets/fonts/ibm-plex-sans-700.woff2 +0 -0
  8. data/app/assets/fonts/ibm-plex-sans-italic.woff2 +0 -0
  9. data/app/assets/javascripts/drg_cms/drg_cms.js +229 -95
  10. data/app/assets/stylesheets/drg_cms/drg_cms.css +608 -542
  11. data/app/assets/stylesheets/drg_cms_application.css +1 -1
  12. data/app/assets/stylesheets/drg_cms_cms.css +1 -4
  13. data/app/controllers/cmsedit_controller.rb +54 -127
  14. data/app/controllers/dc_application_controller.rb +17 -2
  15. data/app/controllers/dc_common_controller.rb +13 -7
  16. data/app/controls/browse_models_control.rb +15 -26
  17. data/app/controls/cmsedit_control.rb +125 -0
  18. data/app/controls/dc_help_control.rb +13 -1
  19. data/app/controls/dc_page_control.rb +0 -1
  20. data/app/controls/dc_poll_result_control.rb +1 -1
  21. data/app/controls/dc_report.rb +1 -1
  22. data/app/controls/design_element_settings_control.rb +1 -1
  23. data/app/forms/all_options.yml +23 -7
  24. data/app/forms/cms_menu.yml +24 -24
  25. data/app/forms/dc_big_table.yml +0 -2
  26. data/app/forms/dc_big_table_value.yml +0 -2
  27. data/app/forms/dc_browse_fields.yml +13 -9
  28. data/app/forms/dc_design.yml +1 -2
  29. data/app/forms/dc_folder_permission.yml +0 -2
  30. data/app/forms/dc_help_1.yml +2 -1
  31. data/app/forms/dc_json_ld.yml +0 -3
  32. data/app/forms/dc_menu.yml +6 -12
  33. data/app/forms/dc_menu_item.yml +1 -3
  34. data/app/forms/dc_page.yml +1 -2
  35. data/app/forms/dc_policy.yml +2 -5
  36. data/app/forms/dc_poll.yml +10 -16
  37. data/app/forms/dc_poll_result_export.yml +1 -1
  38. data/app/forms/dc_seo.yml +1 -2
  39. data/app/forms/dc_simple_menu.yml +1 -2
  40. data/app/forms/dc_site.yml +5 -7
  41. data/app/helpers/cms_common_helper.rb +8 -6
  42. data/app/helpers/cms_edit_helper.rb +61 -53
  43. data/app/helpers/cms_helper.rb +78 -42
  44. data/app/helpers/cms_index_helper.rb +198 -137
  45. data/app/helpers/dc_application_helper.rb +65 -43
  46. data/app/models/concerns/dc_page_concern.rb +1 -1
  47. data/app/models/concerns/dc_site_concern.rb +9 -3
  48. data/app/models/dc_big_table.rb +2 -2
  49. data/app/models/dc_filter.rb +45 -37
  50. data/app/models/dc_json_ld.rb +1 -1
  51. data/app/models/dc_part.rb +19 -9
  52. data/app/models/dc_site.rb +0 -1
  53. data/app/models/dc_temp.rb +7 -0
  54. data/app/models/drgcms_form_fields/comment.rb +11 -2
  55. data/app/models/drgcms_form_fields/drgcms_field.rb +10 -4
  56. data/app/models/drgcms_form_fields/link_to.rb +1 -1
  57. data/app/models/drgcms_form_fields/multitext_autocomplete.rb +5 -5
  58. data/app/models/drgcms_form_fields/readonly.rb +3 -0
  59. data/app/models/drgcms_form_fields/select.rb +14 -14
  60. data/app/models/drgcms_form_fields/text_autocomplete.rb +19 -11
  61. data/app/renderers/dc_part_renderer.rb +1 -1
  62. data/app/renderers/dc_poll_renderer.rb +1 -1
  63. data/app/views/cmsedit/_edit_stuff.html.erb +12 -12
  64. data/app/views/cmsedit/_form.html.erb +3 -2
  65. data/app/views/cmsedit/_result.html.erb +21 -18
  66. data/app/views/cmsedit/login.html.erb +1 -1
  67. data/app/views/dc_common/paste_clipboard.html.erb +1 -1
  68. data/app/views/layouts/cms.html.erb +3 -5
  69. data/config/locales/drgcms_en.yml +5 -3
  70. data/config/locales/drgcms_sl.yml +5 -3
  71. data/config/locales/kaminari.yml +1 -1
  72. data/config/locales/models_sl.yml +1 -0
  73. data/drg_cms.gemspec +1 -1
  74. data/lib/drg_cms/version.rb +1 -1
  75. data/lib/drg_cms.rb +6 -12
  76. metadata +10 -5
  77. data/app/views/cmsedit/__remove_edit_stuff.js.erb +0 -6
  78. data/app/views/cmsedit/__show.html.erb +0 -21
@@ -50,12 +50,7 @@ def dc_actions_for_index
50
50
  actions['standard'] = nil
51
51
  end
52
52
 
53
- # start div with hidden spinner image
54
- html = %(
55
- <form id="dc-action-menu">
56
- <span class="dc-spinner">#{fa_icon('spinner lg spin')}</span>
57
- <ul class="dc-action-menu">)
58
-
53
+ html_left, html_right = '', ''
59
54
  # Remove actions settings and sort
60
55
  only_actions = []
61
56
  actions.each { |key, value| only_actions << [key, value] if key.class == Integer }
@@ -72,7 +67,7 @@ def dc_actions_for_index
72
67
  action = 'link'
73
68
  end
74
69
  # if return_to is present link directly to URL
75
- if action == 'link' and yaml['url']
70
+ if action == 'link' && yaml['url']
76
71
  url = yaml['url']
77
72
  else
78
73
  url['controller'] = yaml['controller'] if yaml['controller']
@@ -82,49 +77,57 @@ def dc_actions_for_index
82
77
  url['control'] = yaml['control'] if yaml['control']
83
78
  end
84
79
  # html link options
85
- yhtml = yaml['html'] || {}
86
- yhtml['title'] = yaml['title'] if yaml['title']
87
-
88
- code = case
80
+ html_options = yaml['html'] || {}
81
+ html_options['title'] = yaml['title'] if yaml['title']
82
+ case
89
83
  # sort
90
- when action == 'sort' then
91
- choices = [['id','id']]
84
+ when action == 'sort'
85
+ choices = [%w[id id]]
92
86
  if @form['index']['sort']
93
- @form['index']['sort'].split(',').each do |s|
94
- s.strip!
95
- choices << [ t("helpers.label.#{@form['table']}.#{s}"), s ]
87
+ @form['index']['sort'].split(',').each do |e|
88
+ e.strip!
89
+ choices << [ t("helpers.label.#{@form['table']}.#{e}"), e ]
96
90
  end
97
91
  end
98
- fa_icon('sort-alpha-asc') + ' ' + t('drgcms.sort') + ' ' +
99
- select('sort', 'sort', choices, { include_blank: true },
100
- { class: 'drgcms_sort', 'data-table' => @form['table'], 'data-form' => params['form_name']} )
92
+ data = t('drgcms.sort') + select('sort', 'sort', choices, { include_blank: true }, { class: 'dc-sort-select',
93
+ 'data-table' => @form['table'], 'data-form' => CmsHelper.form_param(params)} )
94
+ html_right << %(<li><div class="dc-sort">#{data}</li>)
101
95
 
102
96
  # filter
103
- when action == 'filter' then
104
- caption = t('drgcms.filter')
105
- caption << '&nbsp;' + fa_icon('caret-down lg') + DcFilter.menu_filter(self)
106
- # add filter OFF link
107
- sess = session[@form['table']]
108
- if sess and sess[:filter]
109
- caption << '&nbsp;&nbsp;' + dc_link_to(nil,'remove lg',
110
- { controller: 'cmsedit', filter: 'off', table: @form['table'], form_name: params['form_name'] },
111
- { title: DcFilter.title4_filter_off(sess[:filter]) })
112
- end
113
- caption
97
+ when action == 'filter'
98
+ table = session[@form['table']]
99
+ url = table&.dig(:filter) ?
100
+ url_for(controller: 'cmsedit', action: 'run', control: 'cmsedit.filter_off', t: @form['table'], f: CmsHelper.form_param(params)) :
101
+ ''
102
+ html_right << %(
103
+ <li>
104
+ <div class="dc-filter" title="#{DcFilter.title4_filter_off(table)}" data-url="#{url.html_safe}">
105
+ #{mi_icon(url.blank? ? 'search' : 'search_off') }#{DcFilter.menu_filter(self).html_safe}
106
+ </div>
107
+ </li>#{DcFilter.get_filter_field(self)}).html_safe
114
108
 
115
109
  # new
116
- when action == 'new' then
110
+ when action == 'new'
117
111
  caption = yaml['caption'] || 'drgcms.new'
118
- dc_link_to(caption,'plus', url, yhtml )
112
+ html_options['class'] = 'dc-link'
113
+ html_left << "<li>#{dc_link_to(caption, 'add', url, html_options)}</li>"
114
+
115
+ when action == 'close'
116
+ html_left << %(<li><div class="dc-link" onclick="window.close();"'>#{fa_icon('close')} #{t('drgcms.close')}</div></li>)
117
+
118
+ when action == 'back'
119
+ html_left << %(<li><div class="dc-link" onclick="history.back();"'>#{fa_icon('arrow_back')} #{t('drgcms.back')}</div></li>)
119
120
 
120
121
  # menu
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
122
+ when action == 'menu'
123
+ code = if options['caption']
124
+ caption = t(options['caption'], options['caption']) + '&nbsp;' + fa_icon('caret-down')
125
+ caption + eval(options['eval'])
126
+ else # when caption is false, provide own actions
127
+ eval(options['eval'])
128
+ end
129
+ html_left << %(<li><div class="dc-link">#{code}</div></li>)
130
+
128
131
  =begin
129
132
  # reorder
130
133
  when action == 'reorder' then
@@ -136,27 +139,34 @@ def dc_actions_for_index
136
139
  dc_link_to( caption, 'reorder', parms, method: :delete )
137
140
  =end
138
141
  when action == 'script'
139
- html << dc_script_action(options)
140
- next
142
+ html_left << dc_script_action(options)
141
143
 
142
144
  when action == 'field'
143
- html << dc_field_action(yaml)
144
- next
145
+ html_right << dc_field_action(yaml)
145
146
 
146
- when %w(ajax link window submit).include?(action)
147
- html << dc_link_ajax_window_submit_action(options, nil)
148
- next
147
+ when %w(ajax link window popup submit).include?(action)
148
+ html_left << dc_link_ajax_window_submit_action(options, nil)
149
149
 
150
150
  else
151
- caption = yaml['caption'] || yaml['text']
152
- icon = yaml['icon'] ? yaml['icon'] : action
153
- dc_link_to(caption, icon, url, yhtml)
151
+ caption = dc_get_caption(yaml) || t("drgcms.#{action}")
152
+ icon = yaml['icon'] || action
153
+ html_options['class'] = 'dc-link'
154
+ code = dc_link_to(caption, icon, url, html_options)
155
+ html_left << %(<li>#{code}</li>)
154
156
  end
155
- html << "<li class=\"dc-link dc-animate\">#{code}</li>"
156
- html << DcFilter.get_filter_field(self) if action == 'filter'
157
157
  end
158
- html << '</ul></form>'
159
- html.html_safe
158
+
159
+ %(
160
+ <form id="dc-action-menu">
161
+ <span class="dc-spinner">#{fa_icon('settings-o spin')}</span>
162
+
163
+ <div class="dc-action-menu">
164
+ <ul class="dc-left">#{html_left}</ul>
165
+ <ul class="dc-right">#{html_right}</ul>
166
+ </div>
167
+ <div style="clear: both;"></div>
168
+ </form>
169
+ ).html_safe
160
170
  end
161
171
 
162
172
  ############################################################################
@@ -164,53 +174,53 @@ end
164
174
  ############################################################################
165
175
  def dc_div_filter
166
176
  choices = []
167
- filter = (@form['index'] and @form['index']['filter']) ? @form['index']['filter'] + ',' : ''
177
+ filter = @form['index'] && @form['index']['filter'] ? @form['index']['filter'] + ',' : ''
168
178
  filter << 'id as text_field' # filter id is added by default
169
179
  filter.split(',').each do |f|
170
180
  f.strip!
171
181
  name = f.match(' as ') ? f.split(' ').first : f
172
182
  # like another field on the form
173
- if f.match(' like ')
174
- a = f.split(' ')
175
- name = a.first
176
- f = a.last
177
- end
178
- choices << [ t("helpers.label.#{@form['table']}.#{name}", name), f ]
183
+ name, like, f = f.split(' ') if f.match(' like ')
184
+ choices << [ t("helpers.label.#{@form['table']}.#{name}", name), f ]
185
+ end
186
+ choices4_operators = t('drgcms.choices4_filter_operators').chomp.split(',').inject([]) do |r, v|
187
+ r << (v.match(':') ? v.split(':') : v )
179
188
  end
180
- choices4_operators = t('drgcms.choices4_filter_operators').chomp.split(',').inject([]) {|r,v| r << (v.match(':') ? v.split(':') : v )}
181
189
  # currently selected options
182
- if session[@form['table']] and session[@form['table']][:filter]
190
+ if session[@form['table']] && session[@form['table']][:filter]
183
191
  field_name, operators_value, dummy = session[@form['table']][:filter].split("\t")
184
192
  else
185
193
  field_name, operators_value = nil, nil
186
194
  end
187
- #{ form_tag :table => @form['table'], filter: :on, filter_input: 1, action: :index, method: :post }
188
- url = url_for(table: @form['table'],form_name: params['form_name'], filter: :on, filter_input: 1, action: :index, controller: :cmsedit)
189
- html =<<EOT
195
+ url_on = url_for(controller: 'cmsedit', action: :run, control: 'cmsedit.filter_on' ,
196
+ t: CmsHelper.table_param(params), f: CmsHelper.form_param(params), filter_input: 1)
197
+ url_off = url_for(controller: 'cmsedit', action: :run, control: 'cmsedit.filter_off',
198
+ t: CmsHelper.table_param(params), f: CmsHelper.form_param(params))
199
+ %(
190
200
  <div id="drgcms_filter" class="div-hidden">
191
201
  <h1>#{t('drgcms.filter_set')}</h1>
192
202
 
193
203
  #{ select(nil, 'filter_field1', options_for_select(choices, field_name), { include_blank: true }) }
194
204
  #{ select(nil, 'filter_oper', options_for_select(choices4_operators, operators_value)) }
195
205
  <div class="dc-menu">
196
- <div class="dc-link dc-animate drgcms_popup_submit" data-url="#{url}">#{fa_icon('check-square-o')} #{t('drgcms.filter_on')}</div>
197
- <div class="dc-link dc-animate">#{dc_link_to('drgcms.filter_off','close', {action: :index, filter: 'off', table: @form['table'], form_name: params['form_name']}) }</div>
206
+ <div class="dc-link dc-filter-set" data-url="#{url_on}">#{fa_icon('done')} #{t('drgcms.filter_on')}</div>
207
+ <div class="dc-link-ajax" data-url="#{url_off}">
208
+ #{mi_icon('close')}#{t('drgcms.filter_off')}
209
+ </div>
198
210
  </div>
199
- </div>
200
- EOT
201
- html.html_safe
211
+ </div>).html_safe
202
212
  end
203
213
 
204
214
  ############################################################################
205
215
  # Creates popup div for setting filter on result set header.
206
216
  ############################################################################
207
217
  def dc_filter_popup
208
- html = %Q[<div class="filter-popup" style="display: none;">
209
- <div>#{t('drgcms.filter_set')}</div>
210
- <ul>]
211
- url = url_for(table: @form['table'],form_name: params['form_name'], filter: :on, filter_input: 1, action: :index, controller: :cmsedit)
218
+ html = %(<div class="filter-popup" style="display: none;"><div>#{t('drgcms.filter_set')}</div><ul>)
219
+ url = url_for(controller: 'cmsedit', action: 'run', control: 'cmsedit.filter_on',
220
+ t: @form['table'], f: params['form_name'], filter_input: 1)
221
+
212
222
  t('drgcms.choices4_filter_operators').chomp.split(',').each do |operator_choice|
213
- caption,choice = operator_choice.split(':')
223
+ caption, choice = operator_choice.split(':')
214
224
  html << %Q[<li data-operator="#{choice}" data-url="#{url}">#{caption}</li>]
215
225
  end
216
226
  html << "</ul></div>"
@@ -241,18 +251,20 @@ end
241
251
  ############################################################################
242
252
  def dc_actions_column
243
253
  actions = @form['result_set']['actions']
244
- return [{}, 0] if actions.nil? || dc_dont?(actions)
254
+ return [{}, 0, false] if actions.nil? || dc_dont?(actions)
245
255
 
246
256
  # standard actions
247
- actions = {'standard' => true} if actions.class == String && actions == 'standard'
257
+ actions = { 'standard' => true } if actions.class == String && actions == 'standard'
248
258
  std_actions = { 2 => 'edit', 5 => 'delete' }
249
259
  if actions['standard']
250
260
  actions.merge!(std_actions)
251
261
  actions.delete('standard')
252
262
  end
253
-
254
- width = @form['result_set']['actions_width'] || 18*actions.size
255
- [actions, width]
263
+ # check must be first action
264
+ has_check = actions.first[1] == 'check'
265
+ width = actions.size == 1 ? 22 : 44
266
+ width = 22 if actions.size > 2 and !has_check
267
+ [actions, width, has_check]
256
268
  end
257
269
 
258
270
  ############################################################################
@@ -261,8 +273,8 @@ end
261
273
  def dc_actions_column_for_footer
262
274
  return '' unless @form['result_set']['actions']
263
275
 
264
- ignore, width = dc_actions_column
265
- %Q[<div class="actions" style="width: #{width}px;"></div>].html_safe
276
+ ignore, width, ignore2 = dc_actions_column
277
+ %(<div class="dc-result-actions" style="width: #{width}px;"></div>).html_safe
266
278
  end
267
279
 
268
280
  ############################################################################
@@ -272,57 +284,75 @@ def dc_actions_for_result(document)
272
284
  actions = @form['result_set']['actions']
273
285
  return '' if actions.nil? || @form['readonly']
274
286
 
275
- actions, width = dc_actions_column()
276
- html = %Q[<ul class="actions" style="width: #{width}px;">]
277
- actions.sort_by(&:first).each do |k, v|
278
- session[:form_processing] = "result_set:actions: #{k}=#{v}"
287
+ actions, width, has_check = dc_actions_column()
288
+ has_sub_menu = actions.size > 2 || (has_check && actions.size > 1)
289
+
290
+ main_menu, sub_menu = '', ''
291
+ actions.sort_by(&:first).each do |num, action|
292
+ session[:form_processing] = "result_set:actions: #{num}=#{action}"
279
293
  parms = @parms.clone
280
294
  # if single definition simulate type parameter
281
- yaml = v.class == String ? { 'type' => v } : v
282
- # code already includes li tag
283
- if %w(ajax link window submit).include?(yaml['type'])
295
+ yaml = action.class == String ? { 'type' => action } : action
296
+
297
+ if %w(ajax link window popup submit).include?(yaml['type'])
284
298
  @record = document # otherwise document fields can't be used as parameters
285
- html << dc_link_ajax_window_submit_action(yaml, document)
299
+ html = dc_link_ajax_window_submit_action(yaml, document)
286
300
  else
287
- html << '<li class="dc-link">'
288
- html << case
289
- when yaml['type'] == 'check' then
290
- check_box_tag("check-#{document.id}", false,false,{ class: 'dc-check' })
291
-
292
- when yaml['type'] == 'edit' then
301
+ caption = dc_get_caption(yaml) || "drgcms.#{yaml['type']}"
302
+ title = t(yaml['help'] || caption, '')
303
+ caption = has_sub_menu ? t(caption, '') : nil
304
+ html = '<li>'
305
+ html << case yaml['type']
306
+ when 'check' then
307
+ main_menu << '<li>' + check_box_tag("check-#{document.id}", false, false, { class: 'dc-check' }) + '</li>'
308
+ next
309
+
310
+ when 'edit' then
293
311
  parms['action'] = 'edit'
294
- parms['id'] = document.id
295
- dc_link_to( nil, 'pencil lg', parms )
312
+ parms['id'] = document.id
313
+ dc_link_to( caption, 'edit-o', parms, title: title )
314
+
315
+ when 'show' then
316
+ parms['action'] = 'show'
317
+ parms['id'] = document.id
318
+ parms['readonly'] = true
319
+ dc_link_to( caption, 'eye', parms, title: title )
296
320
 
297
- when yaml['type'] == 'duplicate' then
298
- parms['id'] = document.id
321
+ when 'duplicate' then
322
+ parms['id'] = document.id
299
323
  # duplicate string will be added to these fields.
300
324
  parms['dup_fields'] = yaml['dup_fields']
301
325
  parms['action'] = 'create'
302
- dc_link_to( nil, 'copy lg', parms, data: { confirm: t('drgcms.confirm_dup') }, method: :post )
326
+ dc_link_to( caption, 'content_copy-o', parms, data: { confirm: t('drgcms.confirm_dup') }, method: :post, title: title )
303
327
 
304
- when yaml['type'] == 'delete' then
328
+ when 'delete' then
305
329
  parms['action'] = 'destroy'
306
- parms['id'] = document.id
307
- #parms['return_to'] = request.url
308
- dc_link_to( nil, 'remove lg', parms, data: { confirm: t('drgcms.confirm_delete') }, method: :delete )
309
-
310
- # undocumented so far
311
- when yaml['type'] == 'edit_embedded'
312
- parms['controller'] = 'cmsedit'
313
- parms['table'] += ";#{yaml['table']}"
314
- parms['ids'] ||= ''
315
- parms['ids'] += "#{document.id};"
316
- dc_link_to( nil, 'table lg', parms, method: :get )
317
-
330
+ parms['id'] = document.id
331
+ dc_link_to( caption, 'delete-o', parms, data: { confirm: t('drgcms.confirm_delete') }, method: :delete, title: title )
332
+
318
333
  else # error.
319
334
  yaml['type'].to_s
320
335
  end
321
336
  html << '</li>'
322
337
  end
338
+
339
+ if has_sub_menu
340
+ sub_menu << html
341
+ else
342
+ main_menu << html
343
+ end
323
344
  end
324
- html << '</ul>'
325
- html.html_safe
345
+
346
+ if has_sub_menu
347
+ %(
348
+ <ul class="dc-result-actions" style="width: #{width}px;">#{main_menu}
349
+ <li><div class="dc-result-submenu">#{fa_icon('more_vert')}
350
+ <ul id="menu-#{document.id}">#{sub_menu}</ul>
351
+ </div></li>
352
+ </ul>)
353
+ else
354
+ %(<ul class="dc-result-actions" style="width: #{width}px;">#{main_menu}</ul>)
355
+ end.html_safe
326
356
  end
327
357
 
328
358
  ############################################################################
@@ -330,12 +360,10 @@ end
330
360
  ############################################################################
331
361
  def dc_header_for_result
332
362
  html = '<div class="dc-result-header">'
333
- if @form['result_set']['actions'] and !@form['readonly']
334
- ignore, width = dc_actions_column()
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>]
363
+ if @form['result_set']['actions'] && !@form['readonly']
364
+ ignore, width, has_check = dc_actions_column()
365
+ check_all = fa_icon('check-square-o', class: 'dc-check-all') if has_check
366
+ html << %(<div class="dc-result-actions" style="width:#{width}px;">#{check_all}</div>)
339
367
  end
340
368
  # preparation for sort icon
341
369
  sort_field, sort_direction = nil, nil
@@ -348,25 +376,32 @@ def dc_header_for_result
348
376
  session[:form_processing] = "result_set:columns: #{k}=#{v}"
349
377
  next if v['width'].to_s.match(/hidden|none/i)
350
378
 
351
- th = %Q[<div class="th" style="width:#{v['width'] || '15%'};text-align:#{v['align'] || 'left'};" data-name="#{v['name']}"]
379
+ th = %(<div class="th" style="width:#{v['width'] || '15%'};text-align:#{v['align'] || 'left'};" data-name="#{v['name']}")
352
380
  label = v['caption'] || v['label']
353
381
  label = (v['name'] ? "helpers.label.#{@form['table']}.#{v['name']}" : '') if label.nil?
354
382
  label = t(label) if label.match(/\./)
355
- # no sorting when embedded documents or custom filter is active
356
- #sort_ok = @form['result_set'].nil? || (@form['result_set'] && @form['result_set']['filter'].nil?)
357
- sort_ok = true
383
+ # no sorting when embedded documents or custom filter is active
384
+ sort_ok = !dc_dont?(@form['result_set']['sort'], false)
358
385
  sort_ok = sort_ok || (@form['index'] && @form['index']['sort'])
359
386
  sort_ok = sort_ok && !dc_dont?(v['sort'], false)
360
- if @tables.size == 1 and sort_ok
361
- icon = 'sort lg'
387
+ if @tables.size == 1 && sort_ok
388
+ icon = 'sort_unset md-18'
389
+ filter_class = form_has_input_field?(v['name']) ? nil : 'no-filter'
362
390
  if v['name'] == sort_field
363
- icon = sort_direction == '1' ? 'sort-alpha-asc lg' : 'sort-alpha-desc lg'
364
- end
365
- th << ">#{dc_link_to(label, icon, sort: v['name'], table: params[:table], form_name: params[:form_name], action: :index, icon_pos: :last )}</div>"
391
+ icon = sort_direction == '1' ? 'sort_down md-18' : 'sort_up md-18'
392
+ else
393
+ # no icon if filter can not be set
394
+ icon = nil if filter_class
395
+ end
396
+ # sort and filter icon
397
+ icon = mi_icon(icon, class: filter_class) if icon
398
+ url = url_for(controller: 'cmsedit', action: 'run', control: 'cmsedit.sort', sort: v['name'],
399
+ t: CmsHelper.table_param(params), f: CmsHelper.form_param(params))
400
+ th << %(><span data-url="#{url}">#{label}</span>#{icon}</div>)
366
401
  else
367
402
  th << ">#{label}</div>"
368
403
  end
369
- html << "<div class=\"spacer\"></div>" + th
404
+ html << %(<div class="spacer"></div>) + th
370
405
  end
371
406
  end
372
407
  (html << '</div>').html_safe
@@ -382,8 +417,8 @@ def dc_clicks_for_result(document)
382
417
  opts = {}
383
418
  opts[:controller] = yaml['controller'] || 'cmsedit'
384
419
  opts[:action] = yaml['action']
385
- opts[:table] = yaml['table']
386
- opts[:form_name] = yaml['form_name']
420
+ opts[:table] = yaml['table'] || CmsHelper.table_param(params)
421
+ opts[:form_name] = yaml['form_name'] || CmsHelper.form_param(params) || opts[:table]
387
422
  opts[:method] = yaml['method'] || 'get'
388
423
  opts[:id] = document['id']
389
424
  opts[:readonly] = yaml['readonly'] if yaml['readonly']
@@ -392,8 +427,8 @@ def dc_clicks_for_result(document)
392
427
  else
393
428
  html << (' data-dblclick=' +
394
429
  url_for(action: 'show', controller: 'cmsedit', id: document.id, ids: params[:ids],
395
- readonly: (params[:readonly] ? 2 : 1), table: params[:table],
396
- form_name: params[:form_name]) ) if @form['form']
430
+ readonly: (params[:readonly] ? 2 : 1), t: CmsHelper.table_param(params),
431
+ f: CmsHelper.form_param(params)) ) if @form['form']
397
432
  end
398
433
  html
399
434
  end
@@ -528,7 +563,7 @@ def dc_process_column_eval(yaml, document)
528
563
 
529
564
  # defined in helpers. For example dc_icon_for_boolean
530
565
  elsif respond_to?(yaml['eval'])
531
- send(yaml['eval'], document[yaml['name']])
566
+ send(yaml['eval'], document, yaml['name'])
532
567
 
533
568
  # defined in model
534
569
  elsif document.respond_to?(yaml['eval'])
@@ -598,4 +633,30 @@ def dc_define_standard_actions(actions_params, standard)
598
633
  actions
599
634
  end
600
635
 
636
+ ############################################################################
637
+ # When result set is to be drawn by Rails helper method.
638
+ ############################################################################
639
+ def dc_process_result_set_method
640
+ if @form['result_set']['view']
641
+ render partial: @form['result_set']['view']
642
+ else
643
+ method = @form['result_set']['eval'] || 'result_set_eval_misssing'
644
+ if respond_to?(method)
645
+ send method
646
+ else
647
+ I18n.t('drgcms.no_method', method: method)
648
+ end
649
+ end
650
+ end
651
+
652
+ ############################################################################
653
+ # Check if form has defined input field for field_name and that is not readonly field.
654
+ ############################################################################
655
+ def form_has_input_field?(field_name)
656
+ field = dc_get_field_form_definition(field_name)
657
+ return if field.nil?
658
+
659
+ !(field['type'] == 'readonly' || field['readonly'])
660
+ end
661
+
601
662
  end