drg_cms 0.6.0.8 → 0.6.1.5

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 (85) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +25 -10
  3. data/app/assets/javascripts/drg_cms/drg_cms.js +208 -81
  4. data/app/assets/stylesheets/drg_cms/drg_cms.css +298 -93
  5. data/app/assets/stylesheets/drg_cms/select-multiple.css +1 -1
  6. data/app/controllers/cmsedit_controller.rb +174 -167
  7. data/app/controllers/dc_application_controller.rb +230 -196
  8. data/app/controllers/dc_common_controller.rb +88 -50
  9. data/app/controls/dc_help_control.rb +138 -0
  10. data/app/controls/dc_report.rb +12 -16
  11. data/app/forms/all_options.yml +14 -5
  12. data/app/forms/cms_menu.yml +7 -1
  13. data/app/forms/dc_big_table.yml +0 -2
  14. data/app/forms/dc_big_table_value.yml +0 -2
  15. data/app/forms/dc_category.yml +2 -1
  16. data/app/forms/dc_design.yml +2 -2
  17. data/app/forms/dc_folder_permission.yml +0 -2
  18. data/app/forms/dc_help_1.yml +110 -0
  19. data/app/forms/dc_journal.yml +3 -1
  20. data/app/forms/dc_json_ld.yml +0 -3
  21. data/app/forms/dc_link.yml +1 -1
  22. data/app/forms/dc_menu.yml +8 -12
  23. data/app/forms/dc_menu_item.yml +2 -3
  24. data/app/forms/dc_page.yml +7 -2
  25. data/app/forms/dc_part.yml +1 -0
  26. data/app/forms/dc_piece.yml +1 -0
  27. data/app/forms/dc_policy.yml +2 -5
  28. data/app/forms/dc_poll.yml +13 -16
  29. data/app/forms/dc_seo.yml +1 -2
  30. data/app/forms/dc_simple_menu.yml +3 -2
  31. data/app/forms/dc_site.yml +5 -8
  32. data/app/forms/dc_user.yml +27 -11
  33. data/app/forms/dc_user_role.yml +3 -0
  34. data/app/helpers/cms_common_helper.rb +68 -4
  35. data/app/helpers/cms_edit_helper.rb +73 -55
  36. data/app/helpers/cms_helper.rb +70 -32
  37. data/app/helpers/cms_index_helper.rb +155 -102
  38. data/app/helpers/dc_application_helper.rb +132 -109
  39. data/app/models/concerns/dc_page_concern.rb +14 -4
  40. data/app/models/concerns/dc_piece_concern.rb +1 -1
  41. data/app/models/concerns/dc_policy_rule_concern.rb +20 -8
  42. data/app/models/concerns/dc_site_concern.rb +56 -44
  43. data/app/models/concerns/dc_user_concern.rb +58 -19
  44. data/app/models/dc_big_table.rb +2 -2
  45. data/app/models/dc_design.rb +29 -19
  46. data/app/models/dc_filter.rb +28 -22
  47. data/app/models/dc_key_value_store.rb +1 -0
  48. data/app/models/dc_permission.rb +19 -9
  49. data/app/models/dc_policy.rb +25 -14
  50. data/app/models/dc_policy_role.rb +22 -11
  51. data/app/models/dc_temp.rb +8 -1
  52. data/app/models/dc_user_role.rb +2 -2
  53. data/app/models/drgcms_form_fields/comment.rb +11 -2
  54. data/app/models/drgcms_form_fields/date_picker.rb +2 -0
  55. data/app/models/drgcms_form_fields/drgcms_field.rb +2 -1
  56. data/app/models/drgcms_form_fields/embedded.rb +9 -10
  57. data/app/models/drgcms_form_fields/file_field.rb +1 -1
  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/link_to.rb +2 -2
  61. data/app/models/drgcms_form_fields/method.rb +5 -4
  62. data/app/models/drgcms_form_fields/multitext_autocomplete.rb +1 -1
  63. data/app/models/drgcms_form_fields/number_field.rb +4 -3
  64. data/app/models/drgcms_form_fields/readonly.rb +13 -17
  65. data/app/models/drgcms_form_fields/select.rb +24 -25
  66. data/app/models/drgcms_form_fields/text_autocomplete.rb +22 -14
  67. data/app/renderers/dc_page_renderer.rb +7 -6
  68. data/app/renderers/dc_poll_renderer.rb +16 -20
  69. data/app/views/cmsedit/_edit_stuff.html.erb +5 -2
  70. data/app/views/cmsedit/_form.html.erb +3 -2
  71. data/app/views/cmsedit/_result.html.erb +21 -18
  72. data/app/views/cmsedit/edit.html.erb +4 -1
  73. data/app/views/cmsedit/index.html.erb +3 -2
  74. data/app/views/cmsedit/new.html.erb +5 -2
  75. data/app/views/dc_common/_help.html.erb +17 -0
  76. data/app/views/layouts/models.html.erb +2 -1
  77. data/config/locales/drgcms_en.yml +17 -2
  78. data/config/locales/drgcms_sl.yml +20 -2
  79. data/config/locales/models_en.yml +7 -5
  80. data/config/locales/models_sl.yml +12 -9
  81. data/drg_cms.gemspec +16 -16
  82. data/lib/drg_cms/version.rb +1 -1
  83. data/lib/drg_cms.rb +94 -2
  84. metadata +32 -30
  85. data/app/models/__dc_dummy.rb +0 -102
