drg_cms 0.6.1.4 → 0.6.1.9

Sign up to get free protection for your applications and to get access to all the features.
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