drg_cms 0.5.52.12 → 0.6.0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/app/assets/javascripts/drg_cms/drg_cms.js +395 -120
- data/app/assets/javascripts/drg_cms/jstree.min.js +6 -6
- data/app/assets/javascripts/drg_cms_application.js +1 -1
- data/app/assets/stylesheets/drg_cms/drg_cms.css +476 -215
- data/app/assets/stylesheets/drg_cms/jstree.css +6 -12
- data/app/assets/stylesheets/drg_cms/select-multiple.css +19 -13
- data/app/assets/stylesheets/drg_cms_cms.css +1 -1
- data/app/controllers/cmsedit_controller.rb +474 -233
- data/app/controllers/dc_application_controller.rb +264 -41
- data/app/controllers/dc_common_controller.rb +75 -63
- data/app/{controllers → controls}/browse_models_control.rb +0 -0
- data/app/{controllers → controls}/dc_page_control.rb +24 -8
- data/app/controls/dc_poll_result_control.rb +88 -0
- data/app/controls/dc_report.rb +227 -0
- data/app/{controllers → controls}/design_element_settings_control.rb +0 -0
- data/app/forms/all_options.yml +70 -12
- data/app/forms/cms_menu.yml +26 -17
- data/app/forms/dc_ad.yml +11 -22
- data/app/forms/dc_big_table.yml +1 -0
- data/app/forms/dc_big_table_value.yml +1 -0
- data/app/forms/dc_design.yml +19 -16
- data/app/forms/dc_filter.yml +3 -6
- data/app/forms/dc_gallery.yml +53 -0
- data/app/forms/dc_json_ld.yml +59 -0
- data/app/forms/dc_key_value.yml +32 -0
- data/app/forms/dc_link.yml +16 -10
- data/app/forms/dc_menu_item.yml +6 -0
- data/app/forms/dc_page.yml +2 -7
- data/app/forms/dc_poll.yml +16 -9
- data/app/forms/dc_poll_item.yml +2 -1
- data/app/forms/dc_poll_result.yml +83 -0
- data/app/forms/dc_poll_result_export.yml +35 -0
- data/app/forms/dc_removed_url.yml +42 -0
- data/app/forms/dc_seo.yml +33 -0
- data/app/forms/dc_site.yml +2 -6
- data/app/forms/json_ld_schema.yml +168 -0
- data/app/helpers/cms_common_helper.rb +311 -0
- data/app/helpers/cms_edit_helper.rb +498 -0
- data/app/helpers/cms_helper.rb +230 -0
- data/app/helpers/cms_index_helper.rb +564 -0
- data/app/helpers/dc_application_helper.rb +195 -268
- data/app/models/{dc_dummy.rb → __dc_dummy.rb} +0 -0
- data/app/models/concerns/dc_page_concern.rb +31 -6
- data/app/models/concerns/dc_seo_concern.rb +66 -0
- data/app/models/concerns/dc_site_concern.rb +12 -1
- data/app/models/concerns/dc_user_concern.rb +5 -3
- data/app/models/dc_design.rb +2 -0
- data/app/models/dc_filter.rb +37 -20
- data/app/models/dc_gallery.rb +64 -0
- data/app/models/dc_json_ld.rb +152 -0
- data/app/models/dc_key_value.rb +48 -0
- data/app/models/dc_link.rb +1 -0
- data/app/models/dc_memory.rb +26 -4
- data/app/models/dc_page.rb +1 -2
- data/app/models/dc_permission.rb +30 -0
- data/app/models/dc_poll.rb +39 -19
- data/app/models/dc_poll_result.rb +46 -0
- data/app/models/dc_removed_url.rb +54 -0
- data/app/models/dc_temp.rb +140 -0
- data/app/models/drgcms_form_fields.rb +6 -1642
- data/app/models/drgcms_form_fields/action.rb +61 -0
- data/app/models/drgcms_form_fields/check_box.rb +72 -0
- data/app/models/drgcms_form_fields/comment.rb +53 -0
- data/app/models/drgcms_form_fields/date_picker.rb +104 -0
- data/app/models/drgcms_form_fields/date_select.rb +68 -0
- data/app/models/drgcms_form_fields/datetime_picker.rb +89 -0
- data/app/models/drgcms_form_fields/datetime_select.rb +73 -0
- data/app/models/drgcms_form_fields/drgcms_field.rb +287 -0
- data/app/models/drgcms_form_fields/embedded.rb +97 -0
- data/app/models/drgcms_form_fields/file_field.rb +52 -0
- data/app/models/drgcms_form_fields/file_select.rb +70 -0
- data/app/models/drgcms_form_fields/hash_field.rb +86 -0
- data/app/models/drgcms_form_fields/hidden_field.rb +52 -0
- data/app/models/drgcms_form_fields/html_field.rb +70 -0
- data/app/models/drgcms_form_fields/journal_diff.rb +60 -0
- data/app/models/drgcms_form_fields/link_to.rb +69 -0
- data/app/models/drgcms_form_fields/method.rb +65 -0
- data/app/models/drgcms_form_fields/multitext_autocomplete.rb +204 -0
- data/app/models/drgcms_form_fields/number_field.rb +92 -0
- data/app/models/drgcms_form_fields/password_field.rb +62 -0
- data/app/models/drgcms_form_fields/radio.rb +96 -0
- data/app/models/drgcms_form_fields/readonly.rb +79 -0
- data/app/models/drgcms_form_fields/select.rb +226 -0
- data/app/models/drgcms_form_fields/submit_tag.rb +58 -0
- data/app/models/drgcms_form_fields/text_area.rb +68 -0
- data/app/models/drgcms_form_fields/text_autocomplete.rb +155 -0
- data/app/models/drgcms_form_fields/text_field.rb +56 -0
- data/app/models/drgcms_form_fields/text_with_select.rb +95 -0
- data/app/models/drgcms_form_fields/tree_select.rb +169 -0
- data/app/{helpers → renderers}/dc_ad_renderer.rb +0 -0
- data/app/{helpers → renderers}/dc_big_menu_renderer.rb +1 -0
- data/app/{helpers → renderers}/dc_captcha_renderer.rb +0 -0
- data/app/{helpers → renderers}/dc_common_renderer.rb +0 -0
- data/app/renderers/dc_gallery_renderer.rb +95 -0
- data/app/{helpers → renderers}/dc_menu_renderer.rb +11 -4
- data/app/{helpers → renderers}/dc_page_renderer.rb +21 -3
- data/app/{helpers → renderers}/dc_part_renderer.rb +5 -4
- data/app/{helpers → renderers}/dc_piece_renderer.rb +1 -1
- data/app/{helpers → renderers}/dc_poll_renderer.rb +86 -51
- data/app/{helpers → renderers}/dc_renderer.rb +1 -0
- data/app/{helpers → renderers}/dc_simple_menu_renderer.rb +1 -0
- data/app/views/cmsedit/{remove_edit_stuff.js.erb → __remove_edit_stuff.js.erb} +0 -0
- data/app/views/cmsedit/{show.html.erb → __show.html.erb} +0 -0
- data/app/views/cmsedit/_edit_stuff.html.erb +4 -25
- data/app/views/cmsedit/_form.html.erb +4 -3
- data/app/views/cmsedit/_result.html.erb +2 -3
- data/app/views/cmsedit/edit.html.erb +2 -1
- data/app/views/cmsedit/index.html.erb +6 -1
- data/app/views/cmsedit/new.html.erb +1 -1
- data/config/locales/drgcms_en.yml +15 -3
- data/config/locales/drgcms_sl.yml +18 -6
- data/config/locales/models_en.yml +103 -19
- data/config/locales/models_sl.yml +102 -17
- data/drg_cms.gemspec +3 -3
- data/lib/drg_cms.rb +6 -2
- data/lib/drg_cms/version.rb +2 -2
- data/lib/generators/new_drg_form/new_drg_form_generator.rb +9 -2
- data/lib/tasks/database.rake +6 -56
- data/lib/tasks/dc_cleanup.rake +1 -1
- metadata +106 -61
- data/app/assets/stylesheets/drg_cms/__jquery-ui.css +0 -339
- data/app/helpers/application_helper.rb +0 -2
- data/app/helpers/cmsedit_helper.rb +0 -844
- data/test/fixtures/drg_cms_test_data.rb +0 -87
@@ -1,5 +1,5 @@
|
|
1
1
|
#--
|
2
|
-
# Copyright (c)
|
2
|
+
# Copyright (c) 2020+ Damjan Rems
|
3
3
|
#
|
4
4
|
# Permission is hereby granted, free of charge, to any person obtaining
|
5
5
|
# a copy of this software and associated documentation files (the
|
@@ -21,1653 +21,17 @@
|
|
21
21
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
22
|
#++
|
23
23
|
|
24
|
-
###########################################################################
|
25
|
-
# DrgcmsFormFields module contains definitions of classes used for
|
26
|
-
# rendering data entry fields on DRG CMS forms.
|
27
|
-
#
|
28
|
-
# Every data entry field type written in lowercase in form must have its class
|
29
|
-
# defined in CamelCase in DrgcmsFormFields module.
|
30
|
-
#
|
31
|
-
# Each class must have at least render method implemented. All classes can
|
32
|
-
# inherit from DrgcmsField class which acts as abstract template class and implements
|
33
|
-
# most of surrounding code for creating custom DRG CMS form field.
|
34
|
-
#
|
35
|
-
# Render method must create html and javascript code which must be
|
36
|
-
# saved to internal @html and @js variables. Field code is then retrived by accessing
|
37
|
-
# these two internal variables.
|
38
|
-
#
|
39
|
-
# Example. How the field code is generated in form renderer:
|
40
|
-
# klas_string = yaml['type'].camelize
|
41
|
-
# if DrgcmsFormFields.const_defined?(klas_string) # check if field type class is defined
|
42
|
-
# klas = DrgcmsFormFields.const_get(klas_string)
|
43
|
-
# field = klas.new(self, @record, options).render
|
44
|
-
# javascript << field.js
|
45
|
-
# html << field.html
|
46
|
-
# end
|
47
|
-
#
|
48
|
-
# Example. How to mix DRG CMS field code in Rails views:
|
49
|
-
# <div>User:
|
50
|
-
# <%=
|
51
|
-
# opts = {'name' => 'user', 'eval' => "dc_choices4('dc_user','name')",
|
52
|
-
# 'html' => { 'include_blank' => true } }
|
53
|
-
# dt = DrgcmsFormFields::Select.new(self, {}, opts).render
|
54
|
-
# (dt.html + javascript_tag(dt.js)).html_safe
|
55
|
-
# %></div>
|
56
|
-
###########################################################################
|
57
24
|
module DrgcmsFormFields
|
58
|
-
|
59
|
-
###########################################################################
|
60
|
-
# Template method for DRG CMS form field definition. This is abstract class with
|
61
|
-
# most of the common code for custom form field already implemented.
|
62
|
-
###########################################################################
|
63
|
-
class DrgcmsField
|
64
|
-
attr_reader :js
|
65
|
-
|
66
|
-
####################################################################
|
67
|
-
# DrgcmsField initialization code.
|
68
|
-
#
|
69
|
-
# Parameters:
|
70
|
-
# [parent] Controller object. Controller object from where object is created. Usually self is send.
|
71
|
-
# [record] Document object. Document object which holds fields data.
|
72
|
-
# [yaml] Hash. Hash object holding field definition data.
|
73
|
-
#
|
74
|
-
# Returns:
|
75
|
-
# Self
|
76
|
-
####################################################################
|
77
|
-
def initialize( parent, record, yaml )
|
78
|
-
@parent = parent
|
79
|
-
@record = record
|
80
|
-
@yaml = yaml
|
81
|
-
@form = parent.form
|
82
|
-
@readonly = (@yaml and @yaml['readonly']) || (@form and @form['readonly'])
|
83
|
-
if @yaml['size'] # move size to html element if not already there
|
84
|
-
@yaml['html'] ||= {}
|
85
|
-
@yaml['html']['size'] ||= @yaml['size']
|
86
|
-
end
|
87
|
-
@html = ''
|
88
|
-
@js = ''
|
89
|
-
@css = @yaml['css']
|
90
|
-
self
|
91
|
-
end
|
92
|
-
|
93
|
-
####################################################################
|
94
|
-
# Returns html code together with CSS code.
|
95
|
-
####################################################################
|
96
|
-
def html
|
97
|
-
@html + (@css ? "\n<style type=\"text/css\">#{@css}</style>" : '')
|
98
|
-
end
|
99
|
-
|
100
|
-
####################################################################
|
101
|
-
# Wrapper for i18 t method, with some spice added. If translation is not found English
|
102
|
-
# translation value will be returned. And if still not found default value will be returned if passed.
|
103
|
-
#
|
104
|
-
# Parameters:
|
105
|
-
# [key] String. String to be translated into locale.
|
106
|
-
# [default] String. Value returned if translation is not found.
|
107
|
-
#
|
108
|
-
# Example:
|
109
|
-
# t('translate.this','Enter text for ....')
|
110
|
-
#
|
111
|
-
# Returns:
|
112
|
-
# String. Translated text.
|
113
|
-
####################################################################
|
114
|
-
def t(key, default='')
|
115
|
-
c = I18n.t(key)
|
116
|
-
if c.match( 'translation missing' )
|
117
|
-
c = I18n.t(key, locale: 'en')
|
118
|
-
# Still not found. Return default if set
|
119
|
-
c = default unless default.blank?
|
120
|
-
end
|
121
|
-
c
|
122
|
-
end
|
123
|
-
|
124
|
-
####################################################################
|
125
|
-
# Standard code for returning readonly field.
|
126
|
-
####################################################################
|
127
|
-
def ro_standard(value=nil)
|
128
|
-
value = @record[@yaml['name']] if value.nil? and @record.respond_to?(@yaml['name'])
|
129
|
-
@html << (value.blank? ? '' : "<div class='dc-readonly'>#{value}</div>")
|
130
|
-
self
|
131
|
-
end
|
132
|
-
|
133
|
-
####################################################################
|
134
|
-
# Set initial value of the field when initial value is set in url parameters..
|
135
|
-
#
|
136
|
-
# Example: Form has field named picture. Field can be initialized by
|
137
|
-
# setting value of param p_picture.
|
138
|
-
# params['p_picture'] = '/path/to_picture'
|
139
|
-
#
|
140
|
-
# When multiple initial values are assigned it is more convinient to assign them
|
141
|
-
# through flash object.
|
142
|
-
# flash[:record] = {}
|
143
|
-
# flash[:record]['picture'] = '/path/to_picture'
|
144
|
-
####################################################################
|
145
|
-
def set_initial_value(opt1='html', opt2='value')
|
146
|
-
@yaml['html'] ||= {}
|
147
|
-
value_send_as = 'p_' + @yaml['name']
|
148
|
-
if @parent.params[value_send_as]
|
149
|
-
@yaml[opt1][opt2] = @parent.params[value_send_as]
|
150
|
-
elsif @parent.flash[:record] and @parent.flash[:record][@yaml['name']]
|
151
|
-
@yaml[opt1][opt2] = @parent.flash[:record][@yaml['name']]
|
152
|
-
end
|
153
|
-
end
|
154
|
-
|
155
|
-
####################################################################
|
156
|
-
# Returns style html code for DRGForm object if style directive is present in field definition.
|
157
|
-
# Otherwiese returns empty string.
|
158
|
-
#
|
159
|
-
# Style may be defined like:
|
160
|
-
# style:
|
161
|
-
# height: 400px
|
162
|
-
# width: 800px
|
163
|
-
# padding: 10px 20px
|
164
|
-
#
|
165
|
-
# or
|
166
|
-
#
|
167
|
-
# style: "height:400px; width:800px; padding: 10px 20px;"
|
168
|
-
#
|
169
|
-
# Style directive may also be defined under html directive.
|
170
|
-
# html:
|
171
|
-
# style:
|
172
|
-
# height: 400px
|
173
|
-
# width: 800px
|
174
|
-
#
|
175
|
-
#
|
176
|
-
####################################################################
|
177
|
-
def set_style()
|
178
|
-
style = @yaml['html']['style'] || @yaml['style']
|
179
|
-
case
|
180
|
-
when style.nil? then ''
|
181
|
-
when style.class == String then "style=\"#{style}\""
|
182
|
-
when style.class == Hash then
|
183
|
-
value = style.to_a.inject([]) {|r,v| r << "#{v[0]}: #{v[1]}" }.join(';')
|
184
|
-
"style=\"#{value}\""
|
185
|
-
else ''
|
186
|
-
end
|
187
|
-
end
|
188
|
-
|
189
|
-
####################################################################
|
190
|
-
# Will return ruby hash formated as javascript string which can be used
|
191
|
-
# for passing parameters in javascript code.
|
192
|
-
#
|
193
|
-
# Parameters:
|
194
|
-
# [Hash] Hash. Ruby hash parameters.
|
195
|
-
#
|
196
|
-
# Form example: As used in forms
|
197
|
-
# options:
|
198
|
-
# height: 400
|
199
|
-
# width: 800
|
200
|
-
# toolbar: "'basic'"
|
201
|
-
#
|
202
|
-
# => "height:400, width:800, toolbar:'basic'"
|
203
|
-
#
|
204
|
-
# Return:
|
205
|
-
# String: Options formated as javascript options.
|
206
|
-
#
|
207
|
-
####################################################################
|
208
|
-
def hash_to_options(hash)
|
209
|
-
hash.to_a.inject([]) {|r,v| r << "#{v[0]}: #{v[1]}" }.join(',')
|
210
|
-
end
|
211
|
-
|
212
|
-
####################################################################
|
213
|
-
# Checks if field name exists in document and alters record parameters if necesary.
|
214
|
-
# Method was added after fields that do not belong to current edited document
|
215
|
-
# were added to forms. Valid nonexisting form field names must start with underscore (_) letter.
|
216
|
-
#
|
217
|
-
# Return:
|
218
|
-
# String: 'record' or '_record' when valid nonexisting field is used
|
219
|
-
####################################################################
|
220
|
-
def record_text_for(name)
|
221
|
-
(!@record.respond_to?(name) and name[0,1] == '_') ? '_record' : 'record'
|
222
|
-
end
|
223
|
-
|
224
|
-
|
225
|
-
###########################################################################
|
226
|
-
# Default get_data method for retrieving data from parameters. Class method is called
|
227
|
-
# for every entry field defined on form before field value is saved to database.
|
228
|
-
#
|
229
|
-
# Parameters:
|
230
|
-
# [params] Controllers params object.
|
231
|
-
# [name] Field name
|
232
|
-
#
|
233
|
-
# Most of classes will use this default method which returns params['record'][name].
|
234
|
-
# When field data is more complex class should implement its own get_data method.
|
235
|
-
###########################################################################
|
236
|
-
def self.get_data(params, name)
|
237
|
-
params['record'][name]
|
238
|
-
end
|
239
|
-
|
240
|
-
end
|
241
|
-
|
242
|
-
###########################################################################
|
243
|
-
# Implementation of readonly DRG CMS form field.
|
244
|
-
#
|
245
|
-
# Readonly field value is just painted on form.
|
246
|
-
#
|
247
|
-
# ===Form options:
|
248
|
-
# * +name:+ field name
|
249
|
-
# * +type:+ readonly
|
250
|
-
# * +eval:+ value will be provided by evaluating expression. Usually dc_name4_id helper
|
251
|
-
# can be used to get value. Example: dc_name4_id,model_name_in_lower_case,field_name
|
252
|
-
#
|
253
|
-
# * +readonly:+ yes (can be applied to any field type)
|
254
|
-
#
|
255
|
-
# Form example:
|
256
|
-
# 10:
|
257
|
-
# name: user
|
258
|
-
# type: readonly
|
259
|
-
# html:
|
260
|
-
# size: 50
|
261
|
-
# 20:
|
262
|
-
# name: created_by
|
263
|
-
# type: readonly
|
264
|
-
# eval: dc_name4_id,dc_user,name
|
265
|
-
###########################################################################
|
266
|
-
class Readonly < DrgcmsField
|
267
|
-
###########################################################################
|
268
|
-
# Render readonly field html code
|
269
|
-
###########################################################################
|
270
|
-
def render
|
271
|
-
@html << @parent.hidden_field('record', @yaml['name']) # retain field as hidden field
|
272
|
-
@html << '<div class="dc-readonly">'
|
273
|
-
|
274
|
-
@html << if @yaml['eval']
|
275
|
-
if @yaml['eval'].match('dc_name4_id')
|
276
|
-
a = @yaml['eval'].split(',')
|
277
|
-
if a.size == 3
|
278
|
-
@parent.dc_name4_id(a[1], a[2], nil, @record[ @yaml['name'] ])
|
279
|
-
else
|
280
|
-
@parent.dc_name4_id(a[1], a[2], a[3], @record[ @yaml['name'] ])
|
281
|
-
end
|
282
|
-
|
283
|
-
# @parent.dc_name4_id(a[1], a[2], @record[ @yaml['name'] ])
|
284
|
-
else
|
285
|
-
eval( "#{@yaml['eval']} '#{@record[ @yaml['name'] ]}'")
|
286
|
-
end
|
287
|
-
else
|
288
|
-
@parent.dc_format_value(@record[@yaml['name']],@yaml['format'])
|
289
|
-
end
|
290
|
-
@html << '</div>'
|
291
|
-
self
|
292
|
-
end
|
293
|
-
end
|
294
|
-
|
295
|
-
###########################################################################
|
296
|
-
# Implementation of hidden DRG CMS form field.
|
297
|
-
#
|
298
|
-
# Will create hidden_field on form.
|
299
|
-
#
|
300
|
-
# ===Form options:
|
301
|
-
# * +name:+ field name
|
302
|
-
# * +type:+ hidden_field
|
303
|
-
#
|
304
|
-
# Form example:
|
305
|
-
# 10:
|
306
|
-
# name: im_hidden
|
307
|
-
# type: hidden_field
|
308
|
-
###########################################################################
|
309
|
-
class HiddenField < DrgcmsField
|
310
|
-
###########################################################################
|
311
|
-
# Render hidden_field field html code
|
312
|
-
###########################################################################
|
313
|
-
def render
|
314
|
-
set_initial_value
|
315
|
-
value = @yaml['html']['value'] ? @yaml['html']['value'] : @record[@yaml['name']]
|
316
|
-
record = record_text_for(@yaml['name'])
|
317
|
-
@parent.hidden_field(record, @yaml['name'], value: value)
|
318
|
-
end
|
319
|
-
end
|
320
|
-
|
321
|
-
###########################################################################
|
322
|
-
# Implementation of embedded DRG CMS form field.
|
323
|
-
#
|
324
|
-
# Creates html required to paint embedded object on form.
|
325
|
-
#
|
326
|
-
# ===Form options:
|
327
|
-
# * +name:+ field name (required)
|
328
|
-
# * +type:+ embedded (required)
|
329
|
-
# * +form_name:+ name of form which will be used for editing
|
330
|
-
# * +html:+ html options (optional)
|
331
|
-
# * +height:+ height of embedded object in pixels (1000)
|
332
|
-
# * +width:+ width of embedded object in pixels (500)
|
333
|
-
#
|
334
|
-
# Form example:
|
335
|
-
# 10:
|
336
|
-
# name: dc_parts
|
337
|
-
# type: embedded
|
338
|
-
# form_name: dc_part
|
339
|
-
# html:
|
340
|
-
# height: 1000
|
341
|
-
###########################################################################
|
342
|
-
class Embedded < DrgcmsField
|
343
|
-
###########################################################################
|
344
|
-
# Render embedded field html code
|
345
|
-
###########################################################################
|
346
|
-
def render
|
347
|
-
return self if @record.new_record? # would be in error otherwise
|
348
|
-
# HTML defaults. Some must be set
|
349
|
-
@yaml['html'] ||= {}
|
350
|
-
@yaml['html']['height'] ||= 300
|
351
|
-
@yaml['html']['width'] ||= '99%'
|
352
|
-
# defaults both way
|
353
|
-
@yaml['table'] ||= @yaml['form_name'] if @yaml['form_name']
|
354
|
-
@yaml['form_name'] ||= @yaml['table'] if @yaml['table']
|
355
|
-
#
|
356
|
-
html = ''
|
357
|
-
@yaml['html'].each {|k,v| html << "#{k}=\"#{v}\" "}
|
358
|
-
#
|
359
|
-
if @yaml['name'] == @yaml['table']
|
360
|
-
tables = @yaml['table']
|
361
|
-
ids = @record._id
|
362
|
-
else
|
363
|
-
tables = @parent.tables.inject('') { |r,v| r << "#{v[1]};" } + @yaml['table']
|
364
|
-
ids = @parent.ids.inject('') { |r,v| r << "#{v};" } + @record._id
|
365
|
-
end
|
366
|
-
opts = { controller: 'cmsedit', action: 'index', ids: ids, table: tables, form_name: @yaml['form_name'],
|
367
|
-
field_name: @yaml['name'], iframe: "if_#{@yaml['name']}", readonly: @readonly }
|
368
|
-
@html << "<iframe class='iframe_embedded' id='if_#{@yaml['name']}' name='if_#{@yaml['name']}' #{html}></iframe>"
|
369
|
-
@js = <<EOJS
|
370
|
-
$(document).ready( function() {
|
371
|
-
$('#if_#{@yaml['name']}').attr('src', '#{@parent.url_for(opts)}');
|
372
|
-
});
|
373
|
-
EOJS
|
374
|
-
self
|
375
|
-
end
|
376
|
-
|
377
|
-
end
|
378
|
-
|
379
|
-
###########################################################################
|
380
|
-
# Implementation of journal_diff DRG CMS form field. journal_diff field is used to
|
381
|
-
# show differences between two fields in DcJournal collection.
|
382
|
-
#
|
383
|
-
# ===Form options:
|
384
|
-
# * +name:+ field name (required)
|
385
|
-
# * +type:+ journal_diff (required)
|
386
|
-
#
|
387
|
-
# Form example:
|
388
|
-
# 10:
|
389
|
-
# name: diff
|
390
|
-
# type: journal_diff
|
391
|
-
# html:
|
392
|
-
# size: 100x25
|
393
|
-
###########################################################################
|
394
|
-
class JournalDiff < DrgcmsField
|
395
|
-
###########################################################################
|
396
|
-
# Render journal_diff field html code
|
397
|
-
###########################################################################
|
398
|
-
def render
|
399
|
-
@yaml['name'] = 'old' if @record[@yaml['name']].nil?
|
400
|
-
@html << '<div class="dc-journal">'
|
401
|
-
JSON.parse(@record[@yaml['name']]).each do |k,v|
|
402
|
-
old_value = v.class == Array ? v[0] : v
|
403
|
-
new_value = v.class == Array ? v[1] : v
|
404
|
-
@html << "<div style='background-color: #eee;'>#{@parent.check_box('select', k)} #{k}</div>
|
405
|
-
<div style='background-color: #fcc;'>-<br>#{old_value}</div>
|
406
|
-
<div style='background-color: #cfc;'>+<br>#{new_value}</div><br>"
|
407
|
-
end
|
408
|
-
@html << '</div>'
|
409
|
-
self
|
410
|
-
end
|
411
|
-
end
|
412
|
-
|
413
|
-
###########################################################################
|
414
|
-
# Implementation of multitext_autocomplete DRG CMS form field.
|
415
|
-
#
|
416
|
-
# multitext_autocomplete field is complex data entry field which uses autocomplete
|
417
|
-
# function when selecting multiple values for MongoDB Array field. Array typically holds
|
418
|
-
# id's of selected documents and control typically displays value of the field name
|
419
|
-
# defined by search options.
|
420
|
-
#
|
421
|
-
# ===Form options:
|
422
|
-
# * +name:+ field name (required)
|
423
|
-
# * +type:+ multitext_autocomplete (required)
|
424
|
-
# * +table+ Collection (table) name. When defined search must contain field name
|
425
|
-
# * +search:+ Search may consist of three parameters from which are separated either by dot (.) or comma(,)
|
426
|
-
# * search_field_name; when table option is defined search must define field name which will be used for search query
|
427
|
-
# * collection_name.search_field_name; Same as above except that table options must be ommited.
|
428
|
-
# * collection_name.search_field_name.method_name; When searching is more complex custom search
|
429
|
-
# method may be defined in CollectionName model which will provide result set for search.
|
430
|
-
#
|
431
|
-
# Form example:
|
432
|
-
# 90:
|
433
|
-
# name: kats
|
434
|
-
# type: multitext_autocomplete
|
435
|
-
# search: dc_category.name
|
436
|
-
# html:
|
437
|
-
# size: 30
|
438
|
-
###########################################################################
|
439
|
-
class MultitextAutocomplete < DrgcmsField
|
440
|
-
|
441
|
-
###########################################################################
|
442
|
-
# Returns value for readonly field
|
443
|
-
###########################################################################
|
444
|
-
def ro_standard(table, search)
|
445
|
-
result = ''
|
446
|
-
table = table.classify.constantize
|
447
|
-
return self if @record[@yaml['name']].nil?
|
448
|
-
# when field name and method are defined together
|
449
|
-
search = search.split('.').first if search.match('.')
|
450
|
-
@record[@yaml['name']].each do |element|
|
451
|
-
result << table.find(element)[search] + '<br>'
|
452
|
-
end
|
453
|
-
super(result)
|
454
|
-
end
|
455
|
-
|
456
|
-
###########################################################################
|
457
|
-
# Render multitext_autocomplete field html code
|
458
|
-
###########################################################################
|
459
|
-
def render
|
460
|
-
# search field name
|
461
|
-
if @yaml['search'].class == Hash
|
462
|
-
table = @yaml['search']['table']
|
463
|
-
field_name = @yaml['search']['field']
|
464
|
-
method = @yaml['search']['method']
|
465
|
-
search = method.nil? ? field_name : "#{field_name}.#{method}"
|
466
|
-
elsif @yaml['search'].to_s.match(/\./)
|
467
|
-
table, field_name, method = @yaml['search'].split(/\.|\,/)
|
468
|
-
search = method.nil? ? field_name : "#{field_name}.#{method}"
|
469
|
-
else # search and table name are separated
|
470
|
-
search = field_name = @yaml['search']
|
471
|
-
end
|
472
|
-
# determine table name
|
473
|
-
if @yaml['table']
|
474
|
-
table = if @yaml['table'].class == String
|
475
|
-
@yaml['table']
|
476
|
-
# eval(how_to_get_my_table_name)
|
477
|
-
elsif @yaml['table']['eval']
|
478
|
-
eval @yaml['table']['eval']
|
479
|
-
else
|
480
|
-
p "Field #{@yaml['name']}: Invalid table parameter!"
|
481
|
-
nil
|
482
|
-
end
|
483
|
-
end
|
484
|
-
unless (table and search)
|
485
|
-
@html << 'Table or search field not defined!'
|
486
|
-
return self
|
487
|
-
end
|
488
|
-
#
|
489
|
-
return ro_standard(table, search) if @readonly
|
490
|
-
# TODO check if table exists
|
491
|
-
collection = table.classify.constantize
|
492
|
-
unless @record.respond_to?(@yaml['name'])
|
493
|
-
@html << "Invalid field name: #{@yaml['name']}"
|
494
|
-
return self
|
495
|
-
end
|
496
|
-
# put field to enter search data on form
|
497
|
-
@yaml['html'] ||= {}
|
498
|
-
@yaml['html']['value'] = '' # must be. Otherwise it will look into record and return error
|
499
|
-
@yaml['html']['placeholder'] = t('drgcms.search_placeholder')
|
500
|
-
_name = '_' + @yaml['name']
|
501
|
-
@html << '<div class="ui-autocomplete-border">'
|
502
|
-
@html << @parent.link_to(@parent.fa_icon('plus-square lg', class: 'dc-animate dc-green'), '#',onclick: 'return false;') # dummy add. But it is usefull.
|
503
|
-
|
504
|
-
record = record_text_for(@yaml['name'])
|
505
|
-
@html << ' ' << @parent.text_field(record, _name, @yaml['html']) # text field for autocomplete
|
506
|
-
@html << "<div id =\"#{record}#{@yaml['name']}\">" # div to list active records
|
507
|
-
# find value for each field inside categories
|
508
|
-
unless @record[@yaml['name']].nil?
|
509
|
-
@record[@yaml['name']].each do |element|
|
510
|
-
# this is quick and dirty trick. We have model dc_big_table which can be used for retrive
|
511
|
-
# more complicated options
|
512
|
-
# TODO retrieve choices from big_table
|
513
|
-
rec = if table == 'dc_big_table'
|
514
|
-
collection.find(@yaml['name'], @parent.session)
|
515
|
-
else
|
516
|
-
collection.find(element)
|
517
|
-
end
|
518
|
-
# Related data is missing. It happends.
|
519
|
-
@html << if rec
|
520
|
-
link = @parent.link_to(@parent.fa_icon('remove lg', class: 'dc-animate dc-red'), '#',
|
521
|
-
onclick: "$('##{rec.id}').hide(); var v = $('##{record}_#{@yaml['name']}_#{rec.id}'); v.val(\"-\" + v.val());return false;")
|
522
|
-
field = @parent.hidden_field(record, "#{@yaml['name']}_#{rec.id}", value: element)
|
523
|
-
"<div id=\"#{rec.id}\" style=\"padding:4px;\">#{link} #{rec.send(field_name)}<br>#{field}</div>"
|
524
|
-
else
|
525
|
-
'** error **'
|
526
|
-
end
|
527
|
-
end
|
528
|
-
end
|
529
|
-
@html << "</div></div>"
|
530
|
-
# Create text for div to be added when new category is selected
|
531
|
-
link = @parent.link_to(@parent.fa_icon('remove lg', class: 'dc-animate dc-red'), '#',
|
532
|
-
onclick: "$('#rec_id').hide(); var v = $('##{record}_#{@yaml['name']}_rec_id'); v.val(\"-\" + v.val());return false;")
|
533
|
-
field = @parent.hidden_field(record, "#{@yaml['name']}_rec_id", value: 'rec_id')
|
534
|
-
one_div = "<div id=\"rec_id\" style=\"padding:4px;\">#{link} rec_search<br>#{field}</div>"
|
535
|
-
|
536
|
-
# JS stuff
|
537
|
-
@js << <<EOJS
|
538
|
-
$(document).ready(function() {
|
539
|
-
$("##{record}_#{_name}").autocomplete( {
|
540
|
-
source: function(request, response) {
|
541
|
-
$.ajax({
|
542
|
-
url: "#{ @parent.url_for( controller: 'dc_common', action: 'autocomplete' )}",
|
543
|
-
type: "POST",
|
544
|
-
dataType: "json",
|
545
|
-
data: { input: request.term, table: "#{table}", search: "#{search}" #{(',id: "'+@yaml['id'] + '"') if @yaml['id']} },
|
546
|
-
success: function(data) {
|
547
|
-
response( $.map( data, function(key) {
|
548
|
-
return key;
|
549
|
-
}));
|
550
|
-
}
|
551
|
-
});
|
552
|
-
},
|
553
|
-
change: function (event, ui) {
|
554
|
-
var div = '#{one_div}';
|
555
|
-
div = div.replace(/rec_id/g, ui.item.id)
|
556
|
-
div = div.replace('rec_search', ui.item.value)
|
557
|
-
$("##{record}#{@yaml['name']}").append(div);
|
558
|
-
$("##{record}_#{_name}").val('');
|
559
|
-
$("##{record}_#{_name}").focus();
|
560
|
-
},
|
561
|
-
minLength: 2
|
562
|
-
});
|
563
|
-
});
|
564
|
-
EOJS
|
565
|
-
|
566
|
-
self
|
567
|
-
end
|
568
|
-
|
569
|
-
###########################################################################
|
570
|
-
# Class method for retrieving data from multitext_autocomplete form field.
|
571
|
-
###########################################################################
|
572
|
-
def self.get_data(params, name)
|
573
|
-
r = []
|
574
|
-
params['record'].each do |k,v|
|
575
|
-
# if it starts with - then it was removed
|
576
|
-
r << BSON::ObjectId.from_string(v) if k.match("#{name}_") and v[0,1] != '-'
|
577
|
-
end
|
578
|
-
r.uniq!
|
579
|
-
r
|
580
|
-
end
|
581
|
-
|
582
|
-
end
|
583
|
-
|
584
|
-
###########################################################################
|
585
|
-
# Implementation of select DRG CMS form field.
|
586
|
-
#
|
587
|
-
# ===Form options:
|
588
|
-
# * +name:+ field name (required)
|
589
|
-
# * +type:+ select (required)
|
590
|
-
# * +choices:+ Values for choices separated by comma. Values can also be specified like description:value.
|
591
|
-
# In the example description will be shown to user, but value will be saved to document.
|
592
|
-
# choices: 'OK:0,Ready:1,Error:2'
|
593
|
-
# choices: Ruby,Pyton,PHP
|
594
|
-
# * +eval:+ Choices will be provided by evaluating expression
|
595
|
-
# * eval: dc_choices4('model_name','description_field_name','_id'); dc_choices4 helper will provide data for select field.
|
596
|
-
# * eval: ModelName.choices4_field; ModelName class will define method choices4_field which
|
597
|
-
# will provide data for select field.
|
598
|
-
# * collection_name.search_field_name.method_name; When searching is more complex custom search
|
599
|
-
# method may be defined in CollectionName model which will provide result set for search.
|
600
|
-
# * If choices or eval is not defined choices will be provided from translation helpers. For example:
|
601
|
-
# Collection has field status choices for field may be provided by en.helpers.model_name.choices4_status
|
602
|
-
# entry of english translation. English is of course default translation. If you provide translations in
|
603
|
-
# your local language then select choices will be localized.
|
604
|
-
# en.helpers.model_name.choices4_status: 'OK:0,Ready:1,Error:2'
|
605
|
-
# sl.helpers.model_name.choices4_status: 'V redu:0,Pripravljen:1,Napaka:2'
|
606
|
-
# * +html:+ html options which apply to select field (optional)
|
607
|
-
#
|
608
|
-
# Form example:
|
609
|
-
# 30:
|
610
|
-
# name: type
|
611
|
-
# type: select
|
612
|
-
# 40:
|
613
|
-
# name: parent
|
614
|
-
# type: select
|
615
|
-
# eval: DcCategory.values_for_parent
|
616
|
-
# html:
|
617
|
-
# include_blank: true
|
618
|
-
###########################################################################
|
619
|
-
class Select < DrgcmsField
|
620
|
-
|
621
|
-
###########################################################################
|
622
|
-
# Return values, when choices options will be returned by evaluating expression
|
623
|
-
###########################################################################
|
624
|
-
def do_eval(e)
|
625
|
-
e.strip!
|
626
|
-
method = e.split(/\ |\(/).first
|
627
|
-
return eval(e) if respond_to?(method) # id method defined here
|
628
|
-
return eval('@parent.'+e) if @parent.respond_to?(method) # is method defined in helpers
|
629
|
-
# eval whatever it is
|
630
|
-
eval e
|
631
|
-
end
|
632
|
-
|
633
|
-
###########################################################################
|
634
|
-
# Create choices array for select field.
|
635
|
-
###########################################################################
|
636
|
-
def get_choices
|
637
|
-
begin
|
638
|
-
choices = case
|
639
|
-
when @yaml['choices'] then
|
640
|
-
(@yaml['choices'].match('helpers.') ) ? t(@yaml['choices']) : @yaml['choices']
|
641
|
-
when @yaml['eval'] then
|
642
|
-
do_eval(@yaml['eval'])
|
643
|
-
else
|
644
|
-
c = t('helpers.label.' + @form['table'] + '.choices4_' + @yaml['name'] )
|
645
|
-
c = 'Error' if c.match( 'translation missing' )
|
646
|
-
c
|
647
|
-
end
|
648
|
-
# Convert string to Array
|
649
|
-
choices.class == String ?
|
650
|
-
choices.chomp.split(',').inject([]) {|r,v| r << (v.match(':') ? v.split(':') : v )} :
|
651
|
-
choices
|
652
|
-
rescue Exception => e
|
653
|
-
Rails.logger.debug "Error in select eval. #{e.message}\n"
|
654
|
-
['error'] # return empty array when error occures
|
655
|
-
end
|
656
|
-
end
|
657
|
-
|
658
|
-
###########################################################################
|
659
|
-
# Return value when readonly is required
|
660
|
-
###########################################################################
|
661
|
-
def ro_standard
|
662
|
-
value = @record.respond_to?(@yaml['name']) ? @record[@yaml['name']] : nil
|
663
|
-
return self if value.nil?
|
664
|
-
#
|
665
|
-
choices = get_choices()
|
666
|
-
if value.class == Array # multiple choices
|
667
|
-
html = ''
|
668
|
-
value.each do |element|
|
669
|
-
choices.each do |choice|
|
670
|
-
if choice.to_s == element.to_s
|
671
|
-
html << '<br>' if html.size > 0
|
672
|
-
html << "#{element.to_s}"
|
673
|
-
end
|
674
|
-
end
|
675
|
-
end
|
676
|
-
return super(html)
|
677
|
-
else
|
678
|
-
choices.each do |choice|
|
679
|
-
if choice.class == Array
|
680
|
-
return super(choice.first) if choice.last.to_s == value.to_s
|
681
|
-
else
|
682
|
-
return super(choice) if choice.to_s == value.to_s
|
683
|
-
end
|
684
|
-
end
|
685
|
-
end
|
686
|
-
super('')
|
687
|
-
end
|
688
|
-
|
689
|
-
###########################################################################
|
690
|
-
# Render select field html code
|
691
|
-
###########################################################################
|
692
|
-
def render
|
693
|
-
return ro_standard if @readonly
|
694
|
-
set_initial_value('html','selected')
|
695
|
-
#
|
696
|
-
@yaml['html'].symbolize_keys!
|
697
|
-
record = record_text_for(@yaml['name'])
|
698
|
-
if @yaml['multiple']
|
699
|
-
@html << @parent.select(record, @yaml['name'], get_choices, @yaml['html'], {multiple: true})
|
700
|
-
@js << "$('##{record}_#{@yaml['name']}').selectMultiple();"
|
701
|
-
else
|
702
|
-
@html << @parent.select(record, @yaml['name'], get_choices, @yaml['html'])
|
703
|
-
end
|
704
|
-
self
|
705
|
-
end
|
706
|
-
|
707
|
-
###########################################################################
|
708
|
-
# Return value.
|
709
|
-
###########################################################################
|
710
|
-
def self.get_data(params, name)
|
711
|
-
if params['record'][name].class == Array
|
712
|
-
params['record'][name].delete_if {|e| e.blank? }
|
713
|
-
return nil if params['record'][name].size == 0
|
714
|
-
# convert to BSON objects
|
715
|
-
is_id = BSON::ObjectId.legal?(params['record'][name].first)
|
716
|
-
return params['record'][name].map{ |e| BSON::ObjectId.from_string(e) } if is_id
|
717
|
-
return params['record'][name]
|
718
|
-
end
|
719
|
-
params['record'][name]
|
720
|
-
end
|
721
|
-
|
722
|
-
end
|
723
|
-
|
724
|
-
###########################################################################
|
725
|
-
# Implementation of check_box DRG CMS form field.
|
726
|
-
#
|
727
|
-
# ===Form options:
|
728
|
-
# * +name:+ field name (required)
|
729
|
-
# * +type:+ check_box (required)
|
730
|
-
# * +choices:+ Values check_box separated by comma (1,0) (yes,no)
|
731
|
-
# * +checked_value:+ 1 or yes or approved
|
732
|
-
# * +unchecked_value:+ 0 or no or not approved
|
733
|
-
# * +html:+ html options which apply to check_box field (optional)
|
734
|
-
#
|
735
|
-
# Form example:
|
736
|
-
# 30:
|
737
|
-
# name: active
|
738
|
-
# type: check_box
|
739
|
-
# 40:
|
740
|
-
# name: status
|
741
|
-
# type: check_box
|
742
|
-
# choices: yes,no
|
743
|
-
###########################################################################
|
744
|
-
class CheckBox < DrgcmsField
|
745
25
|
|
746
|
-
|
747
|
-
|
748
|
-
|
749
|
-
|
750
|
-
|
751
|
-
# checked flag must be set
|
752
|
-
@yaml['html']['checked'] = !@parent.dc_dont?(@yaml['html']['default']) if @yaml['html']['default']
|
753
|
-
# disable it if readonly
|
754
|
-
@yaml['html']['disabled'] = @readonly ? true : nil
|
755
|
-
# If choices are present split them to set checked and unchecked value
|
756
|
-
@yaml['checked_value'], @yaml['unchecked_value'] = @yaml['choices'].split(',') if @yaml['choices']
|
757
|
-
@yaml['html'].symbolize_keys!
|
758
|
-
record = record_text_for(@yaml['name'])
|
759
|
-
@html << if @yaml['checked_value']
|
760
|
-
@parent.check_box(record, @yaml['name'], @yaml['html'], @yaml['checked_value'], @yaml['unchecked_value'] || '0')
|
26
|
+
def self.field(parent, record, options)
|
27
|
+
klass = options['type'].camelize
|
28
|
+
if DrgcmsFormFields.const_defined?(klass)
|
29
|
+
field = DrgcmsFormFields.const_get(klass).new(parent, record, options).render
|
30
|
+
[field.html + (field.js.size > 0 ? @parent.javascript_tag(field.js) : ''),field.css]
|
761
31
|
else
|
762
|
-
@parent.check_box(record, @yaml['name'], @yaml['html'])
|
763
|
-
end
|
764
|
-
self
|
765
|
-
end
|
766
|
-
end
|
767
|
-
|
768
|
-
###########################################################################
|
769
|
-
# Implementation of comment DRG CMS form field. Comments may also be written
|
770
|
-
# on the place of form field.
|
771
|
-
#
|
772
|
-
# ===Form options:
|
773
|
-
# * +text:+ any text. Text will be translated if key is found in translations. (required)
|
774
|
-
# * +type:+ comment (required)
|
775
|
-
#
|
776
|
-
# Form example:
|
777
|
-
# 30:
|
778
|
-
# name: active
|
779
|
-
# type: check_box
|
780
|
-
|
781
|
-
###########################################################################
|
782
|
-
class Comment < DrgcmsField
|
783
|
-
|
784
|
-
###########################################################################
|
785
|
-
# Render comment field html code
|
786
|
-
###########################################################################
|
787
|
-
def render
|
788
|
-
@html << t(@yaml['comment'], @yaml['comment'])
|
789
|
-
self
|
790
|
-
end
|
791
|
-
end
|
792
|
-
|
793
|
-
###########################################################################
|
794
|
-
# Implementation of link_to DRG CMS form field. link_to form field is mostly used by polls but can
|
795
|
-
# be also incorporated anywhere on the form.
|
796
|
-
#
|
797
|
-
# ===Form options:
|
798
|
-
# * +type:+ link_to (required)
|
799
|
-
# * +caption:+ Link caption
|
800
|
-
# * +icon:+ Link icon
|
801
|
-
# * +url:+ direct url link
|
802
|
-
# * +controller:+ controller name
|
803
|
-
# * +action:+ action name
|
804
|
-
# * +html:+ html options which apply to link_to (optional)
|
805
|
-
#
|
806
|
-
# Form example:
|
807
|
-
# 30:
|
808
|
-
# type: link_to
|
809
|
-
# caption: Some action
|
810
|
-
# icon: cogs
|
811
|
-
# controller: my_controller
|
812
|
-
# action: my_action
|
813
|
-
# id: id # will be replaced by record._id
|
814
|
-
###########################################################################
|
815
|
-
class LinkTo < DrgcmsField
|
816
|
-
|
817
|
-
###########################################################################
|
818
|
-
# Render link_to field html code
|
819
|
-
###########################################################################
|
820
|
-
def render
|
821
|
-
@yaml['html'] ||= {}
|
822
|
-
@yaml['html']['class'] ||= 'dc-link dc-animate'
|
823
|
-
@yaml['html'].symbolize_keys!
|
824
|
-
#
|
825
|
-
@yaml[:id] = record._id if @yaml[:id] == 'id'
|
826
|
-
url = @yaml['url'] || "#{@yaml[:controller]}/#{@yaml[:action]}/#{@yaml[:id]}"
|
827
|
-
url.gsub!('//','/') # no action and id
|
828
|
-
url = '/' + @yaml['url'] unless url[0,1] == '/' # no leading /
|
829
|
-
url.chop if url[0,-1] == '/' # remove trailing /
|
830
|
-
#
|
831
|
-
caption = @yaml['caption'] || @yaml['text']
|
832
|
-
@html << @parent.dc_link_to(caption, @yaml['icon'], url, @yaml['html'])
|
833
|
-
self
|
834
|
-
end
|
835
|
-
end
|
836
|
-
|
837
|
-
###########################################################################
|
838
|
-
# Create submit_tag form field. submit_tag form field is mostly used by polls but can
|
839
|
-
# be also incorporated in the middle of form.
|
840
|
-
#
|
841
|
-
# ===Form options:
|
842
|
-
# * +type:+ submit_tag (required)
|
843
|
-
# * +caption:+ Submit field caption
|
844
|
-
# * +icon:+ Icon
|
845
|
-
# * +html:+ html options which apply to link_to (optional)
|
846
|
-
#
|
847
|
-
# Form example:
|
848
|
-
# 40:
|
849
|
-
# type: submit_tag
|
850
|
-
# caption: translate.this
|
851
|
-
# icon: check
|
852
|
-
###########################################################################
|
853
|
-
class SubmitTag < DrgcmsField
|
854
|
-
|
855
|
-
###########################################################################
|
856
|
-
# Render submit_tag field html code
|
857
|
-
###########################################################################
|
858
|
-
def render
|
859
|
-
@yaml['html'] ||= {}
|
860
|
-
@yaml['html']['class'] ||= 'dc-submit'
|
861
|
-
@yaml['html'].symbolize_keys!
|
862
|
-
text = @yaml['caption'] || @yaml['text']
|
863
|
-
text = t(@yaml['text']) if text.match(/\./)
|
864
|
-
|
865
|
-
@html << @parent.submit_tag(text, @yaml['html'])
|
866
|
-
self
|
867
|
-
end
|
868
|
-
end
|
869
|
-
|
870
|
-
###########################################################################
|
871
|
-
# Implementation of password DRG CMS form field.
|
872
|
-
#
|
873
|
-
# ===Form options:
|
874
|
-
# * +type:+ password_field (required)
|
875
|
-
# * +name:+ Field name (required)
|
876
|
-
# * +html:+ html options which apply to password field (optional)
|
877
|
-
#
|
878
|
-
# Form example:
|
879
|
-
# 20:
|
880
|
-
# name: password
|
881
|
-
# type: pasword_field
|
882
|
-
# html:
|
883
|
-
# size: 20
|
884
|
-
#
|
885
|
-
# 30:
|
886
|
-
# name: password_confirmation
|
887
|
-
# type: pasword_field
|
888
|
-
# html:
|
889
|
-
# size: 20
|
890
|
-
#
|
891
|
-
###########################################################################
|
892
|
-
class PasswordField < DrgcmsField
|
893
|
-
|
894
|
-
###########################################################################
|
895
|
-
# Render password field html code
|
896
|
-
#
|
897
|
-
###########################################################################
|
898
|
-
def render
|
899
|
-
return self if @readonly
|
900
|
-
@yaml['html'] ||= {}
|
901
|
-
record = record_text_for(@yaml['name'])
|
902
|
-
@html << @parent.password_field(record, @yaml['name'], @yaml['html'])
|
903
|
-
self
|
904
|
-
end
|
905
|
-
end
|
906
|
-
|
907
|
-
###########################################################################
|
908
|
-
# Implementation of date_select DRG CMS form field.
|
909
|
-
#
|
910
|
-
# ===Form options:
|
911
|
-
# * +type:+ date_select (required)
|
912
|
-
# * +name:+ Field name (required)
|
913
|
-
# * +options:+ options which apply to date_select field (optional)
|
914
|
-
# * +html:+ html options which apply to password field (optional)
|
915
|
-
#
|
916
|
-
# Form example:
|
917
|
-
# 50:
|
918
|
-
# name: valid_from
|
919
|
-
# type: date_select
|
920
|
-
# options:
|
921
|
-
# include_blank: true
|
922
|
-
# html:
|
923
|
-
# class: my-date-class
|
924
|
-
###########################################################################
|
925
|
-
class DateSelect < DrgcmsField
|
926
|
-
|
927
|
-
###########################################################################
|
928
|
-
# Render date_select field html code
|
929
|
-
###########################################################################
|
930
|
-
def render
|
931
|
-
return ro_standard( @parent.dc_format_value(@record[@yaml['name']])) if @readonly
|
932
|
-
#
|
933
|
-
@yaml['options'] ||= {}
|
934
|
-
set_initial_value('options','default')
|
935
|
-
@yaml['options'].symbolize_keys!
|
936
|
-
@yaml['html'].symbolize_keys!
|
937
|
-
record = record_text_for(@yaml['name'])
|
938
|
-
@html << @parent.date_select(record, @yaml['name'], @yaml['options'], @yaml['html'])
|
939
|
-
self
|
940
|
-
end
|
941
|
-
|
942
|
-
###########################################################################
|
943
|
-
# DatetimeSelect get_data method.
|
944
|
-
###########################################################################
|
945
|
-
def self.get_data(params, name)
|
946
|
-
DatetimeSelect.get_data(params, name).to_date rescue nil
|
947
|
-
end
|
948
|
-
|
949
|
-
|
950
|
-
end
|
951
|
-
|
952
|
-
###########################################################################
|
953
|
-
# Create datetime_select form field
|
954
|
-
#
|
955
|
-
# ===Form options:
|
956
|
-
# * +type:+ datetime_select (required)
|
957
|
-
# * +name:+ Field name (required)
|
958
|
-
# * +options:+ options which apply to date_select field (optional)
|
959
|
-
# * +html:+ html options which apply to password field (optional)
|
960
|
-
#
|
961
|
-
# Form example:
|
962
|
-
# 60:
|
963
|
-
# name: end_time
|
964
|
-
# type: datetime_select
|
965
|
-
# options:
|
966
|
-
# include_blank: true
|
967
|
-
###########################################################################
|
968
|
-
class DatetimeSelect < DrgcmsField
|
969
|
-
|
970
|
-
###########################################################################
|
971
|
-
# Render datetime_select field html code
|
972
|
-
###########################################################################
|
973
|
-
def render
|
974
|
-
return ro_standard( @parent.dc_format_value(@record[@yaml['name']])) if @readonly
|
975
|
-
#
|
976
|
-
@yaml['options'] ||= {}
|
977
|
-
set_initial_value('options','default')
|
978
|
-
@yaml['options'].symbolize_keys!
|
979
|
-
@yaml['html'].symbolize_keys!
|
980
|
-
#
|
981
|
-
record = record_text_for(@yaml['name'])
|
982
|
-
@html << @parent.datetime_select(record, @yaml['name'], @yaml['options'], @yaml['html'])
|
983
|
-
self
|
984
|
-
end
|
985
|
-
|
986
|
-
####################################################################
|
987
|
-
# DatetimeSelect get_data method.
|
988
|
-
####################################################################
|
989
|
-
def self.get_data(params, name)
|
990
|
-
begin
|
991
|
-
attrs = (1..5).map { |i| params['record']["#{name}(#{i}i)"]}
|
992
|
-
Time.zone.local(*attrs)
|
993
|
-
rescue
|
994
32
|
nil
|
995
33
|
end
|
996
34
|
end
|
997
35
|
|
998
36
|
end
|
999
37
|
|
1000
|
-
###########################################################################
|
1001
|
-
# Implementation of date_picker DRG CMS form field with help of jQuery DateTimePicker plugin.
|
1002
|
-
#
|
1003
|
-
# Since javascript date(time) format differs from ruby date(time) format localization
|
1004
|
-
# must be provided in order for date_picker object works as expected. For example:
|
1005
|
-
#
|
1006
|
-
# en:
|
1007
|
-
# datetimepicker:
|
1008
|
-
# formats:
|
1009
|
-
# date: 'Y/m/d'
|
1010
|
-
# datetime: 'Y/m/d H:i'
|
1011
|
-
#
|
1012
|
-
# sl:
|
1013
|
-
# datetimepicker:
|
1014
|
-
# formats:
|
1015
|
-
# date: 'd.m.Y'
|
1016
|
-
# datetime: 'd.m.Y H:i'
|
1017
|
-
#
|
1018
|
-
# ===Form options:
|
1019
|
-
# * +type:+ date_picker (required)
|
1020
|
-
# * +name:+ Field name (required)
|
1021
|
-
# * +options:+ options which apply to date_picker field. All options can be found here http://xdsoft.net/jqplugins/datetimepicker/ .
|
1022
|
-
# Options can be defined in single line like:
|
1023
|
-
# * options: 'inline: true,lang: "sl"' or
|
1024
|
-
#
|
1025
|
-
# * options:
|
1026
|
-
# * inline: true
|
1027
|
-
# * lang: '"sl"'
|
1028
|
-
#
|
1029
|
-
# * +html:+ html options which apply to date_picker field (optional)
|
1030
|
-
#
|
1031
|
-
# Form example:
|
1032
|
-
# 10:
|
1033
|
-
# name: created
|
1034
|
-
# type: date_picker
|
1035
|
-
# options: 'inline: true,lang: "sl"'
|
1036
|
-
###########################################################################
|
1037
|
-
class DatePicker < DrgcmsField
|
1038
|
-
|
1039
|
-
###########################################################################
|
1040
|
-
# Render date_picker field html code
|
1041
|
-
###########################################################################
|
1042
|
-
def render
|
1043
|
-
value = (@record and @record[@yaml['name']]) ? I18n.localize(@record[@yaml['name']].to_date) : nil
|
1044
|
-
return ro_standard( @parent.dc_format_value(value)) if @readonly
|
1045
|
-
#
|
1046
|
-
@yaml['options'] ||= {}
|
1047
|
-
set_initial_value
|
1048
|
-
@yaml['html']['size'] ||= 10
|
1049
|
-
@yaml['html']['value'] = value
|
1050
|
-
#
|
1051
|
-
@yaml['options']['lang'] ||= "'#{I18n.locale}'"
|
1052
|
-
@yaml['options']['format'] ||= "'#{t('datetimepicker.formats.date')}'"
|
1053
|
-
@yaml['options']['timepicker'] = false
|
1054
|
-
#
|
1055
|
-
record = record_text_for(@yaml['name'])
|
1056
|
-
@html << @parent.text_field(record, @yaml['name'], @yaml['html'])
|
1057
|
-
@js << <<EOJS
|
1058
|
-
$(document).ready(function() {
|
1059
|
-
$("##{record}_#{@yaml['name']}").datetimepicker( {
|
1060
|
-
#{hash_to_options(@yaml['options'])}
|
1061
|
-
});
|
1062
|
-
});
|
1063
|
-
EOJS
|
1064
|
-
|
1065
|
-
self
|
1066
|
-
end
|
1067
|
-
|
1068
|
-
###########################################################################
|
1069
|
-
# DatePicker get_data method.
|
1070
|
-
###########################################################################
|
1071
|
-
def self.get_data(params, name)
|
1072
|
-
t = params['record'][name] ? params['record'][name].to_datetime : nil
|
1073
|
-
t ? Time.zone.local(t.year, t.month, t.day) : nil
|
1074
|
-
end
|
1075
|
-
|
1076
|
-
end
|
1077
|
-
###########################################################################
|
1078
|
-
# Implementation of date_time_picker DRG CMS form field with help of jQuery DateTimePicker plugin
|
1079
|
-
#
|
1080
|
-
# ===Form options:
|
1081
|
-
# * +type:+ datetime_picker (required)
|
1082
|
-
# * +name:+ Field name (required)
|
1083
|
-
# * +options:+ options which apply to date_picker field. All options can be found here http://xdsoft.net/jqplugins/datetimepicker/ .
|
1084
|
-
# Options can be defined in single line like:
|
1085
|
-
# * options: 'step: 15,inline: true,lang: "sl"' or
|
1086
|
-
#
|
1087
|
-
# * options:
|
1088
|
-
# * step: 15
|
1089
|
-
# * inline: true
|
1090
|
-
# * lang: '"sl"'
|
1091
|
-
#
|
1092
|
-
# * +html:+ html options which apply to date_time_picker field (optional)
|
1093
|
-
#
|
1094
|
-
# Form example:
|
1095
|
-
# 10:
|
1096
|
-
# name: valid_to
|
1097
|
-
# type: datetime_picker
|
1098
|
-
# options: 'step: 60'
|
1099
|
-
###########################################################################
|
1100
|
-
class DatetimePicker < DrgcmsField
|
1101
|
-
|
1102
|
-
###########################################################################
|
1103
|
-
# Render date_time_picker field html code
|
1104
|
-
###########################################################################
|
1105
|
-
def render
|
1106
|
-
value = (@record and @record[@yaml['name']]) ? I18n.localize(@record[@yaml['name']].localtime) : nil
|
1107
|
-
return ro_standard( @parent.dc_format_value(value)) if @readonly
|
1108
|
-
#
|
1109
|
-
@yaml['options'] ||= {}
|
1110
|
-
set_initial_value
|
1111
|
-
@yaml['html']['size'] ||= 14
|
1112
|
-
@yaml['html']['value'] = value if @record[@yaml['name']]
|
1113
|
-
#
|
1114
|
-
@yaml['options']['lang'] ||= "'#{I18n.locale}'"
|
1115
|
-
@yaml['options']['format'] ||= "'#{t('datetimepicker.formats.datetime')}'"
|
1116
|
-
#
|
1117
|
-
record = record_text_for(@yaml['name'])
|
1118
|
-
@html << @parent.text_field(record, @yaml['name'], @yaml['html'])
|
1119
|
-
@js << <<EOJS
|
1120
|
-
$(document).ready(function() {
|
1121
|
-
$("##{record}_#{@yaml['name']}").datetimepicker( {
|
1122
|
-
#{hash_to_options(@yaml['options'])}
|
1123
|
-
});
|
1124
|
-
});
|
1125
|
-
EOJS
|
1126
|
-
|
1127
|
-
self
|
1128
|
-
end
|
1129
|
-
|
1130
|
-
###########################################################################
|
1131
|
-
# DateTimePicker get_data method.
|
1132
|
-
###########################################################################
|
1133
|
-
def self.get_data(params, name)
|
1134
|
-
t = params['record'][name] ? params['record'][name].to_datetime : nil
|
1135
|
-
t ? Time.zone.local(t.year, t.month, t.day, t.hour, t.min) : nil
|
1136
|
-
end
|
1137
|
-
|
1138
|
-
end
|
1139
|
-
|
1140
|
-
###########################################################################
|
1141
|
-
# Implementation of text_autocomplete DRG CMS form field.
|
1142
|
-
#
|
1143
|
-
# ===Form options:
|
1144
|
-
# * +name:+ field name (required)
|
1145
|
-
# * +type:+ text_autocomplete (required)
|
1146
|
-
# * +table+ Collection (table) name. When defined search must contain field name
|
1147
|
-
# * +search:+ Search may consist of three parameters from which are separated either by dot (.)
|
1148
|
-
# * search_field_name; when table option is defined search must define field name which will be used for search query
|
1149
|
-
# * collection_name.search_field_name; Same as above except that table options must be ommited.
|
1150
|
-
# * collection_name.search_field_name.method_name; When searching is more complex custom search
|
1151
|
-
# method may be defined in CollectionName model which will provide result set for search.
|
1152
|
-
#
|
1153
|
-
# Form example:
|
1154
|
-
# 10:
|
1155
|
-
# name: user_id
|
1156
|
-
# type: text_autocomplete
|
1157
|
-
# search: dc_user.name
|
1158
|
-
# html:
|
1159
|
-
# size: 30
|
1160
|
-
###########################################################################
|
1161
|
-
class TextAutocomplete < DrgcmsField
|
1162
|
-
|
1163
|
-
###########################################################################
|
1164
|
-
# Render text_autocomplete field html code
|
1165
|
-
###########################################################################
|
1166
|
-
def render
|
1167
|
-
# Return descriptive text and put it into input field
|
1168
|
-
# search field name
|
1169
|
-
if @yaml['search'].class == Hash
|
1170
|
-
table = @yaml['search']['table']
|
1171
|
-
ret_name = @yaml['search']['field']
|
1172
|
-
method = @yaml['search']['method']
|
1173
|
-
elsif @yaml['search'].match(/\./)
|
1174
|
-
table, ret_name, method = @yaml['search'].split('.')
|
1175
|
-
else
|
1176
|
-
ret_name = @yaml['search']
|
1177
|
-
end
|
1178
|
-
# determine table name
|
1179
|
-
if @yaml['table']
|
1180
|
-
table = if @yaml['table'].class == String
|
1181
|
-
@yaml['table']
|
1182
|
-
# eval(how_to_get_my_table_name)
|
1183
|
-
elsif @yaml['table']['eval']
|
1184
|
-
eval @yaml['table']['eval']
|
1185
|
-
else
|
1186
|
-
p "Field #{@yaml['name']}: Invalid table parameter!"
|
1187
|
-
nil
|
1188
|
-
end
|
1189
|
-
end
|
1190
|
-
return 'Table or field keyword not defined!' unless (table and ret_name)
|
1191
|
-
# TODO check if table exists
|
1192
|
-
t = table.classify.constantize
|
1193
|
-
# find record and return value of field
|
1194
|
-
value_send_as = 'p_' + @yaml['name']
|
1195
|
-
value = if @parent.params[value_send_as]
|
1196
|
-
@parent.params[value_send_as]
|
1197
|
-
elsif @record and @record[@yaml['name']]
|
1198
|
-
@record[@yaml['name']]
|
1199
|
-
end
|
1200
|
-
# Found value to be written in field. If field is not found write out value.
|
1201
|
-
if value
|
1202
|
-
record = t.find(value)
|
1203
|
-
value_displayed = record ? record.send(ret_name) : value
|
1204
|
-
end
|
1205
|
-
# return if readonly
|
1206
|
-
return ro_standard(value_displayed) if @readonly
|
1207
|
-
# Add method back, so autocomplete will know that it must search for method inside class
|
1208
|
-
ret_name = "#{ret_name}.#{method}" if method
|
1209
|
-
@yaml['html'] ||= {}
|
1210
|
-
@yaml['html']['value'] = value_displayed
|
1211
|
-
@yaml['html']['placeholder'] ||= t('drgcms.search_placeholder') || nil
|
1212
|
-
#
|
1213
|
-
_name = '_' + @yaml['name']
|
1214
|
-
record = record_text_for(@yaml['name'])
|
1215
|
-
@html << @parent.text_field(record, _name, @yaml['html'])
|
1216
|
-
if @yaml['with_new']
|
1217
|
-
@html << ' ' +
|
1218
|
-
@parent.fa_icon('plus-square lg', class: 'in-edit-add', title: t('drgcms.new'),
|
1219
|
-
style: "vertical-align: top;", 'data-table' => @yaml['with_new'] )
|
1220
|
-
end
|
1221
|
-
@html << @parent.hidden_field(record, @yaml['name'], value: value) # actual value will be in hidden field
|
1222
|
-
# JS stuff
|
1223
|
-
@js << <<EOJS
|
1224
|
-
$(document).ready(function() {
|
1225
|
-
$("##{record}_#{_name}").autocomplete( {
|
1226
|
-
source: function(request, response) {
|
1227
|
-
$.ajax({
|
1228
|
-
url: '/dc_common/autocomplete',
|
1229
|
-
type: "POST",
|
1230
|
-
dataType: "json",
|
1231
|
-
data: { input: request.term, table: "#{table}", search: "#{ret_name}" #{(',id: "'+@yaml['id'] + '"') if @yaml['id']} },
|
1232
|
-
success: function(data) {
|
1233
|
-
response( $.map( data, function(key) {
|
1234
|
-
return key;
|
1235
|
-
}));
|
1236
|
-
}
|
1237
|
-
});
|
1238
|
-
},
|
1239
|
-
change: function (event, ui) {
|
1240
|
-
$("##{record}_#{@yaml['name']}").val(ui.item.id);
|
1241
|
-
},
|
1242
|
-
minLength: 2
|
1243
|
-
});
|
1244
|
-
});
|
1245
|
-
EOJS
|
1246
|
-
|
1247
|
-
self
|
1248
|
-
end
|
1249
|
-
|
1250
|
-
###########################################################################
|
1251
|
-
# Return value. Return nil if input field is empty
|
1252
|
-
###########################################################################
|
1253
|
-
def self.get_data(params, name)
|
1254
|
-
params['record']["_#{name}"].blank? ? nil : params['record'][name]
|
1255
|
-
end
|
1256
|
-
end
|
1257
|
-
|
1258
|
-
###########################################################################
|
1259
|
-
# Implementation of text_area DRG CMS form field.
|
1260
|
-
#
|
1261
|
-
# ===Form options:
|
1262
|
-
# * +type:+ text_area (required)
|
1263
|
-
# * +name:+ Field name (required)
|
1264
|
-
# * +html:+ html options which apply to text_area field (optional)
|
1265
|
-
#
|
1266
|
-
# Form example:
|
1267
|
-
# 10:
|
1268
|
-
# name: css
|
1269
|
-
# type: text_area
|
1270
|
-
# html:
|
1271
|
-
# size: 100x30
|
1272
|
-
###########################################################################
|
1273
|
-
class TextArea < DrgcmsField
|
1274
|
-
|
1275
|
-
###########################################################################
|
1276
|
-
# Return value for readonly field
|
1277
|
-
###########################################################################
|
1278
|
-
def ro_standard
|
1279
|
-
value = @record[@yaml['name']]
|
1280
|
-
@html << "<div class='dc-readonly'>#{value.gsub("\n",'<br>')}</div>" unless value.blank?
|
1281
|
-
self
|
1282
|
-
end
|
1283
|
-
|
1284
|
-
###########################################################################
|
1285
|
-
# Render text_area field html code
|
1286
|
-
###########################################################################
|
1287
|
-
def render
|
1288
|
-
return ro_standard if @readonly
|
1289
|
-
set_initial_value
|
1290
|
-
#
|
1291
|
-
# @yaml['html'] ||= {}
|
1292
|
-
# value_send_as = 'p_' + @yaml['name']
|
1293
|
-
# @yaml['html']['value'] = @parent.params[value_send_as] if @parent.params[value_send_as]
|
1294
|
-
|
1295
|
-
record = record_text_for(@yaml['name'])
|
1296
|
-
@html << @parent.text_area(record, @yaml['name'], @yaml['html'])
|
1297
|
-
self
|
1298
|
-
end
|
1299
|
-
end
|
1300
|
-
|
1301
|
-
###########################################################################
|
1302
|
-
# Implementation of text_field DRG CMS form field.
|
1303
|
-
#
|
1304
|
-
# ===Form options:
|
1305
|
-
# * +type:+ text_field (required)
|
1306
|
-
# * +name:+ Field name (required)
|
1307
|
-
# * +html:+ html options which apply to text_field field (optional)
|
1308
|
-
#
|
1309
|
-
# Form example:
|
1310
|
-
# 10:
|
1311
|
-
# name: title
|
1312
|
-
# type: text_field
|
1313
|
-
# size: 30
|
1314
|
-
# html:
|
1315
|
-
# required: yes
|
1316
|
-
###########################################################################
|
1317
|
-
class TextField < DrgcmsField
|
1318
|
-
|
1319
|
-
###########################################################################
|
1320
|
-
# Render text_field field html code
|
1321
|
-
###########################################################################
|
1322
|
-
def render
|
1323
|
-
return ro_standard if @readonly
|
1324
|
-
set_initial_value
|
1325
|
-
#
|
1326
|
-
record = record_text_for(@yaml['name'])
|
1327
|
-
@html << @parent.text_field( record, @yaml['name'], @yaml['html'])
|
1328
|
-
self
|
1329
|
-
end
|
1330
|
-
end
|
1331
|
-
|
1332
|
-
###########################################################################
|
1333
|
-
# Implementation of number_field DRG CMS form field. Number fields can be
|
1334
|
-
# formated for display with thousands delimiters and decimal separators and
|
1335
|
-
# can have currency symbol.
|
1336
|
-
#
|
1337
|
-
# ===Form options:
|
1338
|
-
# * +type:+ number_field (required)
|
1339
|
-
# * +name:+ Field name (required)
|
1340
|
-
# * +format:+ Format options
|
1341
|
-
# * +decimals:+ No of decimal places
|
1342
|
-
# * +separator:+ decimal separator (yes no , .) Default yes if decimals > 0
|
1343
|
-
# * +delimiter:+ Thousands delimiter (yes no , .) Default defind by locals
|
1344
|
-
# * +currency:+ Currency sign (yes no sign) Default no. If yes defined by locals
|
1345
|
-
# * +html:+ html options which apply to text_field field (optional)
|
1346
|
-
#
|
1347
|
-
# Form example:
|
1348
|
-
# 10:
|
1349
|
-
# name: title
|
1350
|
-
# type: number_field
|
1351
|
-
# size: 10
|
1352
|
-
# format:
|
1353
|
-
# decimals: 2
|
1354
|
-
# delimiter: false
|
1355
|
-
###########################################################################
|
1356
|
-
class NumberField < DrgcmsField
|
1357
|
-
|
1358
|
-
###########################################################################
|
1359
|
-
# Render text_field field html code
|
1360
|
-
###########################################################################
|
1361
|
-
def render
|
1362
|
-
return ro_standard if @readonly
|
1363
|
-
set_initial_value
|
1364
|
-
#
|
1365
|
-
record = record_text_for(@yaml['name'])
|
1366
|
-
@yaml['html'] ||= {}
|
1367
|
-
@yaml['html']['class'] = 'dc-number'
|
1368
|
-
@yaml['html']['data-decimal'] = @yaml.dig('format','decimal') || 2
|
1369
|
-
@yaml['html']['data-delimiter'] = @yaml.dig('format','delimiter') || I18n.t('number.currency.format.delimiter')
|
1370
|
-
@yaml['html']['data-separator'] = @yaml.dig('format','separator') || I18n.t('number.currency.format.separator')
|
1371
|
-
# @yaml['html']['data-currency'] = @yaml.dig('format','currency') == 'yes' ? I18n.t('number.currency.format.currency') : @yaml.dig('format','currency')
|
1372
|
-
value = @record[@yaml['name']] || 0
|
1373
|
-
|
1374
|
-
@html << @parent.hidden_field( record, @yaml['name'], value: value )
|
1375
|
-
|
1376
|
-
@yaml['html']['value'] = @parent.dc_format_number(value, @yaml['html']['data-decimal'], @yaml['html']['data-separator'], @yaml['html']['data-delimiter'] )
|
1377
|
-
@html << @parent.text_field( nil,"record_#{@yaml['name']}1", @yaml['html'])
|
1378
|
-
self
|
1379
|
-
end
|
1380
|
-
|
1381
|
-
###########################################################################
|
1382
|
-
# Return value. Return nil if input field is empty
|
1383
|
-
###########################################################################
|
1384
|
-
def self.get_data(params, name)
|
1385
|
-
return 0 if params['record'][name].blank?
|
1386
|
-
params['record'][name].match('.') ? BigDecimal.new(params['record'][name]) : Integer.new(params['record'][name])
|
1387
|
-
end
|
1388
|
-
end
|
1389
|
-
|
1390
|
-
###########################################################################
|
1391
|
-
# Implementation of text_with_select DRG CMS form field. Field will provide
|
1392
|
-
# text_field entry field with select dropdown box with optional values for the field.
|
1393
|
-
# Form options are mostly same as in select field.
|
1394
|
-
#
|
1395
|
-
# ===Form options:
|
1396
|
-
# * +name:+ field name (required)
|
1397
|
-
# * +type:+ text_with_select (required)
|
1398
|
-
# * +choices:+ Values for choices separated by comma. Values can also be specified like description:value.
|
1399
|
-
# In this case description will be shown to user, but value will be saved to document.
|
1400
|
-
# choices: 'OK:0,Ready:1,Error:2'
|
1401
|
-
# choices: Ruby,Pyton,PHP
|
1402
|
-
# * +eval:+ Choices will be provided by evaluating expression
|
1403
|
-
# eval: dc_choices4('model_name','description_field_name','_id'); dc_choices4 helper will provide data for select field.
|
1404
|
-
# eval: ModelName.choices4_field; ModelName class will define method choices4_field which
|
1405
|
-
# will provide data for select field. Since expression is evaluated in the context of Form Field object
|
1406
|
-
# Even session session variables can be accessed.
|
1407
|
-
# eval: 'MyClass.method(@parent.session[:user_id])'
|
1408
|
-
# When searching is more complex custom search method may be defined in CollectionName
|
1409
|
-
# model which will provide result set for search.
|
1410
|
-
# eval: collection_name.search_field_name.method_name;
|
1411
|
-
# If choices or eval is not defined choices will be provided from translation helpers. For example:
|
1412
|
-
# Collection has field status. Choices for field will be provided by en.helpers.model_name.choices4_status
|
1413
|
-
# entry of english translation. English is of course default translation. If you provide translations in
|
1414
|
-
# your local language then select choices will be localized.
|
1415
|
-
# en.helpers.model_name.choices4_status: 'OK:0,Ready:1,Error:2'
|
1416
|
-
# sl.helpers.model_name.choices4_status: 'V redu:0,Pripravljen:1,Napaka:2'
|
1417
|
-
# * +html:+ html options which apply to select and text_field fields (optional)
|
1418
|
-
#
|
1419
|
-
# Form example:
|
1420
|
-
# 10:
|
1421
|
-
# name: link
|
1422
|
-
# type: text_with_select
|
1423
|
-
# eval: '@parent.dc_page_class.all_pages_for_site(@parent.dc_get_site)'
|
1424
|
-
# html:
|
1425
|
-
# size: 50
|
1426
|
-
###########################################################################
|
1427
|
-
class TextWithSelect < Select
|
1428
|
-
|
1429
|
-
###########################################################################
|
1430
|
-
# Render text_with_select field html code
|
1431
|
-
###########################################################################
|
1432
|
-
def render
|
1433
|
-
return ro_standard if @readonly
|
1434
|
-
set_initial_value('html','value')
|
1435
|
-
|
1436
|
-
record = record_text_for(@yaml['name'])
|
1437
|
-
@html << @parent.text_field( record, @yaml['name'], @yaml['html'])
|
1438
|
-
@yaml['html']['class'] = 'text-with-select'
|
1439
|
-
@yaml['html'].symbolize_keys!
|
1440
|
-
@html << @parent.select( @yaml['name'] + '_', nil, get_choices, { include_blank: true }, { class: 'text-with-select' })
|
1441
|
-
|
1442
|
-
# javascript to update text field if new value is selected in select field
|
1443
|
-
@js =<<EOJS
|
1444
|
-
$(document).ready(function() {
|
1445
|
-
$('##{@yaml['name']}_').change( function() {
|
1446
|
-
if ($(this).val().toString().length > 0) {
|
1447
|
-
$('##{record}_#{@yaml['name']}').val( $(this).val() );
|
1448
|
-
}
|
1449
|
-
$('##{record}_#{@yaml['name']}').focus();
|
1450
|
-
});
|
1451
|
-
});
|
1452
|
-
EOJS
|
1453
|
-
self
|
1454
|
-
end
|
1455
|
-
end
|
1456
|
-
|
1457
|
-
###########################################################################
|
1458
|
-
# Implementation of tree_select DRG CMS form field. Field will provides
|
1459
|
-
# multiple select functionality displayed as a tree. Might be used for selecting
|
1460
|
-
# multiple categories in a parent-child tree view.#
|
1461
|
-
#
|
1462
|
-
# ===Form options:
|
1463
|
-
# * +name:+ field name (required)
|
1464
|
-
# * +type:+ tree_select (required)
|
1465
|
-
# * +choices:+ Values for choices separated by comma. Values can also be specified like description:value.
|
1466
|
-
# In this case description will be shown to user, but value will be saved to document.
|
1467
|
-
# choices: 'OK:0,Ready:1,Error:2'
|
1468
|
-
# choices: Ruby,Pyton,PHP
|
1469
|
-
# * +eval:+ Choices will be provided by evaluating expression
|
1470
|
-
# eval: ModelName.choices4_field; Model class should define method which will provide data for field.
|
1471
|
-
# Data returned must be of type Array and have 3 elements.
|
1472
|
-
# 1 - description text
|
1473
|
-
# 2 - id value
|
1474
|
-
# 3 - parent id
|
1475
|
-
# * +html:+ html options which apply to select and text_field fields (optional)
|
1476
|
-
#
|
1477
|
-
# Form example:
|
1478
|
-
# 10:
|
1479
|
-
# name: categories
|
1480
|
-
# type: tree_select
|
1481
|
-
# eval: 'Categories.all_categories'
|
1482
|
-
# html:
|
1483
|
-
# size: 50x10
|
1484
|
-
###########################################################################
|
1485
|
-
class TreeSelect < Select
|
1486
|
-
|
1487
|
-
###########################################################################
|
1488
|
-
# Prepare choices for tree data rendering.
|
1489
|
-
###########################################################################
|
1490
|
-
def make_tree(parent)
|
1491
|
-
return '' unless @choices[parent.to_s]
|
1492
|
-
@html << '<ul>'
|
1493
|
-
choices = if @choices[parent.to_s].first[3] != 0
|
1494
|
-
@choices[parent.to_s].sort_by {|e| e[3].to_i } # sort by order if first is not 0
|
1495
|
-
# @choices[parent.to_s].sort_alphabetical_by(&:first) # use UTF-8 sort
|
1496
|
-
else
|
1497
|
-
@choices[parent.to_s].sort_alphabetical_by(&:first) # use UTF-8 sort
|
1498
|
-
end
|
1499
|
-
choices.each do |choice|
|
1500
|
-
jstree = %Q[{"selected" : #{choice.last ? 'true' : 'false'} }]
|
1501
|
-
# data-jstree must be singe quoted
|
1502
|
-
@html << %Q[<li data-id="#{choice[1]}" data-jstree='#{jstree}'>#{choice.first}\n]
|
1503
|
-
# call recursively for children
|
1504
|
-
make_tree(choice[1]) if @choices[ choice[1].to_s ]
|
1505
|
-
@html << "</li>"
|
1506
|
-
end
|
1507
|
-
@html << '</ul>'
|
1508
|
-
end
|
1509
|
-
|
1510
|
-
###########################################################################
|
1511
|
-
# Render tree_select field html code
|
1512
|
-
###########################################################################
|
1513
|
-
def render
|
1514
|
-
return ro_standard if @readonly
|
1515
|
-
set_initial_value('html','value')
|
1516
|
-
require 'sort_alphabetical'
|
1517
|
-
|
1518
|
-
record = record_text_for(@yaml['name'])
|
1519
|
-
@html << "<div id=\"#{@yaml['name']}\" class=\"tree-select\" #{set_style()} >"
|
1520
|
-
# Fill @choices hash. The key is parent object id
|
1521
|
-
@choices = {}
|
1522
|
-
do_eval(@yaml['eval']).each {|data| @choices[ data[2].to_s ] ||= []; @choices[ data[2].to_s ] << (data << false)}
|
1523
|
-
# put current values hash with. To speed up selection when there is a lot of categories
|
1524
|
-
current_values = {}
|
1525
|
-
current = @record[@yaml['name']] || []
|
1526
|
-
current = [current] unless current.class == Array # non array fields
|
1527
|
-
current.each {|e| current_values[e.to_s] = true}
|
1528
|
-
# set third element of @choices when selected
|
1529
|
-
@choices.keys.each do |key|
|
1530
|
-
0.upto( @choices[key].size - 1 ) do |i|
|
1531
|
-
choice = @choices[key][i]
|
1532
|
-
choice[choice.size - 1] = true if current_values[ choice[1].to_s ]
|
1533
|
-
end
|
1534
|
-
end
|
1535
|
-
make_tree(nil)
|
1536
|
-
@html << '</ul></div>'
|
1537
|
-
# add hidden communication field
|
1538
|
-
@html << @parent.hidden_field(record, @yaml['name'], value: current.join(','))
|
1539
|
-
# save multiple indicator for data processing on return
|
1540
|
-
@html << @parent.hidden_field(record, "#{@yaml['name']}_multiple", value: 1) if @yaml['multiple']
|
1541
|
-
# javascript to update hidden record field when tree looses focus
|
1542
|
-
@js =<<EOJS
|
1543
|
-
$(function(){
|
1544
|
-
$("##{@yaml['name']}").jstree( {
|
1545
|
-
"checkbox" : {"three_state" : false},
|
1546
|
-
"core" : { "themes" : { "icons": false },
|
1547
|
-
"multiple" : #{@yaml['multiple'] ? 'true' : 'false'} },
|
1548
|
-
"plugins" : ["checkbox"]
|
1549
|
-
});
|
1550
|
-
});
|
1551
|
-
|
1552
|
-
$(document).ready(function() {
|
1553
|
-
$('##{@yaml['name']}').on('focusout', function(e) {
|
1554
|
-
var checked_ids = [];
|
1555
|
-
var checked = $('##{@yaml['name']}').jstree("get_checked", true);
|
1556
|
-
$.each(checked, function() {
|
1557
|
-
checked_ids.push( this.data.id );
|
1558
|
-
});
|
1559
|
-
$('#record_#{@yaml['name']}').val( checked_ids.join(",") );
|
1560
|
-
});
|
1561
|
-
});
|
1562
|
-
EOJS
|
1563
|
-
self
|
1564
|
-
end
|
1565
|
-
|
1566
|
-
###########################################################################
|
1567
|
-
# Return value. Return nil if input field is empty
|
1568
|
-
###########################################################################
|
1569
|
-
def self.get_data(params, name)
|
1570
|
-
return nil if params['record'][name].blank?
|
1571
|
-
#
|
1572
|
-
result = params['record'][name].split(',')
|
1573
|
-
result.delete_if {|e| e.blank? }
|
1574
|
-
return nil if result.size == 0
|
1575
|
-
# convert to BSON objects if is BSON object ID
|
1576
|
-
result = result.map{ |e| BSON::ObjectId.from_string(e) } if BSON::ObjectId.legal?(result.first)
|
1577
|
-
# return only first element if multiple values select was not alowed
|
1578
|
-
params['record']["#{name}_multiple"] == '1' ? result : result.first
|
1579
|
-
end
|
1580
|
-
|
1581
|
-
end
|
1582
|
-
|
1583
|
-
###########################################################################
|
1584
|
-
# Implementation of html_field DRG CMS form field.
|
1585
|
-
#
|
1586
|
-
# HtmlField class only implements code for calling actual html edit field code.
|
1587
|
-
# This is by default drg_default_html_editor gem which uses CK editor javascript plugin
|
1588
|
-
# or any other plugin. Which plugin will be used as html editor is defined by
|
1589
|
-
# dc_site.settings html_editor setting.
|
1590
|
-
#
|
1591
|
-
# Example of dc_site.setting used for drg_default_html_editor gem.
|
1592
|
-
# html_editor: ckeditor
|
1593
|
-
# ck_editor:
|
1594
|
-
# config_file: /files/ck_config.js
|
1595
|
-
# css_file: /files/ck_css.css
|
1596
|
-
# file_select: elfinder
|
1597
|
-
#
|
1598
|
-
# Form example:
|
1599
|
-
# 10:
|
1600
|
-
# name: body
|
1601
|
-
# type: html_field
|
1602
|
-
# options: "height: 500, width: 550, toolbar: 'basic'"
|
1603
|
-
###########################################################################
|
1604
|
-
class HtmlField < DrgcmsField
|
1605
|
-
|
1606
|
-
###########################################################################
|
1607
|
-
# Render html_field field html code
|
1608
|
-
###########################################################################
|
1609
|
-
def render
|
1610
|
-
return ro_standard if @readonly
|
1611
|
-
# retrieve html editor from page settings
|
1612
|
-
editor_string = @parent.dc_get_site.params['html_editor'] if @parent.dc_get_site
|
1613
|
-
editor_string ||= 'ckeditor'
|
1614
|
-
#
|
1615
|
-
klas_string = editor_string.camelize
|
1616
|
-
if DrgcmsFormFields.const_defined?(klas_string)
|
1617
|
-
klas = DrgcmsFormFields::const_get(klas_string)
|
1618
|
-
o = klas.new(@parent, @record, @yaml).render
|
1619
|
-
@js << o.js
|
1620
|
-
@html << o.html
|
1621
|
-
else
|
1622
|
-
@html << "HTML editor not defined. Check site.settings or include drgcms_default_html_editor gem."
|
1623
|
-
end
|
1624
|
-
self
|
1625
|
-
end
|
1626
|
-
end
|
1627
|
-
|
1628
|
-
###########################################################################
|
1629
|
-
# Implementation of file_select DRG CMS form field.
|
1630
|
-
#
|
1631
|
-
# FileSelect like HtmlField implements redirection for calling document manager edit field code.
|
1632
|
-
# This can be drg_default_html_editor's elfinder or any other code defined
|
1633
|
-
# by dc_site.settings file_select setting.
|
1634
|
-
#
|
1635
|
-
# Example of dc_site.setting used for drg_default_html_editor gem.
|
1636
|
-
# html_editor: ckeditor
|
1637
|
-
# ck_editor:
|
1638
|
-
# config_file: /files/ck_config.js
|
1639
|
-
# css_file: /files/ck_css.css
|
1640
|
-
# file_select: elfinder
|
1641
|
-
#
|
1642
|
-
# Form example:
|
1643
|
-
# 60:
|
1644
|
-
# name: picture
|
1645
|
-
# type: file_select
|
1646
|
-
# html:
|
1647
|
-
# size: 50
|
1648
|
-
###########################################################################
|
1649
|
-
class FileSelect < DrgcmsField
|
1650
|
-
|
1651
|
-
###########################################################################
|
1652
|
-
# Render file_select field html code
|
1653
|
-
###########################################################################
|
1654
|
-
def render
|
1655
|
-
return ro_standard if @readonly
|
1656
|
-
# retrieve html editor from page settings
|
1657
|
-
selector_string = @parent.dc_get_site.params['file_select'] if @parent.dc_get_site
|
1658
|
-
selector_string ||= 'elfinder'
|
1659
|
-
#
|
1660
|
-
klas_string = selector_string.camelize
|
1661
|
-
if DrgcmsFormFields.const_defined?(klas_string)
|
1662
|
-
klas = DrgcmsFormFields::const_get(klas_string)
|
1663
|
-
o = klas.new(@parent, @record, @yaml).render
|
1664
|
-
@js << o.js
|
1665
|
-
@html << o.html
|
1666
|
-
else
|
1667
|
-
@html << "File select component not defined. Check site.settings or include drgcms_default_html_editor gem."
|
1668
|
-
end
|
1669
|
-
self
|
1670
|
-
end
|
1671
|
-
end
|
1672
|
-
|
1673
|
-
end
|