drg_cms 0.6.1.9 → 0.7.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +260 -0
  3. data/MIT-LICENSE +1 -1
  4. data/README.md +9 -5
  5. data/app/assets/javascripts/drg_cms/drg_cms.js +69 -32
  6. data/app/assets/javascripts/drg_cms_application.js +0 -2
  7. data/app/assets/javascripts/drg_cms_cms.js +2 -3
  8. data/app/assets/stylesheets/drg_cms/drg_cms.css +89 -26
  9. data/app/assets/stylesheets/drg_cms/jstree.css +32 -27
  10. data/app/assets/stylesheets/drg_cms/select-multiple.css +4 -2
  11. data/app/controllers/cmsedit_controller.rb +9 -111
  12. data/app/controllers/dc_application_controller.rb +100 -23
  13. data/app/controllers/dc_common_controller.rb +10 -24
  14. data/app/controls/browse_models_control.rb +3 -1
  15. data/app/controls/cmsedit_control.rb +5 -1
  16. data/app/controls/dc_category_control.rb +61 -0
  17. data/app/controls/dc_report.rb +1 -1
  18. data/app/forms/all_options.yml +2 -0
  19. data/app/forms/cms_menu.yml +3 -2
  20. data/app/forms/dc_browse_models.yml +24 -2
  21. data/app/forms/dc_category.yml +17 -8
  22. data/app/forms/dc_category_as_tree.yml +31 -0
  23. data/app/forms/dc_steps_template.yml +51 -0
  24. data/app/forms/help/dc_category_as_tree.en +4 -0
  25. data/app/forms/help/dc_category_as_tree.sl +5 -0
  26. data/app/helpers/cms_common_helper.rb +66 -1
  27. data/app/helpers/cms_edit_helper.rb +230 -121
  28. data/app/helpers/cms_helper.rb +74 -17
  29. data/app/helpers/cms_index_helper.rb +40 -37
  30. data/app/helpers/dc_application_helper.rb +37 -76
  31. data/app/helpers/dc_category_helper.rb +129 -0
  32. data/app/models/dc_category.rb +50 -24
  33. data/app/models/dc_journal.rb +2 -2
  34. data/app/models/dc_json_ld.rb +18 -41
  35. data/app/models/drgcms_form_fields/date_picker.rb +10 -12
  36. data/app/models/drgcms_form_fields/datetime_picker.rb +10 -11
  37. data/app/models/drgcms_form_fields/drgcms_field.rb +46 -4
  38. data/app/models/drgcms_form_fields/readonly.rb +1 -1
  39. data/app/models/drgcms_form_fields/select.rb +2 -2
  40. data/app/models/drgcms_form_fields/text_autocomplete.rb +2 -2
  41. data/app/models/drgcms_form_fields/text_with_select.rb +1 -0
  42. data/app/models/drgcms_form_fields/tree_select.rb +20 -19
  43. data/app/renderers/dc_common_renderer.rb +20 -3
  44. data/app/views/cmsedit/_form.html.erb +19 -12
  45. data/app/views/cmsedit/edit.html.erb +10 -6
  46. data/app/views/cmsedit/index.html.erb +5 -3
  47. data/app/views/cmsedit/new.html.erb +9 -5
  48. data/app/views/dc_common/_help.html.erb +1 -0
  49. data/app/views/layouts/content.html.erb +1 -1
  50. data/config/locales/drgcms_en.yml +7 -0
  51. data/config/locales/drgcms_sl.yml +7 -0
  52. data/drg_cms.gemspec +3 -3
  53. data/lib/drg_cms/version.rb +1 -1
  54. data/lib/tasks/dc_cleanup.rake +20 -42
  55. metadata +18 -12
  56. data/History.log +0 -109
