drg_cms 0.6.1.5 → 0.6.1.11

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