@@ -27,44 +27,55 @@
27
27
  module DcSiteConcern
28
28
  extend ActiveSupport::Concern
29
29
  included do
30
- include Mongoid::Document
31
- include Mongoid::Timestamps
32
-
33
- field :name, type: String
34
- field :description, type: String
35
- field :homepage_link, type: String
36
- field :error_link, type: String
37
- field :header, type: String, default: ''
38
- field :css, type: String, default: ''
39
- field :route_name, type: String, default: ''
40
- field :page_title, type: String
41
- field :document_extension, type: String
42
- field :page_table, type: String
43
- field :page_class, type: String, default: 'DcPage'
44
- field :site_layout, type: String, default: 'content'
45
- field :menu_class, type: String, default: 'DcSimpleMenu'
46
- field :request_processor, type: String
47
- field :files_directory, type: String
48
- field :logo, type: String
49
- field :active, type: Boolean, default: true
50
- field :created_by, type: BSON::ObjectId
51
- field :updated_by, type: BSON::ObjectId
52
- field :menu_name, type: String
53
- field :menu_id, type: BSON::ObjectId
54
- field :settings, type: String
55
- field :alias_for, type: String
56
- field :rails_view, type: String, default: ''
57
- field :design, type: String, default: ''
58
- field :inherit_policy, type: BSON::ObjectId
59
-
60
- embeds_many :dc_policies
61
- embeds_many :dc_parts
62
-
63
- index( { name: 1 }, { unique: true } )
64
- index( { alias_for: 1 } )
65
-
66
- validates :name, presence: true
67
- validates :name, uniqueness: true
30
+
31
+ include Mongoid::Document
32
+ include Mongoid::Timestamps
33
+
34
+ field :name, type: String
35
+ field :description, type: String
36
+ field :homepage_link, type: String
37
+ field :error_link, type: String
38
+ field :header, type: String, default: ''
39
+ field :css, type: String, default: ''
40
+ field :route_name, type: String, default: ''
41
+ field :page_title, type: String
42
+ field :document_extension, type: String
43
+ field :page_table, type: String
44
+ field :page_class, type: String, default: 'DcPage'
45
+ field :site_layout, type: String, default: 'content'
46
+ field :menu_class, type: String, default: 'DcSimpleMenu'
47
+ field :request_processor, type: String
48
+ field :files_directory, type: String
49
+ field :logo, type: String
50
+ field :active, type: Mongoid::Boolean, default: true
51
+ field :created_by, type: BSON::ObjectId
52
+ field :updated_by, type: BSON::ObjectId
53
+ field :menu_name, type: String
54
+ field :menu_id, type: BSON::ObjectId
55
+ field :settings, type: String
56
+ field :alias_for, type: String
57
+ field :rails_view, type: String, default: ''
58
+ field :design, type: String, default: ''
59
+ field :inherit_policy, type: BSON::ObjectId
60
+
61
+ embeds_many :dc_policies
62
+ embeds_many :dc_parts
63
+
64
+ index( { name: 1 }, { unique: true } )
65
+ index( { alias_for: 1 } )
66
+
67
+ validates :name, presence: true
68
+ validates :name, uniqueness: true
69
+
70
+ after_save :cache_clear
71
+ after_destroy :cache_clear
72
+
73
+ ####################################################################
74
+ # Clear cache if cache is configured
75
+ ####################################################################
76
+ def cache_clear
77
+ DrgCms.cache_clear(:dc_site)
78
+ end
68
79
 