@@ -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 {
@@ -117,11 +117,9 @@
117
117
  .vakata-context,
118
118
  .vakata-context ul {
119
119
  margin: 0;
120
- padding: 2px;
121
120
  position: absolute;
122
- background: #f5f5f5;
123
- border: 1px solid #979797;
124
- box-shadow: 2px 2px 2px #999999;
121
+ background: #fff;
122
+ filter: drop-shadow(1px 1px 6px #ddd);
125
123
  }
126
124
  .vakata-context ul {
127
125
  list-style: none;
@@ -140,19 +138,20 @@
140
138
  }
141
139
  .vakata-context li > a {
142
140
  display: block;
143
- padding: 0 2em 0 2em;
141
+ padding: 4px;
144
142
  text-decoration: none;
145
143
  width: auto;
146
144
  color: black;
147
145
  white-space: nowrap;
148
- line-height: 2.4em;
149
- text-shadow: 1px 1px 0 white;
150
146
  border-radius: 1px;
151
147
  }
152
148
  .vakata-context li > a:hover {
153
149
  position: relative;
154
- background-color: #e8eff7;
155
- box-shadow: 0 0 2px #0a6aa1;
150
+ background-color: rgba(44, 142, 255, 1);
151
+ color: #fff;
152
+ }
153
+ .vakata-context li > a:hover > i {
154
+ color: #fff;
156
155
  }
157
156
  .vakata-context li > a.vakata-context-parent {
158
157
  background-image: url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAIORI4JlrqN1oMSnmmZDQUAOw==");
@@ -164,8 +163,6 @@
164
163
  }
165
164
  .vakata-context .vakata-context-hover > a {
166
165
  position: relative;
167
- background-color: #e8eff7;
168
- box-shadow: 0 0 2px #0a6aa1;
169
166
  }
170
167
  .vakata-context .vakata-context-separator > a,
171
168
  .vakata-context .vakata-context-separator > a:hover {
@@ -177,7 +174,6 @@
177
174
  max-height: 1px;
178
175
  padding: 0;
179
176
  margin: 0 0 0 2.4em;
180
- border-left: 1px solid #e0e0e0;
181
177
  text-shadow: 0 0 0 transparent;
182
178
  box-shadow: 0 0 0 transparent;
183
179
  border-radius: 0;
@@ -195,25 +191,15 @@
195
191
  .vakata-context li > a > i {
196
192
  text-decoration: none;
197
193
  display: inline-block;
198
- width: 2.4em;
199
- height: 2.4em;
200
194
  background: transparent;
201
- margin: 0 0 0 -2em;
202
- vertical-align: top;
195
+ vertical-align: bottom;
203
196
  text-align: center;
204
- line-height: 2.4em;
197
+ color: rgba(44, 142, 255, 1);
205
198
  }
206
199
  .vakata-context li > a > i:empty {
207
- width: 2.4em;
208
- line-height: 2.4em;
209
200
  }
210
201
  .vakata-context li > a .vakata-contextmenu-sep {
211
202
  display: inline-block;
212
- width: 1px;
213
- height: 2.4em;
214
- background: white;
215
- margin: 0 0.5em 0 0;
216
- border-left: 1px solid #e2e3e3;
217
203
  }
218
204
  .vakata-context .vakata-contextmenu-shortcut {
219
205
  font-size: 0.8em;
@@ -233,9 +219,7 @@
233
219
  background-repeat: no-repeat;
234
220
  }
235
221
  .vakata-context-rtl .vakata-context-separator > a {
236
- margin: 0 2.4em 0 0;
237
222
  border-left: 0;
238
- border-right: 1px solid #e2e3e3;
239
223
  }
240
224
  .vakata-context-rtl .vakata-context-left ul {
241
225
  right: auto;
@@ -954,7 +938,8 @@
954
938
  margin-top: -10px;
955
939
  }
956
940
  }
957
- @media (max-width: 768px) {
941
+
942
+ @media (max-width: 600px) {
958
943
  .jstree-default-responsive {
959
944
  /*
960
945
  .jstree-open > .jstree-ocl,
@@ -1099,4 +1084,24 @@
1099
1084
  margin-left: 0;
1100
1085
  margin-right: 0;
1101
1086
  }
1087
+ }
1088
+
1089
+ /* edit categorise as tree */
1090
+ #catagories-as-tree {
1091
+ margin: 8px 4px;
1092
+ border-top: 2px solid #bbb;
1093
+ padding: 8px;
1094
+ background-color: #f8f8f8;
1095
+ }
1096
+
1097
+ #catagories-as-tree .jstree-anchor {
1098
+ padding: 2px 4px;
1099
+ font-weight: 400;
1100
+ }
1101
+
1102
+ #catagories-as-tree .mi-o {
1103
+ font-size: 22px;
1104
+ color: #666;
1105
+ padding-right: 4px;
1106
+ vertical-align: top;
1102
1107
  }
@@ -1,5 +1,6 @@
1
1
  .ms-container{
2
- max-width: 200px;
2
+ width: fit-content;
3
+ max-width: 600px;
3
4
  }
4
5
 
5
6
  .ms-container:after{
@@ -62,7 +63,7 @@
62
63
  }
63
64
 
64
65
  .ms-container .ms-selectable li.ms-elem-selectable{
65
- padding: 2px 10px;
66
+ padding: 3px 10px;
66
67
  color: #444;
67
68
  font-size: 14px;
68
69
  }
@@ -96,4 +97,5 @@
96
97
  .pull-right.ms-elem-selected{
97
98
  float: right;
98
99
  font-size: smaller;
100
+ padding-left: 4px;
99
101
  }
@@ -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
  #
@@ -445,7 +424,7 @@ end
445
424
  # decamelize_type(ModelName) # 'ModelName' => 'model_name'
446
425
  ########################################################################
447
426
  def decamelize_type(model_string)
448
- model_string ? model_string.underscore : nil
427
+ model_string ? model_string.to_s.underscore : nil
449
428
  end
450
429
 
451
430
  ####################################################################
@@ -460,7 +439,8 @@ def dc_error_messages_for(document)
460
439
 
461
440
  msg = ''
462
441
  document.errors.each do |error|
463
- label = t("helpers.label.#{decamelize_type(document.class)}.#{error.attribute}", error.attribute)
442
+ label = t("helpers.label.#{decamelize_type(document.class)}.#{error.attribute}")
443
+ label = error.attribute if label.match( 'translation missing' )
464
444
  msg << "<li>#{label} : #{error.message}</li>"
465
445
  end
466
446
 
@@ -833,4 +813,101 @@ def redis
833
813
  Rails.cache.redis
834
814
  end
835
815
 
816
+ ########################################################################
817
+ # Extends DRGCMS form file. Extended file is processed first and then merged
818
+ # with code in this form file. Form can extend only single form file.
819
+ #
820
+ # [Parameters:]
821
+ # [extend_option] : Value of @form['extend'] option
822
+ ########################################################################
823
+ def dc_form_extend(extend_option)
824
+ form_file_name = CmsHelper.form_file_find(extend_option)
825
+ @form_js << read_js_drg_form(form_file_name)
826
+ form = YAML.load_file( form_file_name )
827
+ @form = CmsHelper.forms_merge(form, @form)
828
+ # If combined form contains tabs and fields options, merge fields into tabs
829
+ if @form['form']['tabs'] && @form['form']['fields']
830
+ @form['form']['tabs']['fields'] = @form['form']['fields']
831
+ @form['form']['fields'] = nil
832
+ end
833
+ end
834
+
835
+ ########################################################################
836
+ # Include code from another DRGCMS form file. Included code is merged
837
+ # with current form file code. Form can include more than one other DRGCMS forms.
838
+ #
839
+ # [Parameters:]
840
+ # [include_option] : Value of @form['include'] option
841
+ ########################################################################
842
+ def dc_form_include(include_option)
843
+ includes = include_option.class == Array ? include_option : include_option.split(/\,|\;/)
844
+ includes.each do |include_file|
845
+ form_file_name = CmsHelper.form_file_find(include_file)
846
+ @form_js << read_js_drg_form(form_file_name)
847
+ form = YAML.load_file(form_file_name)
848
+ @form = CmsHelper.forms_merge(@form, form)
849
+ end
850
+ end
851
+
852
+ ########################################################################
853
+ # Will read data from form_file_name.js if exists.
854
+ #
855
+ # [Parameters:]
856
+ # [form_file_name] : Physical form filename
857
+ ########################################################################
858
+ def read_js_drg_form(form_file_name)
859
+ js_form_file_name = form_file_name.sub('.yml','.js')
860
+ File.read(js_form_file_name) rescue ''
861
+ end
862
+
863
+ ########################################################################
864
+ # Read DRG form into @form object. Subroutine of check_authorization.
865
+ ########################################################################
866
+ def dc_form_read
867
+ params[:table] ||= params[:t] || CmsHelper.form_param(params)
868
+ table_name = decamelize_type(CmsHelper.table_param(params).strip)
869
+ @tables = table_name.split(';').inject([]) { |r, v| r << [(v.classify.constantize rescue nil), v] }
870
+
871
+ # split ids passed when embedded document
872
+ ids = params[:ids].to_s.strip.downcase
873
+ @ids = ids.split(';').inject([]) { |r,v| r << v }
874
+
875
+ # form_name defaults to last table specified
876
+ form_name = CmsHelper.form_param(params) || @tables.last[1]
877
+ @form_js = ''
878
+
879
+ # dynamically generated form
880
+ @form = if CmsHelper.form_param(params) == 'method'
881
+ dc_eval_class_method(params[:form_method], params)
882
+ else
883
+ form_file_name = CmsHelper.form_file_find(form_name)
884
+ @form_js = read_js_drg_form(form_file_name)
885
+ YAML.load_file(form_file_name)
886
+ end
887
+
888
+ # form includes or extends another form file
889
+ dc_form_include(@form['include']) if @form['include']
890
+ dc_form_extend(@form['extend']) if @form['extend']
891
+ @form['script'] = (@form['script'].blank? ? @form_js : @form['script'] + @form_js)
892
+ # add readonly key to form if readonly parameter is passed in url
893
+ @form['readonly'] = 1 if params['readonly'] #and %w(1 yes true).include?(params['readonly'].to_s.downcase.strip)
894
+
895
+ # !!!!!! Always use strings for key names since @form_params['table'] != @form_params[:table]
896
+ @form_params = { 'table' => table_name, 'ids' => params[:ids], 'form_name' => form_name,
897
+ 'return_to' => params['return_to'], 'edit_only' => params['edit_only'],
898
+ 'readonly' => params['readonly'], 'window_close' => params['window_close']}
899
+ end
900
+
901
+ ########################################################################
902
+ # Will search for help file and return it's full path name if found.
903
+ ########################################################################
904
+ def self.find_help_file(help_file_name)
905
+ file_name = nil
906
+ DrgCms.paths(:forms).reverse.each do |path|
907
+ f = "#{path}/help/#{help_file_name}.#{I18n.locale}"
908
+ file_name = f and break if File.exist?(f)
909
+ end
910
+ file_name
911
+ end
912
+
836
913
  end