drg_cms 0.7.0.2 → 0.7.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/drg_cms/drg_cms.js +110 -35
- data/app/assets/javascripts/drg_cms/jquery.bpopup.js +372 -0
- data/app/assets/javascripts/drg_cms_application.js +1 -1
- data/app/assets/javascripts/drg_cms_cms.js +1 -1
- data/app/assets/stylesheets/drg_cms/drg_cms.css +126 -36
- data/app/assets/stylesheets/drg_cms/select-multiple.css +6 -7
- data/app/controllers/cmsedit_controller.rb +78 -47
- data/app/controllers/dc_application_controller.rb +22 -25
- data/app/controllers/dc_common_controller.rb +9 -6
- data/app/controllers/dc_main_controller.rb +0 -1
- data/app/controls/{dc_category_control.rb → dc_gallery_control.rb} +15 -30
- data/app/controls/dc_image_control.rb +180 -0
- data/app/controls/dc_page_control.rb +3 -3
- data/app/controls/dc_poll_result_control.rb +38 -39
- data/app/controls/dc_report.rb +9 -4
- data/app/controls/dc_setup_control.rb +53 -0
- data/app/controls/design_element_settings_control.rb +88 -37
- data/app/forms/all_options.yml +20 -9
- data/app/forms/cms_menu.yml +14 -2
- data/app/forms/dc_gallery.yml +1 -1
- data/app/forms/dc_image.yml +122 -0
- data/app/forms/dc_image_search.yml +72 -0
- data/app/forms/dc_page.yml +11 -8
- data/app/forms/dc_poll.yml +2 -1
- data/app/forms/dc_poll_result.yml +10 -7
- data/app/forms/dc_setup.yml +45 -0
- data/app/forms/dc_steps_template.yml +6 -2
- data/app/helpers/cms_common_helper.rb +36 -24
- data/app/helpers/cms_edit_helper.rb +26 -33
- data/app/helpers/cms_helper.rb +29 -12
- data/app/helpers/cms_index_helper.rb +109 -80
- data/app/helpers/dc_application_helper.rb +108 -86
- data/app/helpers/dc_image_helper.rb +127 -0
- data/app/models/concerns/dc_policy_rule_concern.rb +1 -1
- data/app/models/concerns/dc_user_concern.rb +13 -5
- data/app/models/dc_big_table.rb +1 -1
- data/app/models/dc_category.rb +12 -0
- data/app/models/dc_design.rb +5 -4
- data/app/models/dc_filter.rb +24 -27
- data/app/models/dc_image.rb +237 -0
- data/app/models/dc_internals.rb +5 -9
- data/app/models/dc_memory.rb +2 -2
- data/app/models/dc_policy_role.rb +8 -8
- data/app/models/dc_setup.rb +111 -0
- data/app/models/drgcms_form_fields/datetime_picker.rb +1 -1
- data/app/models/drgcms_form_fields/drgcms_field.rb +9 -26
- data/app/models/drgcms_form_fields/embedded.rb +28 -17
- data/app/models/drgcms_form_fields/journal_diff.rb +2 -2
- data/app/models/drgcms_form_fields/multitext_autocomplete.rb +88 -76
- data/app/models/drgcms_form_fields/select.rb +41 -19
- data/app/models/drgcms_form_fields/text_with_select.rb +5 -9
- data/app/renderers/dc_big_menu_renderer.rb +18 -20
- data/app/renderers/dc_gallery_renderer.rb +10 -4
- data/app/renderers/dc_menu_renderer.rb +21 -58
- data/app/renderers/dc_page_renderer.rb +7 -7
- data/app/renderers/dc_poll_renderer.rb +13 -12
- data/app/renderers/dc_simple_menu_renderer.rb +1 -1
- data/app/views/cmsedit/_edit_stuff.html.erb +4 -1
- data/app/views/cmsedit/edit.html.erb +1 -1
- data/app/views/cmsedit/index.html.erb +1 -1
- data/app/views/cmsedit/new.html.erb +1 -0
- data/config/locales/drgcms_en.yml +22 -2
- data/config/locales/drgcms_sl.yml +25 -6
- data/config/locales/models_en.yml +50 -1
- data/config/locales/models_sl.yml +60 -1
- data/drg_cms.gemspec +1 -1
- data/lib/drg_cms/version.rb +1 -1
- data/lib/drg_cms.rb +40 -27
- data/lib/generators/convert_to_ar/USAGE +8 -0
- data/lib/generators/convert_to_ar/convert_to_ar_generator.rb +158 -0
- data/lib/generators/new_drg_form/new_drg_form_generator.rb +32 -14
- metadata +19 -10
- data/app/assets/javascripts/drg_cms/jquery.bpopup.min.js +0 -7
- data/app/views/layouts/__cmsedit.html.erb +0 -16
data/app/models/dc_filter.rb
CHANGED
@@ -53,32 +53,33 @@ end
|
|
53
53
|
######################################################################
|
54
54
|
def self.get_filter(filter)
|
55
55
|
yaml = YAML.load(filter) rescue nil
|
56
|
-
return yaml
|
57
|
-
|
58
|
-
#
|
56
|
+
return if yaml.nil? || yaml['table'].nil? # old data
|
57
|
+
|
59
58
|
model = yaml['table'].classify.constantize
|
60
59
|
field = yaml['field'] == 'id' ? '_id' : yaml['field'] # must be
|
61
|
-
# evaluate
|
62
|
-
if yaml['operation'] == 'eval'
|
63
|
-
return
|
60
|
+
# evaluate
|
61
|
+
if yaml['operation'] == 'eval'
|
62
|
+
return eval(yaml['value']) if yaml['value'] && yaml['value'] != '#NIL' # evaluated as string
|
63
|
+
return model.send( yaml['field'] ) if model.respond_to?(yaml['field']) # defined as scope or method in the model
|
64
|
+
return
|
64
65
|
end
|
65
|
-
# if empty
|
66
|
+
# if empty
|
66
67
|
if yaml['operation'] == 'empty'
|
67
|
-
return model.in(field => [nil,''])
|
68
|
+
return model.in(field => [nil, ''])
|
68
69
|
end
|
69
|
-
# if value == NIL no filter is necessary
|
70
|
-
return
|
70
|
+
# if value == NIL no filter is necessary
|
71
|
+
return if yaml['value'].class == String && yaml['value'] == '#NIL'
|
71
72
|
|
72
|
-
# do regex if operation is like
|
73
|
+
# do regex if operation is like
|
73
74
|
value = yaml['operation'] == 'like' ? /#{yaml['value']}/i : yaml['value']
|
74
|
-
# when field type is ObjectId transform value
|
75
|
-
if model.fields[field]
|
75
|
+
# when field type is ObjectId transform value
|
76
|
+
if model.fields[field] && model.fields[field].type == BSON::ObjectId
|
76
77
|
value = BSON::ObjectId.from_string(value) rescue nil
|
77
78
|
end
|
78
|
-
|
79
|
-
if [
|
79
|
+
|
80
|
+
if %w[eq like].include?(yaml['operation'])
|
80
81
|
model.where(field => value)
|
81
|
-
# TODO in operator
|
82
|
+
# TODO in operator
|
82
83
|
else
|
83
84
|
model.where(field.to_sym.send(yaml['operation']) => value)
|
84
85
|
end
|
@@ -109,11 +110,11 @@ end
|
|
109
110
|
def self.get_filter_field(parent)
|
110
111
|
return '' if parent.session[ parent.form['table'] ].nil?
|
111
112
|
|
112
|
-
filter = parent.session[
|
113
|
+
filter = parent.session[parent.form['table']][:filter]
|
113
114
|
return '' if filter.nil?
|
114
115
|
|
115
116
|
filter = YAML.load(filter) rescue nil
|
116
|
-
return '' if filter.nil?
|
117
|
+
return '' if filter.nil? || filter['operation'].to_s == 'eval'
|
117
118
|
|
118
119
|
field = get_field_form_definition(filter['field'], parent)
|
119
120
|
return '' if field.nil? && filter['input'].nil?
|
@@ -124,7 +125,7 @@ def self.get_filter_field(parent)
|
|
124
125
|
# If field has choices available in labels, use them. This is most likely select input field.
|
125
126
|
if field['name']
|
126
127
|
choices = parent.t('helpers.label.' + parent.form['table'] + '.choices4_' + field['name'] )
|
127
|
-
unless choices.match(
|
128
|
+
unless choices.match(/translation missing/i) || choices.match('helpers.label')
|
128
129
|
field['choices'] = choices
|
129
130
|
end
|
130
131
|
end
|
@@ -185,14 +186,10 @@ def self.menu_filter(parent)
|
|
185
186
|
# only single defined. Convert to array.
|
186
187
|
filters = [filters] if filters.class == Hash
|
187
188
|
filters.each do |filter|
|
188
|
-
url = parent.
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
filter_oper: filter['operation'],
|
193
|
-
filter_value: filter['value'])
|
194
|
-
|
195
|
-
url = parent.url_for(controller: 'cmsedit', action: :run, t: table, f: CmsHelper.form_param(parent.params),
|
189
|
+
url = parent.url_for(controller: :cmsedit,
|
190
|
+
action: :run,
|
191
|
+
table: table,
|
192
|
+
form_name: CmsHelper.form_param(parent.params),
|
196
193
|
control: 'cmsedit.filter_on',
|
197
194
|
filter_field: filter['field'],
|
198
195
|
filter_oper: filter['operation'],
|
@@ -0,0 +1,237 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2022+ Damjan Rems
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
# a copy of this software and associated documentation files (the
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
# the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be
|
13
|
+
# included in all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
#++
|
23
|
+
|
24
|
+
##########################################################################
|
25
|
+
# == Schema information
|
26
|
+
#
|
27
|
+
# Collection name: dc_images : Images
|
28
|
+
#
|
29
|
+
# _id BSON::ObjectId _id
|
30
|
+
# created_at Time created_at
|
31
|
+
# updated_at Time updated_at
|
32
|
+
# dc_site_id BSON::ObjectId Site id
|
33
|
+
# dc_user_id BSON::ObjectId User's id
|
34
|
+
# name String ip
|
35
|
+
# short String short name
|
36
|
+
# text String text
|
37
|
+
# size_l String Large image size
|
38
|
+
# size_m String Medium image size
|
39
|
+
# size_s String Small image size
|
40
|
+
#
|
41
|
+
# DRG CMS module for saveing and manipulating images.
|
42
|
+
#
|
43
|
+
# If you want to use this module you must install image magick tools
|
44
|
+
# and mini_magick ruby gem.
|
45
|
+
##########################################################################
|
46
|
+
class DcImage
|
47
|
+
include Mongoid::Document
|
48
|
+
include Mongoid::Timestamps
|
49
|
+
|
50
|
+
field :name, type: String
|
51
|
+
field :img_type, type: String
|
52
|
+
field :text, type: String
|
53
|
+
field :short, type: String
|
54
|
+
field :keep_original, type: Boolean, default: false
|
55
|
+
field :size_o, type: String
|
56
|
+
field :size_l, type: String
|
57
|
+
field :size_m, type: String
|
58
|
+
field :size_s, type: String
|
59
|
+
field :categories, type: Array, default: []
|
60
|
+
field :created_by, type: BSON::ObjectId
|
61
|
+
|
62
|
+
belongs_to :dc_site
|
63
|
+
|
64
|
+
index dc_site_id: 1
|
65
|
+
index created_by: 1
|
66
|
+
index categories: 1
|
67
|
+
|
68
|
+
before_validation :set_original
|
69
|
+
|
70
|
+
validate :validate_image_values
|
71
|
+
|
72
|
+
#########################################################################
|
73
|
+
# checks that image size values are in correct format. Must be hsize[x]vsize (ex. 300x200)
|
74
|
+
#########################################################################
|
75
|
+
def set_original
|
76
|
+
if keep_original
|
77
|
+
if size_o.blank?
|
78
|
+
image = MiniMagick::Image.open(name)
|
79
|
+
self.size_o = "#{image.width}x#{image.height}"
|
80
|
+
end
|
81
|
+
else
|
82
|
+
self.size_o = ''
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
#########################################################################
|
87
|
+
# checks that image size values are in correct format. Must be hsize[x]vsize (ex. 300x200)
|
88
|
+
#########################################################################
|
89
|
+
def validate_image_values
|
90
|
+
%w[l m s o].each do |size|
|
91
|
+
field = "size_#{size}"
|
92
|
+
value = send(field)
|
93
|
+
next if value.blank?
|
94
|
+
|
95
|
+
a = value.strip.split(/x|\+/)
|
96
|
+
a[0, 2].each { |e| errors.add(field, I18n.t('drgcms.not_valid')) unless e.to_i > 0 }
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
#########################################################################
|
101
|
+
# For mapping categories array to input text_area field
|
102
|
+
#########################################################################
|
103
|
+
def cats_input=(what)
|
104
|
+
self.categories = if what.blank?
|
105
|
+
[]
|
106
|
+
else
|
107
|
+
what.chomp.split("\n").map(&:downcase).map(&:strip)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
#########################################################################
|
112
|
+
# For mapping categories array to input text_area field
|
113
|
+
#########################################################################
|
114
|
+
def cats_input
|
115
|
+
self.categories.join("\n")
|
116
|
+
end
|
117
|
+
|
118
|
+
#########################################################################
|
119
|
+
# For mapping categories array to display field
|
120
|
+
#########################################################################
|
121
|
+
def categories_line
|
122
|
+
categories ? categories.join(", ") : ''
|
123
|
+
end
|
124
|
+
|
125
|
+
#########################################################################
|
126
|
+
# Will return first available image starting from small up
|
127
|
+
#########################################################################
|
128
|
+
def first_available_image
|
129
|
+
image = %w[o s m l].each do |size|
|
130
|
+
field = "size_#{size}"
|
131
|
+
value = send(field)
|
132
|
+
return "#{id}-#{size}.#{img_type}" if value.present?
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
#########################################################################
|
137
|
+
# Will return size for large image
|
138
|
+
#########################################################################
|
139
|
+
def size_ls
|
140
|
+
size_l.blank? ? '' : size_l.split(/x|\+/)[0, 2].join('x')
|
141
|
+
end
|
142
|
+
|
143
|
+
#########################################################################
|
144
|
+
# Will set new size for large image
|
145
|
+
#########################################################################
|
146
|
+
def size_ls=(value)
|
147
|
+
self.size_l = value.blank? ? '' : value
|
148
|
+
end
|
149
|
+
|
150
|
+
#########################################################################
|
151
|
+
# Will return x offset for cropping large image
|
152
|
+
#########################################################################
|
153
|
+
def offset_lx
|
154
|
+
size_l.blank? ? '' : size_l.split(/x|\+/)[2].to_i
|
155
|
+
end
|
156
|
+
|
157
|
+
#########################################################################
|
158
|
+
# Will set x offset for cropping large image
|
159
|
+
#########################################################################
|
160
|
+
def offset_lx=(value)
|
161
|
+
self.size_l << (size_l.blank? ? '' : "+#{value}")
|
162
|
+
end
|
163
|
+
|
164
|
+
#########################################################################
|
165
|
+
# Will return y offset for cropping large image
|
166
|
+
#########################################################################
|
167
|
+
def offset_ly
|
168
|
+
size_l.blank? ? '' : size_l.split(/x|\+/)[3].to_i
|
169
|
+
end
|
170
|
+
|
171
|
+
#########################################################################
|
172
|
+
# Will set y offset for cropping large image
|
173
|
+
#########################################################################
|
174
|
+
def offset_ly=(value)
|
175
|
+
self.size_l << (size_l.blank? ? '' : "+#{value}")
|
176
|
+
end
|
177
|
+
|
178
|
+
def size_ms
|
179
|
+
size_m.blank? ? '' : size_m.split(/x|\+/)[0, 2].join('x')
|
180
|
+
end
|
181
|
+
|
182
|
+
def size_ms=(value)
|
183
|
+
self.size_m = value.blank? ? '' : value
|
184
|
+
end
|
185
|
+
|
186
|
+
def offset_mx
|
187
|
+
size_m.blank? ? '' : size_m.split(/x|\+/)[2].to_i
|
188
|
+
end
|
189
|
+
|
190
|
+
def offset_mx=(value)
|
191
|
+
self.size_m << (size_m.blank? ? '' : "+#{value}")
|
192
|
+
end
|
193
|
+
|
194
|
+
def offset_my
|
195
|
+
size_m.blank? ? '' : size_m.split(/x|\+/)[3].to_i
|
196
|
+
end
|
197
|
+
|
198
|
+
def offset_my=(value)
|
199
|
+
self.size_m << (size_m.blank? ? '' : "+#{value}")
|
200
|
+
end
|
201
|
+
|
202
|
+
def size_ss
|
203
|
+
size_s.blank? ? '' : size_s.split(/x|\+/)[0, 2].join('x')
|
204
|
+
end
|
205
|
+
|
206
|
+
def size_ss=(value)
|
207
|
+
self.size_s = value.blank? ? '' : value
|
208
|
+
end
|
209
|
+
|
210
|
+
def offset_sx
|
211
|
+
size_s.blank? ? '' : size_s.split(/x|\+/)[2].to_i
|
212
|
+
end
|
213
|
+
|
214
|
+
def offset_sx=(value)
|
215
|
+
self.size_s << (size_s.blank? ? '' : "+#{value}")
|
216
|
+
end
|
217
|
+
|
218
|
+
def offset_sy
|
219
|
+
size_s.blank? ? '' : size_s.split(/x|\+/)[3].to_i
|
220
|
+
end
|
221
|
+
|
222
|
+
def offset_sy=(value)
|
223
|
+
self.size_s << (size_s.blank? ? '' : "+#{value}")
|
224
|
+
end
|
225
|
+
|
226
|
+
#########################################################################
|
227
|
+
# Return all users that have contributed images
|
228
|
+
#########################################################################
|
229
|
+
def self.all_users
|
230
|
+
DcUser.where(:id.in => distinct(:created_by)).order_by(name: 1).map { |doc| [doc.name, doc.id] }
|
231
|
+
end
|
232
|
+
|
233
|
+
def self.html_code
|
234
|
+
'code'
|
235
|
+
end
|
236
|
+
|
237
|
+
end
|
data/app/models/dc_internals.rb
CHANGED
@@ -28,11 +28,10 @@
|
|
28
28
|
##########################################################################
|
29
29
|
module DcInternals
|
30
30
|
INTERNALS = {
|
31
|
-
'current_user' => 'session[:user_id]',
|
31
|
+
'current_user' => 'session[:user_id].to_s',
|
32
32
|
'current_user_name' => 'session[:user_name]',
|
33
|
-
'current_site' => 'dc_get_site.id'
|
33
|
+
'current_site' => 'dc_get_site.id.to_s'
|
34
34
|
}
|
35
|
-
#
|
36
35
|
@additions = {}
|
37
36
|
|
38
37
|
##########################################################################
|
@@ -40,7 +39,7 @@ module DcInternals
|
|
40
39
|
# to be added to structure and be used together with predefined values.
|
41
40
|
##########################################################################
|
42
41
|
def self.add_internal(hash)
|
43
|
-
hash.each {|key,value| additions[key] = value}
|
42
|
+
hash.each { |key, value| additions[key] = value }
|
44
43
|
end
|
45
44
|
|
46
45
|
##########################################################################
|
@@ -48,11 +47,8 @@ end
|
|
48
47
|
# to be added to structure and be used together with predefined values.
|
49
48
|
##########################################################################
|
50
49
|
def self.get(key)
|
51
|
-
key
|
52
|
-
|
53
|
-
value = INTERNALS[key]
|
54
|
-
value = @additions[key] if value.nil?
|
55
|
-
value
|
50
|
+
key.sub!('@', '')
|
51
|
+
INTERNALS[key] || @additions[key]
|
56
52
|
end
|
57
53
|
|
58
54
|
end
|
data/app/models/dc_memory.rb
CHANGED
@@ -63,8 +63,8 @@
|
|
63
63
|
# As result report.pdf file will be opened in new browser window.
|
64
64
|
########################################################################
|
65
65
|
class DcMemory
|
66
|
-
|
67
|
-
|
66
|
+
include Mongoid::Document
|
67
|
+
|
68
68
|
########################################################################
|
69
69
|
# Initilize object
|
70
70
|
########################################################################
|
@@ -55,30 +55,30 @@ after_save :cache_clear
|
|
55
55
|
after_destroy :cache_clear
|
56
56
|
|
57
57
|
####################################################################
|
58
|
-
# Clear cache
|
58
|
+
# Clear cache when cache is configured
|
59
59
|
####################################################################
|
60
60
|
def cache_clear
|
61
61
|
DrgCms.cache_clear(:dc_permission)
|
62
62
|
DrgCms.cache_clear(:dc_site)
|
63
|
+
DrgCms.cache_clear(:dc_policy_role)
|
63
64
|
end
|
64
65
|
|
65
66
|
########################################################################
|
66
67
|
# Return all defined roles as choices for use in select field.
|
67
68
|
########################################################################
|
68
69
|
def self.choices4_roles
|
69
|
-
where(active: true).order_by(name: 1).inject([]) { |r,role| r << [ role.name, role._id] }
|
70
|
+
where(active: true).order_by(name: 1).inject([]) { |r, role| r << [ role.name, role._id] }
|
70
71
|
end
|
71
72
|
|
72
73
|
########################################################################
|
73
74
|
# Search for role when role parameter is String.
|
74
75
|
########################################################################
|
75
76
|
def self.get_role(role)
|
76
|
-
|
77
|
-
|
78
|
-
role = find_by(name: rol) || find_by(system_name: rol)
|
79
|
-
end
|
80
|
-
role
|
81
|
-
end
|
77
|
+
doc = DrgCms.cache_read(['dc_policy_role', role])
|
78
|
+
return doc if doc
|
82
79
|
|
80
|
+
doc = find_by(name: role) || find_by(system_name: role)
|
81
|
+
DrgCms.cache_write(['dc_policy_role', role], doc)
|
82
|
+
end
|
83
83
|
|
84
84
|
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2024+ Damjan Rems
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
# a copy of this software and associated documentation files (the
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
# the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be
|
13
|
+
# included in all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
#++
|
23
|
+
|
24
|
+
##############################################################################
|
25
|
+
# DcSetup collection is used for settings, that are specific to the application,
|
26
|
+
# or part of application (gem). It consists of data dafinitions and form for editing data.
|
27
|
+
# Data is saved internaly in YAML format.
|
28
|
+
#
|
29
|
+
# When editing, admin can see and edit form definition (adding new data to application setup), while user
|
30
|
+
# sees only data entry form.
|
31
|
+
#
|
32
|
+
# Usage:
|
33
|
+
# my_app_settings = DcSetup.find_by(name: 'my_app')
|
34
|
+
# my_app_settings = DcSetup.get('my_app')
|
35
|
+
# company = my_app_settings.company_name
|
36
|
+
# company, ceo = my_app_settings[:company_name, 'ceo_name']
|
37
|
+
#
|
38
|
+
##############################################################################
|
39
|
+
class DcSetup
|
40
|
+
include Mongoid::Document
|
41
|
+
include Mongoid::Timestamps
|
42
|
+
|
43
|
+
attr_reader :my_data
|
44
|
+
attr_reader :my_fields
|
45
|
+
|
46
|
+
field :name, type: String, default: ''
|
47
|
+
field :data, type: String, default: ''
|
48
|
+
field :form, type: String, default: ''
|
49
|
+
field :editors, type: Array, default: []
|
50
|
+
|
51
|
+
field :created_by, type: BSON::ObjectId
|
52
|
+
field :updated_by, type: BSON::ObjectId
|
53
|
+
|
54
|
+
index name: 1
|
55
|
+
|
56
|
+
validates_length_of :name, minimum: 3
|
57
|
+
|
58
|
+
before_save do
|
59
|
+
self.data = my_data.to_yaml
|
60
|
+
end
|
61
|
+
|
62
|
+
##############################################################################
|
63
|
+
# Will return settings record for specified application.
|
64
|
+
#
|
65
|
+
# @param [String] app_name The name of the application
|
66
|
+
# @return [Object, nil] The settings record if found, nil otherwise
|
67
|
+
##############################################################################
|
68
|
+
def self.get(app_name)
|
69
|
+
DcSetup.find_by(name: app_name.to_s)
|
70
|
+
end
|
71
|
+
|
72
|
+
##############################################################################
|
73
|
+
# Will return value for single setting if called as method.
|
74
|
+
##############################################################################
|
75
|
+
def method_missing(m, *args, &block)
|
76
|
+
m = m.to_s
|
77
|
+
if m.match('=')
|
78
|
+
m.chomp!('=')
|
79
|
+
my_data[m] = args.first
|
80
|
+
else
|
81
|
+
my_data[m]
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
##############################################################################
|
86
|
+
# Will return value for single setting. Called as parameter in square brackets.
|
87
|
+
# If more then one parameter is passed it will return them as array.
|
88
|
+
##############################################################################
|
89
|
+
def [](*keys)
|
90
|
+
return my_data[keys.first.to_s] if keys.size == 1
|
91
|
+
|
92
|
+
keys.inject([]) { |r, k| r << my_data[k.to_s] }
|
93
|
+
end
|
94
|
+
|
95
|
+
##############################################################################
|
96
|
+
# Will return true if setting is defined on the form
|
97
|
+
##############################################################################
|
98
|
+
def respond_to?(field_name)
|
99
|
+
return true #if my_fields[field_name.to_s]
|
100
|
+
|
101
|
+
super.respond_to?(field_name)
|
102
|
+
end
|
103
|
+
|
104
|
+
##############################################################################
|
105
|
+
#
|
106
|
+
##############################################################################
|
107
|
+
def my_data
|
108
|
+
@my_data ||= (YAML.unsafe_load(data)) || {}
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
@@ -81,7 +81,7 @@ end
|
|
81
81
|
###########################################################################
|
82
82
|
def self.get_data(params, name)
|
83
83
|
t = params['record'][name] ? params['record'][name].to_datetime : nil
|
84
|
-
t ? Time.
|
84
|
+
t ? Time.new(t.year, t.month, t.day, t.hour, t.min) : nil
|
85
85
|
end
|
86
86
|
|
87
87
|
end
|
@@ -114,11 +114,11 @@ end
|
|
114
114
|
# Returns:
|
115
115
|
# String. Translated text.
|
116
116
|
####################################################################
|
117
|
-
def t(key, default='')
|
117
|
+
def t(key, default = '')
|
118
118
|
c = I18n.t(key)
|
119
|
-
if c.match(
|
119
|
+
if c.match(/translation missing/i)
|
120
120
|
c = I18n.t(key, locale: 'en')
|
121
|
-
# Still not found. Return default if set
|
121
|
+
# Still not found. Return default if set
|
122
122
|
c = default unless default.blank?
|
123
123
|
end
|
124
124
|
c
|
@@ -127,15 +127,8 @@ end
|
|
127
127
|
####################################################################
|
128
128
|
# Standard code for returning readonly field.
|
129
129
|
####################################################################
|
130
|
-
def ro_standard(value=nil)
|
131
|
-
|
132
|
-
value = if @yaml['html']['value']
|
133
|
-
@yaml['html']['value']
|
134
|
-
else
|
135
|
-
@record.respond_to?(@yaml['name']) ? @record.send(@yaml['name']) : nil
|
136
|
-
end
|
137
|
-
end
|
138
|
-
#@html << (value.blank? ? '' : "<div class='dc-readonly'>#{value}</div>")
|
130
|
+
def ro_standard(value = nil)
|
131
|
+
value ||= @yaml['html']['value'] || (@record.respond_to?(@yaml['name']) ? @record.send(@yaml['name']) : nil)
|
139
132
|
@html << %(<div id="#{@yaml['name']}" class="dc-readonly">#{value}</div>)
|
140
133
|
self
|
141
134
|
end
|
@@ -157,8 +150,9 @@ def set_initial_value(opt1 = 'html', opt2 = 'value')
|
|
157
150
|
value_send_as = 'p_' + @yaml['name']
|
158
151
|
if @parent.params[value_send_as]
|
159
152
|
@yaml[opt1][opt2] = @parent.params[value_send_as]
|
160
|
-
elsif @parent.flash[:record]
|
161
|
-
@
|
153
|
+
elsif @parent.flash[:record]
|
154
|
+
value = @parent.flash[:record][@yaml['name']] || @parent.flash[:record][@yaml['name'].to_sym]
|
155
|
+
@yaml[opt1][opt2] = value if value
|
162
156
|
end
|
163
157
|
set_default_value(opt1, opt2) if @yaml['default']
|
164
158
|
end
|
@@ -217,24 +211,13 @@ def set_style()
|
|
217
211
|
end
|
218
212
|
end
|
219
213
|
|
220
|
-
####################################################################
|
221
|
-
# DEPRECATED!
|
222
|
-
#
|
223
|
-
# Returns css code for the field if specified. It replaces all occurences of '# '
|
224
|
-
# with field name id, as defined on form.
|
225
|
-
####################################################################
|
226
|
-
def __css_code
|
227
|
-
return '' if @css.blank?
|
228
|
-
@css.gsub!('# ',"#td_record_#{@yaml['name']} ")
|
229
|
-
"\n<style type=\"text/css\">#{@css}</style>"
|
230
|
-
end
|
231
|
-
|
232
214
|
####################################################################
|
233
215
|
# Sets css code for the field if specified. It replaces all occurences of '# '
|
234
216
|
# with field name id, as defined on form.
|
235
217
|
####################################################################
|
236
218
|
def set_css_code(css)
|
237
219
|
return '' if css.blank?
|
220
|
+
|
238
221
|
css.gsub!('# ',"#td_record_#{@yaml['name']} ") if css.match('# ')
|
239
222
|
css
|
240
223
|
end
|
@@ -53,19 +53,26 @@ def render
|
|
53
53
|
# HTML defaults. Some must be set
|
54
54
|
@yaml['html'] ||= {}
|
55
55
|
@yaml['html']['width'] ||= '99%'
|
56
|
+
# message when new record
|
57
|
+
if @record.new_record?
|
58
|
+
@yaml['html']['srcdoc'] = %(
|
59
|
+
<div style='font-family: helvetica; font-size: 1.7rem; font-weight: bold; color: #ddd; padding: 1rem'>
|
60
|
+
#{I18n.t('drgcms.iframe_save_to_view')}
|
61
|
+
</div>)
|
62
|
+
end
|
56
63
|
html = @yaml['html'].inject('') { |r, val| r << "#{val.first}=\"#{val.last}\" " }
|
57
64
|
|
58
65
|
@yaml['action'] ||= 'index'
|
59
66
|
# defaults both way
|
60
|
-
@yaml['table'] ||= @yaml['form_name']
|
61
|
-
@yaml['form_name'] ||= @yaml['table']
|
67
|
+
@yaml['table'] ||= @yaml['form_name']
|
68
|
+
@yaml['form_name'] ||= @yaml['table']
|
62
69
|
|
63
|
-
if @yaml['name'] == @yaml['table']
|
70
|
+
if @yaml['name'] == @yaml['table'] || @yaml['table'] == 'dc_memory'
|
64
71
|
tables = @yaml['table']
|
65
72
|
ids = @record.id
|
66
73
|
else
|
67
|
-
tables = @parent.tables.
|
68
|
-
ids = @parent.ids
|
74
|
+
tables = (@parent.tables.map(&:first) + [@yaml['table']]).join(';')
|
75
|
+
ids = (@parent.ids + [@record.id]).join(';')
|
69
76
|
end
|
70
77
|
# edit enabled embedded form on a readonly form
|
71
78
|
readonly = @yaml['readonly'].class == FalseClass ? nil : @readonly
|
@@ -73,20 +80,24 @@ def render
|
|
73
80
|
ids: ids, table: tables, form_name: @yaml['form_name'],
|
74
81
|
field_name: @yaml['name'], iframe: "if_#{@yaml['name']}", readonly: readonly }
|
75
82
|
# additional parameters if specified
|
76
|
-
@yaml['params'].each { |k,v| opts[k] = @parent.dc_value_for_parameter(v) } if @yaml['params']
|
77
|
-
|
83
|
+
@yaml['params'].each { |k, v| opts[k] = @parent.dc_value_for_parameter(v) } if @yaml['params']
|
84
|
+
|
78
85
|
@html << "<iframe class='iframe_embedded' id='if_#{@yaml['name']}' name='if_#{@yaml['name']}' #{html}></iframe>"
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
86
|
+
if @record.new_record?
|
87
|
+
else
|
88
|
+
url = @parent.url_for(opts)
|
89
|
+
attributes = case
|
90
|
+
when @yaml['load'].nil? || @yaml['load'].match('default')
|
91
|
+
"'src', '#{url}'"
|
92
|
+
when @yaml['load'].match('delay')
|
93
|
+
"'data-src-#{@yaml['load']}', '#{url}'"
|
94
|
+
when @yaml['load'].match('always')
|
95
|
+
"{'data-src-#{@yaml['load']}': '#{url}', src: '#{url}'}"
|
96
|
+
end
|
97
|
+
@js << %(
|
87
98
|
$(document).ready( function() {
|
88
|
-
$('#if_#{@yaml['name']}').attr(
|
89
|
-
});
|
99
|
+
$('#if_#{@yaml['name']}').attr(#{attributes});
|
100
|
+
});)
|
90
101
|
end
|
91
102
|
self
|
92
103
|
end
|