69
80
  ########################################################################
70
81
  # Returns value of site setting. If no value is send as parameter it returns
@@ -78,14 +89,14 @@ end
78
89
  ########################################################################
79
90
  # Returns class object of collection name
80
91
  ########################################################################
81
- def page_klass()
92
+ def page_klass
82
93
  (self.page_table.blank? ? self.page_class : self.page_table).classify.constantize
83
94
  end
84
95
 
85
96
  ########################################################################
86
97
  # Returns class object of menu collection name
87
98
  ########################################################################
88
- def menu_klass()
99
+ def menu_klass
89
100
  (menu_class.blank? ? 'DcMenu' : menu_class).classify.constantize
90
101
  end
91
102
 
@@ -99,12 +110,13 @@ end
99
110
 
100
111
  ########################################################################
101
112
  # Return choices for selecting policies for the site
113
+ # @deprecated
102
114
  ########################################################################
103
- def self.choices4_policies
104
- site = ApplicationController.dc_get_site_()
115
+ #def self.choices4_policies
116
+ # site = ApplicationController.dc_get_site_()
105
117
  #all.inject([]) { |r,site| r << [ (site.active ? '' : t('drgcms.disabled') ) + site.name, site._id] }
106
- [['a','b']]
107
- end
118
+ # [['a','b']]
119
+ #end
108
120
 
109
121
  ########################################################################
110
122
  # Return choices for selecting policies for the site
@@ -50,14 +50,14 @@ field :picture, type: String
50
50
  field :birthdate, type: Date
51
51
  field :about, type: String
52
52
  field :last_visit, type: Time
53
- field :active, type: Boolean, default: true
53
+ field :active, type: Mongoid::Boolean, default: true
54
54
  field :valid_from, type: Date
55
55
  field :valid_to, type: Date
56
56
  field :created_by, type: BSON::ObjectId
57
57
  field :updated_by, type: BSON::ObjectId
58
58
 
59
- field :type, type: Integer, default: 0 # 0 => User, 1 => Group
60
- field :members, type: Array
59
+ field :group, type: Mongoid::Boolean, default: false # false => User, true => Group
60
+ field :member, type: Array
61
61
 
62
62
  embeds_many :dc_user_roles
63
63
 
@@ -73,23 +73,17 @@ has_secure_password
73
73
 
74
74
  index( { username: 1 }, { unique: true } )
75
75
  index( { email: 1 }, { unique: true } )
76
- index 'dc_user_roles.dc_policy_role_id' => 1
77
- index 'members' => 1
76
+ index 'dc_user_roles.dc_policy_role_id' => 1
77
+ index member: 1
78
+ index group: 1
78
79
 
79
80
  validates_length_of :username, minimum: 4
80
81
  validates :username, uniqueness: true
81
- validates :email, uniqueness: true
82
- before_save :do_before_save
82
+ validates :email, uniqueness: true
83
+ validate :do_validate
83
84
 
