drg_cms 0.7.0.8 → 0.7.1.1
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/app/assets/javascripts/drg_cms/drg_cms.js +50 -20
- data/app/assets/stylesheets/drg_cms/drg_cms.css +89 -31
- data/app/assets/stylesheets/drg_cms/select-multiple.css +5 -6
- data/app/controllers/cmsedit_controller.rb +57 -24
- data/app/controllers/dc_application_controller.rb +18 -21
- data/app/controls/dc_poll_result_control.rb +36 -36
- data/app/controls/dc_setup_control.rb +53 -0
- data/app/forms/all_options.yml +3 -3
- data/app/forms/cms_menu.yml +7 -0
- data/app/forms/dc_image_search.yml +2 -2
- 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 +4 -1
- data/app/helpers/cms_common_helper.rb +14 -10
- data/app/helpers/cms_helper.rb +8 -7
- data/app/helpers/cms_index_helper.rb +56 -42
- data/app/helpers/dc_application_helper.rb +46 -16
- data/app/helpers/dc_image_helper.rb +2 -2
- data/app/models/concerns/dc_user_concern.rb +1 -1
- data/app/models/dc_big_table.rb +1 -1
- data/app/models/dc_filter.rb +5 -9
- data/app/models/dc_image.rb +1 -1
- data/app/models/dc_memory.rb +2 -2
- 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/embedded.rb +17 -9
- data/app/models/drgcms_form_fields/multitext_autocomplete.rb +44 -36
- data/app/models/drgcms_form_fields/select.rb +21 -5
- data/app/renderers/dc_big_menu_renderer.rb +18 -20
- data/app/renderers/dc_menu_renderer.rb +21 -58
- data/app/renderers/dc_simple_menu_renderer.rb +1 -1
- data/app/views/cmsedit/_edit_stuff.html.erb +3 -0
- data/config/locales/drgcms_en.yml +8 -0
- data/config/locales/drgcms_sl.yml +12 -4
- data/config/locales/models_en.yml +17 -1
- data/config/locales/models_sl.yml +17 -1
- data/lib/drg_cms/version.rb +1 -1
- data/lib/drg_cms.rb +22 -23
- data/lib/generators/new_drg_form/new_drg_form_generator.rb +32 -14
- metadata +5 -2
@@ -855,10 +855,10 @@ def dc_user_can_view(ctrl, policy_id)
|
|
855
855
|
policies = if site.inherit_policy.blank?
|
856
856
|
site.dc_policies
|
857
857
|
else
|
858
|
-
|
858
|
+
Mongo::QueryCache.cache { DcSite.find(site.inherit_policy) }.dc_policies
|
859
859
|
end
|
860
860
|
# permission defined by default policy
|
861
|
-
default_policy =
|
861
|
+
default_policy = Mongo::QueryCache.cache { policies.find_by(is_default: true) }
|
862
862
|
return cache_add(policy_id, false, 'Default access policy not found for the site!') unless default_policy
|
863
863
|
|
864
864
|
permissions = {}
|
@@ -866,14 +866,14 @@ def dc_user_can_view(ctrl, policy_id)
|
|
866
866
|
# update permissions with defined policy
|
867
867
|
part_policy = nil
|
868
868
|
if policy_id
|
869
|
-
part_policy =
|
869
|
+
part_policy = Mongo::QueryCache.cache { policies.find(policy_id) }
|
870
870
|
return cache_add(policy_id, false, 'Access policy not found for part!') unless part_policy
|
871
871
|
|
872
872
|
part_policy.dc_policy_rules.to_a.each { |v| permissions[v.dc_policy_role_id] = v.permission }
|
873
873
|
end
|
874
874
|
# apply guest role if no roles defined
|
875
875
|
if ctrl.session[:user_roles].nil?
|
876
|
-
role =
|
876
|
+
role = Mongo::QueryCache.cache { DcPolicyRole.find_by(system_name: 'guest', active: true) }
|
877
877
|
return cache_add(policy_id, false, 'System guest role not defined!') unless role
|
878
878
|
|
879
879
|
ctrl.session[:user_roles] = [role.id]
|
@@ -999,7 +999,15 @@ def dc_big_table(key)
|
|
999
999
|
desc = v.value if desc.blank? # still blank. Use value as description
|
1000
1000
|
ret << [desc, v.value]
|
1001
1001
|
end
|
1002
|
-
ret
|
1002
|
+
ret.sort_alphabetical_by(&:first)
|
1003
|
+
end
|
1004
|
+
|
1005
|
+
########################################################################
|
1006
|
+
# Will return name for value defined in dc_big_table
|
1007
|
+
########################################################################
|
1008
|
+
def dc_big_table_name_for_value(key, value)
|
1009
|
+
dc_big_table(key).each { |k, val| return k if val.to_s == value.to_s}
|
1010
|
+
'???'
|
1003
1011
|
end
|
1004
1012
|
|
1005
1013
|
########################################################################
|
@@ -1110,12 +1118,12 @@ end
|
|
1110
1118
|
# Returns:
|
1111
1119
|
# HTML data to be embedded into page header
|
1112
1120
|
#######################################################################
|
1113
|
-
def dc_get_json_ld
|
1114
|
-
return '' if @json_ld.
|
1121
|
+
def dc_get_json_ld
|
1122
|
+
return '' if @json_ld.blank?
|
1115
1123
|
|
1116
1124
|
%(
|
1117
1125
|
<script type="application/ld+json">
|
1118
|
-
#{JSON.pretty_generate({'@context' => 'http://schema.org', '@graph' => @json_ld})}
|
1126
|
+
#{JSON.pretty_generate({ '@context' => 'http://schema.org', '@graph' => @json_ld })}
|
1119
1127
|
</script>).html_safe
|
1120
1128
|
end
|
1121
1129
|
|
@@ -1135,21 +1143,40 @@ def dc_add_json_ld(element)
|
|
1135
1143
|
end
|
1136
1144
|
|
1137
1145
|
########################################################################
|
1138
|
-
# Will return meta data for SEO optimizations
|
1146
|
+
# Will return meta data for SEO optimizations.
|
1147
|
+
# It will also create special link rel="canonical" tag if defined in meta tags or page document.
|
1139
1148
|
#
|
1140
1149
|
# Returns:
|
1141
1150
|
# HTML data to be embedded into page header
|
1142
1151
|
#######################################################################
|
1143
1152
|
def dc_get_seo_meta_tags
|
1144
1153
|
html = ''
|
1145
|
-
|
1146
|
-
|
1147
|
-
|
1148
|
-
|
1154
|
+
has_canonical = false
|
1155
|
+
html << @meta_tags.inject('') do |r, tag|
|
1156
|
+
r << if tag.first.match('canonical')
|
1157
|
+
has_canonical = true
|
1158
|
+
dc_get_link_canonical_tag(tag.last)
|
1159
|
+
else
|
1160
|
+
%(<meta #{tag.first} content="#{tag.last}">\n )
|
1161
|
+
end
|
1149
1162
|
end if @meta_tags
|
1163
|
+
html << dc_get_link_canonical_tag(@page&.canonical_link) unless has_canonical
|
1150
1164
|
html.html_safe
|
1151
1165
|
end
|
1152
1166
|
|
1167
|
+
########################################################################
|
1168
|
+
# helper for setting canonical link on the page
|
1169
|
+
#######################################################################
|
1170
|
+
def dc_get_link_canonical_tag(href = nil)
|
1171
|
+
return %(<link rel="canonical" href="#{request.url}">\n) if href.blank?
|
1172
|
+
|
1173
|
+
unless href.match(/^http/i)
|
1174
|
+
uri = URI.parse(request.url)
|
1175
|
+
href = "#{uri.scheme}://#{uri.host}/#{href.delete_prefix('/')}"
|
1176
|
+
end
|
1177
|
+
%(<link rel="canonical" href="#{href}">\n)
|
1178
|
+
end
|
1179
|
+
|
1153
1180
|
########################################################################
|
1154
1181
|
# Will add a meta tag to internal hash structure. If meta tag already exists it
|
1155
1182
|
# will be overwritten.
|
@@ -1178,7 +1205,7 @@ end
|
|
1178
1205
|
# Returns:
|
1179
1206
|
# [String] alt="image-tag"
|
1180
1207
|
#######################################################################
|
1181
|
-
def dc_img_alt_tag(file_name, text=nil)
|
1208
|
+
def dc_img_alt_tag(file_name, text = nil)
|
1182
1209
|
%( alt="#{dc_img_alt(file_name, text)}" ).html_safe
|
1183
1210
|
end
|
1184
1211
|
|
@@ -1194,7 +1221,7 @@ end
|
|
1194
1221
|
# Returns:
|
1195
1222
|
# [String] alt_image_name
|
1196
1223
|
#######################################################################
|
1197
|
-
def dc_img_alt(file_name, text=nil)
|
1224
|
+
def dc_img_alt(file_name, text = nil)
|
1198
1225
|
return text if text.present?
|
1199
1226
|
|
1200
1227
|
name = File.basename(file_name.to_s)
|
@@ -1203,7 +1230,10 @@ end
|
|
1203
1230
|
|
1204
1231
|
private
|
1205
1232
|
|
1206
|
-
|
1233
|
+
########################################################################
|
1234
|
+
# To cache localy dc_user_can_view response for a single call. It has large gains on sites
|
1235
|
+
# with large menus.
|
1236
|
+
########################################################################
|
1207
1237
|
def cache_add(id, can_view, msg)
|
1208
1238
|
@can_view_cache[id] = [can_view, msg]
|
1209
1239
|
end
|
@@ -71,7 +71,7 @@ end
|
|
71
71
|
############################################################################
|
72
72
|
# Will return code for previewing image on top of dc_image entry form
|
73
73
|
############################################################################
|
74
|
-
def
|
74
|
+
def first_dc_image(document, *parms)
|
75
75
|
src = "/#{dc_get_site.params.dig('dc_image', 'location')}/#{document.first_available_image}"
|
76
76
|
%(<span class="dc-image-preview"><img src="#{src}"></img></span><span id="dc-image-preview">).html_safe
|
77
77
|
end
|
@@ -79,7 +79,7 @@ end
|
|
79
79
|
######################################################################
|
80
80
|
# Will format qry result as html code for selecting image
|
81
81
|
######################################################################
|
82
|
-
def
|
82
|
+
def select_links_for_dc_image(doc, *parms)
|
83
83
|
%w[o s m l].inject('') { | r,size| r << dc_image_link_for_select(doc, size) }.html_safe
|
84
84
|
end
|
85
85
|
|
@@ -149,7 +149,7 @@ end
|
|
149
149
|
# Will return list of available groups
|
150
150
|
##########################################################################
|
151
151
|
def self.groups_for_select
|
152
|
-
where(group: true, active: true).order_by(name: 1).
|
152
|
+
where(group: true, active: true).order_by(name: 1).map { [_1.name, _1.id] }
|
153
153
|
end
|
154
154
|
|
155
155
|
private
|
data/app/models/dc_big_table.rb
CHANGED
data/app/models/dc_filter.rb
CHANGED
@@ -114,7 +114,7 @@ def self.get_filter_field(parent)
|
|
114
114
|
return '' if filter.nil?
|
115
115
|
|
116
116
|
filter = YAML.load(filter) rescue nil
|
117
|
-
return '' if filter.nil?
|
117
|
+
return '' if filter.nil? || filter['operation'].to_s == 'eval'
|
118
118
|
|
119
119
|
field = get_field_form_definition(filter['field'], parent)
|
120
120
|
return '' if field.nil? && filter['input'].nil?
|
@@ -186,14 +186,10 @@ def self.menu_filter(parent)
|
|
186
186
|
# only single defined. Convert to array.
|
187
187
|
filters = [filters] if filters.class == Hash
|
188
188
|
filters.each do |filter|
|
189
|
-
url = parent.
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
filter_oper: filter['operation'],
|
194
|
-
filter_value: filter['value'])
|
195
|
-
|
196
|
-
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),
|
197
193
|
control: 'cmsedit.filter_on',
|
198
194
|
filter_field: filter['field'],
|
199
195
|
filter_oper: filter['operation'],
|
data/app/models/dc_image.rb
CHANGED
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
|
########################################################################
|
@@ -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
|
@@ -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,11 +80,12 @@ 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
|
-
|
86
|
+
if @record.new_record?
|
87
|
+
else
|
88
|
+
url = @parent.url_for(opts)
|
81
89
|
attributes = case
|
82
90
|
when @yaml['load'].nil? || @yaml['load'].match('default')
|
83
91
|
"'src', '#{url}'"
|
@@ -55,16 +55,13 @@ class MultitextAutocomplete < DrgcmsField
|
|
55
55
|
# Returns value for readonly field
|
56
56
|
###########################################################################
|
57
57
|
def ro_standard(table, search)
|
58
|
-
|
58
|
+
current_values = @record.send(@yaml['name'])
|
59
|
+
return self if current_values.blank?
|
59
60
|
|
60
|
-
result = ''
|
61
61
|
table = table.classify.constantize
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
result << table.find(element)[search] + '<br>'
|
66
|
-
end
|
67
|
-
super(result)
|
62
|
+
search = search.split(/\.|\,/).first if search.match(/\.|\,/)
|
63
|
+
html = current_values.inject('') { |r, element| r << table.find(element)[search] + '<br>' }
|
64
|
+
super(html)
|
68
65
|
end
|
69
66
|
|
70
67
|
###########################################################################
|
@@ -73,11 +70,11 @@ end
|
|
73
70
|
def render
|
74
71
|
# get field name
|
75
72
|
if @yaml['search'].class == Hash
|
76
|
-
table
|
73
|
+
table = @yaml['search']['table']
|
77
74
|
field_name = @yaml['search']['field']
|
78
|
-
method
|
79
|
-
search
|
80
|
-
elsif @yaml['search'].to_s.match(
|
75
|
+
method = @yaml['search']['method']
|
76
|
+
search = method.nil? ? field_name : "#{field_name}.#{method}"
|
77
|
+
elsif @yaml['search'].to_s.match(/\.|\,/)
|
81
78
|
table, field_name, method = @yaml['search'].split(/\.|\,/).map(&:strip)
|
82
79
|
search = method.nil? ? field_name : "#{field_name}.#{method}"
|
83
80
|
else # search and table name are separated
|
@@ -101,60 +98,71 @@ def render
|
|
101
98
|
return self
|
102
99
|
end
|
103
100
|
|
104
|
-
#
|
105
|
-
collection = table.classify.constantize
|
101
|
+
# does collection exists
|
102
|
+
collection = table.classify.constantize rescue nil
|
103
|
+
if collection.nil?
|
104
|
+
@html << "Invalid table name: #{table}"
|
105
|
+
return self
|
106
|
+
end
|
107
|
+
|
108
|
+
# does field exists
|
106
109
|
unless @record.respond_to?(@yaml['name'])
|
107
110
|
@html << "Invalid field name: #{@yaml['name']}"
|
108
111
|
return self
|
109
112
|
end
|
110
|
-
|
113
|
+
|
114
|
+
# search data entry
|
111
115
|
@yaml['html'] ||= {}
|
112
116
|
@yaml['html']['value'] = '' # must be. Otherwise it will look into record and return error
|
113
117
|
@yaml['html']['placeholder'] = t('drgcms.search_placeholder')
|
114
118
|
_name = '_' + @yaml['name']
|
115
119
|
@html << '<div class="ui-autocomplete-border">'
|
116
|
-
@html << @parent.link_to(@parent.
|
120
|
+
@html << @parent.link_to(@parent.mi_icon('plus-square-o green'), '#', onclick: 'return false;') # dummy add. But it is usefull.
|
117
121
|
|
122
|
+
# text_field for autocomplete
|
118
123
|
record = record_text_for(@yaml['name'])
|
119
|
-
# text field for autocomplete
|
120
124
|
@html << '<span class="dc-text-autocomplete">' << @parent.text_field(record, _name, @yaml['html']) << '<span></span></span>'
|
121
|
-
|
125
|
+
|
126
|
+
# link for adding new documents to searched collection
|
122
127
|
if @yaml['with_new'] && !@readonly
|
123
128
|
@html << ' ' +
|
124
|
-
@parent.
|
129
|
+
@parent.mi_icon('plus-square-o', class: 'in-edit-add', title: t('drgcms.new'),
|
125
130
|
style: "vertical-align: top;", 'data-table' => @yaml['with_new'] )
|
126
131
|
end
|
132
|
+
|
127
133
|
# div to list active selections
|
128
134
|
@html << "<div id =\"#{record}#{@yaml['name']}\">"
|
129
|
-
#
|
130
|
-
|
131
|
-
|
135
|
+
# fill with current values
|
136
|
+
current_values = @record.send(@yaml['name'])
|
137
|
+
unless current_values.nil?
|
138
|
+
current_values.each do |element|
|
132
139
|
# this is quick and dirty trick. We have model dc_big_table which can be used for retrive
|
133
140
|
# more complicated options
|
134
141
|
# TODO retrieve choices from big_table
|
135
142
|
rec = if table == 'dc_big_table'
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
143
|
+
collection.find(@yaml['name'], @parent.session)
|
144
|
+
else
|
145
|
+
collection.find(element)
|
146
|
+
end
|
147
|
+
|
141
148
|
@html << if rec
|
142
|
-
link = @parent.link_to(@parent.
|
143
|
-
onclick: %($('##{rec.id}').hide();
|
144
|
-
link = @parent.
|
149
|
+
link = @parent.link_to(@parent.mi_icon('remove_circle red'), '#',
|
150
|
+
onclick: %($('##{rec.id}').hide(); let v = $('##{record}_#{@yaml['name']}_#{rec.id}'); v.val("-" + v.val());return false;))
|
151
|
+
link = @parent.mi_icon('check green') if @readonly
|
145
152
|
field = @parent.hidden_field(record, "#{@yaml['name']}_#{rec.id}", value: element)
|
146
153
|
%(<div id="#{rec.id}" style="padding:4px;">#{link} #{rec.send(field_name)}<br>#{field}</div>)
|
147
154
|
else
|
148
|
-
'** error **'
|
155
|
+
'** error **' # Related data is missing. It happends.
|
149
156
|
end
|
150
157
|
end
|
151
158
|
end
|
152
159
|
@html << "</div></div>"
|
160
|
+
|
153
161
|
# Create text for div to be added when new category is selected
|
154
|
-
link = @parent.link_to(@parent.
|
155
|
-
onclick:
|
162
|
+
link = @parent.link_to(@parent.mi_icon('remove_circle red'), '#',
|
163
|
+
onclick: %($('#rec_id').hide(); let v = $('##{record}_#{@yaml['name']}_rec_id'); v.val("-" + v.val());return false;"))
|
156
164
|
field = @parent.hidden_field(record, "#{@yaml['name']}_rec_id", value: 'rec_id')
|
157
|
-
one_div =
|
165
|
+
one_div = %(<div id="rec_id" style="padding:4px;">#{link} rec_search<br>#{field}</div>)
|
158
166
|
|
159
167
|
# JS stuff
|
160
168
|
@js << <<EOJS
|
@@ -174,7 +182,7 @@ $(document).ready(function() {
|
|
174
182
|
});
|
175
183
|
},
|
176
184
|
change: function (event, ui) {
|
177
|
-
|
185
|
+
let div = '#{one_div}';
|
178
186
|
if (ui.item != null) {
|
179
187
|
div = div.replace(/rec_id/g, ui.item.id)
|
180
188
|
div = div.replace('rec_search', ui.item.value)
|
@@ -197,7 +205,7 @@ end
|
|
197
205
|
###########################################################################
|
198
206
|
def self.get_data(params, name)
|
199
207
|
r = []
|
200
|
-
params['record'].each do |k, v|
|
208
|
+
params['record'].each do |k, v| # inject does not work on params
|
201
209
|
# if it starts with - then it was removed
|
202
210
|
r << BSON::ObjectId.from_string(v) if k.starts_with?("#{name}_") && v[0] != '-'
|
203
211
|
end
|
@@ -47,7 +47,9 @@ module DrgcmsFormFields
|
|
47
47
|
# * +depend:+ Select options may depend on a value in some other field. If depend option is specified
|
48
48
|
# then chices must be provided by class method and defined in eval option.
|
49
49
|
# * +html:+ html options which apply to select field (optional)
|
50
|
-
#
|
50
|
+
# * +with_new:+ model_name.form_name will invoke view dialog for selected option
|
51
|
+
# * +with_edit:+ model_name.form_name will invoke edit dialog for selected option
|
52
|
+
#
|
51
53
|
# Form example:
|
52
54
|
# 30:
|
53
55
|
# name: type
|
@@ -150,9 +152,21 @@ end
|
|
150
152
|
def add_view_code
|
151
153
|
return '' if (data = @record.send(@yaml['name'])).blank?
|
152
154
|
|
153
|
-
table, form_name = @yaml['
|
155
|
+
table, form_name = @yaml['with_view'].split(/\ |\,/).delete_if(&:blank)
|
154
156
|
url = @parent.url_for(controller: 'cmsedit', id: data, action: :edit, table: table, form_name: form_name, readonly: true, window_close: 1 )
|
155
|
-
icon = @parent.mi_icon('
|
157
|
+
icon = @parent.mi_icon('visibility-o md-18')
|
158
|
+
%(<span class="dc-window-open" data-url="#{url}"> #{icon}</span>)
|
159
|
+
end
|
160
|
+
|
161
|
+
###########################################################################
|
162
|
+
# Will add code to view more data about selected option in a window
|
163
|
+
###########################################################################
|
164
|
+
def add_edit_code
|
165
|
+
return '' if (data = @record.send(@yaml['name'])).blank?
|
166
|
+
|
167
|
+
table, form_name = @yaml['view'].split(/\ |\,/).delete_if(&:blank)
|
168
|
+
url = @parent.url_for(controller: 'cmsedit', id: data, action: :edit, table: table, form_name: form_name, window_close: 1 )
|
169
|
+
icon = @parent.mi_icon('edit-o md-18')
|
156
170
|
%(<span class="dc-window-open" data-url="#{url}"> #{icon}</span>)
|
157
171
|
end
|
158
172
|
|
@@ -182,7 +196,7 @@ def ro_standard
|
|
182
196
|
(html = choice; break) if choice.to_s == value.to_s
|
183
197
|
end
|
184
198
|
end
|
185
|
-
html << add_view_code if @yaml['
|
199
|
+
html << add_view_code if @yaml['with_view']
|
186
200
|
end
|
187
201
|
super(html)
|
188
202
|
end
|
@@ -202,12 +216,14 @@ def render
|
|
202
216
|
|
203
217
|
record = record_text_for(@yaml['name'])
|
204
218
|
if @yaml['html'][:multiple]
|
219
|
+
@yaml['html']['class'] = "#{@yaml['html']['class']} select-multiple"
|
205
220
|
@html << @parent.select(record, @yaml['name'], get_choices, options_part, @yaml['html'])
|
206
221
|
@js << "$('##{record}_#{@yaml['name']}').selectMultiple();"
|
207
222
|
else
|
208
223
|
@html << @parent.select(record, @yaml['name'], get_choices, options_part, @yaml['html'])
|
209
224
|
# add code for view more data
|
210
|
-
@html <<
|
225
|
+
@html << view_code_add() if @yaml['with_view']
|
226
|
+
@html << edit_code_add() if @yaml['with_edit'] && !@readonly
|
211
227
|
end
|
212
228
|
self
|
213
229
|
end
|