drg_cms 0.7.0.8 → 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 +50 -20
- data/app/assets/stylesheets/drg_cms/drg_cms.css +89 -31
- data/app/assets/stylesheets/drg_cms/select-multiple.css +5 -6
- data/app/controllers/cmsedit_controller.rb +57 -24
- data/app/controllers/dc_application_controller.rb +18 -21
- data/app/controls/dc_poll_result_control.rb +36 -36
- data/app/controls/dc_setup_control.rb +53 -0
- data/app/forms/all_options.yml +3 -3
- data/app/forms/cms_menu.yml +7 -0
- data/app/forms/dc_image_search.yml +2 -2
- 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 +4 -1
- data/app/helpers/cms_common_helper.rb +14 -10
- data/app/helpers/cms_helper.rb +8 -7
- data/app/helpers/cms_index_helper.rb +56 -42
- data/app/helpers/dc_application_helper.rb +46 -16
- data/app/helpers/dc_image_helper.rb +2 -2
- data/app/models/concerns/dc_user_concern.rb +1 -1
- data/app/models/dc_big_table.rb +1 -1
- data/app/models/dc_filter.rb +5 -9
- data/app/models/dc_image.rb +1 -1
- data/app/models/dc_memory.rb +2 -2
- 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/embedded.rb +17 -9
- data/app/models/drgcms_form_fields/multitext_autocomplete.rb +44 -36
- data/app/models/drgcms_form_fields/select.rb +21 -5
- data/app/renderers/dc_big_menu_renderer.rb +18 -20
- data/app/renderers/dc_menu_renderer.rb +21 -58
- data/app/renderers/dc_simple_menu_renderer.rb +1 -1
- data/app/views/cmsedit/_edit_stuff.html.erb +3 -0
- data/config/locales/drgcms_en.yml +8 -0
- data/config/locales/drgcms_sl.yml +12 -4
- data/config/locales/models_en.yml +17 -1
- data/config/locales/models_sl.yml +17 -1
- data/lib/drg_cms/version.rb +1 -1
- data/lib/drg_cms.rb +22 -23
- data/lib/generators/new_drg_form/new_drg_form_generator.rb +32 -14
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 836e52abeb4f9f04c54c21d66c4c053b5bc9cb8906904ce6c608b0c03edc57d7
|
4
|
+
data.tar.gz: 86469fb38b082d39f20ce81ee903354e11d693db34060a224cf031facd554b45
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: af0af1882f81f7240438b80a4138c415ada71850395ce149f3a9b4d30b5e8858081aad9a438e9a7a9749a8e75cc0b16775aec187785a765870d4d726aa4f66e1
|
7
|
+
data.tar.gz: d8c3c2d0184e4e97451962203a64d7d4a2e59dd08e5e48320d05f0203a12f8e50cbd0263958d2af189c7ef84f0627f95067558321fb0d44f4ce88b7683897b5d
|
@@ -120,6 +120,8 @@ update_select_depend = function(select_name, depend_name, method) {
|
|
120
120
|
$.each(data, function(index, element) {
|
121
121
|
select_field.append( new Option(element['label'], element['id']) );
|
122
122
|
});
|
123
|
+
// refresh multiple select field
|
124
|
+
if (select_field.hasClass('select-multiple')) { select_field.selectMultiple('refresh') }
|
123
125
|
}
|
124
126
|
});
|
125
127
|
};
|
@@ -292,10 +294,12 @@ process_json_result = function(json) {
|
|
292
294
|
closeClass: 'dc-link' });
|
293
295
|
}
|
294
296
|
else {
|
295
|
-
|
297
|
+
if (selector == '') { selector = 'info' }
|
298
|
+
let popup_html = '<div class="popup-' + selector + '">' + value + '<br><button class="dc-link">OK</button></div>';
|
299
|
+
$('#popup').html(popup_html);
|
296
300
|
$('#popup').bPopup( {
|
297
301
|
transition: 'slideDown', transitionClose: 'slideDown', speed: 300,
|
298
|
-
opacity: 0, position: ['auto',
|
302
|
+
opacity: 0, position: ['auto', 'auto'],
|
299
303
|
closeClass: 'dc-link' });
|
300
304
|
}
|
301
305
|
// resize parent iframe if smaller then 500px to ensure popup some space
|
@@ -520,19 +524,44 @@ dc_image_preview = function(img) {
|
|
520
524
|
*******************************************************************/
|
521
525
|
dc_image_select = function(img) {
|
522
526
|
let ck_func_name = $.getUrlParam('CKEditorFuncNum');
|
523
|
-
let field_name
|
524
|
-
if (ck_func_name
|
527
|
+
let field_name = $.getUrlParam('field_name');
|
528
|
+
if (ck_func_name) {
|
525
529
|
window.opener.CKEDITOR.tools.callFunction(ck_func_name, img);
|
526
530
|
} else {
|
527
531
|
window.opener.document.getElementById(field_name).value = img;
|
532
|
+
|
533
|
+
// update image preview
|
534
|
+
//let img_src = window.opener.$(`#td_${field_name} .dc-image-preview img`);
|
535
|
+
//img_src.attr("src", img);
|
536
|
+
|
537
|
+
// even better. Click save button.
|
538
|
+
window.opener.$(`.mi.mi-save`).first().click();
|
528
539
|
}
|
529
540
|
window.close();
|
530
541
|
};
|
531
542
|
|
532
|
-
|
533
543
|
/*******************************************************************
|
534
|
-
*
|
544
|
+
* Resize iframe_embedded to the size of form.
|
535
545
|
*******************************************************************/
|
546
|
+
function resize_iframe_embedded(that) {
|
547
|
+
let embedded_height = that.contentWindow.document.body.offsetHeight;
|
548
|
+
// workaround. It gets tricky when embedded field is on tab
|
549
|
+
if (embedded_height == 0) embedded_height = 50;
|
550
|
+
that.style.height = (embedded_height + 30) + 'px';
|
551
|
+
// resize parent element too
|
552
|
+
let parentWindow= that.contentWindow.parent;
|
553
|
+
let parent_height= (parentWindow.document.body.offsetHeight + 30) + 'px';
|
554
|
+
parentWindow.frameElement.style.height = parent_height;
|
555
|
+
};
|
556
|
+
|
557
|
+
|
558
|
+
/*******************************************************************
|
559
|
+
*
|
560
|
+
*
|
561
|
+
* EVENTS START HERE
|
562
|
+
*
|
563
|
+
*
|
564
|
+
********************************************************************/
|
536
565
|
$(document).ready( function() {
|
537
566
|
/* This could be the way to focus on first input field on document open
|
538
567
|
if ( $('.dc-form')[0] ) {
|
@@ -580,6 +609,7 @@ $(document).ready( function() {
|
|
580
609
|
$('.cms-toggle').bind('click', function(e) {
|
581
610
|
var url = '/dc_common/toggle_edit_mode?return_to=' + window.location.href;
|
582
611
|
if (e.pageX < 30) url = url + '&return_to_ypos=' + e.pageY ;
|
612
|
+
console.log(url);
|
583
613
|
window.location.href = url;
|
584
614
|
});
|
585
615
|
|
@@ -691,7 +721,7 @@ $(document).ready( function() {
|
|
691
721
|
});
|
692
722
|
|
693
723
|
/*******************************************************************
|
694
|
-
* Resize iframe_cms to the size of its contents. Make at least 500 px high
|
724
|
+
* Resize iframe_cms on load to the size of its contents. Make at least 500 px high
|
695
725
|
* unless on initial display.
|
696
726
|
*******************************************************************/
|
697
727
|
$('#iframe_cms').on('load', function() {
|
@@ -703,7 +733,7 @@ $(document).ready( function() {
|
|
703
733
|
});
|
704
734
|
|
705
735
|
/*******************************************************************
|
706
|
-
*
|
736
|
+
* Resize iframe_edit on load to the size of its contents. Resize it + 30px
|
707
737
|
* unless on initial display with no data
|
708
738
|
*******************************************************************/
|
709
739
|
$('#iframe_edit').on('load', function() {
|
@@ -715,18 +745,16 @@ $(document).ready( function() {
|
|
715
745
|
});
|
716
746
|
|
717
747
|
/*******************************************************************
|
718
|
-
*
|
748
|
+
* Resize iframe_embedded on load to the size of its contents.
|
749
|
+
* It doesn't work well with firefox, when CK editor object is on the form.
|
750
|
+
* Adding some delay is resolving the problem.
|
719
751
|
*******************************************************************/
|
720
752
|
$('.iframe_embedded').on('load', function() {
|
721
|
-
|
722
|
-
|
723
|
-
|
724
|
-
|
725
|
-
|
726
|
-
let parentWindow = this.contentWindow.parent;
|
727
|
-
let parent_height = (parentWindow.document.body.offsetHeight + 30) + 'px';
|
728
|
-
//parentWindow.frameElement.setAttribute('style', 'height:' + parent_height);
|
729
|
-
parentWindow.frameElement.style.height = parent_height;
|
753
|
+
if (/Firefox/.test(navigator.userAgent)) {
|
754
|
+
setTimeout(resize_iframe_embedded, 100, this);
|
755
|
+
} else {
|
756
|
+
resize_iframe_embedded(this);
|
757
|
+
}
|
730
758
|
});
|
731
759
|
|
732
760
|
/*******************************************************************
|
@@ -856,11 +884,13 @@ $(document).ready( function() {
|
|
856
884
|
let title = this.getAttribute("title");
|
857
885
|
let w = this.getAttribute("data-x") || 1000;
|
858
886
|
let h = this.getAttribute("data-y") || 800;
|
887
|
+
let offset = parent.window.scrollY || window.scrollY;
|
859
888
|
|
860
889
|
url = dc_url_add_params(this, url)
|
861
890
|
$('#popup').bPopup({ loadUrl: url,
|
862
|
-
transition: 'slideDown', transitionClose: 'slideDown',
|
863
|
-
|
891
|
+
transition: 'slideDown', transitionClose: 'slideDown',
|
892
|
+
speed: 300, opacity: 0,
|
893
|
+
position: ['auto', offset + 20],
|
864
894
|
closeClass: 'dc-link'
|
865
895
|
});
|
866
896
|
});
|
@@ -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);
|
@@ -643,8 +646,7 @@ display: inline-table;
|
|
643
646
|
/***** FORM *****/
|
644
647
|
|
645
648
|
#dc-form-container {
|
646
|
-
display: flex
|
647
|
-
padding-left: 4px;
|
649
|
+
/*display: flex;*/
|
648
650
|
}
|
649
651
|
|
650
652
|
#dc-form-left {
|
@@ -659,7 +661,7 @@ display: inline-table;
|
|
659
661
|
}
|
660
662
|
|
661
663
|
.dc-form-frame {
|
662
|
-
margin:
|
664
|
+
margin: 0;
|
663
665
|
padding: 4px;
|
664
666
|
}
|
665
667
|
|
@@ -683,7 +685,6 @@ display: inline-table;
|
|
683
685
|
border-radius: 2px;
|
684
686
|
margin: 2px 0;
|
685
687
|
}
|
686
|
-
|
687
688
|
.dc-form-warning {
|
688
689
|
padding: 8px;
|
689
690
|
background-image: linear-gradient(to bottom, rgba(213, 143, 218, 0.1) 0, rgba(213, 143, 218, 0.5) 100%);
|
@@ -715,7 +716,7 @@ display: inline-table;
|
|
715
716
|
color: #555;
|
716
717
|
text-align: right;
|
717
718
|
vertical-align: middle;
|
718
|
-
font-weight:
|
719
|
+
font-weight: 500;
|
719
720
|
padding: 10px 2px;
|
720
721
|
width: 150px;
|
721
722
|
}
|
@@ -735,6 +736,8 @@ display: inline-table;
|
|
735
736
|
|
736
737
|
.dc-form-label.dc-color-odd, .dc-form-label.dc-color-even {background-color: transparent;}
|
737
738
|
|
739
|
+
.dc-form-label.dc-width-0 { padding: 0;}
|
740
|
+
|
738
741
|
.dc-align-left {
|
739
742
|
text-align: left;
|
740
743
|
}
|
@@ -745,7 +748,7 @@ display: inline-table;
|
|
745
748
|
.dc-form-field {
|
746
749
|
text-align: left;
|
747
750
|
padding: 4px 2px;
|
748
|
-
z-index: 10
|
751
|
+
/*z-index: 10;*/
|
749
752
|
white-space: nowrap;
|
750
753
|
text-overflow: fade;
|
751
754
|
}
|
@@ -1076,6 +1079,7 @@ font-size: 1.2em;
|
|
1076
1079
|
font-size: 1.1em;
|
1077
1080
|
line-height: 1.4em;
|
1078
1081
|
}
|
1082
|
+
|
1079
1083
|
/****** jquery ui-autocomplete widget ***************/
|
1080
1084
|
.ui-autocomplete-input {
|
1081
1085
|
padding: 8px 4px 8px 12px;
|
@@ -1137,16 +1141,7 @@ color: #000;
|
|
1137
1141
|
margin-left: 4px;
|
1138
1142
|
}
|
1139
1143
|
|
1140
|
-
|
1141
|
-
.dc-red { color: #f76;}
|
1142
|
-
.dc-red:hover { color: #c43;}
|
1143
|
-
.dc-green { color: #9c9;}
|
1144
|
-
.dc-green:hover { color: #6a6;}
|
1145
|
-
|
1146
|
-
.aui-corner-all {
|
1147
|
-
background-color: lightyellow;
|
1148
|
-
}
|
1149
|
-
|
1144
|
+
/************* login *************/
|
1150
1145
|
#dc-login {
|
1151
1146
|
position: fixed;
|
1152
1147
|
top: 50%;
|
@@ -1206,10 +1201,10 @@ color: #000;
|
|
1206
1201
|
color: white;
|
1207
1202
|
}
|
1208
1203
|
.iframe_embedded {
|
1209
|
-
padding:
|
1204
|
+
padding: 2px;
|
1210
1205
|
background-color: #fff;
|
1211
1206
|
border-radius: 2px;
|
1212
|
-
border: 2px solid #
|
1207
|
+
border: 2px solid #888;
|
1213
1208
|
}
|
1214
1209
|
|
1215
1210
|
#iframe_edit, #iframe_cms {
|
@@ -1387,6 +1382,7 @@ color: #000;
|
|
1387
1382
|
max-height: 700px;
|
1388
1383
|
overflow-y: auto;
|
1389
1384
|
max-width: 800px;
|
1385
|
+
line-height: 1.5em;
|
1390
1386
|
}
|
1391
1387
|
|
1392
1388
|
#popup .dc-help h1 {
|
@@ -1480,6 +1476,35 @@ color: #000;
|
|
1480
1476
|
display: inline-flex;
|
1481
1477
|
}
|
1482
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
|
+
|
1483
1508
|
.filter-popup {
|
1484
1509
|
background-color: #fff;
|
1485
1510
|
filter: drop-shadow(2px 2px 8px #888);
|
@@ -1549,7 +1574,7 @@ cursor: pointer;
|
|
1549
1574
|
|
1550
1575
|
#drgcms_filter h1 {
|
1551
1576
|
font-size: 1.8em;
|
1552
|
-
font-
|
1577
|
+
font-weight: 600;
|
1553
1578
|
color: rgba(44, 142, 255, 1);
|
1554
1579
|
}
|
1555
1580
|
|
@@ -1572,6 +1597,36 @@ cursor: pointer;
|
|
1572
1597
|
margin-left: 1px;
|
1573
1598
|
}
|
1574
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
|
+
|
1575
1630
|
/** Radio button input field **/
|
1576
1631
|
|
1577
1632
|
.dc-radio {
|
@@ -1613,18 +1668,13 @@ cursor: pointer;
|
|
1613
1668
|
@media only screen and (max-device-width: 600px) {
|
1614
1669
|
#body-cms {font-size: 11px;}
|
1615
1670
|
#site-top div:nth-of-type(2) {padding-top: 0 !important;}
|
1616
|
-
.dc-title {
|
1617
|
-
|
1618
|
-
|
1619
|
-
border: none;
|
1620
|
-
border-top: 2px solid #888;
|
1621
|
-
border-bottom: 2px solid #888;
|
1622
|
-
margin-top: 4px;
|
1671
|
+
.dc-title {
|
1672
|
+
font-size: 1.5em;
|
1673
|
+
padding-bottom: 4px;
|
1623
1674
|
}
|
1675
|
+
.dc-form-field { padding-bottom: 4px; }
|
1624
1676
|
|
1625
|
-
.dc-form .row-div {
|
1626
|
-
display: block;
|
1627
|
-
}
|
1677
|
+
.dc-form .row-div { display: block; }
|
1628
1678
|
.dc-form-li {margin-top: 3px;}
|
1629
1679
|
|
1630
1680
|
.dc-form-label {
|
@@ -1635,6 +1685,7 @@ cursor: pointer;
|
|
1635
1685
|
}
|
1636
1686
|
.dc-form-label label {
|
1637
1687
|
font-size: 15px;
|
1688
|
+
padding: 0;
|
1638
1689
|
}
|
1639
1690
|
|
1640
1691
|
.dc-menu { padding: 0;}
|
@@ -1670,6 +1721,13 @@ cursor: pointer;
|
|
1670
1721
|
font-size: 2em;
|
1671
1722
|
}
|
1672
1723
|
|
1724
|
+
#menu-hamburger .mi:before{
|
1725
|
+
background-color: #222;
|
1726
|
+
color: #fff;
|
1727
|
+
padding: 1px;
|
1728
|
+
border-radius: 2px;
|
1729
|
+
}
|
1730
|
+
|
1673
1731
|
.cmsedit-container {display: block;}
|
1674
1732
|
.cmsedit-container #cms-menu {display: none;}
|
1675
1733
|
.cmsedit-container #cms-menu.visible {
|
@@ -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,6 +108,10 @@ 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)
|
@@ -270,11 +274,8 @@ def create
|
|
270
274
|
# create document
|
271
275
|
if params['id'].nil?
|
272
276
|
# Prevent double form submit
|
273
|
-
|
274
|
-
session[:form_time_stamp] ||= 0
|
275
|
-
return index if params[:form_time_stamp] <= session[:form_time_stamp] && !Rails.env.test?
|
277
|
+
return index if double_form_submit?
|
276
278
|
|
277
|
-
session[:form_time_stamp] = params[:form_time_stamp]
|
278
279
|
create_new_empty_record
|
279
280
|
if save_data
|
280
281
|
flash[:info] = t('drgcms.doc_saved')
|
@@ -549,14 +550,14 @@ def check_authorization
|
|
549
550
|
end
|
550
551
|
dc_form_read
|
551
552
|
|
552
|
-
# Permissions can be also defined
|
553
|
+
# Permissions can be also defined in form
|
553
554
|
#TODO So far only can_view is used. Think about if using other permissions has sense
|
554
555
|
can_view = @form.dig('permissions','can_view')
|
555
|
-
if can_view.nil?
|
556
|
+
if can_view.nil? || can_view.split(',').any? { |role| dc_user_has_role(role) }
|
556
557
|
extend_with_control_module
|
557
558
|
else
|
558
559
|
render(action: 'error', locals: { error: t('drgcms.not_authorized')} )
|
559
|
-
end
|
560
|
+
end
|
560
561
|
end
|
561
562
|
|
562
563
|
########################################################################
|
@@ -716,10 +717,10 @@ def save_data
|
|
716
717
|
|
717
718
|
form_fields.each do |v|
|
718
719
|
session[:form_processing] = v['name'] # for debuging
|
719
|
-
next if v['type'].nil?
|
720
|
-
v['type'].match('embedded')
|
721
|
-
(params[:edit_only]
|
722
|
-
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
|
723
724
|
!@record.respond_to?(v['name']) # there are temporary fields on the form
|
724
725
|
# good to know! How to get type of field @record.fields[v['name']].type
|
725
726
|
# return value from form field definition
|
@@ -736,7 +737,7 @@ def save_data
|
|
736
737
|
|
737
738
|
# save data
|
738
739
|
changes = @record.changes
|
739
|
-
update_standards
|
740
|
+
update_standards if changes.size > 0 # update only if there has been some changes
|
740
741
|
if (saved = @record.save)
|
741
742
|
operation = @record.new_record? ? :new : :update
|
742
743
|
save_journal(operation, @record.previous_changes)
|
@@ -751,9 +752,9 @@ end
|
|
751
752
|
# in select_fields and deny_fields
|
752
753
|
########################################################################
|
753
754
|
def separated_to_symbols(data)
|
754
|
-
data.chomp.split(',').map {
|
755
|
+
data.chomp.split(',').map { _1.strip.downcase.to_sym }
|
755
756
|
end
|
756
|
-
|
757
|
+
|
757
758
|
########################################################################
|
758
759
|
# Will process only (select_fields) and without (deny_fields) option
|
759
760
|
########################################################################
|
@@ -877,19 +878,14 @@ def process_collections #:nodoc
|
|
877
878
|
end
|
878
879
|
|
879
880
|
########################################################################
|
880
|
-
# 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.
|
881
883
|
########################################################################
|
882
884
|
def process_in_memory #:nodoc
|
883
885
|
@records = []
|
884
886
|
# result set is defined by filter method in control object
|
885
|
-
if (method = @form['result_set']['filter'])
|
886
|
-
send(method) if respond_to?(method)
|
887
|
-
end
|
888
|
-
# result set is defined by class method
|
889
|
-
if (klass_method = @form['result_set']['filter_method'])
|
890
|
-
_klass, method = klass_method.split('.')
|
891
|
-
klass = _klass.classify.constantize
|
892
|
-
@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)
|
893
889
|
end
|
894
890
|
# ensure that record has id field
|
895
891
|
if @records.size > 0
|
@@ -898,4 +894,41 @@ def process_in_memory #:nodoc
|
|
898
894
|
false
|
899
895
|
end
|
900
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
|
+
|
901
934
|
end
|
@@ -85,7 +85,7 @@ def dc_get_site
|
|
85
85
|
uri = URI.parse(request.url)
|
86
86
|
cache_key = ['dc_site', uri.host]
|
87
87
|
|
88
|
-
@site =
|
88
|
+
@site = DrgCms.cache_read(cache_key)
|
89
89
|
return @site if @site
|
90
90
|
|
91
91
|
@site = DcSite.find_by(name: uri.host)
|
@@ -100,7 +100,7 @@ def dc_get_site
|
|
100
100
|
@site = DcSite.find_by(name: @site.alias_for) if @site
|
101
101
|
end
|
102
102
|
@site = nil if @site && !@site.active # site is disabled
|
103
|
-
|
103
|
+
DrgCms.cache_write(cache_key, @site)
|
104
104
|
end
|
105
105
|
|
106
106
|
##########################################################################
|
@@ -160,15 +160,10 @@ protected
|
|
160
160
|
# if dc_user_can(DcPermission::CAN_VIEW, params[:table]) then ...
|
161
161
|
############################################################################
|
162
162
|
def dc_user_can(permission, table = params[:table])
|
163
|
-
table = table.underscore
|
164
|
-
cache_key = ['dc_permission', table, dc_get_site.id]
|
165
|
-
permissions = DrgCms.cache_read(cache_key)
|
166
|
-
if permissions.nil?
|
167
|
-
permissions = DcPermission.permissions_for_table(table)
|
168
|
-
DrgCms.cache_write(cache_key, permissions)
|
169
|
-
end
|
170
163
|
return false if session[:user_roles].nil?
|
171
164
|
|
165
|
+
table = table.underscore
|
166
|
+
permissions = DrgCms.cache_read(['dc_permission', table, dc_get_site.id]) { DcPermission.permissions_for_table(table) }
|
172
167
|
session[:user_roles].inject(false) { |r, rule| break true if permissions[rule] && permissions[rule] >= permission }
|
173
168
|
end
|
174
169
|
|
@@ -800,7 +795,7 @@ private
|
|
800
795
|
#
|
801
796
|
# @return [Boolean] : True if redis cache store is active
|
802
797
|
########################################################################
|
803
|
-
def
|
798
|
+
def xredis_cache_store?
|
804
799
|
(Rails.application.config.cache_store.first == :redis_cache_store) rescue false
|
805
800
|
end
|
806
801
|
|
@@ -809,31 +804,33 @@ end
|
|
809
804
|
#
|
810
805
|
# @return [Object] : Redis object
|
811
806
|
########################################################################
|
812
|
-
def
|
807
|
+
def xredis
|
813
808
|
Rails.cache.redis
|
814
809
|
end
|
815
810
|
|
816
811
|
########################################################################
|
817
|
-
# Extends
|
812
|
+
# Extends DRG CMS form file. Extended file is processed first and then merged
|
818
813
|
# with code in this form file. Form can extend only single form file.
|
819
814
|
#
|
820
815
|
# [Parameters:]
|
821
816
|
# [extend_option] : Value of @form['extend'] option
|
822
817
|
########################################################################
|
823
818
|
def dc_form_extend(extend_option)
|
824
|
-
|
825
|
-
|
826
|
-
|
827
|
-
|
828
|
-
|
829
|
-
|
830
|
-
@form
|
831
|
-
|
819
|
+
extend_option.chomp.split(',').each do |a_file|
|
820
|
+
form_file_name = CmsHelper.form_file_find(a_file.strip)
|
821
|
+
@form_js << read_js_drg_form(form_file_name)
|
822
|
+
form = YAML.load_file( form_file_name )
|
823
|
+
@form = CmsHelper.forms_merge(form, @form)
|
824
|
+
# If combined form contains tabs and fields options, move fields into fields tab
|
825
|
+
if @form.dig('form', 'tabs') && @form.dig('form', 'fields')
|
826
|
+
@form['form']['tabs']['fields'] = @form['form']['fields']
|
827
|
+
@form['form']['fields'] = nil
|
828
|
+
end
|
832
829
|
end
|
833
830
|
end
|
834
831
|
|
835
832
|
########################################################################
|
836
|
-
# Include code from another
|
833
|
+
# Include code from another DRG CMS form file. Included code is merged
|
837
834
|
# with current form file code. Form can include more than one other DRGCMS forms.
|
838
835
|
#
|
839
836
|
# [Parameters:]
|