drg_cms 0.6.1.11 → 0.7.0.8
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +260 -0
- data/MIT-LICENSE +1 -1
- data/README.md +9 -5
- data/app/assets/javascripts/drg_cms/drg_cms.js +95 -34
- data/app/assets/javascripts/drg_cms/jquery.bpopup.js +372 -0
- data/app/assets/javascripts/drg_cms_application.js +1 -3
- data/app/assets/javascripts/drg_cms_cms.js +3 -4
- data/app/assets/stylesheets/drg_cms/drg_cms.css +37 -5
- data/app/assets/stylesheets/drg_cms/jstree.css +32 -27
- data/app/assets/stylesheets/drg_cms/select-multiple.css +6 -4
- data/app/controllers/cmsedit_controller.rb +22 -24
- data/app/controllers/dc_application_controller.rb +10 -9
- data/app/controllers/dc_common_controller.rb +14 -11
- data/app/controllers/dc_main_controller.rb +0 -1
- data/app/controls/dc_gallery_control.rb +46 -0
- 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 +7 -8
- data/app/controls/dc_report.rb +9 -4
- data/app/controls/design_element_settings_control.rb +88 -37
- data/app/forms/all_options.yml +18 -7
- data/app/forms/cms_menu.yml +10 -4
- data/app/forms/dc_category.yml +17 -8
- data/app/forms/dc_category_as_tree.yml +31 -0
- 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_steps_template.yml +2 -1
- data/app/forms/help/dc_category_as_tree.en +4 -0
- data/app/forms/help/dc_category_as_tree.sl +5 -0
- data/app/helpers/cms_common_helper.rb +24 -16
- data/app/helpers/cms_edit_helper.rb +28 -35
- data/app/helpers/cms_helper.rb +21 -5
- data/app/helpers/cms_index_helper.rb +53 -38
- data/app/helpers/dc_application_helper.rb +95 -121
- data/app/helpers/dc_category_helper.rb +129 -0
- 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 +12 -4
- data/app/models/dc_category.rb +62 -24
- data/app/models/dc_design.rb +5 -4
- data/app/models/dc_filter.rb +19 -18
- data/app/models/dc_image.rb +237 -0
- data/app/models/dc_internals.rb +5 -9
- data/app/models/dc_policy_role.rb +8 -8
- data/app/models/drgcms_form_fields/date_picker.rb +10 -12
- data/app/models/drgcms_form_fields/datetime_picker.rb +10 -11
- data/app/models/drgcms_form_fields/drgcms_field.rb +55 -30
- data/app/models/drgcms_form_fields/embedded.rb +11 -8
- data/app/models/drgcms_form_fields/journal_diff.rb +2 -2
- data/app/models/drgcms_form_fields/multitext_autocomplete.rb +51 -47
- data/app/models/drgcms_form_fields/select.rb +20 -14
- data/app/models/drgcms_form_fields/text_with_select.rb +5 -9
- data/app/models/drgcms_form_fields/tree_select.rb +20 -19
- data/app/renderers/dc_gallery_renderer.rb +10 -4
- data/app/renderers/dc_page_renderer.rb +7 -7
- data/app/renderers/dc_poll_renderer.rb +13 -12
- data/app/views/cmsedit/_edit_stuff.html.erb +1 -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/app/views/layouts/content.html.erb +1 -1
- data/config/locales/drgcms_en.yml +16 -2
- data/config/locales/drgcms_sl.yml +15 -2
- data/config/locales/models_en.yml +33 -0
- data/config/locales/models_sl.yml +44 -1
- data/drg_cms.gemspec +3 -3
- data/lib/drg_cms/version.rb +1 -1
- data/lib/drg_cms.rb +19 -5
- data/lib/generators/convert_to_ar/USAGE +8 -0
- data/lib/generators/convert_to_ar/convert_to_ar_generator.rb +158 -0
- data/lib/tasks/dc_cleanup.rake +20 -42
- metadata +25 -14
- data/History.log +0 -109
- data/app/assets/javascripts/drg_cms/jquery.bpopup.min.js +0 -7
- data/app/views/layouts/__cmsedit.html.erb +0 -16
@@ -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
|
@@ -66,30 +66,28 @@ class DatePicker < DrgcmsField
|
|
66
66
|
###########################################################################
|
67
67
|
def render
|
68
68
|
value = @record.try(@yaml['name']) ? I18n.localize(@record[@yaml['name']].to_date) : nil
|
69
|
-
#return ro_standard( @parent.dc_format_value(value)) if @readonly
|
70
|
-
|
71
|
-
@yaml['options'] ||= {}
|
72
69
|
set_initial_value
|
73
70
|
@yaml['html']['size'] ||= @yaml['size'] || 10
|
74
71
|
@yaml['html']['value'] ||= value
|
75
72
|
@yaml['html']['autocomplete'] ||= 'off'
|
76
73
|
@yaml['html']['class'] = @yaml['html']['class'].to_s + ' date-picker'
|
77
74
|
|
78
|
-
@yaml['options']
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
75
|
+
options = options_to_hash(@yaml['options'])
|
76
|
+
options['lang'] ||= I18n.locale.to_s
|
77
|
+
options['format'] ||= t('datetimepicker.formats.date')
|
78
|
+
options['timepicker'] = false
|
79
|
+
options['scrollMonth'] ||= false
|
80
|
+
options['scrollInput'] ||= false
|
83
81
|
|
84
82
|
record = record_text_for(@yaml['name'])
|
85
83
|
@html << @parent.text_field(record, @yaml['name'], @yaml['html'])
|
86
|
-
@js << %
|
84
|
+
@js << %(
|
87
85
|
$(document).ready(function() {
|
88
|
-
$("##{record}_#{@yaml['name']}").datetimepicker(
|
89
|
-
#{hash_to_options(
|
86
|
+
$("##{record}_#{@yaml['name']}").datetimepicker({
|
87
|
+
#{hash_to_options(options)}
|
90
88
|
});
|
91
89
|
});
|
92
|
-
|
90
|
+
) unless @readonly
|
93
91
|
|
94
92
|
self
|
95
93
|
end
|
@@ -30,12 +30,12 @@ module DrgcmsFormFields
|
|
30
30
|
# * +name:+ Field name (required)
|
31
31
|
# * +options:+ options which apply to date_picker field. All options can be found here http://xdsoft.net/jqplugins/datetimepicker/ .
|
32
32
|
# Options can be defined in single line like:
|
33
|
-
# * options: 'step: 15,inline: true,lang:
|
33
|
+
# * options: 'step: 15,inline: true,lang: sl' or
|
34
34
|
#
|
35
35
|
# * options:
|
36
36
|
# * step: 15
|
37
37
|
# * inline: true
|
38
|
-
# * lang:
|
38
|
+
# * lang: sl
|
39
39
|
#
|
40
40
|
# * +html:+ html options which apply to date_time_picker field (optional)
|
41
41
|
#
|
@@ -52,27 +52,26 @@ class DatetimePicker < DrgcmsField
|
|
52
52
|
###########################################################################
|
53
53
|
def render
|
54
54
|
value = @record.try(@yaml['name']) ? I18n.localize(@record[@yaml['name']].localtime) : nil
|
55
|
-
#return ro_standard( @parent.dc_format_value(value)) if @readonly
|
56
|
-
|
57
|
-
@yaml['options'] ||= {}
|
58
55
|
set_initial_value
|
56
|
+
|
59
57
|
@yaml['html']['size'] ||= @yaml['size'] || 14
|
60
58
|
@yaml['html']['value'] ||= value if @record[@yaml['name']]
|
61
59
|
@yaml['html']['autocomplete'] ||= 'off'
|
62
60
|
@yaml['html']['class'] = @yaml['html']['class'].to_s + ' date-picker'
|
63
61
|
|
64
|
-
@yaml['options']
|
65
|
-
|
62
|
+
options = options_to_hash(@yaml['options'])
|
63
|
+
options['lang'] ||= I18n.locale.to_s
|
64
|
+
options['format'] ||= t('datetimepicker.formats.datetime')
|
66
65
|
|
67
66
|
record = record_text_for(@yaml['name'])
|
68
67
|
@html << @parent.text_field(record, @yaml['name'], @yaml['html'])
|
69
|
-
@js << %
|
68
|
+
@js << %(
|
70
69
|
$(document).ready(function() {
|
71
|
-
$("##{record}_#{@yaml['name']}").datetimepicker(
|
72
|
-
#{hash_to_options(
|
70
|
+
$("##{record}_#{@yaml['name']}").datetimepicker({
|
71
|
+
#{hash_to_options(options)}
|
73
72
|
});
|
74
73
|
});
|
75
|
-
|
74
|
+
) unless @readonly
|
76
75
|
|
77
76
|
self
|
78
77
|
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
|
@@ -250,16 +233,58 @@ end
|
|
250
233
|
# options:
|
251
234
|
# height: 400
|
252
235
|
# width: 800
|
253
|
-
# toolbar: "
|
236
|
+
# toolbar: "basic"
|
254
237
|
#
|
255
|
-
# => "height:400, width:800, toolbar:'basic'"
|
238
|
+
# => "height:400, width:800, toolbar: 'basic'"
|
256
239
|
#
|
257
240
|
# Return:
|
258
241
|
# String: Options formated as javascript options.
|
259
242
|
#
|
260
243
|
####################################################################
|
261
|
-
def hash_to_options(
|
262
|
-
|
244
|
+
def hash_to_options(options)
|
245
|
+
c = ''
|
246
|
+
options.each do |key, option|
|
247
|
+
c << "#{key} : "
|
248
|
+
c << case
|
249
|
+
when option.to_s.match(/function/i) then option
|
250
|
+
when option.class == String then "\"#{option}\""
|
251
|
+
else option.to_s
|
252
|
+
end
|
253
|
+
c << ",\n"
|
254
|
+
end
|
255
|
+
c
|
256
|
+
end
|
257
|
+
|
258
|
+
####################################################################
|
259
|
+
# Options may be defined on form as hash or as string. This method will
|
260
|
+
# ensure conversion of options into hash.
|
261
|
+
#
|
262
|
+
# Parameters:
|
263
|
+
# [String or Hash] : Form options
|
264
|
+
#
|
265
|
+
# Form example: As used in forms
|
266
|
+
# options:
|
267
|
+
# height: 400
|
268
|
+
# width: 800
|
269
|
+
# toolbar: "'basic'"
|
270
|
+
# or
|
271
|
+
#
|
272
|
+
# options: "height:400, width:800, toolbar:'basic'"
|
273
|
+
#
|
274
|
+
# Return:
|
275
|
+
# Hash: Options as Hash
|
276
|
+
####################################################################
|
277
|
+
def options_to_hash(options)
|
278
|
+
return {} if options.nil?
|
279
|
+
return options unless options.class == String
|
280
|
+
|
281
|
+
options.chomp.split(',').inject({}) do |r, e|
|
282
|
+
key, value = e.chomp.split(':')
|
283
|
+
value.strip!
|
284
|
+
value = value[1..value.size - 2] if value[0] =~ /\'|\"/
|
285
|
+
r[key.strip] = value
|
286
|
+
r
|
287
|
+
end
|
263
288
|
end
|
264
289
|
|
265
290
|
####################################################################
|
@@ -78,15 +78,18 @@ def render
|
|
78
78
|
@html << "<iframe class='iframe_embedded' id='if_#{@yaml['name']}' name='if_#{@yaml['name']}' #{html}></iframe>"
|
79
79
|
unless @record.new_record?
|
80
80
|
url = @parent.url_for(opts)
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
81
|
+
attributes = case
|
82
|
+
when @yaml['load'].nil? || @yaml['load'].match('default')
|
83
|
+
"'src', '#{url}'"
|
84
|
+
when @yaml['load'].match('delay')
|
85
|
+
"'data-src-#{@yaml['load']}', '#{url}'"
|
86
|
+
when @yaml['load'].match('always')
|
87
|
+
"{'data-src-#{@yaml['load']}': '#{url}', src: '#{url}'}"
|
88
|
+
end
|
89
|
+
@js << %(
|
87
90
|
$(document).ready( function() {
|
88
|
-
$('#if_#{@yaml['name']}').attr(
|
89
|
-
});
|
91
|
+
$('#if_#{@yaml['name']}').attr(#{attributes});
|
92
|
+
});)
|
90
93
|
end
|
91
94
|
self
|
92
95
|
end
|
@@ -49,8 +49,8 @@ def render
|
|
49
49
|
old_value = v.class == Array ? v[0] : v
|
50
50
|
new_value = v.class == Array ? v[1] : v
|
51
51
|
@html << "<div style='background-color: #eee;'>#{@parent.check_box('select', k)} #{k}</div>
|
52
|
-
<div style='background-color: #fcc;'>-<br>#{old_value}</div>
|
53
|
-
<div style='background-color: #cfc;'>+<br>#{new_value}</div><br>"
|
52
|
+
<div style='background-color: #fcc;'>-<br>#{old_value.to_s.gsub("\n", '<br>')}</div>
|
53
|
+
<div style='background-color: #cfc;'>+<br>#{new_value.to_s.gsub("\n", '<br>')}</div><br>"
|
54
54
|
end
|
55
55
|
@html << '</div>'
|
56
56
|
self
|
@@ -24,12 +24,12 @@ module DrgcmsFormFields
|
|
24
24
|
|
25
25
|
###########################################################################
|
26
26
|
# Implementation of multitext_autocomplete DRG Form field.
|
27
|
-
#
|
27
|
+
#
|
28
28
|
# multitext_autocomplete field is complex data entry field which uses autocomplete
|
29
29
|
# function when selecting multiple values for MongoDB Array field. Array typically holds
|
30
|
-
# id's of selected documents and control typically displays value of the field name
|
30
|
+
# id's of selected documents and control typically displays value of the field name
|
31
31
|
# defined by search options.
|
32
|
-
#
|
32
|
+
#
|
33
33
|
# ===Form options:
|
34
34
|
# * +name:+ field name (required)
|
35
35
|
# * +type:+ multitext_autocomplete (required)
|
@@ -40,12 +40,12 @@ module DrgcmsFormFields
|
|
40
40
|
# * collection_name.search_field_name.method_name; When searching is more complex custom search
|
41
41
|
# method may be defined in CollectionName model which will provide result set for search.
|
42
42
|
# * +with_new+ Will add an icon for shortcut to add new document to collection
|
43
|
-
#
|
43
|
+
#
|
44
44
|
# Form example:
|
45
45
|
# 90:
|
46
46
|
# name: kats
|
47
47
|
# type: multitext_autocomplete
|
48
|
-
# search: dc_category.name
|
48
|
+
# search: dc_category.name
|
49
49
|
# with_new: model_name
|
50
50
|
# size: 30
|
51
51
|
###########################################################################
|
@@ -55,10 +55,11 @@ class MultitextAutocomplete < DrgcmsField
|
|
55
55
|
# Returns value for readonly field
|
56
56
|
###########################################################################
|
57
57
|
def ro_standard(table, search)
|
58
|
-
result = ''
|
59
|
-
table = table.classify.constantize
|
60
58
|
return self if @record[@yaml['name']].nil?
|
61
|
-
|
59
|
+
|
60
|
+
result = ''
|
61
|
+
table = table.classify.constantize
|
62
|
+
# when field name and method are defined together
|
62
63
|
search = search.split('.').first if search.match('.')
|
63
64
|
@record[@yaml['name']].each do |element|
|
64
65
|
result << table.find(element)[search] + '<br>'
|
@@ -69,8 +70,8 @@ end
|
|
69
70
|
###########################################################################
|
70
71
|
# Render multitext_autocomplete field html code
|
71
72
|
###########################################################################
|
72
|
-
def render
|
73
|
-
#
|
73
|
+
def render
|
74
|
+
# get field name
|
74
75
|
if @yaml['search'].class == Hash
|
75
76
|
table = @yaml['search']['table']
|
76
77
|
field_name = @yaml['search']['field']
|
@@ -82,27 +83,28 @@ def render
|
|
82
83
|
else # search and table name are separated
|
83
84
|
search = field_name = @yaml['search']
|
84
85
|
end
|
85
|
-
#
|
86
|
+
# get table name
|
86
87
|
if @yaml['table']
|
87
88
|
table = if @yaml['table'].class == String
|
88
|
-
|
89
|
-
# eval(how_to_get_my_table_name)
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
89
|
+
@yaml['table']
|
90
|
+
# eval(how_to_get_my_table_name)
|
91
|
+
elsif @yaml['table']['eval']
|
92
|
+
eval @yaml['table']['eval']
|
93
|
+
else
|
94
|
+
Rails.logger.error "Field #{@yaml['name']}: Invalid table parameter!"
|
95
|
+
nil
|
96
|
+
end
|
96
97
|
end
|
97
|
-
|
98
|
-
|
98
|
+
|
99
|
+
if table.blank? || search.blank?
|
100
|
+
@html << 'Table or search field not defined!'
|
99
101
|
return self
|
100
102
|
end
|
101
|
-
|
102
|
-
# TODO check if table exists
|
103
|
+
|
104
|
+
# TODO check if table exists
|
103
105
|
collection = table.classify.constantize
|
104
106
|
unless @record.respond_to?(@yaml['name'])
|
105
|
-
@html << "Invalid field name: #{@yaml['name']}"
|
107
|
+
@html << "Invalid field name: #{@yaml['name']}"
|
106
108
|
return self
|
107
109
|
end
|
108
110
|
# put field to enter search data on form
|
@@ -117,44 +119,44 @@ def render
|
|
117
119
|
# text field for autocomplete
|
118
120
|
@html << '<span class="dc-text-autocomplete">' << @parent.text_field(record, _name, @yaml['html']) << '<span></span></span>'
|
119
121
|
# direct link for adding new documents to collection
|
120
|
-
if @yaml['with_new']
|
121
|
-
@html << ' ' +
|
122
|
+
if @yaml['with_new'] && !@readonly
|
123
|
+
@html << ' ' +
|
122
124
|
@parent.fa_icon('plus-square-o', class: 'in-edit-add', title: t('drgcms.new'),
|
123
|
-
style: "vertical-align: top;", 'data-table' => @yaml['with_new'] )
|
125
|
+
style: "vertical-align: top;", 'data-table' => @yaml['with_new'] )
|
124
126
|
end
|
125
127
|
# div to list active selections
|
126
128
|
@html << "<div id =\"#{record}#{@yaml['name']}\">"
|
127
|
-
# find value for each field inside categories
|
129
|
+
# find value for each field inside categories
|
128
130
|
unless @record[@yaml['name']].nil?
|
129
131
|
@record[@yaml['name']].each do |element|
|
130
|
-
# this is quick and dirty trick. We have model dc_big_table which can be used for retrive
|
131
|
-
# more complicated options
|
132
|
+
# this is quick and dirty trick. We have model dc_big_table which can be used for retrive
|
133
|
+
# more complicated options
|
132
134
|
# TODO retrieve choices from big_table
|
133
135
|
rec = if table == 'dc_big_table'
|
134
136
|
collection.find(@yaml['name'], @parent.session)
|
135
137
|
else
|
136
138
|
collection.find(element)
|
137
139
|
end
|
138
|
-
# Related data is missing. It happends.
|
140
|
+
# Related data is missing. It happends.
|
139
141
|
@html << if rec
|
140
142
|
link = @parent.link_to(@parent.fa_icon('remove_circle', class: 'dc-red'), '#',
|
141
|
-
onclick:
|
143
|
+
onclick: %($('##{rec.id}').hide(); var v = $('##{record}_#{@yaml['name']}_#{rec.id}'); v.val("-" + v.val());return false;))
|
142
144
|
link = @parent.fa_icon('check', class: 'dc-green') if @readonly
|
143
145
|
field = @parent.hidden_field(record, "#{@yaml['name']}_#{rec.id}", value: element)
|
144
|
-
|
146
|
+
%(<div id="#{rec.id}" style="padding:4px;">#{link} #{rec.send(field_name)}<br>#{field}</div>)
|
145
147
|
else
|
146
148
|
'** error **'
|
147
149
|
end
|
148
150
|
end
|
149
151
|
end
|
150
152
|
@html << "</div></div>"
|
151
|
-
# Create text for div to be added when new category is selected
|
153
|
+
# Create text for div to be added when new category is selected
|
152
154
|
link = @parent.link_to(@parent.fa_icon('remove_circle', class: 'dc-red'), '#',
|
153
155
|
onclick: "$('#rec_id').hide(); var v = $('##{record}_#{@yaml['name']}_rec_id'); v.val(\"-\" + v.val());return false;")
|
154
156
|
field = @parent.hidden_field(record, "#{@yaml['name']}_rec_id", value: 'rec_id')
|
155
157
|
one_div = "<div id=\"rec_id\" style=\"padding:4px;\">#{link} rec_search<br>#{field}</div>"
|
156
|
-
|
157
|
-
# JS stuff
|
158
|
+
|
159
|
+
# JS stuff
|
158
160
|
@js << <<EOJS
|
159
161
|
$(document).ready(function() {
|
160
162
|
$("##{record}_#{_name}").autocomplete( {
|
@@ -173,10 +175,12 @@ $(document).ready(function() {
|
|
173
175
|
},
|
174
176
|
change: function (event, ui) {
|
175
177
|
var div = '#{one_div}';
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
178
|
+
if (ui.item != null) {
|
179
|
+
div = div.replace(/rec_id/g, ui.item.id)
|
180
|
+
div = div.replace('rec_search', ui.item.value)
|
181
|
+
$("##{record}#{@yaml['name']}").append(div);
|
182
|
+
$("##{record}_#{_name}").val('');
|
183
|
+
}
|
180
184
|
$("##{record}_#{_name}").focus();
|
181
185
|
},
|
182
186
|
minLength: 2
|
@@ -184,20 +188,20 @@ $(document).ready(function() {
|
|
184
188
|
});
|
185
189
|
EOJS
|
186
190
|
|
187
|
-
self
|
191
|
+
self
|
188
192
|
end
|
189
193
|
|
190
194
|
###########################################################################
|
191
|
-
# Class method for retrieving data from multitext_autocomplete form field.
|
195
|
+
# Class method for retrieving data from multitext_autocomplete form field. Values are sabed
|
196
|
+
# in parameters as name_id => id
|
192
197
|
###########################################################################
|
193
198
|
def self.get_data(params, name)
|
194
199
|
r = []
|
195
|
-
params['record'].each do |k,v|
|
196
|
-
# if it starts with - then it was removed
|
197
|
-
r << BSON::ObjectId.from_string(v) if k.
|
200
|
+
params['record'].each do |k, v|
|
201
|
+
# if it starts with - then it was removed
|
202
|
+
r << BSON::ObjectId.from_string(v) if k.starts_with?("#{name}_") && v[0] != '-'
|
198
203
|
end
|
199
|
-
r.uniq
|
200
|
-
r
|
204
|
+
r.uniq
|
201
205
|
end
|
202
206
|
|
203
207
|
end
|
@@ -80,9 +80,9 @@ class Select < DrgcmsField
|
|
80
80
|
def choices_in_helper(helper = nil)
|
81
81
|
helper ||= "helpers.label.#{@form['table']}.choices4_#{@yaml['name']}"
|
82
82
|
c = t(helper)
|
83
|
-
if c.match(
|
83
|
+
if c.match(/translation missing/i)
|
84
84
|
helper = "choices_for_#{@form['table']}_#{@yaml['name']}"
|
85
|
-
return "Error. #{helper} not defined" if c.match(
|
85
|
+
return "Error. #{helper} not defined" if c.match(/translation missing/i)
|
86
86
|
end
|
87
87
|
c
|
88
88
|
end
|
@@ -95,21 +95,27 @@ def choices_in_eval(e)
|
|
95
95
|
e.strip!
|
96
96
|
if @yaml['depend'].nil?
|
97
97
|
method = e.split(/\ |\(/).first
|
98
|
-
return eval(e) if respond_to?(method) #
|
99
|
-
return eval('@parent.' + e) if @parent.respond_to?(method) # is method defined in
|
98
|
+
return eval(e) if respond_to?(method) # is method defined here
|
99
|
+
return eval('@parent.' + e) if @parent.respond_to?(method) # is method defined in helper methods
|
100
100
|
# eval whatever it is there
|
101
101
|
eval e
|
102
102
|
else
|
103
|
-
# add event listener to depend field
|
104
|
-
|
105
|
-
$(document).ready(function() {
|
106
|
-
|
107
|
-
|
108
|
-
|
103
|
+
# add event listener to depend field(s)
|
104
|
+
depend_value = ''
|
105
|
+
@js << "\n$(document).ready(function() {\n"
|
106
|
+
@yaml['depend'].split(',') do |depend|
|
107
|
+
depend.strip!
|
108
|
+
depend_value << ',' if depend_value.present?
|
109
|
+
# depend field might be virtual field. It's value should be set in params
|
110
|
+
depend_value << (depend[0] == '_' ? @parent.params["p_#{depend}"] : @record[depend]).to_s
|
111
|
+
next if depend == @yaml['name'] # self may be sent, but don't listen to change event
|
112
|
+
|
113
|
+
@js << %(
|
114
|
+
$('#record_#{depend}').change( function(e) { update_select_depend('record_#{@yaml['name']}', '#{@yaml['depend']}', '#{e}');});
|
115
|
+
$('#_record_#{depend}').change( function(e) { update_select_depend('record_#{@yaml['name']}', '#{@yaml['depend']}', '#{e}');});
|
109
116
|
)
|
110
|
-
|
111
|
-
|
112
|
-
|
117
|
+
end
|
118
|
+
@js << + "});\n"
|
113
119
|
e << " '#{depend_value}'"
|
114
120
|
eval e
|
115
121
|
end
|
@@ -132,7 +138,7 @@ def get_choices
|
|
132
138
|
|
133
139
|
choices.chomp.split(',').map { |e| e.match(':') ? e.split(':') : e }
|
134
140
|
rescue Exception => e
|
135
|
-
Rails.logger.
|
141
|
+
Rails.logger.error "\nError in select eval. #{e.message}\n"
|
136
142
|
Rails.logger.debug(e.backtrace.join($/)) if Rails.env.development?
|
137
143
|
['error'] # return empty array when error occures
|
138
144
|
end
|
@@ -65,9 +65,7 @@ class TextWithSelect < Select
|
|
65
65
|
# Render text_with_select field html code
|
66
66
|
###########################################################################
|
67
67
|
def render
|
68
|
-
|
69
|
-
set_initial_value('html','value')
|
70
|
-
|
68
|
+
set_initial_value
|
71
69
|
record = record_text_for(@yaml['name'])
|
72
70
|
@html << @parent.text_field( record, @yaml['name'], @yaml['html'])
|
73
71
|
@yaml['html']['class'] ||= ''
|
@@ -80,13 +78,11 @@ def render
|
|
80
78
|
# javascript to update text field if new value is selected in select field
|
81
79
|
@js =<<EOJS
|
82
80
|
$(document).ready(function() {
|
83
|
-
|
84
|
-
|
85
|
-
$('##{record}_#{@yaml['name']}').val( $(this).val() );
|
81
|
+
$('##{@yaml['name']}_').on("click", function() {
|
82
|
+
$('##{record}_#{@yaml['name']}').val( $(this).val().toString() );
|
86
83
|
$('##{record}_#{@yaml['name']}').trigger("change");
|
87
|
-
|
88
|
-
|
89
|
-
});
|
84
|
+
$('##{record}_#{@yaml['name']}').focus();
|
85
|
+
});
|
90
86
|
});
|
91
87
|
EOJS
|
92
88
|
self
|