84
- ##########################################################################
85
- # before_save callback takes care of name field and ensures that e-mail is unique
86
- # when entry is left empty.
87
- ##########################################################################
88
- def do_before_save
89
- self.name = "#{self.title} #{self.first_name} #{self.middle_name + ' ' unless self.middle_name.blank?}#{self.last_name}".strip
90
- # to ensure unique e-mail
91
- self.email = "unknown@#{self.id}" if self.email.to_s.strip.size < 5
92
- end
85
+ before_save :do_before_save
86
+ before_validation :do_before_validation
93
87
 
94
88
  ##########################################################################
95
89
  # Checks if user has role 'role_id' defined in his roles.
@@ -98,7 +92,7 @@ end
98
92
  ##########################################################################
99
93
  def has_role?(role_id)
100
94
  return false unless role_id
101
- #
95
+
102
96
  unless BSON::ObjectId.legal?(role_id)
103
97
  role = DcPolicyRole.get_role(role_id)
104
98
  role_id = role.id if role
@@ -111,7 +105,7 @@ end
111
105
  # Will return all possible values for country field ready for input in select field.
112
106
  # Values are loaded from github when method is first called.
113
107
  ##########################################################################
114
- def self.choices4_country()
108
+ def self.choices4_country
115
109
  if @@countries.nil?
116
110
  uri = URI.parse("https://raw.githubusercontent.com/umpirsky/country-list/master/country/cldr/en/country.json")
117
111
  http = Net::HTTP.new(uri.host, uri.port)
@@ -125,7 +119,7 @@ def self.choices4_country()
125
119
  end
126
120
 
127
121
  ##########################################################################
128
- # Performs ligically test on passed email parameter.
122
+ # Performs logically test on passed email parameter.
129
123
  #
130
124
  # Parameters:
131
125
  # [email] String: e-mail address
