drg_cms 0.4.61 → 0.5.0

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.
@@ -53,6 +53,7 @@ en:
53
53
  not_id: Value entered is not ID!
54
54
 
55
55
  edit: Edit
56
+ show: Prikaz
56
57
  new: New
57
58
  sort: Sort
58
59
  filter: Filter
@@ -53,6 +53,7 @@ sl:
53
53
  not_id: Vsebina polja ni ključ ID!
54
54
 
55
55
  edit: Urejanje
56
+ show: Prikaz
56
57
  new: Dodaj
57
58
  sort: Razvrsti
58
59
  filter: Filter
data/drg_cms.gemspec CHANGED
@@ -10,10 +10,9 @@ Gem::Specification.new do |s|
10
10
  s.authors = ["Damjan Rems"]
11
11
  s.email = ["damjan.rems@gmail.com"]
12
12
  s.homepage = "http://www.drgcms.org"
13
- s.summary = "DRG CMS: CMS for Ruby, Rails and MongoDB"
14
- s.description = "DRG CMS: Content management system for Ruby, Rails and MongoDB"
13
+ s.summary = "DRG CMS: Content management system for Ruby, Rails and MongoDB"
14
+ s.description = "DRG CMS can be used for rapid building of complex, data-entry intensive web sites as well as building your private Intranet applications."
15
15
  s.license = "MIT-LICENSE"
16
-
17
16
  s.files = Dir["{app,config,db,lib}/**/*"] + ["MIT-LICENSE", "Rakefile", "README.md", "drg_cms.gemspec"]
18
17
  s.test_files = Dir["test/**/*"]
19
18
 
@@ -1,4 +1,4 @@
1
1
  module DrgCms #:nodoc:
2
2
  # drg_cms gem version
3
- VERSION = "0.4.61"
3
+ VERSION = "0.5.0"
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: drg_cms
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.61
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Damjan Rems
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-28 00:00:00.000000000 Z
11
+ date: 2015-05-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -122,7 +122,8 @@ dependencies:
122
122
  - - ">="
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
- description: 'DRG CMS: Content management system for Ruby, Rails and MongoDB'
125
+ description: DRG CMS can be used for rapid building of complex, data-entry intensive
126
+ web sites as well as building your private Intranet applications.
126
127
  email:
127
128
  - damjan.rems@gmail.com
128
129
  executables: []
@@ -247,7 +248,6 @@ files:
247
248
  - app/models/dc_user.rb
248
249
  - app/models/dc_user_role.rb
249
250
  - app/models/dc_visit.rb
250
- - app/models/drgcms_form_field.rb
251
251
  - app/models/drgcms_form_fields.rb
252
252
  - app/views/__dc_at_the_beginning/create.html.erb
253
253
  - app/views/__dc_at_the_beginning/index.html.erb
@@ -345,7 +345,7 @@ rubyforge_project:
345
345
  rubygems_version: 2.2.3
346
346
  signing_key:
347
347
  specification_version: 4
348
- summary: 'DRG CMS: CMS for Ruby, Rails and MongoDB'
348
+ summary: 'DRG CMS: Content management system for Ruby, Rails and MongoDB'
349
349
  test_files:
350
350
  - test/test_helper.rb
351
351
  - test/drg_cms_test.rb
