drg_cms 0.6.1.9 → 0.6.1.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/drg_cms/drg_cms.js +35 -14
  3. data/app/assets/stylesheets/drg_cms/drg_cms.css +89 -26
  4. data/app/controllers/cmsedit_controller.rb +9 -111
  5. data/app/controllers/dc_application_controller.rb +97 -21
  6. data/app/controllers/dc_common_controller.rb +3 -17
  7. data/app/controls/browse_models_control.rb +3 -1
  8. data/app/controls/cmsedit_control.rb +5 -1
  9. data/app/controls/dc_report.rb +1 -1
  10. data/app/forms/all_options.yml +2 -0
  11. data/app/forms/dc_browse_models.yml +24 -2
  12. data/app/forms/dc_steps_template.yml +51 -0
  13. data/app/helpers/cms_common_helper.rb +66 -1
  14. data/app/helpers/cms_edit_helper.rb +228 -119
  15. data/app/helpers/cms_helper.rb +74 -17
  16. data/app/helpers/cms_index_helper.rb +40 -37
  17. data/app/helpers/dc_application_helper.rb +6 -27
  18. data/app/models/dc_journal.rb +2 -2
  19. data/app/models/dc_json_ld.rb +18 -41
  20. data/app/models/drgcms_form_fields/readonly.rb +1 -1
  21. data/app/models/drgcms_form_fields/select.rb +2 -2
  22. data/app/models/drgcms_form_fields/text_autocomplete.rb +2 -2
  23. data/app/models/drgcms_form_fields/text_with_select.rb +1 -0
  24. data/app/renderers/dc_common_renderer.rb +20 -3
  25. data/app/views/cmsedit/_form.html.erb +19 -12
  26. data/app/views/cmsedit/edit.html.erb +10 -6
  27. data/app/views/cmsedit/index.html.erb +5 -3
  28. data/app/views/cmsedit/new.html.erb +9 -5
  29. data/app/views/dc_common/_help.html.erb +1 -0
  30. data/config/locales/drgcms_en.yml +5 -0
  31. data/config/locales/drgcms_sl.yml +5 -0
  32. data/drg_cms.gemspec +1 -1
  33. data/lib/drg_cms/version.rb +1 -1
  34. metadata +8 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 83e7b1464f53b988b2bbfb9b9b4069bea725c33bcbe5d8a107293696059742f8
4
- data.tar.gz: e969b7a61d4b837fecc35f476d72c1f421a54dd86cee95e646a299c320f9298e
3
+ metadata.gz: 8dc5db773399698216bce4e41936d84f3e4780c1ac1a23497b755d9ddfce1102
4
+ data.tar.gz: aba467dab232ba47b20b1e00dcdc746aa9568521b8d756137c4dab40b255f795
5
5
  SHA512:
