drg_cms 0.6.0.6 → 0.6.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +25 -10
  3. data/app/assets/javascripts/drg_cms/drg_cms.js +281 -106
  4. data/app/assets/stylesheets/drg_cms/drg_cms.css +417 -152
  5. data/app/assets/stylesheets/drg_cms/select-multiple.css +9 -12
  6. data/app/assets/stylesheets/drg_cms_cms.css +1 -1
  7. data/app/controllers/cmsedit_controller.rb +247 -175
  8. data/app/controllers/dc_application_controller.rb +251 -173
  9. data/app/controllers/dc_common_controller.rb +81 -48
  10. data/app/controls/dc_help_control.rb +126 -0
  11. data/app/controls/dc_report.rb +223 -0
  12. data/app/forms/all_options.yml +38 -10
  13. data/app/forms/cms_menu.yml +7 -1
  14. data/app/forms/dc_big_table.yml +1 -0
  15. data/app/forms/dc_big_table_value.yml +1 -0
  16. data/app/forms/dc_category.yml +2 -1
  17. data/app/forms/dc_design.yml +1 -0
  18. data/app/forms/dc_help_1.yml +109 -0
  19. data/app/forms/dc_journal.yml +3 -1
  20. data/app/forms/dc_link.yml +1 -1
  21. data/app/forms/dc_menu.yml +2 -0
  22. data/app/forms/dc_menu_item.yml +1 -0
  23. data/app/forms/dc_page.yml +6 -0
  24. data/app/forms/dc_part.yml +1 -0
  25. data/app/forms/dc_piece.yml +1 -0
  26. data/app/forms/dc_poll.yml +15 -5
  27. data/app/forms/dc_poll_item.yml +2 -1
  28. data/app/forms/dc_poll_result.yml +9 -0
  29. data/app/forms/dc_simple_menu.yml +2 -0
  30. data/app/forms/dc_site.yml +4 -12
  31. data/app/forms/dc_user.yml +27 -11
  32. data/app/forms/dc_user_role.yml +3 -0
  33. data/app/helpers/cms_common_helper.rb +375 -0
  34. data/app/helpers/{cmsedit_edit_helper.rb → cms_edit_helper.rb} +109 -65
  35. data/app/helpers/{cmsedit_helper.rb → cms_helper.rb} +93 -48
  36. data/app/helpers/{cmsedit_index_helper.rb → cms_index_helper.rb} +240 -206
  37. data/app/helpers/dc_application_helper.rb +108 -327
  38. data/app/models/concerns/dc_page_concern.rb +14 -4
  39. data/app/models/concerns/dc_piece_concern.rb +1 -1
  40. data/app/models/concerns/dc_policy_rule_concern.rb +20 -8
  41. data/app/models/concerns/dc_site_concern.rb +67 -44
  42. data/app/models/concerns/dc_user_concern.rb +58 -19
  43. data/app/models/dc_design.rb +29 -19
  44. data/app/models/dc_filter.rb +26 -18
  45. data/app/models/dc_key_value_store.rb +1 -0
  46. data/app/models/dc_permission.rb +49 -9
  47. data/app/models/dc_policy.rb +25 -14
  48. data/app/models/dc_policy_role.rb +22 -11
  49. data/app/models/dc_poll.rb +1 -0
  50. data/app/models/dc_poll_result.rb +4 -2
  51. data/app/models/dc_temp.rb +6 -3
  52. data/app/models/dc_user_role.rb +2 -2
  53. data/app/models/drgcms_form_fields/date_picker.rb +6 -3
  54. data/app/models/drgcms_form_fields/datetime_picker.rb +4 -3
  55. data/app/models/drgcms_form_fields/drgcms_field.rb +20 -5
  56. data/app/models/drgcms_form_fields/embedded.rb +23 -16
  57. data/app/models/drgcms_form_fields/file_field.rb +2 -2
  58. data/app/models/drgcms_form_fields/file_select.rb +2 -2
  59. data/app/models/drgcms_form_fields/hash_field.rb +11 -7
  60. data/app/models/drgcms_form_fields/hidden_field.rb +1 -1
  61. data/app/models/drgcms_form_fields/link_to.rb +2 -2
  62. data/app/models/drgcms_form_fields/method.rb +66 -0
  63. data/app/models/drgcms_form_fields/multitext_autocomplete.rb +18 -12
  64. data/app/models/drgcms_form_fields/number_field.rb +4 -3
  65. data/app/models/drgcms_form_fields/radio.rb +10 -5
  66. data/app/models/drgcms_form_fields/readonly.rb +13 -17
  67. data/app/models/drgcms_form_fields/select.rb +58 -41
  68. data/app/models/drgcms_form_fields/text_autocomplete.rb +41 -33
  69. data/app/models/drgcms_form_fields.rb +12 -1
  70. data/app/renderers/dc_big_menu_renderer.rb +1 -0
  71. data/app/renderers/dc_gallery_renderer.rb +1 -0
  72. data/app/renderers/dc_menu_renderer.rb +1 -0
  73. data/app/renderers/dc_page_renderer.rb +8 -6
  74. data/app/renderers/dc_part_renderer.rb +1 -0
  75. data/app/renderers/dc_piece_renderer.rb +1 -1
  76. data/app/renderers/dc_poll_renderer.rb +56 -55
  77. data/app/renderers/dc_renderer.rb +1 -0
  78. data/app/renderers/dc_simple_menu_renderer.rb +1 -0
  79. data/app/views/cmsedit/_edit_stuff.html.erb +5 -2
  80. data/app/views/cmsedit/edit.html.erb +4 -1
  81. data/app/views/cmsedit/index.html.erb +3 -2
  82. data/app/views/cmsedit/new.html.erb +5 -2
  83. data/app/views/dc_common/_help.html.erb +17 -0
  84. data/app/views/layouts/models.html.erb +2 -1
  85. data/config/locales/drgcms_en.yml +17 -2
  86. data/config/locales/drgcms_sl.yml +22 -4
  87. data/config/locales/models_en.yml +16 -7
  88. data/config/locales/models_sl.yml +21 -12
  89. data/drg_cms.gemspec +16 -16
  90. data/lib/drg_cms/version.rb +1 -1
  91. data/lib/drg_cms.rb +98 -0
  92. data/lib/generators/new_drg_form/new_drg_form_generator.rb +5 -3
  93. data/lib/tasks/database.rake +6 -56
  94. metadata +39 -35
  95. data/app/helpers/application_helper.rb +0 -2
  96. data/app/models/__dc_dummy.rb +0 -102