@@ -1,1027 +0,0 @@
1
- #--
2
- # Copyright (c) 2012+ 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
- # DrgcmsFormField 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 DrgcmsFormField 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.
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 DrgcmsFormField.const_defined?(klas_string) # check if field type class is defined
42
- # klas = DrgcmsFormField.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 = DrgcmsFormField::Select.new(self, {}, opts).render
54
- # (dt.html + javascript_tag(dt.js)).html_safe
55
- # %></div>
56
- ###########################################################################
57
- module DrgcmsFormField
58
-
59
- ###########################################################################
60
- # Template method for DRG CMS form field definition. This is abstract class with
61
- # most of the common code already implemented.
62
- ###########################################################################
63
- class DrgcmsField
64
- attr_reader :html, :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
- @html = ''
84
- @js = ''
85
- self
86
- end
87
-
88
- ####################################################################
89
- # Wrapper for i18 t method, with some spice added. If translation is not found English
90
- # translation value will be returned. And if still not found default value will be returned if passed.
91
- #
92
- # Parameters:
93
- # [key] String. String to be translated into locale.
94
- # [default] String. Value returned if translation is not found.
95
- #
96
- # Example:
97
- # t('translate.this','Enter text for ....')
98
- #
99
- # Returns:
100
- # String. Translated text.
101
- ####################################################################
102
- def t(key, default='')
103
- c = I18n.t(key)
104
- if c.match( 'translation missing' )
105
- c = I18n.t(key, locale: 'en')
106
- # Still not found. Return default if set
107
- c = default unless default.blank?
108
- end
109
- c
110
- end
111
-
112
- ####################################################################
113
- # Standard code for returning readonly field.
114
- ####################################################################
115
- def ro_standard(value=nil)
116
- value = @record[@yaml['name']] if value.nil? and @record.respond_to?(@yaml['name'])
117
- @html << (value.to_s.size == 0 ? '' : "<table class='dc-readonly'><td>#{value}</td></table>")
118
- self
119
- end
120
-
121
- ####################################################################
122
- # Set initial value of the field when initial value is set in url parameters..
123
- #
124
- # Example: Form has field named picture. Field can be initialized by
125
- # setting value of param p_picture.
126
- ####################################################################
127
- def set_initial_value(opt1='html', opt2='value')
128
- @yaml['html'] ||= {}
129
- value_send_as = 'p_' + @yaml['name']
130
- @yaml[opt1][opt2] = @parent.params[value_send_as] if @parent.params[value_send_as]
131
- end
132
-
133
- ####################################################################
134
- # Will return ruby hash formated as javascript string which can be used
135
- # for passing parameters in javascript code.
136
- #
137
- # Parameters:
138
- # [Hash] Hash. Ruby hash parameters.
139
- #
140
- # Example: As used in forms
141
- # options:
142
- # height: 400
143
- # width: 800
144
- # toolbar: "'basic'"
145
- #
146
- # => "height:400, width:800, toolbar:'basic'"
147
- #
148
- # Return:
149
- # String: Options formated as javascript options.
150
- #
151
- ####################################################################
152
- def hash_to_options(hash)
153
- options = hash.to_a.inject('') do |r,v|
154
- r << "#{v[0]}: #{v[1]},"
155
- end
156
- options.chomp(',')
157
- end
158
-
159
- ####################################################################
160
- # Checks if field name exists in document and alters record parameters if necesary.
161
- # Method was added after fields that do not belong to current edited document
162
- # were added to forms. Valid nonexisting form field names must start with underscore (_) letter.
163
- #
164
- # Return:
165
- # String: 'record' or '_record' when valid nonexisting field is used
166
- ####################################################################
167
- def record_text_for(name)
168
- (!@record.respond_to?(name) and name[0,1] == '_') ? '_record' : 'record'
169
- end
170
-
171
-
172
- ###########################################################################
173
- # Default get_data method for retrieving data from parameters. Class method is called
174
- # for every entry field defined on form before field value is saved to database.
175
- #
176
- # Parameters:
177
- # [params] Controllers params object.
178
- # [name] Field name
179
- #
180
- # Most of classes will use this default method which returns params['record'][name].
181
- # When field data is more complex class should implement its own get_data method.
182
- ###########################################################################
183
- def self.get_data(params, name)
184
- params['record'][name]
185
- end
186
-
187
- end
188
-
189
- ###########################################################################
190
- # Implementation of readonly DRG CMS form field.
191
- #
192
- # Readonly field value is just painted on form.
193
- ###########################################################################
194
- class Readonly < DrgcmsField
195
- ###########################################################################
196
- # Render readonly field html code
197
- ###########################################################################
198
- def render
199
- @html << @parent.hidden_field('record', @yaml['name']) # retain field as hidden field
200
- @html << '<table class="dc-readonly"><td>'
201
-
202
- @html << if @yaml['eval']
203
- if @yaml['eval'].match('dc_name4_id')
204
- a = @yaml['eval'].split(',')
205
- @parent.dc_name4_id(a[1], a[2], @record[ @yaml['name'] ])
206
- else
207
- eval( "#{@yaml['eval']} '#{@record[ @yaml['name'] ]}'")
208
- end
209
- else
210
- @parent.dc_format_value(@record[@yaml['name']],@yaml['format'])
211
- end
212
- @html << '</td></table>'
213
- self
214
- end
215
- end
216
-
217
- ###########################################################################
218
- # Implementation of hidden DRG CMS form field.
219
- #
220
- # Will create hidden_field on form.
221
- ###########################################################################
222
- class HiddenField < DrgcmsField
223
- ###########################################################################
224
- # Render hidden_field field html code
225
- ###########################################################################
226
- def render
227
- set_initial_value
228
- value = @yaml['html']['value'] ? @yaml['html']['value'] : @record[@yaml['name']]
229
- record = record_text_for(@yaml['name'])
230
- @parent.hidden_field(record, @yaml['name'], value: value)
231
- end
232
- end
233
-
234
- ###########################################################################
235
- # Implementation of embedded DRG CMS form field.
236
- #
237
- # Creates html required to paint embedded object on form.
238
- ###########################################################################
239
- class Embedded < DrgcmsField
240
- ###########################################################################
241
- # Render embedded field html code
242
- ###########################################################################
243
- def render
244
- return self if @record.new_record? # would be in error otherwise
245
- # HTML defaults. Some must be set
246
- @yaml['html'] ||= {}
247
- @yaml['html']['height'] ||= 300
248
- @yaml['html']['width'] ||= '99%'
249
- # defaults both way
250
- @yaml['table'] ||= @yaml['formname'] if @yaml['formname']
251
- @yaml['formname'] ||= @yaml['table'] if @yaml['table']
252
- #
253
- html = ''
254
- @yaml['html'].each {|k,v| html << "#{k}=\"#{v}\" "}
255
- #
256
- tables = @parent.tables.inject('') { |r,v| r << "#{v[1]};" } + @yaml['table']
257
- ids = @parent.ids.inject('') { |r,v| r << "#{v};" } + @record._id
258
- opts = { controller: 'cmsedit', action: 'index', ids: ids, table: tables, formname: @yaml['formname'],
259
- field_name: @yaml['name'], iframe: "if_#{@yaml['name']}", readonly: @readonly }
260
- @html << "<iframe class='iframe_embedded' id='if_#{@yaml['name']}' name='if_#{@yaml['name']}' #{html}></iframe>"
261
- @js = <<EOJS
262
- $(document).ready( function() {
263
- $('#if_#{@yaml['name']}').attr('src', '#{@parent.url_for(opts)}');
264
- });
265
- EOJS
266
- self
267
- end
268
-
269
- end
270
-
271
- ###########################################################################
272
- # Implementation of journal_diff DRG CMS form field.
273
- #
274
- # journal_diff field is used to show differences between two fields in DcJournal collection.
275
- ###########################################################################
276
- class JournalDiff < DrgcmsField
277
- ###########################################################################
278
- # Render journal_diff field html code
279
- ###########################################################################
280
- def render
281
- @yaml['name'] = 'old' if @record[@yaml['name']].nil?
282
- @html << '<table width="99%">'
283
- JSON.parse(@record[@yaml['name']]).each do |k,v|
284
- @html << "<tr><td style='background-color: #654ddd;'>#{@parent.check_box('select', k)} #{k}:</td></tr>
285
- <tr><td style='background-color: #ffe;'>#{v[0]}</td></tr>
286
- <tr><td style='background-color: #eff;'>#{v[1]}</td></tr>"
287
- end
288
- @html << '</table>'
289
- self
290
- end
291
- end
292
-
293
- ###########################################################################
294
- # Implementation of multitext_autocomplete DRG CMS form field.
295
- #
296
- # multitext_autocomplete field is complex data entry field which uses autocomplete
297
- # function when selecting multiple values for MongoDB Array field. Array typically holds
298
- # id's of selected documents and control typically displays value of the field name
299
- # defined by search options.
300
- #
301
- # Form options:
302
- # [name] field name
303
- # [table] Collection (table) name
304
- # [search] Search may consist of three parameters from which last is not required. Parameters
305
- # can be separated either by dot (.) or comma(,) table_name.display_field_name.(table_name_search_method)
306
- # table_name is name of collection, display_field_name will be used for displaying value of selected
307
- # document ids on screen. Optional search method can be defined when searched documents are
308
- # only subset of all documents and additional query is required.
309
- # [html] Various html options which can be applied to input object.
310
- ###########################################################################
311
- class MultitextAutocomplete < DrgcmsField
312
-
313
- ###########################################################################
314
- # Returns value for readonly field
315
- ###########################################################################
316
- def ro_standard(table, search)
317
- result = ''
318
- table = table.classify.constantize
319
- return self if @record[@yaml['name']].nil?
320
- @record[@yaml['name']].each do |element|
321
- result << table.find(element)[search] + '<br>'
322
- end
323
- super(result)
324
- end
325
-
326
- ###########################################################################
327
- # Render multitext_autocomplete field html code
328
- ###########################################################################
329
- def render
330
- # search field name
331
- if @yaml['search'].to_s.match(/\./)
332
- table, field_name, method = @yaml['search'].split(/\.|\,/)
333
- search = method.nil? ? field_name : "#{field_name}.#{method}"
334
- else # search and table name are separated
335
- search = field_name = @yaml['search']
336
- end
337
- # determine table name
338
- if @yaml['table']
339
- table = if @yaml['table'].class == String
340
- @yaml['table']
341
- # eval(how_to_get_my_table_name)
342
- elsif @yaml['table']['eval']
343
- eval @yaml['table']['eval']
344
- else
345
- p "Field #{@yaml['name']}: Invalid table parameter!"
346
- nil
347
- end
348
- end
349
- unless (table and search)
350
- @html << 'Table or search field not defined!'
351
- return self
352
- end
353
- #
354
- return ro_standard(table, search) if @readonly
355
- # TODO check if table exists
356
- collection = table.classify.constantize
357
- unless @record.respond_to?(@yaml['name'])
358
- @html << "Invalid field name: #{@yaml['name']}"
359
- return self
360
- end
361
- # put field to enter search data on form
362
- @yaml['html'] ||= {}
363
- @yaml['html']['value'] = '' # must be. Otherwise it will look into record and return error
364
- _name = '_' + @yaml['name']
365
- @html << '<table class="ui-autocomplete-table"><td>'
366
- @html << @parent.link_to(@parent.image_tag('drg_cms/add.png', class: 'dc-link-img'), '#',onclick: 'return false;') # dummy add. But it is usefull.
367
-
368
- record = record_text_for(@yaml['name'])
369
- @html << ' ' << @parent.text_field(record, _name, @yaml['html']) # text field for autocomplete
370
- @html << "<div id =\"#{record}#{@yaml['name']}\">" # div to list active records
371
- # find value for each field inside categories
372
- unless @record[@yaml['name']].nil?
373
- @record[@yaml['name']].each do |element|
374
- # this is quick and dirty trick. We have model dc_big_table which can be used for retrive
375
- # more complicated options
376
- # TODO retrieve choices from big_table
377
- rec = if table == 'dc_big_table'
378
- collection.find(@yaml['name'], @parent.session)
379
- else
380
- collection.find(element)
381
- end
382
- # Related data is missing. It happends.
383
- @html << if rec
384
- link = @parent.link_to(@parent.image_tag('drg_cms/x.png', class: 'dc-link-img'), '#',
385
- onclick: "$('##{rec.id}').hide(); var v = $('##{record}_#{@yaml['name']}_#{rec.id}'); v.val(\"-\" + v.val());return false;")
386
- field = @parent.hidden_field(record, "#{@yaml['name']}_#{rec.id}", value: element)
387
- "<div id=\"#{rec.id}\">#{link} #{rec[field_name]}<br>#{field}</div>"
388
- else
389
- '** error **'
390
- end
391
- end
392
- end
393
- @html << "</div></td></table>"
394
- # Create text for div to be added when new category is selected
395
- link = @parent.link_to(@parent.image_tag('drg_cms/x.png', class: 'dc-link-img'), '#',
396
- onclick: "$('#rec_id').hide(); var v = $('##{record}_#{@yaml['name']}_rec_id'); v.val(\"-\" + v.val());return false;")
397
- field = @parent.hidden_field(record, "#{@yaml['name']}_rec_id", value: 'rec_id')
398
- one_div = "<div id=\"rec_id\">#{link} rec_search<br>#{field}</div>"
399
-
400
- # JS stuff
401
- @js << <<EOJS
402
- $(document).ready(function() {
403
- $("##{record}_#{_name}").autocomplete( {
404
- source: function(request, response) {
405
- $.ajax({
406
- url: "#{ @parent.url_for( controller: 'dc_common', action: 'autocomplete' )}",
407
- type: "POST",
408
- dataType: "json",
409
- data: { input: request.term, table: "#{table}", search: "#{search}" #{(',id: "'+@yaml['id'] + '"') if @yaml['id']} },
410
- success: function(data) {
411
- response( $.map( data, function(key) {
412
- return key;
413
- }));
414
- }
415
- });
416
- },
417
- change: function (event, ui) {
418
- var div = '#{one_div}';
419
- div = div.replace(/rec_id/g, ui.item.id)
420
- div = div.replace('rec_search', ui.item.value)
421
- $("##{record}#{@yaml['name']}").append(div);
422
- $("##{record}_#{_name}").val('');
423
- },
424
- minLength: 2
425
- });
426
- });
427
- EOJS
428
-
429
- self
430
- end
431
-
432
- ###########################################################################
433
- # Class method for retrieving data from multitext_autocomplete form field.
434
- ###########################################################################
435
- def self.get_data(params, name)
436
- r = []
437
- params['record'].each do |k,v|
438
- # if it starts with - then it was removed
439
- r << BSON::ObjectId.from_string(v) if k.match("#{name}_") and v[0,1] != '-'
440
- end
441
- r.uniq!
442
- r
443
- end
444
-
445
- end
446
-
447
- ###########################################################################
448
- # Implementation of select DRG CMS form field.
449
- #
450
- # Form options:
451
- # [name] field name
452
- # [choices] Values for choices separated by comma. Values can also be specified like description:value.
453
- # In this case description will be shown to user, but value will be saved to document.
454
- # choices: 'OK:0,Ready:1,Error:2'
455
- # choices: Ruby,Pyton,PHP
456
- # [eval] Choices will be provided by evaluating expression
457
- # eval: dc_choices4('model_name','description_field_name','_id') # call dc_choices4 method
458
- # eval: DcPolicyRole.choices4_roles # call class method choices4_roles in DcPolicyRole class definition.
459
- # If choices or eval is not defined choices will be provided from translation helpers. If you have
460
- # field status on a form choices may be provided by en.helpers.model_name.choices4_status entry of
461
- # english translation. English is of course default translation. If you provide translations in
462
- # your own language then select choices will be localized.
463
- # sl.helpers.model_name.choices4_status: 'V redu:0,Pripravljen:1,Napaka:2'
464
- #
465
- # [html] html options which can be applied to select field.
466
- ###########################################################################
467
- class Select < DrgcmsField
468
-
469
- ###########################################################################
470
- # Return values, when choices options will be returned by evaluating expression
471
- ###########################################################################
472
- def do_eval(e)
473
- e.strip!
474
- method = e.split(/\ |\(/).first
475
- return eval(e) if respond_to?(method) # id method defined here
476
- return eval('@parent.'+e) if @parent.respond_to?(method) # is method defined in helpers
477
- # eval whatever it is
478
- eval e
479
- end
480
-
481
- ###########################################################################
482
- # Create choices array for select field.
483
- ###########################################################################
484
- def get_choices
485
- begin
486
- choices = case
487
- when @yaml['choices'] then @yaml['choices']
488
- when @yaml['eval'] then
489
- do_eval(@yaml['eval'])
490
- else
491
- c = t('helpers.label.' + @form['table'] + '.choices4_' + @yaml['name'] )
492
- c = 'Error' if c.match( 'translation missing' )
493
- c
494
- end
495
- # Convert string to Array
496
- choices.class == String ?
497
- choices.chomp.split(',').inject([]) {|r,v| r << (v.match(':') ? v.split(':') : v )} :
498
- choices
499
- rescue Exception => e
500
- p "Error in select eval. #{e.message}"
501
- ['error'] # return empty array when error occures
502
- end
503
- end
504
-
505
- ###########################################################################
506
- # Return value when readonly is required
507
- ###########################################################################
508
- def ro_standard
509
- value = @record.respond_to?(@yaml['name']) ? @record[@yaml['name']] : nil
510
- return self if value.nil?
511
- #
512
- get_choices.each do |choice|
513
- p choice, value
514
- if choice.class == Array
515
- return super(choice.first) if choice.last == value
516
- else
517
- return super(choice) if choice == value
518
- end
519
- end
520
- super('')
521
- end
522
-
523
- ###########################################################################
524
- # Render select field html code
525
- ###########################################################################
526
- def render
527
- return ro_standard if @readonly
528
- set_initial_value('html','selected')
529
- #
530
- @yaml['html'].symbolize_keys!
531
- record = record_text_for(@yaml['name'])
532
- @html << @parent.select(record, @yaml['name'], get_choices, @yaml['html'])
533
- self
534
- end
535
-
536
- end
537
-
538
- ###########################################################################
539
- # Implementation of check_box DRG CMS form field.
540
- ###########################################################################
541
- class CheckBox < DrgcmsField
542
-
543
- ###########################################################################
544
- # Render check_box field html code
545
- ###########################################################################
546
- def render
547
- set_initial_value('html','default')
548
- # checked flag must be set
549
- @yaml['html']['checked'] = !@parent.dc_dont?(@yaml['html']['default']) if @yaml['html']['default']
550
- # disable it if readonly
551
- @yaml['html']['disabled'] = @readonly ? true : nil
552
- # If choices are present split them to set checked and unchecked value
553
- @yaml['checked_value'], @yaml['unchecked_value'] = @yaml['choices'].split(',') if @yaml['choices']
554
- @yaml['html'].symbolize_keys!
555
- record = record_text_for(@yaml['name'])
556
- @html << if @yaml['checked_value']
557
- @parent.check_box(record, @yaml['name'], @yaml['html'], @yaml['checked_value'], @yaml['unchecked_value'] || '0')
558
- else
559
- @parent.check_box(record, @yaml['name'], @yaml['html'])
560
- end
561
- self
562
- end
563
- end
564
-
565
- ###########################################################################
566
- # Implementation of comment DRG CMS form field.
567
- ###########################################################################
568
- class Comment < DrgcmsField
569
-
570
- ###########################################################################
571
- # Render comment field html code
572
- ###########################################################################
573
- def render
574
- @html << @yaml['text']
575
- self
576
- end
577
- end
578
-
579
- ###########################################################################
580
- # Implementation of link_to DRG CMS form field. link_to form field is mostly used by polls but can
581
- # be also incorporated in the middle of form.
582
- ###########################################################################
583
- class LinkTo < DrgcmsField
584
-
585
- ###########################################################################
586
- # Render link_to field html code
587
- ###########################################################################
588
- def render
589
- @yaml['html'] ||= {}
590
- @yaml['html']['class'] ||= 'dc-link dc-animate'
591
- @yaml['html'].symbolize_keys!
592
- #
593
- url = @yaml['url'] || "#{@yaml[:controller]}/#{@yaml[:action]}/#{@yaml[:id]}"
594
- url.gsub!('//','/') # no action and id
595
- url = '/' + @yaml['url'] unless url[0,1] == '/' # no leading /
596
- url.chop if url[0,-1] == '/' # remove trailing /
597
- #
598
- caption = @yaml['caption'] || @yaml['text']
599
- @html << @parent.link_to(caption, url, @yaml['html'])
600
- self
601
- end
602
- end
603
-
604
- ###########################################################################
605
- # Create submit_tag form field. submit_tag form field is mostly used by polls but can
606
- # be also incorporated in the middle of form.
607
- ###########################################################################
608
- class SubmitTag < DrgcmsField
609
-
610
- ###########################################################################
611
- # Render submit_tag field html code
612
- ###########################################################################
613
- def render
614
- @yaml['html'] ||= {}
615
- @yaml['html']['class'] ||= 'dc-submit'
616
- @yaml['html'].symbolize_keys!
617
- text = @yaml['caption'] || @yaml['text']
618
- text = t(@yaml['text']) if text.match(/\./)
619
-
620
- @html << @parent.submit_tag(text, @yaml['html'])
621
- self
622
- end
623
- end
624
-
625
- ###########################################################################
626
- # Implementation of password DRG CMS form field.
627
- ###########################################################################
628
- class PasswordField < DrgcmsField
629
-
630
- ###########################################################################
631
- # Render password field html code
632
- ###########################################################################
633
- def render
634
- return self if @readonly
635
- @yaml['html'] ||= {}
636
- record = record_text_for(@yaml['name'])
637
- @html << @parent.password_field(record, @yaml['name'], @yaml['html'])
638
- self
639
- end
640
- end
641
-
642
- ###########################################################################
643
- # Implementation of date_select DRG CMS form field.
644
- ###########################################################################
645
- class DateSelect < DrgcmsField
646
-
647
- ###########################################################################
648
- # Render date_select field html code
649
- ###########################################################################
650
- def render
651
- # return ro_standard if @readonly
652
- return ro_standard( @parent.dc_format_value(@record[@yaml['name']])) if @readonly
653
-
654
- #
655
- @yaml['options'] ||= {}
656
- set_initial_value('options','default')
657
- @yaml['options'].symbolize_keys!
658
- @yaml['html'].symbolize_keys!
659
- record = record_text_for(@yaml['name'])
660
- @html << @parent.date_select(record, @yaml['name'], @yaml['options'], @yaml['html'])
661
- self
662
- end
663
-
664
- ####################################################################
665
- # Get data for DateSelect field
666
- # According to https://gist.github.com/315227
667
- ####################################################################
668
- def self.get_data(params, name)
669
- attrs = params['record'].collect do |key, value|
670
- if key =~ /^#{Regexp.escape(name.to_s)}\((\d+)(\w)\)$/
671
- [$1.to_i, value.send("to_#$2")]
672
- end
673
- end.compact.sort_by(&:first).map(&:last)
674
- # Return nil if error
675
- begin
676
- Time.zone.local(*attrs) #unless attrs.empty?
677
- rescue
678
- nil
679
- end
680
- end
681
-
682
- end
683
-
684
- ###########################################################################
685
- # Create datetime_select form field
686
- ###########################################################################
687
- class DatetimeSelect < DrgcmsField
688
-
689
- ###########################################################################
690
- # Render datetime_select field html code
691
- ###########################################################################
692
- def render
693
- return ro_standard( @parent.dc_format_value(@record[@yaml['name']])) if @readonly
694
- #
695
- @yaml['options'] ||= {}
696
- set_initial_value('options','default')
697
- @yaml['options'].symbolize_keys!
698
- @yaml['html'].symbolize_keys!
699
- #
700
- record = record_text_for(@yaml['name'])
701
- @html << @parent.datetime_select(record, @yaml['name'], @yaml['options'], @yaml['html'])
702
- self
703
- end
704
-
705
- ###########################################################################
706
- # DatetimeSelect get_data method.
707
- ###########################################################################
708
- def self.get_data(params, name)
709
- DateSelect.get_data(params, name)
710
- end
711
-
712
- end
713
-
714
- ###########################################################################
715
- # Implementation of date_picker DRG CMS form field.
716
- ###########################################################################
717
- class DatePicker < DrgcmsField
718
-
719
- ###########################################################################
720
- # Render date_picker field html code
721
- ###########################################################################
722
- def render
723
- # return ro_standard if @readonly
724
- return ro_standard( @parent.dc_format_value(@record[@yaml['name']])) if @readonly
725
- #
726
- @yaml['options'] ||= {}
727
- set_initial_value
728
- @yaml['html']['size'] ||= 10
729
- @yaml['html']['value'] = I18n.localize(@record[@yaml['name']].localtime.to_date) if @record[@yaml['name']]
730
- #
731
- @yaml['options']['lang'] ||= "'#{I18n.locale}'"
732
- @yaml['options']['format'] ||= "'#{t('datetimepicker.formats.date')}'"
733
- @yaml['options']['timepicker'] = false
734
- #
735
- record = record_text_for(@yaml['name'])
736
- @html << @parent.text_field(record, @yaml['name'], @yaml['html'])
737
- @js << <<EOJS
738
- $(document).ready(function() {
739
- $("##{record}_#{@yaml['name']}").datetimepicker( {
740
- #{hash_to_options(@yaml['options'])}
741
- });
742
- });
743
- EOJS
744
-
745
- self
746
- end
747
-
748
- ###########################################################################
749
- # DatePicker get_data method.
750
- ###########################################################################
751
- def self.get_data(params, name)
752
- t = params['record'][name] ? params['record'][name].to_datetime : nil
753
- t ? Time.zone.local(t.year, t.month, t.day) : nil
754
- end
755
-
756
- end
757
- ###########################################################################
758
- # Implementation of date_time_picker DRG CMS form field.
759
- ###########################################################################
760
- class DatetimePicker < DrgcmsField
761
-
762
- ###########################################################################
763
- # Render date_time_picker field html code
764
- ###########################################################################
765
- def render
766
- # return ro_standard if @readonly
767
- return ro_standard( @parent.dc_format_value(@record[@yaml['name']])) if @readonly
768
- #
769
- @yaml['options'] ||= {}
770
- set_initial_value
771
- @yaml['html']['size'] ||= 12
772
- @yaml['html']['value'] = I18n.localize(@record[@yaml['name']].localtime) if @record[@yaml['name']]
773
- #
774
- @yaml['options']['lang'] ||= "'#{I18n.locale}'"
775
- @yaml['options']['format'] ||= "'#{t('datetimepicker.formats.datetime')}'"
776
- #
777
- record = record_text_for(@yaml['name'])
778
- @html << @parent.text_field(record, @yaml['name'], @yaml['html'])
779
- @js << <<EOJS
780
- $(document).ready(function() {
781
- $("##{record}_#{@yaml['name']}").datetimepicker( {
782
- #{hash_to_options(@yaml['options'])}
783
- });
784
- });
785
- EOJS
786
-
787
- self
788
- end
789
-
790
- ###########################################################################
791
- # DateTimePicker get_data method.
792
- ###########################################################################
793
- def self.get_data(params, name)
794
- t = params['record'][name] ? params['record'][name].to_datetime : nil
795
- t ? Time.zone.local(t.year, t.month, t.day, t.hour, t.min) : nil
796
- end
797
-
798
- end
799
-
800
- ###########################################################################
801
- # Implementation of text_autocomplete DRG CMS form field.
802
- ###########################################################################
803
- class TextAutocomplete < DrgcmsField
804
-
805
- ###########################################################################
806
- # Render text_autocomplete field html code
807
- ###########################################################################
808
- def render
809
- # Return descriptive text and put it into input field
810
- # search field name
811
- if @yaml['search'].class == Hash
812
- table = @yaml['search']['table']
813
- ret_name = @yaml['search']['field']
814
- method = @yaml['search']['method']
815
- elsif @yaml['search'].match(/\./)
816
- table, ret_name, method = @yaml['search'].split('.')
817
- else
818
- ret_name = @yaml['search']
819
- end
820
- # determine table name
821
- if @yaml['table']
822
- table = if @yaml['table'].class == String
823
- @yaml['table']
824
- # eval(how_to_get_my_table_name)
825
- elsif @yaml['table']['eval']
826
- eval @yaml['table']['eval']
827
- else
828
- p "Field #{@yaml['name']}: Invalid table parameter!"
829
- nil
830
- end
831
- end
832
- return 'Table or field keyword not defined!' unless (table and ret_name)
833
- # TODO check if table exists
834
- t = table.classify.constantize
835
- # find record and return value of field
836
- value_send_as = 'p_' + @yaml['name']
837
- value = if @parent.params[value_send_as]
838
- @parent.params[value_send_as]
839
- elsif @record and @record[@yaml['name']]
840
- @record[@yaml['name']]
841
- end
842
- # Found value to be written in field
843
- if value
844
- record = t.find(value)
845
- value_displayed = record[ret_name] if record
846
- end
847
- # return if readonly
848
- return ro_standard(value_displayed) if @readonly
849
- # Add method back, so autocomplete will know that it must search for method inside class
850
- ret_name = "#{ret_name}.#{method}" if method
851
- @yaml['html'] ||= {}
852
- @yaml['html']['value'] = value_displayed
853
- #
854
- _name = '_' + @yaml['name']
855
- record = record_text_for(@yaml['name'])
856
- @html << @parent.text_field(record, _name, @yaml['html'])
857
- if @yaml['with_new']
858
- @html << @parent.image_tag('drg_cms/add.png', class: 'in-edit-add', title: t('drgcms.new'),
859
- style: "vertical-align: top;", 'data-table' => @yaml['with_new'] )
860
- end
861
- @html << @parent.hidden_field(record, @yaml['name'], value: value) # actual value will be in hidden field
862
- # JS stuff
863
- @js << <<EOJS
864
- $(document).ready(function() {
865
- $("##{record}_#{_name}").autocomplete( {
866
- source: function(request, response) {
867
- $.ajax({
868
- url: '/dc_common/autocomplete',
869
- type: "POST",
870
- dataType: "json",
871
- data: { input: request.term, table: "#{table}", search: "#{ret_name}" #{(',id: "'+@yaml['id'] + '"') if @yaml['id']} },
872
- success: function(data) {
873
- response( $.map( data, function(key) {
874
- return key;
875
- }));
876
- }
877
- });
878
- },
879
- change: function (event, ui) {
880
- $("##{record}_#{@yaml['name']}").val(ui.item.id);
881
- },
882
- minLength: 2
883
- });
884
- });
885
- EOJS
886
-
887
- self
888
- end
889
- end
890
-
891
- ###########################################################################
892
- # Implementation of text_area DRG CMS form field.
893
- ###########################################################################
894
- class TextArea < DrgcmsField
895
-
896
- ###########################################################################
897
- # Render text_area field html code
898
- ###########################################################################
899
- def render
900
- return ro_standard if @readonly
901
- #
902
- @yaml['html'] ||= {}
903
- value_send_as = 'p_' + @yaml['name']
904
- @yaml['html']['value'] = @parent.params[value_send_as] if @parent.params[value_send_as]
905
-
906
- record = record_text_for(@yaml['name'])
907
- @html << @parent.text_area(record, @yaml['name'], @yaml['html'])
908
- self
909
- end
910
- end
911
-
912
- ###########################################################################
913
- # Implementation of text_field DRG CMS form field.
914
- ###########################################################################
915
- class TextField < DrgcmsField
916
-
917
- ###########################################################################
918
- # Render text_field field html code
919
- ###########################################################################
920
- def render
921
- return ro_standard if @readonly
922
- set_initial_value
923
- #
924
- record = record_text_for(@yaml['name'])
925
- @html << @parent.text_field( record, @yaml['name'], @yaml['html'])
926
- self
927
- end
928
- end
929
-
930
- ###########################################################################
931
- # Implementation of text_with_select DRG CMS form field.
932
- #
933
- # Create text_field with select dropdown box with optional values for the field
934
- ###########################################################################
935
- class TextWithSelect < Select
936
-
937
- ###########################################################################
938
- # Render text_with_select field html code
939
- ###########################################################################
940
- def render
941
- return ro_standard if @readonly
942
- set_initial_value('html','value')
943
-
944
- record = record_text_for(@yaml['name'])
945
- @html << @parent.text_field( record, @yaml['name'], @yaml['html'])
946
- @yaml['html']['class'] = 'text-with-select'
947
- @yaml['html'].symbolize_keys!
948
- @html << @parent.select( @yaml['name'] + '_', nil, get_choices, { include_blank: true }, { class: 'text-with-select' })
949
-
950
- # javascript to update text field if new value is selected in select field
951
- @js =<<EOJS
952
- $(document).ready(function() {
953
- $('##{@yaml['name']}_').change( function() {
954
- if ($(this).val().toString().length > 0) {
955
- $('##{record}_#{@yaml['name']}').val( $(this).val() );
956
- }
957
- $('##{record}_#{@yaml['name']}').focus();
958
- });
959
- });
960
- EOJS
961
- self
962
- end
963
- end
964
-
965
- ###########################################################################
966
- # Implementation of html_field DRG CMS form field.
967
- #
968
- # HtmlField class implements redirection for calling actual html edit field code.
969
- # This can be drg_default_html_editor's ckeditor or any other code defined
970
- # by dc_site.settings html_editor setting.
971
- ###########################################################################
972
- class HtmlField < DrgcmsField
973
-
974
- ###########################################################################
975
- # Render html_field field html code
976
- ###########################################################################
977
- def render
978
- return ro_standard if @readonly
979
- # retrieve html editor from page settings
980
- editor_string = @parent.dc_get_site.params['html_editor'] if @parent.dc_get_site
981
- editor_string ||= 'ckeditor'
982
- #
983
- klas_string = editor_string.camelize
984
- if DrgcmsFormField.const_defined?(klas_string)
985
- klas = DrgcmsFormField::const_get(klas_string)
986
- o = klas.new(@parent, @record, @yaml).render
987
- @js << o.js
988
- @html << o.html
989
- else
990
- @html << "HTML editor not defined. Check site.settings or include drgcms_default_html_editor gem."
991
- end
992
- self
993
- end
994
- end
995
-
996
- ###########################################################################
997
- # Implementation of file_select DRG CMS form field.
998
- #
999
- # FileSelect like HtmlField implements redirection for calling document manager edit field code.
1000
- # This can be drg_default_html_editor's elfinder or any other code defined
1001
- # by dc_site.settings file_select setting.
1002
- ###########################################################################
1003
- class FileSelect < DrgcmsField
1004
-
1005
- ###########################################################################
1006
- # Render file_select field html code
1007
- ###########################################################################
1008
- def render
1009
- return ro_standard if @readonly
1010
- # retrieve html editor from page settings
1011
- selector_string = @parent.dc_get_site.params['file_select'] if @parent.dc_get_site
1012
- selector_string ||= 'elfinder'
1013
- #
1014
- klas_string = selector_string.camelize
1015
- if DrgcmsFormField.const_defined?(klas_string)
1016
- klas = DrgcmsFormField::const_get(klas_string)
1017
- o = klas.new(@parent, @record, @yaml).render
1018
- @js << o.js
1019
- @html << o.html
1020
- else
1021
- @html << "File select component not defined. Check site.settings or include drgcms_default_html_editor gem."
1022
- end
1023
- self
1024
- end
1025
- end
1026
-
1027
- end