6
- metadata.gz: c2d0ecc9d8ec2a18a03f14dee87e62f4b51d12a653de943c67a3ddfa6ad578679e3511b3f89b86a9c2c75509e59f230dde4e0946049c3567e087a193d59e02c3
7
- data.tar.gz: 444d5c7f43362cf4466979d47ce3bbb9cd2afa74702a94d10d08947b34d8cf6a533e0f555cc3d734f38a7060b544cd899ad4cffce235957623e2bcc680e07b65
6
+ metadata.gz: 00c2289971583654147c8d7df3e2c1fcac20845f40381a631f290c888867db86b160910bb7643c5c54c749c671b7751de010cf53c16154a40d9be32c549eb761
7
+ data.tar.gz: c79254feaa595bb5fad752aaf943d327fa475d64b9e832bc5555d76388b4c25a286ac6f4ef1fa3acc65e122fc532ed09291a15e6623d96c80420282fca5480b5
@@ -67,7 +67,7 @@ update_embedded_on_tab_select = function(div_name) {
67
67
  * Return false when confirmation is not required
68
68
  *******************************************************************/
69
69
  confirmation_is_cancled = function(object) {
70
- var confirmation = object.getAttribute("data-confirm");
70
+ let confirmation = object.getAttribute("data-confirm");
71
71
  // if confirmation required
72
72
  if (confirmation !== null) {
73
73
  if (!confirm(confirmation)) {return true;}
@@ -81,8 +81,8 @@ confirmation_is_cancled = function(object) {
81
81
  * methodname and depend field value to obtain new values for select field.
82
82
  *******************************************************************/
83
83
  update_select_depend = function(select_name, depend_name, method) {
84
- var select_field = $('#'+select_name);
85
- var depend_field = $('#'+depend_name);
84
+ let select_field = $('#' + select_name);
85
+ let depend_field = $('#' + depend_name);
86
86
 
87
87
  $.ajax({
88
88
  url: "/dc_common/autocomplete",
@@ -199,8 +199,10 @@ process_json_result = function(json) {
199
199
 
200
200
  /**** update fields on form ****/
201
201
  case 'record':
202
- let name = key.replace('record_','record[') + ']';
203
- field = $('[name="' + name + '"]');
202
+ //let name = key.replace('record_','record[') + ']';
203
+ //field = $('[name="' + name + '"]');
204
+ field = $('#' + key);
205
+ // console.log(field);
204
206
  // checkbox field
205
207
  if (field.is(':checkbox')) {
206
208
  field.prop('checked', value);
@@ -258,6 +260,13 @@ process_json_result = function(json) {
258
260
  opacity: 0, position: ['auto', 20],
259
261
  closeClass: 'dc-link' });
260
262
  }
263
+ // resize parent iframe if smaller then 500px to ensure popup some space
264
+ let document_height = document.body.scrollHeight;
265
+ if (document_height < 500) {
266
+ let frame = window.frameElement
267
+ if (frame === null) frame = document.body;
268
+ frame.style.height = '500px';
269
+ }
261
270
  break;
262
271
 
263
272
  /**** update div ****/
@@ -554,20 +563,20 @@ $(document).ready( function() {
554
563
  *******************************************************************/
555
564
  $('.dc-check-all').on('click',function(e) {
556
565
  let checkboxes = $('.dc-check');
557
- if ($(this).hasClass('fa-check-square-o')) {
566
+ if ($(this).hasClass('mi-check_box')) {
558
567
  // check all checkboxes
559
568
  checkboxes.each( function() {
560
569
  $(this).prop('checked', true);
561
570
  $(this).parent().closest('div').addClass('dc-checked');
562
571
  });
563
- $(this).removeClass('fa-check-square-o').addClass('fa-square-o');
572
+ $(this).removeClass('mi-check_box').addClass('mi-check_square');
564
573
  } else {
565
574
  // uncheck all checkboxes
566
575
  checkboxes.each( function() {
567
576
  $(this).prop('checked', false);
568
577
  $(this).parent().closest('div').removeClass('dc-checked');
569
578
  });
570
- $(this).removeClass('fa-square-o').addClass('fa-check-square-o');
579
+ $(this).removeClass('mi-check_square').addClass('mi-check_box');
571
580
  }
572
581
  });
573
582
 
@@ -667,11 +676,22 @@ $(document).ready( function() {
667
676
  if (url.length < 5) return false;
668
677
 
669
678
  // check HTML5 validations
670
- if ($("form")[0] && !$("form")[0].checkValidity() ) {
671
- $("form")[0].reportValidity();
672
- return false;
679
+ let validate = this.getAttribute("data-validate");
680
+ if (validate == null || validate == true) {
681
+ if ($("form")[0] && !$("form")[0].checkValidity()) {
682
+ $("form")[0].reportValidity();
683
+ return false;
684
+ }
673
685
  }
674
686
 
687
+ // update html editor fields before data serialization
688
+ let cke_elements = document.querySelectorAll(`div[id^="cke_record"]`);
689
+ cke_elements.forEach(e => {
690
+ let field_id = e.id.replace('cke_', '');
691
+ let text = CKEDITOR.instances[field_id].getData();
692
+ $('#' + field_id).val(text);
693
+ });
694
+
675
695
  let data = {};
676
696
  let request = this.getAttribute("data-request");
677
697
  switch (request) {
@@ -692,7 +712,7 @@ $(document).ready( function() {
692
712
  if (checkboxes.length > 0) {
693
713
  let checked = [];
694
714
  checkboxes.each( function() {
695
- if ($(this).prop('checked')) checked.push($(this).attr("id"));
715
+ if ($(this).prop('checked')) checked.push($(this).attr("id").replace('check-', ''));
696
716
  })
697
717
  data['checked'] = checked;
698
718
  }
@@ -717,7 +737,7 @@ $(document).ready( function() {
717
737
  /*******************************************************************
718
738
  * Click on filter off
719
739
  *******************************************************************/
720
- $('.mi-search_off').on('click', function(e) {
740
+ $('.mi-filter_alt_off').on('click', function(e) {
721
741
  let url = $(this).parents('.dc-filter').attr("data-url");
722
742
  if (url.length > 5) simple_ajax_call(url);
723
743
  });
@@ -1133,9 +1153,10 @@ $(document).ready( function() {
1133
1153
  } else {
1134
1154
  sign = '';
1135
1155
  }
1136
- // save value to hidden field which holds return value
1156
+ // save value to field holding return value and trigger change event
1137
1157
  var field = '#' + $(this).attr("id").slice(0,-1);
1138
1158
  $(field).val(val);
1159
+ $(field).trigger("change")
1139
1160
 
1140
1161
  // decimal part
1141
1162
  if (decimals == 0) separator = '';
@@ -321,8 +321,9 @@ border-radius: 1px;
321
321
  margin: -6px 0 0 16px;
322
322
  }
323
323
 
324
- .dc-result-submenu ul .dc-link-ajax {
324
+ .dc-result-submenu ul li {
325
325
  text-align: left;
326
+ padding: 5px;
326
327
  }
327
328
 
328
329
  .dc-result-submenu ul li a:link, .dc-result-submenu .dc-link a:link,
@@ -330,7 +331,6 @@ border-radius: 1px;
330
331
  font-size: 15px;
331
332
  line-height: 18px;
332
333
  font-weight: 500;
333
- padding: 5px 10px;
334
334
  color: #666;
335
335
  display: inline-block;
336
336
  width: 100%;
@@ -359,9 +359,9 @@ border-radius: 1px;
359
359
 
360
360
  .dc-link-no i {
361
361
  color: #bbb;
362
+ vertical-align: top;
362
363
  }
363
364
 
364
-
365
365
  .dc-result-header .dc-check-all {
366
366
  font-size: 18px;
367
367
  padding: 6px 0;
@@ -374,6 +374,7 @@ border-radius: 1px;
374
374
  .dc-result-data .dc-link, .dc-result-data .dc-link-ajax {
375
375
  background-color: transparent;
376
376
  border: 0;
377
+ text-align: left;
377
378
  }
378
379
 
379
380
  .dc-result-data .dc-link, .dc-result-data .dc-link a, .dc-result-data .dc-link-ajax {
@@ -445,6 +446,12 @@ display: inline-table;
445
446
  cursor: pointer;
446
447
  filter: none;
447
448
  }
449
+ .dc-window-open:hover {
450
+ transition: 0.3s;
451
+ color: #fff;
452
+ background: rgba(44, 142, 255, 1);
453
+ cursor: pointer;
454
+ }
448
455
 
449
456
  .dc-link:hover > i, .dc-link-ajax:hover > i, .dc-submit:hover > i {
450
457
  color: #fff;
@@ -622,10 +629,25 @@ display: inline-table;
622
629
 
623
630
  /***** FORM *****/
624
631
 
632
+ #dc-form-container {
633
+ display: flex;
634
+ padding-left: 4px;
635
+ }
636
+
637
+ #dc-form-left {
638
+ padding: 8px;
639
+ background-color: rgba(44, 142, 255, 0.15);;
640
+ display: none;
641
+ margin-top: 12px;
642
+ }
643
+
644
+ #dc-form-right {
645
+ flex: 1;
646
+ }
647
+
625
648
  .dc-form-frame {
626
649
  margin: 0px;
627
650
  padding: 4px;
628
- /*background-color: #f7f7f7;*/
629
651
  }
630
652
 
631
653
  .dc-form {
@@ -690,11 +712,12 @@ display: inline-table;
690
712
  }
691
713
 
692
714
  .dc-form-label-top {
693
- color: #555;
694
715
  text-align: right;
695
716
  vertical-align: middle;
696
- font-weight: bold;
697
- padding: 3px 5px;
717
+ color: #555;
718
+ font-weight: 500;
719
+ line-height: 1.8em;
720
+ margin-top: 8px;
698
721
  }
699
722
 
700
723
  .dc-form-label.dc-color-odd, .dc-form-label.dc-color-even {background-color: transparent;}
@@ -816,6 +839,45 @@ display: flex;
816
839
  font-weight: normal;
817
840
  }
818
841
 
842
+ #dc-form-left #dc-steps-menu {
843
+ color: #222;
844
+ }
845
+ #dc-form-left #dc-steps-menu h2 {
846
+ font-size: 1.6em;
847
+ font-weight: 600;
848
+ border-bottom: 2px solid #444;
849
+ margin-bottom: 8px;
850
+ }
851
+
852
+ #dc-form-left #dc-steps-menu li {
853
+ filter: none;
854
+ border: none;
855
+ text-align: left;
856
+ background-color: transparent;
857
+ padding: 8px 0;
858
+ font-size: 1.1em;
859
+ }
860
+
861
+ #dc-form-left #dc-steps-menu li {
862
+ color: #222;
863
+ }
864
+
865
+ #dc-form-left #dc-steps-menu li.active {
866
+ color: #000;
867
+ font-weight: 600;
868
+ }
869
+
870
+ #dc-form-left #dc-steps-menu li.active:before {
871
+ font-family: MI;
872
+ content: '\e409';
873
+ vertical-align: middle;
874
+ margin-left: -4px;
875
+ }
876
+
877
+ #dc-form-left #dc-steps-menu .dc-link-ajax:hover {
878
+ color: rgba(44, 142, 255, 1);
879
+ }
880
+
819
881
  /*** CMS toggle button */
820
882
  .cms-toggle {
821
883
  z-index: 1000000;
@@ -1125,7 +1187,7 @@ color: #000;
1125
1187
  }
1126
1188
  .iframe_embedded {
1127
1189
  padding: 4px;
1128
- /*background-color: #f7f7f7;*/
1190
+ background-color: #fff;
1129
1191
  border-radius: 2px;
1130
1192
  border: 2px solid #666;
1131
1193
  }
@@ -1255,8 +1317,9 @@ color: #000;
1255
1317
  margin-right: 5px;
1256
1318
  }
1257
1319
 
1258
- .dc-filter .mi-search_off {
1320
+ .dc-filter .mi-filter_alt_off {
1259
1321
  color: #c43;
1322
+ font-size: 20px;
1260
1323
  }
1261
1324
  .dc-filter i:hover {
1262
1325
  color: rgba(44, 142, 255, 1);
@@ -1266,10 +1329,6 @@ color: #000;
1266
1329
  padding-top: 2px;
1267
1330
  }
1268
1331
 
1269
- .dc-sort:hover > select {
1270
- color: rgba(44, 142, 255, 1);
1271
- }
1272
-
1273
1332
  .dc-sort-select {
1274
1333
  width: 18px;
1275
1334
  background: none;
@@ -1403,22 +1462,24 @@ color: #000;
1403
1462
 
1404
1463
  .filter-popup {
1405
1464
  background-color: #fff;
1406
- box-shadow: 2px 2px 5px #666;
1465
+ filter: drop-shadow(2px 2px 8px #888);
1466
+ border-radius: 2px;
1407
1467
  }
1408
1468
 
1409
1469
  .filter-popup div {
1470
+ font-weight: 500;
1410
1471
  padding: 5px 10px;
1411
1472
  text-align: center;
1412
- background-color: #222;
1413
- color: #fff;
1473
+ color: rgba(44, 142, 255, 1);
1474
+ border-bottom: 2px solid rgba(44, 142, 255, 1);
1414
1475
  }
1415
1476
 
1416
1477
  .filter-popup li {
1417
- padding: 4px 8px;
1478
+ padding: 5px 10px;
1418
1479
  }
1419
1480
 
1420
1481
  .filter-popup li:hover {
1421
- background-color: #aaa;
1482
+ background-color: rgba(44, 142, 255, 1);
1422
1483
  color: #fff;
1423
1484
  cursor: pointer;
1424
1485
  }
@@ -1436,14 +1497,15 @@ cursor: pointer;
1436
1497
  }
1437
1498
 
1438
1499
  #dc-document-info-popup {
1439
- text-align: left;
1440
- padding: 6px;
1441
- font-size: 0.9em;
1442
- position:absolute;
1443
- background-color: #fff;
1444
- border: solid 1px #ccc;
1445
- border-radius: 4px;
1446
- z-index: 100;
1500
+ text-align: left;
1501
+ padding: 6px;
1502
+ font-size: 0.9em;
1503
+ position:absolute;
1504
+ background-color: #fff;
1505
+ border: solid 1px #eee;
1506
+ border-radius: 2px;
1507
+ z-index: 100;
1508
+ filter: drop-shadow(0 8px 8px #ccc);
1447
1509
  }
1448
1510
 
1449
1511
  #dc-document-info-popup div span:first-child {
@@ -1454,6 +1516,7 @@ z-index: 100;
1454
1516
  }
1455
1517
  #dc-document-info-popup div span:last-child {font-weight: 600;}
1456
1518
 
1519
+ #dc-document-info-popup i {height: initial;}
1457
1520
 
1458
1521
  /************************** filter popup *************************/
1459
1522
  #drgcms_filter {
@@ -196,7 +196,7 @@ def new
196
196
  end
197
197
  # new_record callback. Set default values for new record
198
198
  if (m = callback_method('new_record') ) then call_callback_method(m) end
199
- @parms['action'] = 'create'
199
+ @form_params['action'] = 'create'
200
200
  end
201
201
 
202
202
  ########################################################################
@@ -279,8 +279,8 @@ def create
279
279
  flash[:info] = t('drgcms.doc_saved')
280
280
  params[:return_to] = 'index' if params[:commit] == t('drgcms.save&back') # save & back
281
281
  return process_return_to(params[:return_to]) if params[:return_to]
282
-
283
- @parms['id'] = @record.id # must be set, for proper update link
282
+
283
+ @form_params['id'] = @record.id # must be set, for proper update link
284
284
  params[:id] = @record.id # must be set, for find_record
285
285
  edit
286
286
  else # error
@@ -309,7 +309,7 @@ def edit
309
309
  # don't do anything if return is false
310
310
  return index if ret.class == FalseClass
311
311
  end
312
- @parms['action'] = 'update'
312
+ @form_params['action'] = 'update'
313
313
  render action: :edit
314
314
  end
315
315
 
@@ -331,7 +331,7 @@ def update
331
331
 
332
332
  if save_data
333
333
  params[:return_to] = 'index' if params[:commit] == t('drgcms.save&back') # save & back
334
- @parms['action'] = 'update'
334
+ @form_params['action'] = 'update'
335
335
  # Process return_to
336
336
  return process_return_to(params[:return_to]) if params[:return_to]
337
337
  else
@@ -422,7 +422,7 @@ def destroy
422
422
 
423
423
  end
424
424
 
425
- @parms['action'] = 'update'
425
+ @form_params['action'] = 'update'
426
426
  render action: :edit
427
427
  end
428
428
 
@@ -496,108 +496,6 @@ def user_has_permission?(permission, collection_name)
496
496
  true
497
497
  end
498
498
 
499
- ########################################################################
500
- # Merges two forms when current form extends other form. Subroutine of read_drg_form.
501
- # With a little help of https://www.ruby-forum.com/topic/142809
502
- ########################################################################
503
- def forms_merge(hash1, hash2)
504
- target = hash1.dup
505
- hash2.keys.each do |key|
506
- if hash2[key].is_a? Hash and hash1[key].is_a? Hash
507
- target[key] = forms_merge(hash1[key], hash2[key])
508
- next
509
- end
510
- target[key] = hash2[key] == '/' ? nil : hash2[key]
511
- end
512
- # delete keys with nil value
513
- target.delete_if { |k, v| v.nil? }
514
- end
515
-
516
- ########################################################################
517
- # Extends DRGCMS form file. Extended file is processed first and then merged
518
- # with code in this form file. Form can extend only single form file.
519
- #
520
- # [Parameters:]
521
- # [extend_option] : Value of @form['extend'] option
522
- ########################################################################
523
- def extend_drg_form(extend_option)
524
- form_file_name = dc_find_form_file(extend_option)
525
- @form_js << read_js_drg_form(form_file_name)
526
- form = YAML.load_file( form_file_name )
527
- @form = forms_merge(form, @form)
528
- # If combined form contains tabs and fields options, merge fields into tabs
529
- if @form['form']['tabs'] && @form['form']['fields']
530
- @form['form']['tabs']['fields'] = @form['form']['fields']
531
- @form['form']['fields'] = nil
532
- end
533
- end
534
-
535
- ########################################################################
536
- # Include code from another DRGCMS form file. Included code is merged
537
- # with current form file code. Form can include more than one other DRGCMS forms.
538
- #
539
- # [Parameters:]
540
- # [include_option] : Value of @form['include'] option
541
- ########################################################################
542
- def include_drg_form(include_option)
543
- includes = include_option.class == Array ? include_option : include_option.split(/\,|\;/)
544
- includes.each do |include_file|
545
- form_file_name = dc_find_form_file(include_file)
546
- @form_js << read_js_drg_form(form_file_name)
547
- form = YAML.load_file(form_file_name)
548
- @form = forms_merge(@form, form)
549
- end
550
- end
551
-
552
- ########################################################################
553
- # Will read data from form_file_name.js if exists.
554
- #
555
- # [Parameters:]
556
- # [form_file_name] : Physical form filename
557
- ########################################################################
558
- def read_js_drg_form(form_file_name)
559
- js_form_file_name = form_file_name.sub('.yml','.js')
560
- File.read(js_form_file_name) rescue ''
561
- end
562
-
563
- ########################################################################
564
- # Read DRG form into @form object. Subroutine of check_authorization.
565
- ########################################################################
566
- def read_drg_form
567
- table_name = decamelize_type(CmsHelper.table_param(params).strip)
568
- @tables = table_name.split(';').inject([]) { |r, v| r << [(v.classify.constantize rescue nil), v] }
569
-
570
- # split ids passed when embedded document
571
- ids = params[:ids].to_s.strip.downcase
572
- @ids = ids.split(';').inject([]) { |r,v| r << v }
573
-
574
- # form_name defaults to last table specified
575
- form_name = CmsHelper.form_param(params) || @tables.last[1]
576
- @form_js = ''
577
-
578
- # dynamically generated form
579
- @form = if CmsHelper.form_param(params) == 'method'
580
- dc_eval_class_method(params[:form_method], params)
581
- else
582
- form_file_name = dc_find_form_file(form_name)
583
- @form_js = read_js_drg_form(form_file_name)
584
- YAML.load_file(form_file_name)
585
- end
586
-
587
- # form includes or extends another form file
588
- include_drg_form(@form['include']) if @form['include']
589
- extend_drg_form(@form['extend']) if @form['extend']
590
- @form['script'] = (@form['script'].blank? ? @form_js : @form['script'] + @form_js)
591
- # add readonly key to form if readonly parameter is passed in url
592
- @form['readonly'] = 1 if params['readonly'] #and %w(1 yes true).include?(params['readonly'].to_s.downcase.strip)
593
-
594
- # !!!!!! Always use strings for key names since @parms['table'] != @parms[:table]
595
- @parms = { 'table' => table_name, 'ids' => params[:ids], 'form_name' => form_name,
596
- 'return_to' => params['return_to'], 'edit_only' => params['edit_only'],
597
- 'readonly' => params['readonly']
598
- }
599
- end
600
-
601
499
  ############################################################################
602
500
  # Load module if available. Try not to mask errors in control module
603
501
  ############################################################################
@@ -648,8 +546,7 @@ def check_authorization
648
546
  (table.size < 3 or !dc_user_can(DcPermission::CAN_VIEW))
649
547
  return render(action: 'error', locals: { error: t('drgcms.not_authorized')} )
650
548
  end
651
- read_drg_form
652
- return render( plain: t('drgcms.form_error') ) if @form.nil?
549
+ dc_form_read
653
550
 
654
551
  # Permissions can be also defined on form
655
552
  #TODO So far only can_view is used. Think about if using other permissions has sense
@@ -698,6 +595,7 @@ def update_standards(record = @record)
698
595
  # and will be directly visible only to admins
699
596
  record.dc_site_id = dc_get_site.id if record.respond_to?('dc_site_id') && record.dc_site_id.nil?
700
597
  end
598
+ record.send(:set_history, self) if record.respond_to?(:set_history)
701
599
  end
702
600
 
703
601
  ########################################################################
@@ -739,7 +637,7 @@ def callback_method(key) #:nodoc:
739
637
  callback = case
740
638
  when params['data'] && params['data'][data_key] then params['data'][data_key]
741
639
  # dc_ + key method is present then call it automatically
742
- when @form['form'][key] then @form['form'][key]
640
+ when @form.dig('form', key) then @form['form'][key]
743
641
  when respond_to?('dc_' + key) then 'dc_' + key
744
642
  when params[data_key] then params[data_key]
745
643
  else nil
@@ -114,27 +114,6 @@ def set_page_title
114
114
  dc_add_meta_tag(:name, 'description', @page.meta_description)
115
115
  end
116
116
 
117
- ########################################################################
118
- # Searches forms path for file_name and returns full file name or nil if not found.
119
- #
120
- # @param [String] Form file name. File name can be passed as gem_name.filename. This can
121
- # be useful when you are extending form but want to retain same name as original form
122
- # For example. You are extending dc_user form from drg_cms gem and want to
123
- # retain same dc_user name. This can be done by setting drg_cms.dc_user as extend option.
124
- #
125
- # @return [String] Form file name including path or nil if not found.
126
- ########################################################################
127
- def dc_find_form_file(form_file)
128
- form_path = nil
129
- form_path, form_file = form_file.split(/\.|\//) if form_file.match(/\.|\//)
130
-
131
- DrgCms.paths(:forms).reverse.each do |path|
132
- f = "#{path}/#{form_file}.yml"
133
- return f if File.exist?(f) && (form_path.nil? || path.to_s.match(/\/#{form_path}(-|\/)/i))
134
- end
135
- raise "Exception: Form file '#{form_file}' not found!"
136
- end
137
-
138
117
  #######################################################################
139
118
  # Will render public/404.html file with some debug code includded.
140
119
  #
@@ -833,4 +812,101 @@ def redis
833
812
  Rails.cache.redis
834
813
  end
835
814
 
815
+ ########################################################################
816
+ # Extends DRGCMS form file. Extended file is processed first and then merged
817
+ # with code in this form file. Form can extend only single form file.
818
+ #
819
+ # [Parameters:]
820
+ # [extend_option] : Value of @form['extend'] option
821
+ ########################################################################
822
+ def dc_form_extend(extend_option)
823
+ form_file_name = CmsHelper.form_file_find(extend_option)
824
+ @form_js << read_js_drg_form(form_file_name)
825
+ form = YAML.load_file( form_file_name )
826
+ @form = CmsHelper.forms_merge(form, @form)
827
+ # If combined form contains tabs and fields options, merge fields into tabs
828
+ if @form['form']['tabs'] && @form['form']['fields']
829
+ @form['form']['tabs']['fields'] = @form['form']['fields']
830
+ @form['form']['fields'] = nil
831
+ end
832
+ end
833
+
834
+ ########################################################################
835
+ # Include code from another DRGCMS form file. Included code is merged
836
+ # with current form file code. Form can include more than one other DRGCMS forms.
837
+ #
838
+ # [Parameters:]
839
+ # [include_option] : Value of @form['include'] option
840
+ ########################################################################
841
+ def dc_form_include(include_option)
842
+ includes = include_option.class == Array ? include_option : include_option.split(/\,|\;/)
843
+ includes.each do |include_file|
844
+ form_file_name = CmsHelper.form_file_find(include_file)
845
+ @form_js << read_js_drg_form(form_file_name)
846
+ form = YAML.load_file(form_file_name)
847
+ @form = CmsHelper.forms_merge(@form, form)
848
+ end
849
+ end
850
+
851
+ ########################################################################
852
+ # Will read data from form_file_name.js if exists.
853
+ #
854
+ # [Parameters:]
855
+ # [form_file_name] : Physical form filename
856
+ ########################################################################
857
+ def read_js_drg_form(form_file_name)
858
+ js_form_file_name = form_file_name.sub('.yml','.js')
859
+ File.read(js_form_file_name) rescue ''
860
+ end
861
+
862
+ ########################################################################
863
+ # Read DRG form into @form object. Subroutine of check_authorization.
864
+ ########################################################################
865
+ def dc_form_read
866
+ params[:table] ||= params[:t] || CmsHelper.form_param(params)
867
+ table_name = decamelize_type(CmsHelper.table_param(params).strip)
868
+ @tables = table_name.split(';').inject([]) { |r, v| r << [(v.classify.constantize rescue nil), v] }
869
+
870
+ # split ids passed when embedded document
871
+ ids = params[:ids].to_s.strip.downcase
872
+ @ids = ids.split(';').inject([]) { |r,v| r << v }
873
+
874
+ # form_name defaults to last table specified
875
+ form_name = CmsHelper.form_param(params) || @tables.last[1]
876
+ @form_js = ''
877
+
878
+ # dynamically generated form
879
+ @form = if CmsHelper.form_param(params) == 'method'
880
+ dc_eval_class_method(params[:form_method], params)
881
+ else
882
+ form_file_name = CmsHelper.form_file_find(form_name)
883
+ @form_js = read_js_drg_form(form_file_name)
884
+ YAML.load_file(form_file_name)
885
+ end
886
+
887
+ # form includes or extends another form file
888
+ dc_form_include(@form['include']) if @form['include']
889
+ dc_form_extend(@form['extend']) if @form['extend']
890
+ @form['script'] = (@form['script'].blank? ? @form_js : @form['script'] + @form_js)
891
+ # add readonly key to form if readonly parameter is passed in url
892
+ @form['readonly'] = 1 if params['readonly'] #and %w(1 yes true).include?(params['readonly'].to_s.downcase.strip)
893
+
894
+ # !!!!!! Always use strings for key names since @form_params['table'] != @form_params[:table]
895
+ @form_params = { 'table' => table_name, 'ids' => params[:ids], 'form_name' => form_name,
896
+ 'return_to' => params['return_to'], 'edit_only' => params['edit_only'],
897
+ 'readonly' => params['readonly'], 'window_close' => params['window_close']}
898
+ end
899
+
900
+ ########################################################################
901
+ # Will search for help file and return it's full path name if found.
902
+ ########################################################################
903
+ def self.find_help_file(help_file_name)
904
+ file_name = nil
905
+ DrgCms.paths(:forms).reverse.each do |path|
906
+ f = "#{path}/help/#{help_file_name}.#{I18n.locale}"
907
+ file_name = f and break if File.exist?(f)
908
+ end
909
+ file_name
910
+ end
911
+
836
912
  end