@@ -62,6 +62,8 @@ module DrgcmsFormFields
62
62
  # name: company
63
63
  # type: select
64
64
  # choices: Audi,BMW,Mercedes
65
+ # or
66
+ # choices: helpers.label.model.choices4_field
65
67
  # 60:
66
68
  # name: type
67
69
  # type: select
@@ -75,8 +77,8 @@ class Select < DrgcmsField
75
77
  # helper.label.table_name.choices_for_fieldname or
76
78
  # choices4_tablename_fieldname
77
79
  ###########################################################################
78
- def choices_in_helper(all)
79
- helper = "helpers.label.#{@form['table']}.choices4_#{@yaml['name']}"
80
+ def choices_in_helper(helper = nil)
81
+ helper ||= "helpers.label.#{@form['table']}.choices4_#{@yaml['name']}"
80
82
  c = t(helper)
81
83
  if c.match( 'translation missing' )
82
84
  helper = "choices_for_#{@form['table']}_#{@yaml['name']}"
@@ -86,32 +88,28 @@ def choices_in_helper(all)
86
88
  end
87
89
 
88
90
  ###########################################################################
89
- # Choices are defined by evaluating an exspression. This is most common class
90
- # method defined in a class. SomeClass.get_choices4.
91
+ # Choices are defined by evaluating an expression. This is most common class
92
+ # method defined in a class. eg. SomeClass.get_choices4
91
93
  ###########################################################################
92
- def choices_in_eval(e, all=false)
94
+ def choices_in_eval(e)
93
95
  e.strip!
94
96
  if @yaml['depend'].nil?
