drg_cms 0.7.0.2 → 0.7.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/drg_cms/drg_cms.js +110 -35
- data/app/assets/javascripts/drg_cms/jquery.bpopup.js +372 -0
- data/app/assets/javascripts/drg_cms_application.js +1 -1
- data/app/assets/javascripts/drg_cms_cms.js +1 -1
- data/app/assets/stylesheets/drg_cms/drg_cms.css +126 -36
- data/app/assets/stylesheets/drg_cms/select-multiple.css +6 -7
- data/app/controllers/cmsedit_controller.rb +78 -47
- data/app/controllers/dc_application_controller.rb +22 -25
- data/app/controllers/dc_common_controller.rb +9 -6
- data/app/controllers/dc_main_controller.rb +0 -1
- data/app/controls/{dc_category_control.rb → dc_gallery_control.rb} +15 -30
- data/app/controls/dc_image_control.rb +180 -0
- data/app/controls/dc_page_control.rb +3 -3
- data/app/controls/dc_poll_result_control.rb +38 -39
- data/app/controls/dc_report.rb +9 -4
- data/app/controls/dc_setup_control.rb +53 -0
- data/app/controls/design_element_settings_control.rb +88 -37
- data/app/forms/all_options.yml +20 -9
- data/app/forms/cms_menu.yml +14 -2
- data/app/forms/dc_gallery.yml +1 -1
- data/app/forms/dc_image.yml +122 -0
- data/app/forms/dc_image_search.yml +72 -0
- data/app/forms/dc_page.yml +11 -8
- data/app/forms/dc_poll.yml +2 -1
- data/app/forms/dc_poll_result.yml +10 -7
- data/app/forms/dc_setup.yml +45 -0
- data/app/forms/dc_steps_template.yml +6 -2
- data/app/helpers/cms_common_helper.rb +36 -24
- data/app/helpers/cms_edit_helper.rb +26 -33
- data/app/helpers/cms_helper.rb +29 -12
- data/app/helpers/cms_index_helper.rb +109 -80
- data/app/helpers/dc_application_helper.rb +108 -86
- data/app/helpers/dc_image_helper.rb +127 -0
- data/app/models/concerns/dc_policy_rule_concern.rb +1 -1
- data/app/models/concerns/dc_user_concern.rb +13 -5
- data/app/models/dc_big_table.rb +1 -1
- data/app/models/dc_category.rb +12 -0
- data/app/models/dc_design.rb +5 -4
- data/app/models/dc_filter.rb +24 -27
- data/app/models/dc_image.rb +237 -0
- data/app/models/dc_internals.rb +5 -9
- data/app/models/dc_memory.rb +2 -2
- data/app/models/dc_policy_role.rb +8 -8
- data/app/models/dc_setup.rb +111 -0
- data/app/models/drgcms_form_fields/datetime_picker.rb +1 -1
- data/app/models/drgcms_form_fields/drgcms_field.rb +9 -26
- data/app/models/drgcms_form_fields/embedded.rb +28 -17
- data/app/models/drgcms_form_fields/journal_diff.rb +2 -2
- data/app/models/drgcms_form_fields/multitext_autocomplete.rb +88 -76
- data/app/models/drgcms_form_fields/select.rb +41 -19
- data/app/models/drgcms_form_fields/text_with_select.rb +5 -9
- data/app/renderers/dc_big_menu_renderer.rb +18 -20
- data/app/renderers/dc_gallery_renderer.rb +10 -4
- data/app/renderers/dc_menu_renderer.rb +21 -58
- data/app/renderers/dc_page_renderer.rb +7 -7
- data/app/renderers/dc_poll_renderer.rb +13 -12
- data/app/renderers/dc_simple_menu_renderer.rb +1 -1
- data/app/views/cmsedit/_edit_stuff.html.erb +4 -1
- data/app/views/cmsedit/edit.html.erb +1 -1
- data/app/views/cmsedit/index.html.erb +1 -1
- data/app/views/cmsedit/new.html.erb +1 -0
- data/config/locales/drgcms_en.yml +22 -2
- data/config/locales/drgcms_sl.yml +25 -6
- data/config/locales/models_en.yml +50 -1
- data/config/locales/models_sl.yml +60 -1
- data/drg_cms.gemspec +1 -1
- data/lib/drg_cms/version.rb +1 -1
- data/lib/drg_cms.rb +40 -27
- data/lib/generators/convert_to_ar/USAGE +8 -0
- data/lib/generators/convert_to_ar/convert_to_ar_generator.rb +158 -0
- data/lib/generators/new_drg_form/new_drg_form_generator.rb +32 -14
- metadata +19 -10
- data/app/assets/javascripts/drg_cms/jquery.bpopup.min.js +0 -7
- data/app/views/layouts/__cmsedit.html.erb +0 -16
@@ -45,7 +45,7 @@
|
|
45
45
|
font-family: DrgSans;
|
46
46
|
font-style: normal;
|
47
47
|
font-weight: 600;
|
48
|
-
src: url('ibm-plex-sans-600.woff2') format('woff2')
|
48
|
+
src: url('ibm-plex-sans-600.woff2') format('woff2');
|
49
49
|
}
|
50
50
|
@font-face {
|
51
51
|
font-family: DrgSans;
|
@@ -83,7 +83,6 @@ time, mark, audio, video {
|
|
83
83
|
margin: 0;
|
84
84
|
padding: 0;
|
85
85
|
border: 0;
|
86
|
-
font-size: 100%;
|
87
86
|
font: inherit;
|
88
87
|
vertical-align: baseline;
|
89
88
|
}
|
@@ -138,6 +137,10 @@ textarea, input, select {
|
|
138
137
|
max-width: 200px;
|
139
138
|
}
|
140
139
|
|
140
|
+
.dc-action-menu .ui-autocomplete-input {
|
141
|
+
padding: 8px 4px 8px 12px;
|
142
|
+
}
|
143
|
+
|
141
144
|
textarea:focus, input:focus, select:focus {
|
142
145
|
border: 1px solid rgba(44, 142, 255, 1);
|
143
146
|
outline: 1px solid rgba(44, 142, 255, 1);
|
@@ -212,6 +215,13 @@ img { vertical-align:bottom; }
|
|
212
215
|
.dc-image-preview img { max-height: 2rem; padding-left: 0.5rem;}
|
213
216
|
.dc-image-preview img:hover { cursor: zoom-in;}
|
214
217
|
|
218
|
+
#dc-image-preview {
|
219
|
+
padding: 2px;
|
220
|
+
background-color: #fff;
|
221
|
+
filter: drop-shadow(0 0 1rem #000);
|
222
|
+
display: none;
|
223
|
+
}
|
224
|
+
|
215
225
|
.text-with-select { width: 20px; }
|
216
226
|
|
217
227
|
.no-borders {
|
@@ -396,7 +406,7 @@ border-radius: 1px;
|
|
396
406
|
.dc-result-data.footer {
|
397
407
|
border-top: 2px solid #222;
|
398
408
|
color: #000;
|
399
|
-
font-weight:
|
409
|
+
font-weight: 600;
|
400
410
|
background-color: #eee;
|
401
411
|
}
|
402
412
|
|
@@ -548,6 +558,12 @@ display: inline-table;
|
|
548
558
|
background-color: #444;
|
549
559
|
}
|
550
560
|
|
561
|
+
.dc-inline-link.dc-link-ajax {
|
562
|
+
padding: initial;
|
563
|
+
border: none;
|
564
|
+
background: initial;
|
565
|
+
}
|
566
|
+
|
551
567
|
.skip-next {
|
552
568
|
text-align: center;
|
553
569
|
border:1px solid #888;
|
@@ -630,8 +646,7 @@ display: inline-table;
|
|
630
646
|
/***** FORM *****/
|
631
647
|
|
632
648
|
#dc-form-container {
|
633
|
-
display: flex
|
634
|
-
padding-left: 4px;
|
649
|
+
/*display: flex;*/
|
635
650
|
}
|
636
651
|
|
637
652
|
#dc-form-left {
|
@@ -646,7 +661,7 @@ display: inline-table;
|
|
646
661
|
}
|
647
662
|
|
648
663
|
.dc-form-frame {
|
649
|
-
margin:
|
664
|
+
margin: 0;
|
650
665
|
padding: 4px;
|
651
666
|
}
|
652
667
|
|
@@ -670,7 +685,6 @@ display: inline-table;
|
|
670
685
|
border-radius: 2px;
|
671
686
|
margin: 2px 0;
|
672
687
|
}
|
673
|
-
|
674
688
|
.dc-form-warning {
|
675
689
|
padding: 8px;
|
676
690
|
background-image: linear-gradient(to bottom, rgba(213, 143, 218, 0.1) 0, rgba(213, 143, 218, 0.5) 100%);
|
@@ -702,7 +716,7 @@ display: inline-table;
|
|
702
716
|
color: #555;
|
703
717
|
text-align: right;
|
704
718
|
vertical-align: middle;
|
705
|
-
font-weight:
|
719
|
+
font-weight: 500;
|
706
720
|
padding: 10px 2px;
|
707
721
|
width: 150px;
|
708
722
|
}
|
@@ -721,7 +735,8 @@ display: inline-table;
|
|
721
735
|
}
|
722
736
|
|
723
737
|
.dc-form-label.dc-color-odd, .dc-form-label.dc-color-even {background-color: transparent;}
|
724
|
-
|
738
|
+
|
739
|
+
.dc-form-label.dc-width-0 { padding: 0;}
|
725
740
|
|
726
741
|
.dc-align-left {
|
727
742
|
text-align: left;
|
@@ -733,7 +748,9 @@ display: inline-table;
|
|
733
748
|
.dc-form-field {
|
734
749
|
text-align: left;
|
735
750
|
padding: 4px 2px;
|
736
|
-
z-index: 10
|
751
|
+
/*z-index: 10;*/
|
752
|
+
white-space: nowrap;
|
753
|
+
text-overflow: fade;
|
737
754
|
}
|
738
755
|
|
739
756
|
.dc-form-field .action li {
|
@@ -878,6 +895,10 @@ display: flex;
|
|
878
895
|
color: rgba(44, 142, 255, 1);
|
879
896
|
}
|
880
897
|
|
898
|
+
.dc-popup-open:hover {
|
899
|
+
color: rgba(44, 142, 255, 1);
|
900
|
+
}
|
901
|
+
|
881
902
|
/*** CMS toggle button */
|
882
903
|
.cms-toggle {
|
883
904
|
z-index: 1000000;
|
@@ -1058,6 +1079,7 @@ font-size: 1.2em;
|
|
1058
1079
|
font-size: 1.1em;
|
1059
1080
|
line-height: 1.4em;
|
1060
1081
|
}
|
1082
|
+
|
1061
1083
|
/****** jquery ui-autocomplete widget ***************/
|
1062
1084
|
.ui-autocomplete-input {
|
1063
1085
|
padding: 8px 4px 8px 12px;
|
@@ -1119,16 +1141,7 @@ color: #000;
|
|
1119
1141
|
margin-left: 4px;
|
1120
1142
|
}
|
1121
1143
|
|
1122
|
-
|
1123
|
-
.dc-red { color: #f76;}
|
1124
|
-
.dc-red:hover { color: #c43;}
|
1125
|
-
.dc-green { color: #9c9;}
|
1126
|
-
.dc-green:hover { color: #6a6;}
|
1127
|
-
|
1128
|
-
.aui-corner-all {
|
1129
|
-
background-color: lightyellow;
|
1130
|
-
}
|
1131
|
-
|
1144
|
+
/************* login *************/
|
1132
1145
|
#dc-login {
|
1133
1146
|
position: fixed;
|
1134
1147
|
top: 50%;
|
@@ -1166,16 +1179,18 @@ color: #000;
|
|
1166
1179
|
border-radius: 2px;
|
1167
1180
|
z-index: 100;
|
1168
1181
|
list-style-type: none;
|
1169
|
-
filter: drop-shadow(1px 1px
|
1182
|
+
filter: drop-shadow(1px 1px 6px #ccc);
|
1170
1183
|
}
|
1171
1184
|
|
1172
1185
|
.drgcms_popmenu_class i {
|
1173
1186
|
vertical-align: sub;
|
1174
1187
|
color: rgba(44, 142, 255, 1);
|
1188
|
+
font-size: 22px;
|
1175
1189
|
}
|
1176
1190
|
|
1177
1191
|
.drgcms_popmenu_item {
|
1178
1192
|
padding: 4px;
|
1193
|
+
font-size: 1.1em;
|
1179
1194
|
}
|
1180
1195
|
|
1181
1196
|
.drgcms_popmenu_item:hover {
|
@@ -1186,14 +1201,14 @@ color: #000;
|
|
1186
1201
|
color: white;
|
1187
1202
|
}
|
1188
1203
|
.iframe_embedded {
|
1189
|
-
padding:
|
1204
|
+
padding: 2px;
|
1190
1205
|
background-color: #fff;
|
1191
1206
|
border-radius: 2px;
|
1192
|
-
border: 2px solid #
|
1207
|
+
border: 2px solid #888;
|
1193
1208
|
}
|
1194
1209
|
|
1195
1210
|
#iframe_edit, #iframe_cms {
|
1196
|
-
height: 1px
|
1211
|
+
/* height: 1px;*/
|
1197
1212
|
width: 100%;
|
1198
1213
|
border: 0;
|
1199
1214
|
margin-bottom: 0;
|
@@ -1367,6 +1382,7 @@ color: #000;
|
|
1367
1382
|
max-height: 700px;
|
1368
1383
|
overflow-y: auto;
|
1369
1384
|
max-width: 800px;
|
1385
|
+
line-height: 1.5em;
|
1370
1386
|
}
|
1371
1387
|
|
1372
1388
|
#popup .dc-help h1 {
|
@@ -1460,6 +1476,35 @@ color: #000;
|
|
1460
1476
|
display: inline-flex;
|
1461
1477
|
}
|
1462
1478
|
|
1479
|
+
#popup:has(.popup-info) {
|
1480
|
+
padding: 1rem;
|
1481
|
+
background-image: linear-gradient(to bottom, #dff0d8 0, #c8e5bc 100%);
|
1482
|
+
color: darkgreen;
|
1483
|
+
font-weight: 600;
|
1484
|
+
font-size: 1.1em;
|
1485
|
+
min-width: 30%;
|
1486
|
+
border: 2px solid darkgreen;
|
1487
|
+
}
|
1488
|
+
|
1489
|
+
#popup:has(.popup-error) {
|
1490
|
+
padding: 1rem;
|
1491
|
+
background-image: linear-gradient(to bottom, #f2dede 0, #e7c3c3 100%);
|
1492
|
+
color: #a94442;
|
1493
|
+
font-weight: 600;
|
1494
|
+
font-size: 1.1em;
|
1495
|
+
min-width: 30%;
|
1496
|
+
border: 2px solid #a94442;
|
1497
|
+
}
|
1498
|
+
|
1499
|
+
#popup .popup-info button, #popup .popup-error button {
|
1500
|
+
margin-top: 1rem;
|
1501
|
+
padding: 4px 2rem;
|
1502
|
+
line-height: initial;
|
1503
|
+
filter: none;
|
1504
|
+
border: 2px solid #222;
|
1505
|
+
border-radius: 5px;
|
1506
|
+
}
|
1507
|
+
|
1463
1508
|
.filter-popup {
|
1464
1509
|
background-color: #fff;
|
1465
1510
|
filter: drop-shadow(2px 2px 8px #888);
|
@@ -1529,7 +1574,7 @@ cursor: pointer;
|
|
1529
1574
|
|
1530
1575
|
#drgcms_filter h1 {
|
1531
1576
|
font-size: 1.8em;
|
1532
|
-
font-
|
1577
|
+
font-weight: 600;
|
1533
1578
|
color: rgba(44, 142, 255, 1);
|
1534
1579
|
}
|
1535
1580
|
|
@@ -1552,6 +1597,36 @@ cursor: pointer;
|
|
1552
1597
|
margin-left: 1px;
|
1553
1598
|
}
|
1554
1599
|
|
1600
|
+
/**** reports ****/
|
1601
|
+
.report .dc-title { color: #003A68; }
|
1602
|
+
.report .dc-result-header {
|
1603
|
+
border-bottom: 2px solid #003A68;
|
1604
|
+
}
|
1605
|
+
.report .dc-result-header .th {
|
1606
|
+
color: #003A68;
|
1607
|
+
padding: 3px;
|
1608
|
+
}
|
1609
|
+
|
1610
|
+
.report .dc-result-data {
|
1611
|
+
padding: 0;
|
1612
|
+
}
|
1613
|
+
|
1614
|
+
.report.dc-form-frame {
|
1615
|
+
padding: 0;
|
1616
|
+
}
|
1617
|
+
|
1618
|
+
|
1619
|
+
.report .dc-result-data .td {
|
1620
|
+
padding: 3px;
|
1621
|
+
}
|
1622
|
+
|
1623
|
+
.iframe_embedded#if_dc_temp {
|
1624
|
+
border: none;
|
1625
|
+
padding: 0;
|
1626
|
+
}
|
1627
|
+
|
1628
|
+
.report .dc-odd {background-color: #e0eeff;}
|
1629
|
+
|
1555
1630
|
/** Radio button input field **/
|
1556
1631
|
|
1557
1632
|
.dc-radio {
|
@@ -1576,23 +1651,30 @@ cursor: pointer;
|
|
1576
1651
|
margin: 6px 4px 0 0;
|
1577
1652
|
}
|
1578
1653
|
|
1654
|
+
.dc-image-preview-1 {
|
1655
|
+
right: 1rem;
|
1656
|
+
position: absolute;
|
1657
|
+
top: 5rem;
|
1658
|
+
max-height: 150px;
|
1659
|
+
max-width: 200px;
|
1660
|
+
}
|
1661
|
+
|
1662
|
+
#dc_image .dc-image-preview img {
|
1663
|
+
max-height: 150px;
|
1664
|
+
max-width: 200px;
|
1665
|
+
}
|
1666
|
+
|
1579
1667
|
/****** MOBILE DEVICE *****/
|
1580
1668
|
@media only screen and (max-device-width: 600px) {
|
1581
1669
|
#body-cms {font-size: 11px;}
|
1582
1670
|
#site-top div:nth-of-type(2) {padding-top: 0 !important;}
|
1583
|
-
.dc-title {
|
1584
|
-
|
1585
|
-
|
1586
|
-
.dc-form {
|
1587
|
-
border: none;
|
1588
|
-
border-top: 2px solid #888;
|
1589
|
-
border-bottom: 2px solid #888;
|
1590
|
-
margin-top: 4px;
|
1671
|
+
.dc-title {
|
1672
|
+
font-size: 1.5em;
|
1673
|
+
padding-bottom: 4px;
|
1591
1674
|
}
|
1675
|
+
.dc-form-field { padding-bottom: 4px; }
|
1592
1676
|
|
1593
|
-
.dc-form .row-div {
|
1594
|
-
display: block;
|
1595
|
-
}
|
1677
|
+
.dc-form .row-div { display: block; }
|
1596
1678
|
.dc-form-li {margin-top: 3px;}
|
1597
1679
|
|
1598
1680
|
.dc-form-label {
|
@@ -1603,6 +1685,7 @@ cursor: pointer;
|
|
1603
1685
|
}
|
1604
1686
|
.dc-form-label label {
|
1605
1687
|
font-size: 15px;
|
1688
|
+
padding: 0;
|
1606
1689
|
}
|
1607
1690
|
|
1608
1691
|
.dc-menu { padding: 0;}
|
@@ -1638,6 +1721,13 @@ cursor: pointer;
|
|
1638
1721
|
font-size: 2em;
|
1639
1722
|
}
|
1640
1723
|
|
1724
|
+
#menu-hamburger .mi:before{
|
1725
|
+
background-color: #222;
|
1726
|
+
color: #fff;
|
1727
|
+
padding: 1px;
|
1728
|
+
border-radius: 2px;
|
1729
|
+
}
|
1730
|
+
|
1641
1731
|
.cmsedit-container {display: block;}
|
1642
1732
|
.cmsedit-container #cms-menu {display: none;}
|
1643
1733
|
.cmsedit-container #cms-menu.visible {
|
@@ -34,7 +34,7 @@
|
|
34
34
|
-moz-border-radius: 1px;
|
35
35
|
border-radius: 1px;
|
36
36
|
position: relative;
|
37
|
-
height: 200px;
|
37
|
+
max-height: 200px;
|
38
38
|
padding: 0;
|
39
39
|
overflow-y: auto;
|
40
40
|
}
|
@@ -63,20 +63,19 @@
|
|
63
63
|
}
|
64
64
|
|
65
65
|
.ms-container .ms-selectable li.ms-elem-selectable{
|
66
|
-
padding:
|
66
|
+
padding: 5px 10px;
|
67
67
|
color: #444;
|
68
|
-
font-size: 14px;
|
69
68
|
}
|
70
69
|
|
71
|
-
.ms-container .ms-selectable li:nth-child(
|
72
|
-
background-color: #
|
70
|
+
.ms-container .ms-selectable li:nth-child(even) {
|
71
|
+
background-color: #f8f8f8;
|
73
72
|
}
|
74
73
|
|
75
74
|
.ms-container .ms-selectable li.ms-hover{
|
76
75
|
cursor: pointer;
|
77
76
|
color: #fff;
|
78
77
|
text-decoration: none;
|
79
|
-
background-color:
|
78
|
+
background-color: rgba(76,154,255, 0.6);
|
80
79
|
}
|
81
80
|
|
82
81
|
.ms-container .ms-selectable li.disabled{
|
@@ -92,10 +91,10 @@
|
|
92
91
|
|
93
92
|
.ms-container .ms-selected {
|
94
93
|
font-weight: 600;
|
94
|
+
color: darkblue !important;
|
95
95
|
}
|
96
96
|
|
97
97
|
.pull-right.ms-elem-selected{
|
98
98
|
float: right;
|
99
|
-
font-size: smaller;
|
100
99
|
padding-left: 4px;
|
101
100
|
}
|
@@ -77,7 +77,7 @@
|
|
77
77
|
########################################################################
|
78
78
|
class CmseditController < DcApplicationController
|
79
79
|
before_action :check_authorization, :except => [:login, :logout, :test, :run]
|
80
|
-
protect_from_forgery with: :null_session, only: Proc.new {
|
80
|
+
protect_from_forgery with: :null_session, only: Proc.new { _1.request.format.json? }
|
81
81
|
|
82
82
|
layout 'cms'
|
83
83
|
|
@@ -108,12 +108,17 @@ end
|
|
108
108
|
########################################################################
|
109
109
|
def show
|
110
110
|
find_record
|
111
|
+
if @record.nil?
|
112
|
+
flash[:error] ||= t('drgcms.doc_no_edit')
|
113
|
+
return index
|
114
|
+
end
|
111
115
|
# before_show callback
|
112
116
|
if (m = callback_method('before_show') )
|
113
117
|
ret = call_callback_method(m)
|
114
118
|
if ret.class == FalseClass
|
115
119
|
@form['readonly'] = nil # must be
|
116
|
-
|
120
|
+
flash[:error] ||= t('drgcms.not_authorized')
|
121
|
+
return index
|
117
122
|
end
|
118
123
|
end
|
119
124
|
|
@@ -269,11 +274,8 @@ def create
|
|
269
274
|
# create document
|
270
275
|
if params['id'].nil?
|
271
276
|
# Prevent double form submit
|
272
|
-
|
273
|
-
session[:form_time_stamp] ||= 0
|
274
|
-
return index if params[:form_time_stamp] <= session[:form_time_stamp]
|
277
|
+
return index if double_form_submit?
|
275
278
|
|
276
|
-
session[:form_time_stamp] = params[:form_time_stamp]
|
277
279
|
create_new_empty_record
|
278
280
|
if save_data
|
279
281
|
flash[:info] = t('drgcms.doc_saved')
|
@@ -385,7 +387,7 @@ def destroy
|
|
385
387
|
save_journal(:delete)
|
386
388
|
flash[:info] = t('drgcms.record_deleted')
|
387
389
|
# after_delete callback
|
388
|
-
if (m = callback_method('after_delete') )
|
390
|
+
if (m = callback_method('after_delete') )
|
389
391
|
call_callback_method(m)
|
390
392
|
elsif params['after-delete'].to_s.match('return_to')
|
391
393
|
params[:return_to] = params['after-delete']
|
@@ -548,14 +550,14 @@ def check_authorization
|
|
548
550
|
end
|
549
551
|
dc_form_read
|
550
552
|
|
551
|
-
# Permissions can be also defined
|
553
|
+
# Permissions can be also defined in form
|
552
554
|
#TODO So far only can_view is used. Think about if using other permissions has sense
|
553
555
|
can_view = @form.dig('permissions','can_view')
|
554
|
-
if can_view.nil?
|
556
|
+
if can_view.nil? || can_view.split(',').any? { |role| dc_user_has_role(role) }
|
555
557
|
extend_with_control_module
|
556
558
|
else
|
557
559
|
render(action: 'error', locals: { error: t('drgcms.not_authorized')} )
|
558
|
-
end
|
560
|
+
end
|
559
561
|
end
|
560
562
|
|
561
563
|
########################################################################
|
@@ -613,7 +615,7 @@ def save_journal(operation, changes = {})
|
|
613
615
|
|
614
616
|
if (operation != :update) || changes.size > 0
|
615
617
|
# determine site_id
|
616
|
-
site_id = @record.site_id if @record.respond_to?('site_id')
|
618
|
+
site_id = @record.site_id if @record && @record.respond_to?('site_id')
|
617
619
|
site_id = dc_get_site._id if site_id.nil? && dc_get_site
|
618
620
|
|
619
621
|
DcJournal.create(site_id: site_id,
|
@@ -637,8 +639,9 @@ def callback_method(key) #:nodoc:
|
|
637
639
|
callback = case
|
638
640
|
when params['data'] && params['data'][data_key] then params['data'][data_key]
|
639
641
|
# dc_ + key method is present then call it automatically
|
640
|
-
when @form.dig('
|
642
|
+
when @form.dig('permissions', key) then @form['permissions'][key]
|
641
643
|
when respond_to?('dc_' + key) then 'dc_' + key
|
644
|
+
when respond_to?(key) then key
|
642
645
|
when params[data_key] then params[data_key]
|
643
646
|
else nil
|
644
647
|
end
|
@@ -714,10 +717,10 @@ def save_data
|
|
714
717
|
|
715
718
|
form_fields.each do |v|
|
716
719
|
session[:form_processing] = v['name'] # for debuging
|
717
|
-
next if v['type'].nil?
|
718
|
-
v['type'].match('embedded')
|
719
|
-
(params[:edit_only]
|
720
|
-
v['readonly']
|
720
|
+
next if v['type'].nil? || v['name'].nil? ||
|
721
|
+
v['type'].match('embedded') || # don't wipe embedded types
|
722
|
+
(params[:edit_only] && params[:edit_only] != v['name']) || # otherwise other fields would be wiped
|
723
|
+
v['readonly'] || # fields with readonly option don't return value and would be wiped
|
721
724
|
!@record.respond_to?(v['name']) # there are temporary fields on the form
|
722
725
|
# good to know! How to get type of field @record.fields[v['name']].type
|
723
726
|
# return value from form field definition
|
@@ -734,7 +737,7 @@ def save_data
|
|
734
737
|
|
735
738
|
# save data
|
736
739
|
changes = @record.changes
|
737
|
-
update_standards
|
740
|
+
update_standards if changes.size > 0 # update only if there has been some changes
|
738
741
|
if (saved = @record.save)
|
739
742
|
operation = @record.new_record? ? :new : :update
|
740
743
|
save_journal(operation, @record.previous_changes)
|
@@ -749,9 +752,9 @@ end
|
|
749
752
|
# in select_fields and deny_fields
|
750
753
|
########################################################################
|
751
754
|
def separated_to_symbols(data)
|
752
|
-
data.chomp.split(',').map {
|
755
|
+
data.chomp.split(',').map { _1.strip.downcase.to_sym }
|
753
756
|
end
|
754
|
-
|
757
|
+
|
755
758
|
########################################################################
|
756
759
|
# Will process only (select_fields) and without (deny_fields) option
|
757
760
|
########################################################################
|
@@ -843,24 +846,20 @@ def process_collections #:nodoc
|
|
843
846
|
check_sort_options()
|
844
847
|
end
|
845
848
|
# result set is defined by filter method in control object
|
846
|
-
form_filter = @form['result_set']['filter']
|
847
|
-
if form_filter
|
848
|
-
|
849
|
-
|
850
|
-
|
851
|
-
|
852
|
-
|
853
|
-
|
854
|
-
|
855
|
-
|
856
|
-
|
857
|
-
|
858
|
-
|
859
|
-
|
860
|
-
@records = @records.page(params[:page]).per(per_page) if per_page > 0
|
861
|
-
end
|
862
|
-
elsif form_filter != 'dc_filter'
|
863
|
-
Rails.logger.error "Error: result_set:filter: #{@form['result_set']['filter']} not found in controls!"
|
849
|
+
form_filter = @form['result_set']['filter'] || 'default_filter'
|
850
|
+
if respond_to?(form_filter)
|
851
|
+
@records = send(form_filter)
|
852
|
+
# something went wrong. flash[] should have explanation.
|
853
|
+
if @records.class == FalseClass
|
854
|
+
@records = []
|
855
|
+
render(action: :index)
|
856
|
+
return true
|
857
|
+
end
|
858
|
+
process_select_and_deny_fields
|
859
|
+
# pagination but only if not already set
|
860
|
+
unless (@form['table'] == 'dc_memory' || (@records.respond_to?(:options) && @records.options[:limit]))
|
861
|
+
per_page = (@form['result_set']['per_page'] || 25).to_i
|
862
|
+
@records = @records.page(params[:page]).per(per_page) if per_page > 0
|
864
863
|
end
|
865
864
|
else
|
866
865
|
if @tables.size > 1
|
@@ -871,7 +870,7 @@ def process_collections #:nodoc
|
|
871
870
|
@records = rec.send(embedded_field_name) # current embedded set
|
872
871
|
# sort by order if order field is present in model
|
873
872
|
if @tables.last[1].classify.constantize.respond_to?(:order)
|
874
|
-
@records = @records.order_by(
|
873
|
+
@records = @records.order_by(order: 1)
|
875
874
|
end
|
876
875
|
end
|
877
876
|
end
|
@@ -879,19 +878,14 @@ def process_collections #:nodoc
|
|
879
878
|
end
|
880
879
|
|
881
880
|
########################################################################
|
882
|
-
# Process index action for in memory data.
|
881
|
+
# Process index action for in memory data. default_filter method must fill @records array
|
882
|
+
# with data, that will be shown in browser.
|
883
883
|
########################################################################
|
884
884
|
def process_in_memory #:nodoc
|
885
885
|
@records = []
|
886
886
|
# result set is defined by filter method in control object
|
887
|
-
if (method = @form['result_set']['filter'])
|
888
|
-
send(method) if respond_to?(method)
|
889
|
-
end
|
890
|
-
# result set is defined by class method
|
891
|
-
if (klass_method = @form['result_set']['filter_method'])
|
892
|
-
_klass, method = klass_method.split('.')
|
893
|
-
klass = _klass.classify.constantize
|
894
|
-
@records = klass.send(method) if klass.respond_to?(method)
|
887
|
+
if (method = @form['result_set']['filter'] || 'default_filter')
|
888
|
+
send(method) if respond_to?(method)
|
895
889
|
end
|
896
890
|
# ensure that record has id field
|
897
891
|
if @records.size > 0
|
@@ -900,4 +894,41 @@ def process_in_memory #:nodoc
|
|
900
894
|
false
|
901
895
|
end
|
902
896
|
|
897
|
+
########################################################################
|
898
|
+
# Prevent double form submit
|
899
|
+
#
|
900
|
+
# There was a problem with old solution when user opened another browser session while
|
901
|
+
# entering data into new document. If in new session user added document to some other
|
902
|
+
# collection, save to document in primary session was silently ignored. Now creation time for last three forms
|
903
|
+
# is remembered. This will work unless user tries to add new document to the same collection in another session.
|
904
|
+
# But that is highly unlikely.
|
905
|
+
########################################################################
|
906
|
+
def double_form_submit?
|
907
|
+
session[:dfs] ||= {}
|
908
|
+
form_name = CmsHelper.form_param(params) || CmsHelper.table_param(params)
|
909
|
+
params[:form_time_stamp] = params[:form_time_stamp].to_i
|
910
|
+
if params[:form_time_stamp] <= update_dfs_time(form_name) && !Rails.env.test? # test must be excluded
|
911
|
+
flash[:error] = I18n.t('drgcms.dfs')
|
912
|
+
return true
|
913
|
+
end
|
914
|
+
update_dfs_time(form_name, params[:form_time_stamp])
|
915
|
+
|
916
|
+
false
|
917
|
+
end
|
918
|
+
|
919
|
+
########################################################################
|
920
|
+
# Updates double_form_submit timings.
|
921
|
+
########################################################################
|
922
|
+
def update_dfs_time(form_name, time = nil)
|
923
|
+
if time.nil?
|
924
|
+
session[:dfs][form_name] ||= 0
|
925
|
+
else
|
926
|
+
session[:dfs][form_name] = time
|
927
|
+
if session[:dfs].size > 3
|
928
|
+
oldest = session[:dfs].invert.min
|
929
|
+
session[:dfs].delete(oldest.last)
|
930
|
+
end
|
931
|
+
end
|
932
|
+
end
|
933
|
+
|
903
934
|
end
|