drg_cms 0.6.1.5 → 0.6.1.11

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 (69) 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 +253 -106
  10. data/app/assets/stylesheets/drg_cms/drg_cms.css +670 -521
  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 +33 -211
  14. data/app/controllers/dc_application_controller.rb +98 -22
  15. data/app/controllers/dc_common_controller.rb +9 -22
  16. data/app/controls/browse_models_control.rb +18 -27
  17. data/app/controls/cmsedit_control.rb +129 -0
  18. data/app/controls/dc_help_control.rb +1 -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 +2 -2
  22. data/app/controls/design_element_settings_control.rb +1 -1
  23. data/app/forms/all_options.yml +25 -7
  24. data/app/forms/cms_menu.yml +24 -24
  25. data/app/forms/dc_browse_fields.yml +13 -9
  26. data/app/forms/dc_browse_models.yml +24 -2
  27. data/app/forms/dc_poll_result_export.yml +1 -1
  28. data/app/forms/dc_site.yml +2 -5
  29. data/app/forms/dc_steps_template.yml +51 -0
  30. data/app/helpers/cms_common_helper.rb +73 -6
  31. data/app/helpers/cms_edit_helper.rb +275 -159
  32. data/app/helpers/cms_helper.rb +152 -59
  33. data/app/helpers/cms_index_helper.rb +220 -172
  34. data/app/helpers/dc_application_helper.rb +40 -67
  35. data/app/models/concerns/dc_page_concern.rb +1 -1
  36. data/app/models/concerns/dc_site_concern.rb +9 -3
  37. data/app/models/dc_filter.rb +30 -22
  38. data/app/models/dc_journal.rb +2 -2
  39. data/app/models/dc_json_ld.rb +19 -42
  40. data/app/models/dc_part.rb +19 -9
  41. data/app/models/dc_site.rb +0 -1
  42. data/app/models/drgcms_form_fields/drgcms_field.rb +10 -4
  43. data/app/models/drgcms_form_fields/link_to.rb +1 -1
  44. data/app/models/drgcms_form_fields/multitext_autocomplete.rb +5 -5
  45. data/app/models/drgcms_form_fields/readonly.rb +4 -1
  46. data/app/models/drgcms_form_fields/select.rb +10 -9
  47. data/app/models/drgcms_form_fields/text_autocomplete.rb +20 -12
  48. data/app/models/drgcms_form_fields/text_with_select.rb +1 -0
  49. data/app/renderers/dc_common_renderer.rb +20 -3
  50. data/app/renderers/dc_part_renderer.rb +1 -1
  51. data/app/renderers/dc_poll_renderer.rb +1 -1
  52. data/app/views/cmsedit/_edit_stuff.html.erb +12 -12
  53. data/app/views/cmsedit/_form.html.erb +19 -12
  54. data/app/views/cmsedit/edit.html.erb +10 -6
  55. data/app/views/cmsedit/index.html.erb +5 -3
  56. data/app/views/cmsedit/login.html.erb +1 -1
  57. data/app/views/cmsedit/new.html.erb +9 -5
  58. data/app/views/dc_common/_help.html.erb +1 -0
  59. data/app/views/dc_common/paste_clipboard.html.erb +1 -1
  60. data/app/views/layouts/cms.html.erb +3 -5
  61. data/config/locales/drgcms_en.yml +7 -1
  62. data/config/locales/drgcms_sl.yml +7 -1
  63. data/config/locales/kaminari.yml +1 -1
  64. data/drg_cms.gemspec +2 -2
  65. data/lib/drg_cms/version.rb +1 -1
  66. data/lib/drg_cms.rb +4 -4
  67. metadata +16 -10
  68. data/app/views/cmsedit/__remove_edit_stuff.js.erb +0 -6
  69. data/app/views/cmsedit/__show.html.erb +0 -21
@@ -34,11 +34,17 @@ module CmsHelper
34
34
  # Creates code for script action type.
35
35
  ############################################################################
36
36
  def dc_script_action(yaml)
37
- # data = {'request' => 'script', 'script' => yaml['js'] || yaml['script'] }
38
- # %Q[<li class="dc-link-ajax with-link dc-animate">#{ dc_link_to(yaml['caption'], yaml['icon'], '#', data: data ) }</li>]
39
37
  icon = dc_icon_for_link yaml['icon']