95
97
  method = e.split(/\ |\(/).first
96
98
  return eval(e) if respond_to?(method) # id method defined here
97
- return eval('@parent.'+e) if @parent.respond_to?(method) # is method defined in helpers
99
+ return eval('@parent.' + e) if @parent.respond_to?(method) # is method defined in helpers
98
100
  # eval whatever it is there
99
101
  eval e
100
102
  else
101
103
  # add event listener to depend field
102
- @js << %Q[
104
+ @js << %(
103
105
  $(document).ready(function() {
104
106
  $('#record_#{@yaml['depend']}').change( function(e) { update_select_depend('record_#{@yaml['name']}', 'record_#{@yaml['depend']}','#{e}');});
105
107
  $('#_record_#{@yaml['depend']}').change( function(e) { update_select_depend('record_#{@yaml['name']}', '_record_#{@yaml['depend']}','#{e}');});
106
108
  });
107
- ]
108
- # depend field might be virtual field. Its value should be set in params
109
- depend_value = if @yaml['depend'][0] == '_'
110
- @parent.params["p_#{@yaml['depend']}"]
111
- else
112
- @record[@yaml['depend']]
113
- end
114
-
109
+ )
110
+ # depend field might be virtual field. It's value should be set in params
111
+ depend_value = @yaml['depend'][0] == '_' ? @parent.params["p_#{@yaml['depend']}"] : @record[@yaml['depend']]
112
+
115
113
  e << " '#{depend_value}'"
116
114
  eval e
117
115
  end
@@ -120,34 +118,46 @@ end
120
118
  ###########################################################################
121
119
  # Create choices array for select field.
122
120
  ###########################################################################
123
- def get_choices(all=false)
121
+ def get_choices
124
122
  begin
125
- choices = case
126
- when @yaml['choices'] then
127
- @yaml['choices']
128
- when @yaml['eval'] then
129
- choices_in_eval(@yaml['eval'], all)
130
- else
131
- choices_in_helper(all)
132
- end
133
- # Convert string to Array
134
- choices.class == String ?
135
- choices.chomp.split(',').inject([]) {|r,v| r << (v.match(':') ? v.split(':') : v )} :
136
- choices
137
- rescue Exception => e
138
- Rails.logger.debug "Error in select eval. #{e.message}\n"
123
+ choices = case
124
+ when @yaml['eval'] then
125
+ choices_in_eval(@yaml['eval'])
126
+ when @yaml['choices'] then
127
+ @yaml['choices'].match('helpers.') ? choices_in_helper(@yaml['choices']) : @yaml['choices']
128
+ else
129
+ choices_in_helper()
130
+ end
131
+ return choices unless choices.class == String
132
+
133
+ choices.chomp.split(',').map { |e| e.match(':') ? e.split(':') : e }
134
+ rescue Exception => e
135
+ Rails.logger.debug "\nError in select eval. #{e.message}\n"
136
+ Rails.logger.debug(e.backtrace.join($/)) if Rails.env.development?
139
137
  ['error'] # return empty array when error occures
140
138
  end
141
139
  end
142
140
 
141
+ ###########################################################################
142
+ # Will add code to view more data about selected option in a window
143
+ ###########################################################################
144
+ def add_view_code
145
+ return '' if (data = @record.send(@yaml['name'])).blank?
146
+
147
+ ar = @yaml['view'].split(/\ |\,/).delete_if {|e| e.blank?}
148
+ table, form_name = *ar
149
+ url = @parent.url_for(controller: :cmsedit, id: data, action: :edit, table: table, form_name: form_name, readonly: true, window_close: 1 )
150
+ icon = @parent.fa_icon('eye')
151
+ %(<span class="dc-window-open" data-url="#{url}">#{icon}</span>)
152
+ end
153
+
143
154
  ###########################################################################
144
155
  # Return value when readonly is required
145
156
  ###########################################################################
146
157
  def ro_standard
147
- #value = @yaml['html']['value'] ? @yaml['html']['value'] : nil
148
- value = @record.respond_to?(@yaml['name']) ? @record[@yaml['name']] : nil
149
- return self if value.nil?
150
- #
158
+ value = @record.respond_to?(@yaml['name']) ? @record.send(@yaml['name']) : nil
159
+ return self if value.blank?
160
+
151
161
  choices = get_choices()
152
162
  if value.class == Array # multiple choices
153
163
  html = ''
@@ -177,15 +187,22 @@ end
177
187
  ###########################################################################
178
188
  def render
179
189
  return ro_standard if @readonly
190
+
180
191
  set_initial_value('html','selected')
181
- #
192
+ # separate options and html part
193
+ html_part = {}
182
194
  @yaml['html'].symbolize_keys!
195
+ %i(class id style required).each { |sym| html_part[sym] = @yaml['html'].delete(sym) if html_part[sym]}
196
+ html_part[:multiple] = true if @yaml['multiple']
197
+
183
198
  record = record_text_for(@yaml['name'])
184
- if @yaml['multiple']
185
- @html << @parent.select(record, @yaml['name'], get_choices, @yaml['html'], {multiple: true})
199
+ if html_part[:multiple]
200
+ @html << @parent.select(record, @yaml['name'], get_choices, @yaml['html'], html_part)
186
201
  @js << "$('##{record}_#{@yaml['name']}').selectMultiple();"
187
202
  else
188
- @html << @parent.select(record, @yaml['name'], get_choices, @yaml['html'])
203
+ @html << @parent.select(record, @yaml['name'], get_choices, @yaml['html'], html_part)
204
+ # add code for view more data
205
+ @html << add_view_code() if @yaml['view']
189
206
  end
190
207
  self
191
208
  end
@@ -196,11 +213,11 @@ end
196
213
  def self.get_data(params, name)
197
214
  if params['record'][name].class == Array
198
215
  params['record'][name].delete_if {|e| e.blank? }
199
- return nil if params['record'][name].size == 0
200
- # convert to BSON objects
216
+ return if params['record'][name].size == 0
217
+
218
+ # convert to BSON objects
201
219
  is_id = BSON::ObjectId.legal?(params['record'][name].first)
202
220
  return params['record'][name].map{ |e| BSON::ObjectId.from_string(e) } if is_id
203
- return params['record'][name]
204
221
  end
205
222
  params['record'][name]
206
223
  end
@@ -30,7 +30,7 @@ module DrgcmsFormFields
30
30
  # * +type:+ text_autocomplete (required)
31
31
  # * +table+ Collection (table) name. When defined search must contain field name
32
32
  # * +with_new+ Will add an icon for shortcut to add new document to collection
33
- # * +not_id+ Field value represent value not an id. Field will save entered value when not selected wit autocomplete.
33
+ # * +is_id+ Field value represent value as id. If false, field will use entered value and not value selected with autocomplete. Default is true.
34
34
  # * +search:+ Search may consist of three parameters from which are separated either by dot (.)
35
35
  # * search_field_name; when table option is defined search must define field name which will be used for search query
36
36
  # * collection_name.search_field_name; Same as above except that table options must be ommited.
@@ -42,6 +42,7 @@ module DrgcmsFormFields
42
42
  # name: user_id
43
43
  # type: text_autocomplete
44
44
  # search: dc_user.name
45
+ # is_id: false
45
46
  # html:
46
47
  # size: 30
47
48
  ###########################################################################
@@ -51,76 +52,80 @@ class TextAutocomplete < DrgcmsField
51
52
  # Render text_autocomplete field html code
52
53
  ###########################################################################
53
54
  def render
54
- # Return descriptive text and put it into input field
55
- # search field name
55
+ # Return descriptive text and put it into input field
56
+ # search field name
56
57
  if @yaml['search'].class == Hash
57
58
  table = @yaml['search']['table']
58
59
  ret_name = @yaml['search']['field']
59
60
  method = @yaml['search']['method']
60
61
  elsif @yaml['search'].match(/\./)
61
- table, ret_name, method = @yaml['search'].split('.')
62
+ table, ret_name, method = @yaml['search'].split(/\.|\,/).map(&:strip)
62
63
  else
63
64
  ret_name = @yaml['search']
64
65
  end
65
- # determine table name
66
+ # determine table name
66
67
  if @yaml['table']
67
68
  table = if @yaml['table'].class == String
68
69
  @yaml['table']
69
- # eval(how_to_get_my_table_name)
70
70
  elsif @yaml['table']['eval']
71
71
  eval @yaml['table']['eval']
72
72
  else
73
- Rails.logger.error "Field #{@yaml['name']}: Invalid table parameter!"
73
+ Rails.logger.error "Field #{ @yaml['name'] }: Invalid table parameter!"
74
74
  nil
75
75
  end
76
76
  end
77
- return 'Table or field keyword not defined!' unless (table and ret_name)
78
- # TODO check if table exists
79
- t = table.classify.constantize
80
- # find record and return value of field
77
+ return ro_standard 'Table or field keyword not defined!' unless (table && ret_name)
78
+ # TODO check if table exists
79
+ model_klass = table.classify.constantize
80
+ # find record and return value of field
81
81
  value_send_as = 'p_' + @yaml['name']
82
82
  value = if @parent.params[value_send_as]
83
- @parent.params[value_send_as]
84
- elsif @record and @record[@yaml['name']]
85
- @record[@yaml['name']]
86
- end
87
- # Found value to be written in field. If field is not found write out value.
88
- if value
89
- record = t.find(value) unless @yaml['not_id'] # don't if it's is not an id
90
- value_displayed = record ? record.send(ret_name) : value
83
+ @parent.params[value_send_as]
84
+ elsif @record && @record[@yaml['name']]
85
+ @record[@yaml['name']]
86
+ end
87
+ not_id = @parent.dc_dont?(@yaml['is_id'], false)
88
+ # Found value to be written in field. If field is not found write out value.
89
+ value_displayed = value
90
+ if value && !not_id
91
+ if BSON::ObjectId.legal?(value)
92
+ record = model_klass.find(value)
93
+ value_displayed = record.send(ret_name) if record
94
+ else
95
+ value_displayed = model_klass.send(ret_name, method, @parent, value)
96
+ end
91
97
  end
92
- # return if readonly
93
- #return ro_standard(value_displayed) if @readonly
94
- # Add method back, so autocomplete will know that it must search for method inside class
98
+ return ro_standard(value_displayed) if @readonly
99
+
100
+ # Add method back, so autocomplete will know that it must search for method inside class
95
101
  ret_name = "#{ret_name}.#{method}" if method
96
102
  @yaml['html'] ||= {}
97
103
  @yaml['html']['value'] = value_displayed
98
104
  @yaml['html']['placeholder'] ||= t('drgcms.search_placeholder') || nil
99
- #
105
+ #
100
106
  _name = '_' + @yaml['name']
101
107
  record = record_text_for(@yaml['name'])
102
- @html << @parent.text_field(record, _name, @yaml['html'])
108
+ @html << '<span class="dc-text-autocomplete">' + @parent.text_field(record, _name, @yaml['html']) + '<span></span>'
103
109
  if @yaml['with_new']
104
110
  @html << ' ' +
105
111
  @parent.fa_icon('plus-square lg', class: 'in-edit-add', title: t('drgcms.new'),
106
112
  style: "vertical-align: top;", 'data-table' => @yaml['with_new'] )
107
113
  end
108
- @html << @parent.hidden_field(record, @yaml['name'], value: value) # actual value will be in hidden field
109
- # JS stuff
110
- # allow unselected values on not_id: true option
111
- not_id_code = %Q[
114
+ @html << '</span>' + @parent.hidden_field(record, @yaml['name'], value: value) # actual value will be in hidden field
115
+ # JS stuff
116
+ # allow unselected values on is_id: false option
117
+ not_id_code = %(
112
118
  if (ui.item == null) {
113
119
  $("##{record}_#{@yaml['name']}").val($("##{record}__#{@yaml['name']}").val() );
114
120
  return;
115
- }
116
- ] if @yaml['not_id']
117
- #
121
+ } ) if not_id
122
+ #
118
123
  @js << <<EOJS
119
124
  $(document).ready(function() {
120
125
  $("##{record}_#{_name}").autocomplete( {
121
126
  source: function(request, response) {
122
127
  $.ajax({
123
- url: '/dc_common/autocomplete',
128
+ url: "/dc_common/autocomplete",
124
129
  type: "POST",
125
130
  dataType: "json",
126
131
  data: { input: request.term, table: "#{table}", search: "#{ret_name}" #{(',id: "'+@yaml['id'] + '"') if @yaml['id']} },
@@ -131,11 +136,13 @@ $(document).ready(function() {
131
136
  }
132
137
  });
133
138
  },
139
+
134
140
  change: function (event, ui) {
135
141
  #{not_id_code}
142
+ if (ui.item == null) return;
136
143
  $("##{record}_#{@yaml['name']}").val(ui.item.id);
137
-
138
144
  },
145
+
139
146
  minLength: 2
140
147
  });
141
148
  });
@@ -152,4 +159,5 @@ def self.get_data(params, name)
152
159
  end
153
160
 
154
161
  end
162
+
155
163
  end
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2012+ Damjan Rems
2
+ # Copyright (c) 2020+ Damjan Rems
3
3
  #
4
4
  # Permission is hereby granted, free of charge, to any person obtaining
5
5
  # a copy of this software and associated documentation files (the
@@ -22,5 +22,16 @@
22
22
  #++
23
23
 
24
24
  module DrgcmsFormFields
25
+
26
+ def self.field(parent, record, options)
27
+ klass = options['type'].camelize
28
+ if DrgcmsFormFields.const_defined?(klass)
29
+ field = DrgcmsFormFields.const_get(klass).new(parent, record, options).render
30
+ [field.html + (field.js.size > 0 ? @parent.javascript_tag(field.js) : ''),field.css]
31
+ else
32
+ nil
33
+ end
34
+ end
35
+
25
36
  end
26
37
 
@@ -32,6 +32,7 @@
32
32
  class DcBigMenuRenderer
33
33
 
34
34
  include DcApplicationHelper
35
+ include CmsCommonHelper
35
36
  ########################################################################
36
37
  # Object initialization.
37
38
  ########################################################################
@@ -33,6 +33,7 @@
33
33
  class DcGalleryRenderer
34
34
 
35
35
  include DcApplicationHelper
36
+ include CmsCommonHelper
36
37
 
37
38
  ########################################################################
38
39
  # Object initialization.
@@ -35,6 +35,7 @@
35
35
  class DcMenuRenderer
36
36
 
37
37
  include DcApplicationHelper
38
+ include CmsCommonHelper
38
39
  ########################################################################
39
40
  # Object initialization. Will also prepare DcMenu document.
40
41
  ########################################################################
@@ -36,6 +36,7 @@
36
36
  class DcPageRenderer
37
37
 
38
38
  include DcApplicationHelper
39
+ include CmsCommonHelper
39
40
 
40
41
  ########################################################################
41
42
  # Object initialization.
@@ -71,6 +72,7 @@ end
71
72
  #########################################################################
72
73
  def iframe
73
74
  return '' if @page.if_url.blank?
75
+
74
76
  html = "\n<iframe"
75
77
  html << " id=\"#{@page.if_id}\"" unless @page.if_id.blank?
76
78
  html << " class=\"#{@page.if_class}\"" unless @page.if_class.blank?
@@ -78,7 +80,7 @@ def iframe
78
80
  html << " height=\"#{@page.if_height}\"" unless @page.if_height.blank?
79
81
  html << " width=\"#{@page.if_width}\"" unless @page.if_width.blank?
80
82
  html << " scrolling=\"#{@page.if_scroll}\""
81
- # Parameters
83
+ # Parameters
82
84
  parameters = @page.if_url.match(/\?/) ? '' : '?'
83
85
  params = YAML.load(@page.if_params) rescue {}
84
86
  params = {} unless params.class == Hash
@@ -97,20 +99,20 @@ end
97
99
  def default
98
100
  can_view, msg = dc_user_can_view(@parent, @page)
99
101
  return msg unless can_view
100
- #
101
- html = ''
102
+
103
+ html = "<div class=\"#{@page.div_class} #{@opts[:div_class]}\">"
102
104
  html << dc_page_edit_menu() if @opts[:edit_mode] > 1
103
105
  @parent.page_title = @page.title.blank? ? @page.subject : @page.title
104
106
  html << @page.body
105
- # render poll if defined
107
+ # render poll if defined
106
108
  if @page.dc_poll_id
107
109
  @opts.merge!(:poll_id => @page.dc_poll_id, :return_to => @parent.request.url, method: nil)
108
110
  comment = DcPollRenderer.new(@parent, @opts)
109
111
  html << "<div class='wrap row'>#{comment.render_html}</div>"
110
112
  @css << "\n#{comment.render_css}"
111
113
  end
112
- # also add iframe
113
- html << iframe()
114
+ # also add iframe
115
+ html << iframe() << '</div>'
114
116
  end
115
117
 
116
118
  #########################################################################
@@ -42,6 +42,7 @@
42
42
  class DcPartRenderer
43
43
 
44
44
  include DcApplicationHelper
45
+ include CmsCommonHelper
45
46
 
46
47
  ########################################################################
47
48
  # Object initialization.
@@ -33,7 +33,7 @@
33
33
  class DcPieceRenderer
34
34
 
35
35
  include DcApplicationHelper
36
-
36
+ include CmsCommonHelper
37
37
  ########################################################################
38
38
  # Object initialization. It also loads requested dc_piece document.
39
39
  ########################################################################