@@ -143,5 +137,50 @@ def self.is_email?(email)
143
137
  email.to_s =~ /^[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$/
144
138
  end
145
139
 
140
+ ##########################################################################
141
+ # Will return list of available groups
142
+ ##########################################################################
143
+ def self.groups_for_select
144
+ where(group: true, active: true).order_by(name: 1).inject([]) { |r, e| r << [e.name, e.id] }
145
+ end
146
+
147
+ private
148
+
149
+ ##########################################################################
150
+ # before_save callback takes care of name field and ensures that e-mail is unique
151
+ # when entry is left empty.
152
+ ##########################################################################
153
+ def do_before_save
154
+ self.name = "#{title} #{first_name} #{middle_name + ' ' unless middle_name.blank?}#{last_name}".squish
155
+ # to ensure unique e-mail
156
+ self.email = "unknown@#{id}" if email.blank?
157
+ end
158
+
159
+ ##########################################################################
160
+ # Create random password for groups. Must be done before validation
161
+ ##########################################################################
162
+ def do_before_validation
163
+ if new_record? && group
164
+ self.password = DcUser.random_password(30)
165
+ self.password_confirmation = password
166
+ end
167
+ end
168
+
169
+ ##########################################################################
170
+ # Perform some additional validations
171
+ ##########################################################################
172
+ def do_validate
173
+ if group && member.present?
174
+ errors.add('member', I18n.t('errors.messages.present'))
175
+ end
176
+ end
177
+ ##########################################################################
178
+ # Will create random password
179
+ ##########################################################################
180
+ def self.random_password(number)
181
+ charset = Array('A'..'Z') + Array('0'..'9') + Array('a'..'z')
182
+ Array.new(number) { charset.sample }.join
183
+ end
184
+
146
185
  end
147
186
  end
@@ -78,10 +78,10 @@ class DcBigTable
78
78
  ########################################################################
79
79
  # Will return possible choices for specified key prepared for usega in select input field.
80
80
  ########################################################################
81
- def self.choices4(key, site, locale=nil)
81
+ def self.choices4(key, site = nil, locale = nil)
82
82
  result = []
83
83
  choices = find_by(key: key, site: site)
84
- choices = find_by(key: key, site: nil) if choices.nil?
84
+ choices = find_by(key: key, site: nil) if site && choices.nil?
85
85
  if choices
86
86
  choices.dc_big_table_values.each do |choice|
87
87
  description = choice.description
@@ -87,25 +87,35 @@
87
87
  # <style type="text/css"><%= @css.html_safe %></style><%= javascript_tag @js %>
88
88
  ########################################################################
89
89
  class DcDesign
90
- include Mongoid::Document
91
- include Mongoid::Timestamps
92
-
93
- field :description, type: String, default: ''
94
- field :body, type: String, default: ''
95
- field :css, type: String, default: ''
96
- field :rails_view, type: String, default: ''
97
- field :control, type: String, default: ''
98
- field :params, type: String, default: ''
99
- field :control_method, type: String, default: ''
100
- field :author, type: String
101
- field :active, type: Boolean, default: true
102
- field :created_by, type: BSON::ObjectId
103
- field :updated_by, type: BSON::ObjectId
104
- field :site_id, type: BSON::ObjectId
105
-
106
- embeds_many :dc_parts
107
-
108
- validates_length_of :description, minimum: 5
90
+ include Mongoid::Document
91
+ include Mongoid::Timestamps
92
+
93
+ field :description, type: String, default: ''
94
+ field :body, type: String, default: ''
95
+ field :css, type: String, default: ''
96
+ field :rails_view, type: String, default: ''
97
+ field :control, type: String, default: ''
98
+ field :params, type: String, default: ''
99
+ field :control_method, type: String, default: ''
100
+ field :author, type: String
101
+ field :active, type: Boolean, default: true
102
+ field :created_by, type: BSON::ObjectId
103
+ field :updated_by, type: BSON::ObjectId
104
+ field :site_id, type: BSON::ObjectId
105
+
106
+ embeds_many :dc_parts
107
+
108
+ validates_length_of :description, minimum: 5
109
+
110
+ after_save :cache_clear
111
+ after_destroy :cache_clear
112
+
113
+ ####################################################################
114
+ # Clear cache if cache is configured
115
+ ####################################################################
116
+ def cache_clear
117
+ DrgCms.cache_clear(:dc_design)
118
+ end
109
119
 
110
120
  ########################################################################
111
121
  # Return choices for select for design_id.
@@ -106,8 +106,9 @@ end
106
106
  ############################################################################
107
107
  # Return filter input field for entering variable filter values on index form
108
108
  ############################################################################
109
- def self.get_filter_field(parent)
109
+ def self.get_filter_field(parent)
110
110
  return '' if parent.session[ parent.form['table'] ].nil?
111
+
111
112
  filter = parent.session[ parent.form['table'] ][:filter]
112
113
  return '' if filter.nil?
113
114
 
@@ -115,8 +116,11 @@ def self.get_filter_field(parent)
115
116
  return '' if filter.nil?
116
117
 
117
118
  field = get_field_form_definition(filter['field'], parent)
118
- return '' if field.nil? and filter['input'].nil?
119
- field = {} if field.nil?
119
+ return '' if field.nil? && filter['input'].nil?
120
+
121
+ saved_readonly = parent.form['readonly']
122
+ parent.form['readonly'] = false # must be
123
+ field ||= {}
120
124
  # If field has choices available in labels, use them. This is most likely select input field.
121
125
  if field['name']
122
126
  choices = parent.t('helpers.label.' + parent.form['table'] + '.choices4_' + field['name'] )
@@ -129,35 +133,37 @@ def self.get_filter_field(parent)
129
133
  field['type'] = filter['input'] if filter['input'].to_s.size > 5
130
134
  field['type'] ||= 'text_field'
131
135
  field['readonly'] = false # must be
132
- field['html'] ||= {}
133
- field['html']['size'] = 20
136
+ field['html'] ||= {}
137
+ field['html']['size'] = 20
134
138
  # Start with last entered value
135
139
  field['html']['value'] = filter['value'] unless filter['value'] == '#NIL'
136
140
  field['html']['selected'] = field['html']['value'] # for select field
137
141
  # url for filter ON action
138
142
  field['html']['data-url'] = parent.url_for(
139
- controller: 'cmsedit',action: :index, filter: 'on',
143
+ controller: 'cmsedit', action: :index, filter: 'on',
140
144
  table: parent.form['table'], form_name: parent.params['form_name'])
141
145
  url = field['html']['data-url']
142
146
  # remove if present
143
147
  field['with_new'] = nil if field['with_new']
144
- # create input field object
145
- klas_string = field['type'].camelize
146
- klas = DrgcmsFormFields::const_get(klas_string) rescue nil
147
- return '' if klas.nil?
148
- # return data from object and create html code to display field
149
- object = klas.new(parent, nil, field).render rescue nil
150
- # Error. Forget filter and return
151
- if object.nil?
152
- parent.session[ parent.form['table'] ][:filter] = nil
153
- return ''
148
+ # create input field object
149
+ html = ''
150
+ klass_string = field['type'].camelize
151
+ klass = DrgcmsFormFields::const_get(klass_string) rescue nil
152
+ # return data from object and create html code to display field
153
+ if klass
154
+ if drg_field = klass.new(parent, nil, field).render rescue nil
155
+ js = drg_field.js.blank? ? '' : parent.javascript_tag(drg_field.js)
156
+ html = %(<li class="no-background">
157
+ <span class="filter_field" data-url="#{url}">#{drg_field.html}
158
+ #{parent.fa_icon('search lg', class: 'record_filter_field_icon')}
159
+ #{js}</span></li>)
160
+ else
161
+ # Error. Forget filter
162
+ parent.session[ parent.form['table'] ][:filter] = nil
163
+ end
154
164
  end
155
- js = object.js.blank? ? '' : parent.javascript_tag(object.js)
156
- %Q[<li class="no-background">
157
- <span class="filter_field" data-url="#{url}">#{object.html}
158
- #{parent.fa_icon('search lg', class: 'record_filter_field_icon')}
159
- #{js}</span>
160
- </li>]
165
+ parent.form['readonly'] = saved_readonly
166
+ html
161
167
  end
162
168
 
163
169
  ######################################################################
@@ -128,6 +128,7 @@ def self.set_value(value, *keys)
128
128
  else
129
129
  create(key: keys.join('-'), value: value)
130
130
  end
131
+ value
131
132
  end
132
133
 
133
134
  end
@@ -44,23 +44,23 @@ class DcPermission
44
44
  #- Available permissions settings
45
45
 
46
46
  # User has no access
47
- NO_ACCESS = 0
47
+ NO_ACCESS = 0
48
48
  # User can view documents
49
- CAN_VIEW = 1
49
+ CAN_VIEW = 1
50
50
  # User can create new documents
51
- CAN_CREATE = 2
51
+ CAN_CREATE = 2
52
52
  # User can edit his own documents
53
- CAN_EDIT = 4
53
+ CAN_EDIT = 4
54
54
  # User can edit all documents in collection
55
- CAN_EDIT_ALL = 8
55
+ CAN_EDIT_ALL = 8
56
56
  # User can delete his own documents
57
- CAN_DELETE = 16
57
+ CAN_DELETE = 16
58
58
  # User can delete all documents in collection
59
59
  CAN_DELETE_ALL = 32
60
60
  # User can admin collection (same as can_delete_all, but can see documents which do not belong to current site)
61
- CAN_ADMIN = 64
61
+ CAN_ADMIN = 64
62
62
  # User is superadmin. Basicly same as admin.
63
- SUPERADMIN = 128
63
+ SUPERADMIN = 128
64
64
 
65
65
  include Mongoid::Document
66
66
  include Mongoid::Timestamps
@@ -75,7 +75,17 @@ embeds_many :dc_policy_rules, as: :policy_rules
75
75
  index( { table_name: 1 }, { unique: true } )
76
76
 
77
77
  validates :table_name, presence: true
78
- validates :table_name, uniqueness: true
78
+ validates :table_name, uniqueness: true
79
+
80
+ after_save :cache_clear
81
+ after_destroy :cache_clear
82
+
83
+ ####################################################################
84
+ # Clear cache if cache is configured
85
+ ####################################################################
86
+ def cache_clear
87
+ DrgCms.cache_clear(:dc_permission)
88
+ end
79
89
 
80
90
  ########################################################################
81
91
  # Will return choices for permissions prepared for usega in select input field.
@@ -45,22 +45,33 @@
45
45
  # other policies. Default policy is also used when document has no access policy assigned.
46
46
  #########################################################################
47
47
  class DcPolicy
48
- include Mongoid::Document
49
- include Mongoid::Timestamps
48
+ include Mongoid::Document
49
+ include Mongoid::Timestamps
50
50
 
51
- field :name, type: String
52
- field :description, type: String, default: ''
53
- field :is_default, type: Boolean, default: false
54
- field :active, type: Boolean, default: true
55
- field :updated_by, type: BSON::ObjectId
56
- field :message, type: String, default: ''
57
-
58
- embeds_many :dc_policy_rules, as: :policy_rules
59
- embedded_in :dc_site
51
+ field :name, type: String
52
+ field :description, type: String, default: ''
53
+ field :is_default, type: Boolean, default: false
54
+ field :active, type: Boolean, default: true
55
+ field :updated_by, type: BSON::ObjectId
56
+ field :message, type: String, default: ''
57
+
58
+ embeds_many :dc_policy_rules, as: :policy_rules
59
+ embedded_in :dc_site
60
+
61
+ validates :name, length: { minimum: 4 }
62
+ validates :message, length: { minimum: 5 }
63
+
64
+ after_save :cache_clear
65
+ after_destroy :cache_clear
66
+
67
+ ####################################################################
68
+ # Clear cache if cache is configured
69
+ ####################################################################
70
+ def cache_clear
71
+ DrgCms.cache_clear(:dc_permission)
72
+ DrgCms.cache_clear(:dc_site)
73
+ end
60
74
 
61
- validates :name, :length => { :minimum => 4 }
62
- validates :message, :length => { :minimum => 5 }
63
-
64
75
  =begin
65
76
  #########################################################################
66
77
  # Returns values for permissions ready to be used in select field.
@@ -38,18 +38,29 @@
38
38
  # which can be persistent, when application is used as Rails plugin.
39
39
  #########################################################################
40
40
  class DcPolicyRole
41
- include Mongoid::Document
42
- include Mongoid::Timestamps
41
+ include Mongoid::Document
42
+ include Mongoid::Timestamps
43
43
 
44
- field :name, type: String
45
- field :system_name, type: String
46
- field :active, type: Boolean, default: true
47
-
48
- index( { name: 1 }, { unique: true } )
49
- index( system_name: 1 )
50
-
51
- validates :name, :length => { :minimum => 4 }
52
- validates :name, uniqueness: true
44
+ field :name, type: String
45
+ field :system_name, type: String
46
+ field :active, type: Boolean, default: true
47
+
48
+ index( { name: 1 }, { unique: true } )
49
+ index( system_name: 1 )
50
+
51
+ validates :name, :length => { :minimum => 4 }
52
+ validates :name, uniqueness: true
53
+
54
+ after_save :cache_clear
55
+ after_destroy :cache_clear
56
+
57
+ ####################################################################
58
+ # Clear cache if cache is configured
59
+ ####################################################################
60
+ def cache_clear
61
+ DrgCms.cache_clear(:dc_permission)
62
+ DrgCms.cache_clear(:dc_site)
63
+ end
53
64
 
54
65
  ########################################################################
55
66
  # Return all defined roles as choices for use in select field.
@@ -46,7 +46,7 @@ class DcTemp
46
46
  ########################################################################
47
47
  def initialize(parms = {})
48
48
  super()
49
- parms.stringify_keys!
49
+ parms = parms.nil? ? {} : parms.stringify_keys
50
50
  self.key = parms.delete('key') if parms['key']
51
51
  self.active = parms.delete('active') if parms['active']
52
52
  self.order = parms.delete('order') if parms['order']
@@ -137,4 +137,11 @@ def self.prepare(key:, clear: nil)
137
137
  self.where(key: key)
138
138
  end
139
139
 
140
+ ########################################################################
141
+ # Order data by new key. Will update order field with values from new field
142
+ ########################################################################
143
+ def self.reorder_by(key, new_order)
144
+ self.where(key: key).each { |doc| doc.order = data[key]; doc.save }
145
+ end
146
+
140
147
  end
@@ -57,8 +57,8 @@ class DcUserRole
57
57
  # Determine of role is still active
58
58
  ###############################################################################
59
59
  def active?
60
- now = Time.zone.local
61
- self.active and (self.valid_from.nil? or now > self.valid_from) and (self.valid_to.nil? or now < self.valid_to)
60
+ now = Time.current
61
+ active && (valid_from.nil? || now > valid_from) && (valid_to.nil? || now < valid_to)
62
62
  end
63
63
 
64
64
  end
@@ -31,12 +31,17 @@ module DrgcmsFormFields
31
31
  # * +type:+ comment (required)
32
32
  # * +caption:+ Caption text written in label place. If set to false comment
33
33
  # will occupy whole row. (required)
34
- #
34
+ # * +html:+ Optional html attributes will be added to div surrounding the comment.
35
+ #
35
36
  # Form example:
36
37
  # 30:
37
38
  # type: comment
38
39
  # text: myapp.comment_text
39
40
  # caption: false
41
+ # html:
42
+ # style: 'color: red'
43
+ # class: some_class
44
+ # id: some_id
40
45
  ###########################################################################
41
46
  class Comment < DrgcmsField
42
47
 
@@ -45,7 +50,11 @@ class Comment < DrgcmsField
45
50
  ###########################################################################
46
51
  def render
47
52
  comment = @yaml['comment'] || @yaml['text']
48
- @html << "<div class=\"dc-comment\">#{t(comment, comment).gsub("\n",'<br>')}</div>"
53
+ @yaml['html'] ||= {}
54
+ @yaml['html']['class'] = 'dc-comment ' + @yaml['html']['class'].to_s
55
+ html = @yaml['html'].inject('') { |r, e| r << %( #{e[0]}="#{e[1]}") }
56
+
57
+ @html << %(<div #{html}>#{t(comment, comment).gsub("\n",'<br>')}</div>)
49
58
  self
50
59
  end
51
60
  end
@@ -78,6 +78,8 @@ def render
78
78
  @yaml['options']['lang'] ||= "'#{I18n.locale}'"
79
79
  @yaml['options']['format'] ||= "'#{t('datetimepicker.formats.date')}'"
80
80
  @yaml['options']['timepicker'] = false
81
+ @yaml['options']['scrollMonth'] ||= false
82
+ @yaml['options']['scrollInput'] ||= false
81
83
 
82
84
  record = record_text_for(@yaml['name'])
83
85
  @html << @parent.text_field(record, @yaml['name'], @yaml['html'])
@@ -135,7 +135,8 @@ def ro_standard(value=nil)
135
135
  @record.respond_to?(@yaml['name']) ? @record.send(@yaml['name']) : nil
136
136
  end
137
137
  end
138
- @html << (value.blank? ? '' : "<div class='dc-readonly'>#{value}</div>")
138
+ #@html << (value.blank? ? '' : "<div class='dc-readonly'>#{value}</div>")
139
+ @html << %(<div id="#{@yaml['name']}" class="dc-readonly">#{value}</div>)
139
140
  self
140
141
  end
141
142