40
- data = %(data-request="script" data-script="#{yaml['js'] || yaml['script']}" data-url="script")
41
- %Q[<li class="dc-link-ajax dc-animate" #{data}>#{icon} #{ t(yaml['caption'],yaml['caption']) }</li>]
38
+ yaml['html'] ||= {}
39
+ yaml['html']['data-url'] = 'script'
40
+ yaml['html']['data-request'] = 'script'
41
+ yaml['html']['data-script'] = "#{yaml['js'] || yaml['script']}"
42
+ yaml['html']['class'] ||= 'dc-link-ajax'
43
+ attributes = yaml['html'].inject('') { |r, e| r << "#{e.first}=\"#{e.last}\"" }
44
+
45
+ # data = %(data-request="script" data-script="#{yaml['js'] || yaml['script']}" data-url="script")
46
+ #%(<li><div class="dc-link-ajax" #{data}>#{icon} #{ t(yaml['caption'], yaml['caption']) }</div></li>)
47
+ %(<li><div #{attributes}>#{icon} #{ t(yaml['caption'], yaml['caption']) }</div></li>)
42
48
  end
43
49
 
44
50
  ############################################################################
@@ -49,11 +55,11 @@ def dc_get_field_form_definition(name) #:nodoc:
49
55
  return if @form['form'].nil?
50
56
 
51
57
  @form['form']['tabs'].each do |tab|
52
- # Array with 2 elements. First is tabname, second is data
58
+ # Array with 2 elements. First is tab name, second is data
53
59
  my_fields = tab.last
54
- my_fields.each {|k,v| return v if (k.class == Integer and v['name'] == name) }
60
+ my_fields.each { |k, v| return v if (k.class == Integer && v['name'] == name) }
55
61
  end if @form['form']['tabs'] # I know. But nice.
56
- #
62
+
57
63
  @form['form']['fields'].each do |field|
58
64
  next unless field.first.class == Integer # options
59
65
  return field.last if field.last['name'] == name
@@ -107,11 +113,13 @@ def dc_label_help(options)
107
113
  return [nil, nil] if %w(comment action).include?(options['type'])
108
114
 
109
115
  label = options['caption'] || options['text'] || options['label']
110
- label = if label.blank?
111
- t_name(options['name'], options['name'].capitalize.gsub('_',' ') )
112
- elsif options['name']
113
- t(label, label)
114
- end
116
+ if options['name']
117
+ label = if label.blank?
118
+ t_label_for_field(options['name'], options['name'].capitalize.gsub('_',' ') )
119
+ elsif options['name']
120
+ t(label, label)
121
+ end
122
+ end
115
123
  # help text can be defined in form or in translations starting with helpers. or as helpers.help.collection.field
116
124
  help = options['help']
117
125
  help ||= "helpers.help.#{@form['table']}.#{options['name']}" if options['name']
@@ -130,11 +138,11 @@ end
130
138
  # help : String : Help text
131
139
  ############################################################################
132
140
  def dc_tab_label_help(tab_name)
133
- label = @form['form']['tabs'][tab_name]['caption'] || tab_name
134
- label = t(label, t_name(label, label))
141
+ label = @form.dig('form', 'tabs', tab_name, 'caption') || tab_name
142
+ label = t(label, t_label_for_field(label, label))
135
143
 
136
- help = @form['form']['tabs'][tab_name]['help'] || "helpers.help.#{@form['table']}.#{tab_name}"
137
- help = t(help, t_name(help, help))
144
+ help = @form.dig('form', 'tabs', tab_name, 'help') || "helpers.help.#{@form['table']}.#{tab_name}"
145
+ help = t(help, t_label_for_field(help, help))
138
146
  help = nil if help.match('helpers.') # help not found in translation
139
147
 
140
148
  [label, help]
@@ -160,7 +168,7 @@ def dc_field_action(yaml)
160
168
  end
161
169
  # input field will have label as placeholder
162
170
  field = field.sub('input',"input placeholder=\"#{label}\"")
163
- %Q[<li class="no-background">#{field}</li>]
171
+ %(<li class="no-background">#{field}</li>)
164
172
  end
165
173
 
166
174
  ############################################################################
@@ -168,9 +176,17 @@ end
168
176
  ############################################################################
169
177
  def dc_html_data(yaml)
170
178
  return '' if yaml.blank?
171
- yaml.inject(' ') {|result, e| result = e.last.nil? ? result : result << "#{e.first}=\"#{e.last}\" "}
179
+
180
+ yaml.inject(' ') { |result, e| result = e.last.nil? ? result : result << "#{e.first}=\"#{e.last}\" " }
172
181
  end
173
182
 
183
+ ############################################################################
184
+ # There are several options for defining caption (caption,label, text). This method
185
+ # will ensure that caption is returned anyhow provided.
186
+ ############################################################################
187
+ def dc_get_caption(yaml)
188
+ yaml['caption'] || yaml['text'] || yaml['label']
189
+ end
174
190
  ############################################################################
175
191
  # Creates code for link, ajax or windows action for index or form actions.
176
192
  #
@@ -184,19 +200,21 @@ end
184
200
  ############################################################################
185
201
  def dc_link_ajax_window_submit_action(yaml, record = nil, action_active = true)
186
202
  parms = {}
187
- caption = yaml['caption'] || yaml['text']
203
+ caption = dc_get_caption(yaml)
188
204
  caption = caption ? t("#{caption.downcase}", caption) : nil
189
205
  icon = yaml['icon'] ? "#{fa_icon(yaml['icon'])}" : ''
190
206
  # action is not active
191
207
  unless dc_is_action_active?(yaml)
192
- return "<li class=\"dc-link-no\">#{icon} #{caption}</li>"
208
+ return %(<li><div class="dc-link-no">#{icon} #{caption}</div></li>)
193
209
  end
194
- # set data-confirm when confirm
210
+ # set data-confirm when confirm shortcut present
195
211
  yaml['html'] ||= {}
196
- confirm = yaml['html']['data-confirm'] || yaml['confirm']
197
- yaml['html']['data-confirm'] = t(confirm) if confirm.present?
198
- yaml['html']['title'] ||= yaml['title']
199
- yaml['html']['title'] = t(yaml['title']) if yaml['title'].present?
212
+ text = yaml['html']['data-confirm'] || yaml['confirm']
213
+ yaml['html']['data-confirm'] = t(text) if text.present?
214
+
215
+ text = yaml['html']['title'] || yaml['title']
216
+ yaml['html']['title'] = t(text) if text.present?
217
+
200
218
  yaml['html']['target'] ||= yaml['target']
201
219
  # direct url
202
220
  if yaml['url']
@@ -218,41 +236,57 @@ def dc_link_ajax_window_submit_action(yaml, record = nil, action_active = true)
218
236
 
219
237
  parms['table'] = parms['table'].underscore if parms['table'] # might be CamelCase
220
238
  # error if controller parameter is missing
221
- if parms['controller'].nil? && parms['url'].nil?
222
- "<li>#{'Controller not defined'}</li>"
239
+ return "<li>#{'Controller not defined'}</li>" if parms['controller'].nil? && parms['url'].nil?
240
+
241
+ html_data = dc_html_data(yaml['html'])
242
+ url = url_for(parms) rescue 'URL error'
243
+ url = nil if parms['url'] == '#'
244
+ request = yaml['request'] || yaml['method'] || 'get'
245
+
246
+ code = case yaml['type']
247
+ when 'ajax' # ajax button
248
+ clas = 'dc-link-ajax'
249
+ %(<div class="#{clas}" data-url="#{action_active ? url : ''}" #{html_data}
250
+ data-request="#{request}" title="#{yaml['title']}">#{icon}#{caption}</div>)
251
+
252
+ when 'submit' # submit button
253
+ # It's dirty hack, but will prevent not authorized message and render index action correctly
254
+ parms[:filter] = 'on'
255
+ url = url_for(parms) rescue 'URL error'
256
+ clas = 'dc-action-submit'
257
+ %(<div class="#{clas}" data-url="#{action_active ? url : ''}" #{html_data}
258
+ data-request="#{request}" title="#{yaml['title']}">#{icon}#{caption}</div>)
259
+
260
+ when 'link' # link button
261
+ yaml['html'] = dc_yaml_add_option(yaml['html'], class: 'dc-link')
262
+ link = dc_link_to(caption, yaml['icon'], parms, yaml['html'] )
263
+ %(#{action_active ? link : caption})
264
+
265
+ when 'window' # open window
266
+ clas = 'dc-link dc-window-open'
267
+ %(<div class="#{clas}" data-url="#{action_active ? url : ''}" #{html_data}>#{icon}#{caption}</div>)
268
+
269
+ when 'popup' # popup dialog
270
+ clas = 'dc-link dc-popup-open'
271
+ %(<div class="#{clas}" data-url="#{action_active ? url : ''}" #{html_data}>#{icon}#{caption}</div>)
272
+
223
273
  else
224
- #yaml['caption'] ||= yaml['text']
225
- html_data = dc_html_data(yaml['html'])
226
- url = url_for(parms) rescue 'URL error'
227
- url = nil if parms['url'] == '#'
228
-
229
- request = yaml['request'] || yaml['method'] || 'get'
230
- if yaml['type'] == 'ajax' # ajax button
231
- clas = "dc-link-ajax dc-animate"
232
- %Q[<li class="#{clas}" data-url="#{action_active ? url : ''}" #{html_data}
233
- data-request="#{request}" title="#{yaml['title']}">#{icon}#{caption}</li>]
234
-
235
- elsif yaml['type'] == 'submit' # submit button
236
- # It's dirty hack, but will prevent not authorized message and render index action correctly
237
- parms[:filter] = 'on'
238
- url = url_for(parms) rescue 'URL error'
239
- clas = "dc-action-submit"
240
- %Q[<li class="#{clas}" data-url="#{action_active ? url : ''}" #{html_data}
241
- data-request="#{request}" title="#{yaml['title']}">#{icon}#{caption}</li>]
242
-
243
- elsif yaml['type'] == 'link' # link button
244
- clas = "dc-link plus-link dc-animate"
245
- link = dc_link_to(caption, yaml['icon'], parms, yaml['html'] )
246
- %Q[<li class="#{clas}">#{action_active ? link : caption}</li>]
247
-
248
- elsif yaml['type'] == 'window'
249
- clas = "dc-link dc-animate dc-window-open"
250
- %Q[<li class="#{clas}" data-url="#{action_active ? url : ''}" #{html_data}>#{icon}#{caption}</li>]
274
+ 'Type error!'
275
+ end
276
+ "<li>#{code}</li>"
277
+ end
251
278
 
252
- else
253
- '<li>Action Type error</li>'
254
- end
279
+ ############################################################################
280
+ # Add new option to yaml. Subroutine of dc_link_ajax_window_submit_action.
281
+ ############################################################################
282
+ def dc_yaml_add_option(source, options) #nodoc
283
+ options.each do |k, v|
284
+ key = k.to_s
285
+ source[key] ||= ''
286
+ # only if not already present
287
+ source[key] << " #{v}" unless source[key].match(v.to_s)
255
288
  end
289
+ source
256
290
  end
257
291
 
258
292
  ############################################################################
@@ -260,9 +294,68 @@ end
260
294
  ############################################################################
261
295
  def dc_log_exception(exception, where = '')
262
296
  log = exception ? "\n*** Error:#{where + ':'} #{exception.message}\n#{exception.backtrace.first.inspect}\n" : ''
263
- log << "DRG Form processing line: #{session[:form_processing]}\n"
297
+ log << "DRG Form: #{CmsHelper.form_param(params)}, line: #{session[:form_processing]}\n"
264
298
 
265
299
  logger.error log
266
300
  end
267
-
301
+
302
+ ############################################################################
303
+ # Will return form id, to be used on each form for simpler css selecting.
304
+ ############################################################################
305
+ def dc_form_id
306
+ %( id=#{CmsHelper.form_param(params) || CmsHelper.table_param(params)} )
307
+ end
308
+
309
+ ############################################################################
310
+ # Will return form_name from parameter regardless if set as form_name or just f.
311
+ ############################################################################
312
+ def self.form_param(params)
313
+ params[:form_name] || params[:f]
314
+ end
315
+
316
+ ############################################################################
317
+ # Will return table name from parameter regardless if set as table or just t.
318
+ ############################################################################
319
+ def self.table_param(params)
320
+ params[:table] || params[:t]
321
+ end
322
+
323
+ ########################################################################
324
+ # Searches forms path for file_name and returns full file name or nil if not found.
325
+ #
326
+ # @param [String] Form file name. File name can be passed as gem_name.filename. This can
327
+ # be useful when you are extending form but want to retain same name as original form
328
+ # For example. You are extending dc_user form from drg_cms gem and want to
329
+ # retain same dc_user name. This can be done by setting drg_cms.dc_user as extend option.
330
+ #
331
+ # @return [String] Form file name including path or nil if not found.
332
+ ########################################################################
333
+ def self.form_file_find(form_file)
334
+ form_path = nil
335
+ form_path, form_file = form_file.split(/\.|\//) if form_file.match(/\.|\//)
336
+
337
+ DrgCms.paths(:forms).reverse.each do |path|
338
+ f = "#{path}/#{form_file}.yml"
339
+ return f if File.exist?(f) && (form_path.nil? || path.to_s.match(/\/#{form_path}(-|\/)/i))
340
+ end
341
+ raise "Exception: Form file '#{form_file}' not found!"
342
+ end
343
+
344
+ ########################################################################
345
+ # Merges two forms when current form extends other form. Subroutine of dc_form_read.
346
+ # With a little help of https://www.ruby-forum.com/topic/142809
347
+ ########################################################################
348
+ def self.forms_merge(hash1, hash2)
349
+ target = hash1.dup
350
+ hash2.keys.each do |key|
351
+ if hash2[key].is_a?(Hash) && hash1[key].is_a?(Hash)
352
+ target[key] = CmsHelper.forms_merge(hash1[key], hash2[key])
353
+ next
354
+ end
355
+ target[key] = hash2[key] == '/' ? nil : hash2[key]
356
+ end
357
+ # delete keys with nil value
358
+ target.delete_if { |k, v| v.nil? }
359
+ end
360
+
268
361
  end