drg_cms 0.5.52.9 → 0.5.52.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/assets/javascripts/drg_cms/drg_cms.js +122 -2
- data/app/assets/javascripts/drg_cms_application.js +1 -0
- data/app/assets/stylesheets/drg_cms/drg_cms.css +4 -0
- data/app/assets/stylesheets/drg_cms/select-multiple.css +1 -1
- data/app/controllers/browse_models_control.rb +1 -1
- data/app/controllers/cmsedit_controller.rb +8 -8
- data/app/controllers/dc_application_controller.rb +1 -1
- data/app/controllers/dc_common_controller.rb +9 -14
- data/app/forms/dc_site.yml +5 -5
- data/app/helpers/cmsedit_helper.rb +12 -6
- data/app/helpers/dc_application_helper.rb +41 -4
- data/app/helpers/dc_menu_renderer.rb +2 -0
- data/app/helpers/dc_simple_menu_renderer.rb +22 -26
- data/app/models/concerns/dc_site_concern.rb +1 -1
- data/app/models/concerns/dc_user_concern.rb +2 -1
- data/app/models/dc_design.rb +3 -2
- data/app/models/dc_filter.rb +7 -6
- data/app/models/drgcms_form_fields.rb +69 -2
- data/drg_cms.gemspec +1 -2
- data/lib/drg_cms/engine.rb +1 -2
- data/lib/drg_cms/version.rb +24 -1
- data/lib/generators/new_drg_form/new_drg_form_generator.rb +10 -5
- data/lib/tasks/browse_models.rake +4 -4
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 637c9ceaf9353fced28bc05ec02a3ad516d91f54
|
4
|
+
data.tar.gz: 949139ee0f5a5351741e94d74d5e7e1502426946
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c67a0b1046125b1408fa8604b88d5b9993d29832fbe6daac9d829b4f6c2bb7537049da1636eefd5f5d3aaebdc84e3ef0ed5f9dd9abb56d039a857b509367573c
|
7
|
+
data.tar.gz: 44e2b256013e943de0edb9e96a947e4deebca64a24686809b2b70ed4d1d9edb827aafb0a300473dbfde0888f6044108150eeb84517ca822529f4b69773083499
|
@@ -51,6 +51,38 @@ remove_background_from_iframe = function(obj) {
|
|
51
51
|
'</style>';
|
52
52
|
$(head).append(css);
|
53
53
|
};
|
54
|
+
|
55
|
+
format_number_field = function(e) {
|
56
|
+
var decimals = e.attr("data-decimal") || 2;
|
57
|
+
var delimiter = e.attr("data-delimiter") || '.';
|
58
|
+
var separator = e.attr("data-separator") || ',';
|
59
|
+
var currency = e.attr("data-currency") || '';
|
60
|
+
var whole = e.val().split(separator)[0];
|
61
|
+
var dec = e.val().split(separator)[1];
|
62
|
+
// save value to hidden field which will be used for return
|
63
|
+
var field = '#' + e.attr("id").slice(0,-1);
|
64
|
+
var value = e.val().replace(delimiter,'.');
|
65
|
+
|
66
|
+
$(field).val( parseFloat(value).toFixed(decimals) );
|
67
|
+
|
68
|
+
// decimal part
|
69
|
+
if (dec == null) dec = '';
|
70
|
+
dec = dec.substring(0, decimals, dec);
|
71
|
+
while (dec.length < decimals) dec = dec + '0';
|
72
|
+
// whole part
|
73
|
+
if (whole == null || whole == '') whole = '0';
|
74
|
+
var ar = [];
|
75
|
+
|
76
|
+
while (whole.length > 0) {
|
77
|
+
var pos1 = whole.length - 3
|
78
|
+
if (pos1 < 0) pos1 = 0;
|
79
|
+
ar.unshift(whole.substr(pos1,3));
|
80
|
+
whole = whole.slice(0, -3);
|
81
|
+
};
|
82
|
+
|
83
|
+
if (delimiter !== '') whole = ar.join(delimiter);
|
84
|
+
e.val(whole + separator + dec + currency);
|
85
|
+
};
|
54
86
|
|
55
87
|
/*******************************************************************
|
56
88
|
* Activate jquery UI tooltip. This needs jquery.ui >= 1.9
|
@@ -80,6 +112,8 @@ $(function() {
|
|
80
112
|
* msg_warn: will display warning message.
|
81
113
|
* msg_info: will display informational message.
|
82
114
|
*
|
115
|
+
* popup: will display popup message
|
116
|
+
*
|
83
117
|
* #div_divname : will replace divname with value
|
84
118
|
* #div+_divname : will append value to divname
|
85
119
|
* #+div_divname : will prepend value to divname
|
@@ -126,6 +160,11 @@ process_json_result = function(json) {
|
|
126
160
|
$('.'+selector).html(val);
|
127
161
|
}
|
128
162
|
break;
|
163
|
+
// display popup message
|
164
|
+
case 'popup':
|
165
|
+
$('#popup').html(val);
|
166
|
+
$('#popup').bPopup({ speed: 650, transition: 'slideDown' });
|
167
|
+
|
129
168
|
// update div
|
130
169
|
case '#div+':
|
131
170
|
$('#'+what).append(val);
|
@@ -306,9 +345,14 @@ $(document).ready( function() {
|
|
306
345
|
* Process Ajax call on cmsedit form actions
|
307
346
|
*******************************************************************/
|
308
347
|
$('.dc-link-ajax').on('click', function(e) {
|
348
|
+
// check HTML5 validations
|
349
|
+
if (!$("form")[0].checkValidity() ) {
|
350
|
+
$("form")[0].reportValidity();
|
351
|
+
return false;
|
352
|
+
}
|
309
353
|
var target = e.target;
|
310
354
|
var req = target.getAttribute("data-request");
|
311
|
-
|
355
|
+
// Get values from elements on the page:
|
312
356
|
if (req == "script") {
|
313
357
|
eval (target.getAttribute("data-script"));
|
314
358
|
return false;
|
@@ -625,8 +669,84 @@ element = $(this).find(':first').attr('id');
|
|
625
669
|
.mouseleave(function() {
|
626
670
|
console.log("leave");
|
627
671
|
});
|
628
|
-
|
629
672
|
|
673
|
+
/*******************************************************************
|
674
|
+
* number_field type entered
|
675
|
+
*******************************************************************/
|
676
|
+
$('.dc-number').on('focus', function(e) {
|
677
|
+
var separator = $(this).attr("data-separator") || ',';
|
678
|
+
var field = '#' + $(this).attr("id").slice(0,-1);
|
679
|
+
var value = $(field).val().replace('.',separator);
|
680
|
+
$(this).val( value );
|
681
|
+
$(this).select();
|
682
|
+
});
|
683
|
+
|
684
|
+
/*******************************************************************
|
685
|
+
* number_field type leaved
|
686
|
+
*******************************************************************/
|
687
|
+
$('.dc-number').on('focusout', function(e) {
|
688
|
+
// format_number_field($(this));
|
689
|
+
|
690
|
+
var decimals = $(this).attr("data-decimal") || 2;
|
691
|
+
var delimiter = $(this).attr("data-delimiter") || '.';
|
692
|
+
var separator = $(this).attr("data-separator") || ',';
|
693
|
+
var currency = $(this).attr("data-currency") || '';
|
694
|
+
var whole = this.value.split(separator)[0];
|
695
|
+
var dec = this.value.split(separator)[1];
|
696
|
+
// save value to hidden field which will be used for return
|
697
|
+
var field = '#' + $(this).attr("id").slice(0,-1);
|
698
|
+
var value = this.value.replace(separator,'.');
|
699
|
+
// remove negative sign and add at the end
|
700
|
+
var sign = whole.substr(0,1);
|
701
|
+
if (sign == '-') {
|
702
|
+
whole = whole.substr(1,20);
|
703
|
+
} else {
|
704
|
+
sign = '';
|
705
|
+
}
|
706
|
+
|
707
|
+
$(field).val( parseFloat(value).toFixed(decimals) );
|
708
|
+
|
709
|
+
// decimal part
|
710
|
+
if (dec == null) dec = '';
|
711
|
+
dec = dec.substring(0, decimals, dec);
|
712
|
+
while (dec.length < decimals) dec = dec + '0';
|
713
|
+
// whole part
|
714
|
+
if (whole == null || whole == '') whole = '0';
|
715
|
+
var ar = [];
|
716
|
+
while (whole.length > 0) {
|
717
|
+
var pos1 = whole.length - 3
|
718
|
+
if (pos1 < 0) pos1 = 0;
|
719
|
+
ar.unshift(whole.substr(pos1,3));
|
720
|
+
whole = whole.slice(0, -3);
|
721
|
+
};
|
722
|
+
|
723
|
+
if (delimiter !== '') whole = ar.join(delimiter);
|
724
|
+
$(this).val(sign + whole + separator + dec + currency);
|
725
|
+
});
|
726
|
+
|
727
|
+
/*******************************************************************
|
728
|
+
* number_field type keypressed
|
729
|
+
*******************************************************************/
|
730
|
+
$('.dc-number').on('keydown', function(e) {
|
731
|
+
// Minus sign. Put it on first place
|
732
|
+
if (e.which == 109) {
|
733
|
+
if($(this).val().substr(0,1) == '-') {
|
734
|
+
$(this).val( $(this).val().substr(1,20));
|
735
|
+
} else {
|
736
|
+
$(this).val( '-' + $(this).val());
|
737
|
+
}
|
738
|
+
e.preventDefault();
|
739
|
+
}
|
740
|
+
// Enter. Save value before Enter is processed
|
741
|
+
if (e.which == 13) {
|
742
|
+
var delimiter = $(this).attr("data-delimiter") || '.';
|
743
|
+
var decimals = $(this).attr("data-decimal") || 2;
|
744
|
+
var value = $(this).val().replace(delimiter,'.');
|
745
|
+
var field = '#' + $(this).attr("id").slice(0,-1);
|
746
|
+
|
747
|
+
$(field).val( parseFloat(value).toFixed(decimals) );
|
748
|
+
}
|
749
|
+
});
|
630
750
|
});
|
631
751
|
|
632
752
|
/*******************************************************************
|
@@ -28,7 +28,7 @@
|
|
28
28
|
-ms-transition: border linear 0.2s, box-shadow linear 0.2s;
|
29
29
|
-o-transition: border linear 0.2s, box-shadow linear 0.2s;
|
30
30
|
transition: border linear 0.2s, box-shadow linear 0.2s;
|
31
|
-
border:
|
31
|
+
border: 2px solid #ddd;
|
32
32
|
-webkit-border-radius: 3px;
|
33
33
|
-moz-border-radius: 3px;
|
34
34
|
border-radius: 3px;
|
@@ -70,7 +70,7 @@ end
|
|
70
70
|
######################################################################
|
71
71
|
# List field definition for single model
|
72
72
|
######################################################################
|
73
|
-
def
|
73
|
+
def all_fields()
|
74
74
|
@records = []
|
75
75
|
model = params[:id].classify.constantize
|
76
76
|
document = model.new
|
@@ -779,16 +779,16 @@ end
|
|
779
779
|
# to get all edit fields on form. This method does it. Subroutine of save_data.
|
780
780
|
########################################################################
|
781
781
|
def fields_on_form() #:nodoc:
|
782
|
-
|
782
|
+
form_fields = []
|
783
783
|
if @form['form']['fields']
|
784
784
|
# read only field elements (key is Integer)
|
785
|
-
@form['form']['fields'].each {|key,options|
|
785
|
+
@form['form']['fields'].each {|key,options| form_fields << options if key.class == Integer }
|
786
786
|
else
|
787
787
|
@form['form']['tabs'].keys.each do |tab|
|
788
|
-
@form['form']['tabs'][tab].each {|key,options|
|
788
|
+
@form['form']['tabs'][tab].each {|key,options| form_fields << options if key.class == Integer }
|
789
789
|
end
|
790
790
|
end
|
791
|
-
|
791
|
+
form_fields
|
792
792
|
end
|
793
793
|
|
794
794
|
########################################################################
|
@@ -796,17 +796,17 @@ end
|
|
796
796
|
# It also saves journal data and calls before_save and after_save callbacks.
|
797
797
|
########################################################################
|
798
798
|
def save_data
|
799
|
-
|
800
|
-
return true if
|
799
|
+
form_fields = fields_on_form()
|
800
|
+
return true if form_fields.size == 0
|
801
801
|
#
|
802
|
-
|
802
|
+
form_fields.each do |v|
|
803
803
|
session[:form_processing] = v['name'] # for debuging
|
804
804
|
next if v['type'].nil? or
|
805
805
|
v['type'].match('embedded') or # don't wipe embedded types
|
806
806
|
(params[:edit_only] and params[:edit_only] != v['name']) or # otherwise other fields would be wiped
|
807
807
|
v['readonly'] or # fields with readonly option don't return value and would be wiped
|
808
808
|
!@record.respond_to?(v['name']) # there can be temporary fields on the form
|
809
|
-
# good to know
|
809
|
+
# good to know! How to get type of field @record.fields[v['name']].type
|
810
810
|
# return value from form field definition
|
811
811
|
value = DrgcmsFormFields.const_get(v['type'].camelize).get_data(params, v['name'])
|
812
812
|
@record.send("#{v['name']}=", value)
|
@@ -327,7 +327,7 @@ def dc_process_default_request()
|
|
327
327
|
dc_set_options(@site.settings)
|
328
328
|
# HOMEPAGE. When no parameters is set
|
329
329
|
params[:path] = @site.homepage_link if params[:id].nil? and params[:path].nil?
|
330
|
-
@options[:path] = params[:path].split('/')
|
330
|
+
@options[:path] = params[:path].to_s.split('/')
|
331
331
|
params[:path] = @options[:path].first if @options[:path].size > 1
|
332
332
|
# some other process request. It should fail if not defined
|
333
333
|
return send(@site.request_processor) unless @site.request_processor.blank?
|
@@ -187,8 +187,7 @@ end
|
|
187
187
|
########################################################################
|
188
188
|
def copy_clipboard
|
189
189
|
# Only administrators can perform this operation
|
190
|
-
return render(plain: t('drgcms.not_authorized') ) unless
|
191
|
-
#
|
190
|
+
return render(plain: t('drgcms.not_authorized') ) unless dc_user_can(DcPermission::CAN_ADMIN,'dc_site')
|
192
191
|
respond_to do |format|
|
193
192
|
# just open new window to same url and come back with html request
|
194
193
|
format.json { dc_render_ajax(operation: 'window', url: request.url ) }
|
@@ -209,8 +208,7 @@ end
|
|
209
208
|
########################################################################
|
210
209
|
def paste_clipboard
|
211
210
|
# Only administrators can perform this operation
|
212
|
-
return render(plain: t('drgcms.not_authorized') )
|
213
|
-
|
211
|
+
return render(plain: t('drgcms.not_authorized') ) unless dc_user_can(DcPermission::CAN_ADMIN,'dc_site')
|
214
212
|
result = ''
|
215
213
|
respond_to do |format|
|
216
214
|
# just open new window to same url and come back with html request
|
@@ -299,10 +297,11 @@ end
|
|
299
297
|
# Fills session with data related to successful login.
|
300
298
|
####################################################################
|
301
299
|
def fill_login_data(user, remember_me)
|
302
|
-
session[:user_id]
|
303
|
-
session[:user_name]
|
304
|
-
session[:edit_mode]
|
300
|
+
session[:user_id] = user.id
|
301
|
+
session[:user_name] = user.name
|
302
|
+
session[:edit_mode] = 0
|
305
303
|
session[:user_roles] = []
|
304
|
+
|
306
305
|
# special for SUPERADMIN
|
307
306
|
sa = DcPolicyRole.find_by(system_name: 'superadmin')
|
308
307
|
if sa and (role = user.dc_user_roles.find_by(dc_policy_role_id: sa.id))
|
@@ -310,6 +309,9 @@ def fill_login_data(user, remember_me)
|
|
310
309
|
session[:edit_mode] = 2
|
311
310
|
return
|
312
311
|
end
|
312
|
+
# Every user has guest role
|
313
|
+
guest = DcPolicyRole.find_by(system_name: 'guest')
|
314
|
+
session[:user_roles] << guest.id if guest
|
313
315
|
# read default policy from site
|
314
316
|
default_policy = dc_get_site().dc_policies.find_by(is_default: true)
|
315
317
|
# load user roles
|
@@ -324,13 +326,6 @@ def fill_login_data(user, remember_me)
|
|
324
326
|
session[:edit_mode] = 1 if policy_role.permission > 1
|
325
327
|
session[:user_roles] << role.dc_policy_role_id
|
326
328
|
end
|
327
|
-
# Add default guest role if no role set
|
328
|
-
# This was previously in dc_user_can. I belive it should be here.
|
329
|
-
#TODO This might not be the best idea. Check in the future.
|
330
|
-
if session[:user_roles].size == 0
|
331
|
-
guest = DcPolicyRole.find_by(:system_name => 'guest')
|
332
|
-
session[:user_roles] << guest.id if guest
|
333
|
-
end
|
334
329
|
# Save remember me cookie if not CMS user and remember me is selected
|
335
330
|
if session[:edit_mode] == 0 and remember_me
|
336
331
|
cookies.signed[:remember_me] = { :value => user.id, :expires => 180.days.from_now}
|
data/app/forms/dc_site.yml
CHANGED
@@ -100,11 +100,11 @@ form:
|
|
100
100
|
name: menu_class
|
101
101
|
type: text_field
|
102
102
|
size: 20
|
103
|
-
60:
|
104
|
-
name: menu_name
|
105
|
-
type: text_with_select
|
106
|
-
eval: dc_choices4(@record.menu_class,'description','name')
|
107
|
-
size: 30
|
103
|
+
# 60:
|
104
|
+
# name: menu_name
|
105
|
+
# type: text_with_select
|
106
|
+
# eval: dc_choices4(@record.menu_class,'description','name')
|
107
|
+
# size: 30
|
108
108
|
70:
|
109
109
|
name: menu_id
|
110
110
|
type: select
|
@@ -364,12 +364,18 @@ def dc_format_value(value, format=nil)
|
|
364
364
|
# :TODO: Enable formating numbers.
|
365
365
|
return '' if value.nil?
|
366
366
|
klass = value.class.to_s
|
367
|
-
|
367
|
+
case when klass.match('Time') then
|
368
368
|
format ||= t('time.formats.default')
|
369
369
|
value.strftime(format)
|
370
|
-
|
370
|
+
when klass.match('Date') then
|
371
371
|
format ||= t('date.formats.default')
|
372
372
|
value.strftime(format)
|
373
|
+
when format.to_s[0] == 'N' then
|
374
|
+
dec = format[1].blank? ? nil : format[1].to_i
|
375
|
+
sep = format[2].blank? ? nil : format[2]
|
376
|
+
del = format[3].blank? ? nil : format[3]
|
377
|
+
cur = format[4].blank? ? nil : format[4]
|
378
|
+
dc_format_number(value, dec, sep, del, cur)
|
373
379
|
else
|
374
380
|
value.to_s
|
375
381
|
end
|
@@ -675,7 +681,7 @@ end
|
|
675
681
|
############################################################################
|
676
682
|
# Creates input fields for one tab. Subroutine of dc_fields_for_form.
|
677
683
|
############################################################################
|
678
|
-
def dc_fields_for_tab(
|
684
|
+
def dc_fields_for_tab(fields_on_tab) #:nodoc:
|
679
685
|
@js ||= ''
|
680
686
|
html = '<div class="dc-form">'
|
681
687
|
labels_pos = dc_check_and_default(@form['form']['labels_pos'], 'right', ['top','left','right'])
|
@@ -687,7 +693,7 @@ def dc_fields_for_tab(fields) #:nodoc:
|
|
687
693
|
# form_options = fields.select {|field| field.class != Integer }
|
688
694
|
# columns = form_options.try(:[],'columns') || 1
|
689
695
|
# Select form fields and sort them by key
|
690
|
-
form_fields =
|
696
|
+
form_fields = fields_on_tab.select {|field| field.class == Integer }
|
691
697
|
form_fields.to_a.sort.each do |element|
|
692
698
|
options = element.last
|
693
699
|
session[:form_processing] = "form:fields: #{element.first}=#{options}"
|
@@ -761,9 +767,9 @@ end
|
|
761
767
|
def dc_fields_for_form()
|
762
768
|
html, tabs, tdata = '',[], ''
|
763
769
|
# Only fields defined
|
764
|
-
if (
|
770
|
+
if (form_fields = @form['form']['fields'])
|
765
771
|
html << "<div id='data_fields' " + (@form['form']['height'] ? "style=\"height: #{@form['form']['height']}px;\">" : '>')
|
766
|
-
html << dc_fields_for_tab(
|
772
|
+
html << dc_fields_for_tab(form_fields) + '</div>'
|
767
773
|
else
|
768
774
|
# there are multiple tabs on form
|
769
775
|
first = true # first tab
|
@@ -766,10 +766,10 @@ end
|
|
766
766
|
############################################################################
|
767
767
|
def dc_name4_id(model, field, field_name, id=nil)
|
768
768
|
return '' if id.nil?
|
769
|
-
field_name
|
769
|
+
field_name ||= 'id'
|
770
770
|
model = model.strip.classify.constantize if model.class == String
|
771
771
|
rec = Mongoid::QueryCache.cache { model.find_by(field_name.strip.to_sym => id) }
|
772
|
-
rec.nil? ? '' : rec
|
772
|
+
rec.nil? ? '' : (rec.send(field) rescue 'not defined')
|
773
773
|
end
|
774
774
|
|
775
775
|
############################################################################
|
@@ -813,6 +813,44 @@ def dc_date_time(value, format) #:nodoc:
|
|
813
813
|
dc_format_date_time(value, format)
|
814
814
|
end
|
815
815
|
|
816
|
+
############################################################################
|
817
|
+
# Returns html code for displaying formatted number.
|
818
|
+
#
|
819
|
+
# Parameters:
|
820
|
+
# [value] Numeric number.
|
821
|
+
# [decimals] Integer. Number of decimals
|
822
|
+
# [separator] String. Decimals separator
|
823
|
+
# [delimiter] String. Thousands delimiter.
|
824
|
+
# [currency] String. Currency symbol if applied to result string.
|
825
|
+
############################################################################
|
826
|
+
def dc_format_number(value=0, decimals=nil, separator=nil, delimiter=nil, currency=nil)
|
827
|
+
decimals ||= I18n.t('number.currency.format.precision')
|
828
|
+
separator ||= I18n.t('number.currency.format.separator')
|
829
|
+
separator = '' if decimals == 0
|
830
|
+
delimiter ||= I18n.t('number.currency.format.delimiter')
|
831
|
+
whole,dec = value.to_s.split('.')
|
832
|
+
whole = '0' if whole.blank?
|
833
|
+
# remove and remember sign
|
834
|
+
sign = whole[0,1]
|
835
|
+
if sign == '-'
|
836
|
+
whole = whole[1,20]
|
837
|
+
else
|
838
|
+
sign = ''
|
839
|
+
end
|
840
|
+
# format decimals
|
841
|
+
dec ||= '0'
|
842
|
+
dec = dec[0,decimals]
|
843
|
+
while dec.size < decimals do dec += '0' end
|
844
|
+
# slice whole on chunks of 3
|
845
|
+
ar = []
|
846
|
+
while whole.size > 0 do
|
847
|
+
n = whole.size >=3 ? 3 : whole.size
|
848
|
+
ar << whole.slice!(n*-1,n)
|
849
|
+
end
|
850
|
+
# put it all back and format
|
851
|
+
"#{sign}#{ar.reverse.join(delimiter)}#{separator}#{dec}"
|
852
|
+
end
|
853
|
+
|
816
854
|
####################################################################
|
817
855
|
# Parse site name from url and return dc_site document. Site document will be cached in
|
818
856
|
# @site variable.
|
@@ -1056,7 +1094,6 @@ def dc_user_can_view(ctrl, policy_id)
|
|
1056
1094
|
policy_id = nil unless policy_id.class == BSON::ObjectId
|
1057
1095
|
#
|
1058
1096
|
site = ctrl.site
|
1059
|
-
policies = site.dc_policies
|
1060
1097
|
policies = if site.inherit_policy.blank?
|
1061
1098
|
site.dc_policies
|
1062
1099
|
else
|
@@ -1075,7 +1112,7 @@ def dc_user_can_view(ctrl, policy_id)
|
|
1075
1112
|
return false, 'Access policy not found for part!' unless part_policy
|
1076
1113
|
part_policy.dc_policy_rules.to_a.each { |v| permissions[v.dc_policy_role_id] = v.permission }
|
1077
1114
|
end
|
1078
|
-
# apply guest role if
|
1115
|
+
# apply guest role if no roles defined
|
1079
1116
|
if ctrl.session[:user_roles].nil?
|
1080
1117
|
role = Mongoid::QueryCache.cache { DcPolicyRole.find_by(system_name: 'guest', active: true) }
|
1081
1118
|
return false, 'System guest role not defined!' unless role
|
@@ -110,6 +110,8 @@ end
|
|
110
110
|
# [item] MenuItem.
|
111
111
|
########################################################################
|
112
112
|
def link_4menu(item)
|
113
|
+
# just horizontal line
|
114
|
+
return item.caption if item.caption == '<hr>'
|
113
115
|
# prepand to link
|
114
116
|
link = if !item.link_prepend.blank?
|
115
117
|
item.link_prepend
|
@@ -226,35 +226,31 @@ end
|
|
226
226
|
def as_dropdown
|
227
227
|
html = link_4edit
|
228
228
|
return "#{html}#{@opts[:name]}<br>Menu not found!" if @menu.nil?
|
229
|
-
#
|
230
|
-
items = @menu.dc_simple_menu_items.sort {|a,b| a.order <=> b.order}
|
231
|
-
@selected = find_selected
|
232
|
-
|
233
|
-
html << "<div id='#{@menu.div_name}'>" unless @menu.div_name.blank?
|
234
|
-
html << '<table><tr>'
|
235
229
|
# sort items acording to :order
|
230
|
+
items = @menu.dc_simple_menu_items.where(active: true).order_by(order: 1)
|
231
|
+
@selected = find_selected
|
232
|
+
div_name = (@menu.div_name.blank? ? @menu.name : @menu.div_name ).downcase
|
233
|
+
|
234
|
+
html << "<div id='#{div_name}'><ul>"
|
236
235
|
items.each do |item|
|
237
|
-
next unless item.active
|
238
236
|
# menu can be hidden from user
|
239
237
|
can_view, msg = dc_user_can_view(@parent, item)
|
240
238
|
next unless can_view
|
241
239
|
#
|
242
|
-
|
243
|
-
html << "
|
244
|
-
y = YAML.load(item.submenu)
|
245
|
-
if y.size > 0
|
240
|
+
selected = item.id == @selected.id ? 'selected' : ''
|
241
|
+
html << "<li class=\"#{selected}\">#{ link_4menu(item) }"
|
242
|
+
y = YAML.load(item.submenu) rescue {}
|
243
|
+
if y and y.size > 0
|
246
244
|
html << '<ul>'
|
247
245
|
y.each do |k,v|
|
248
|
-
|
246
|
+
v ||= k # defined as array
|
247
|
+
html << (v['title'] == '<hr>' ? '<hr>' : "<li>#{@parent.link_to(v['title'], v['link'], {target: v['target']})}</li>" )
|
249
248
|
end
|
250
249
|
html << '</ul>'
|
251
250
|
end
|
252
|
-
html << "
|
253
|
-
|
251
|
+
html << "</li>"
|
254
252
|
end
|
255
|
-
html << '</
|
256
|
-
html << '</div>' unless @menu.div_name.blank?
|
257
|
-
html
|
253
|
+
html << '</ul></div>'
|
258
254
|
end
|
259
255
|
|
260
256
|
########################################################################
|
@@ -273,10 +269,9 @@ def default
|
|
273
269
|
div_name = (@menu.div_name.to_s.size > 2 ? @menu.div_name : @menu.name).downcase
|
274
270
|
html << "<div class=\"#{div_name}\">"
|
275
271
|
html << "<ul class=\"ul-#{div_name}\">"
|
276
|
-
#
|
277
|
-
items = @menu.dc_simple_menu_items.
|
272
|
+
#
|
273
|
+
items = @menu.dc_simple_menu_items.where(active: true).order_by(order: 1)
|
278
274
|
items.each do |item|
|
279
|
-
next unless item.active
|
280
275
|
# menu can be hidden from user
|
281
276
|
can_view, msg = dc_user_can_view(@parent, item)
|
282
277
|
next unless can_view
|
@@ -286,15 +281,16 @@ def default
|
|
286
281
|
end
|
287
282
|
html << "</ul></div>"
|
288
283
|
# submenu
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
if y.class == Hash
|
284
|
+
y = YAML.load(@selected.submenu) rescue {}
|
285
|
+
if y and y.size > 0
|
286
|
+
html << "\n<div class=\"sub-#{div_name}\"><ul class=\"ul-sub-#{div_name}\">"
|
293
287
|
y.each do |k,v|
|
294
|
-
|
288
|
+
v ||= k # defined as array
|
289
|
+
html << "<li class=\"li-sub-#{div_name}\">#{@parent.link_to(v['title'], v['link'])}</li>\n"
|
295
290
|
end
|
291
|
+
html << "</ul></div>\n"
|
296
292
|
end
|
297
|
-
html
|
293
|
+
html
|
298
294
|
end
|
299
295
|
|
300
296
|
|
@@ -93,7 +93,7 @@ end
|
|
93
93
|
# Return choices for select for site_id
|
94
94
|
########################################################################
|
95
95
|
def self.choices4_site
|
96
|
-
result = all.inject([]) { |r,site| r << [ (site.active ? '' : t('drgcms.disabled') ) + site.name, site._id] }
|
96
|
+
result = all.inject([]) { |r,site| r << [ (site.active ? '' : I18n.t('drgcms.disabled') ) + site.name, site._id] }
|
97
97
|
result.sort {|a,b| a[0] <=> b[0]}
|
98
98
|
end
|
99
99
|
|
@@ -74,10 +74,11 @@ has_secure_password
|
|
74
74
|
index( { username: 1 }, { unique: true } )
|
75
75
|
index( { email: 1 }, { unique: true } )
|
76
76
|
index 'dc_user_roles.dc_policy_role_id' => 1
|
77
|
-
|
78
77
|
index 'members' => 1
|
79
78
|
|
80
79
|
validates_length_of :username, minimum: 4
|
80
|
+
validates :username, uniqueness: true
|
81
|
+
validates :email, uniqueness: true
|
81
82
|
before_save :do_before_save
|
82
83
|
|
83
84
|
##########################################################################
|
data/app/models/dc_design.rb
CHANGED
@@ -113,8 +113,9 @@ class DcDesign
|
|
113
113
|
# end user.
|
114
114
|
########################################################################
|
115
115
|
def self.choices4_design(site=nil)
|
116
|
-
list = site.nil? ? where(active: true) : where(active: true).in(site_id: [nil,site.id])
|
117
|
-
list.sort
|
116
|
+
list = site.nil? ? where(active: true) : where(active: true).in(site_id: [nil,site.id]).to_a
|
117
|
+
list.sort! { |w1, w2| w1.description.casecmp(w2.description) }
|
118
|
+
list.inject([]) { |r, design| r << [ design.description, design._id] }
|
118
119
|
end
|
119
120
|
|
120
121
|
end
|
data/app/models/dc_filter.rb
CHANGED
@@ -88,8 +88,8 @@ def self.get_field_form_definition(name, parent) #:nodoc:
|
|
88
88
|
form = parent.form
|
89
89
|
form['form']['tabs'].each do |tab|
|
90
90
|
# Array with 2 elements. First is tabname, second is data
|
91
|
-
|
92
|
-
|
91
|
+
my_fields = tab.last
|
92
|
+
my_fields.each {|k,v| return v if (k.class == Integer and v['name'] == name) }
|
93
93
|
end if form['form']['tabs'] # I know. But nice.
|
94
94
|
#
|
95
95
|
form['form']['fields'].each do |field|
|
@@ -121,10 +121,11 @@ def self.get_filter_field(parent)
|
|
121
121
|
end
|
122
122
|
end
|
123
123
|
# field redefined with input keyword. Name must start with _
|
124
|
-
field['name']
|
125
|
-
field['type']
|
126
|
-
field['type']
|
127
|
-
field['
|
124
|
+
field['name'] = '_filter_field'
|
125
|
+
field['type'] = filter['input'] if filter['input'].to_s.size > 5
|
126
|
+
field['type'] ||= 'text_field'
|
127
|
+
field['readonly'] = false # must be
|
128
|
+
field['html'] ||= {}
|
128
129
|
field['html']['size'] = 20
|
129
130
|
# Start with last entered value
|
130
131
|
field['html']['value'] = filter['value'] unless filter['value'] == '#NIL'
|
@@ -61,7 +61,7 @@ module DrgcmsFormFields
|
|
61
61
|
# most of the common code for custom form field already implemented.
|
62
62
|
###########################################################################
|
63
63
|
class DrgcmsField
|
64
|
-
attr_reader :
|
64
|
+
attr_reader :js
|
65
65
|
|
66
66
|
####################################################################
|
67
67
|
# DrgcmsField initialization code.
|
@@ -86,9 +86,17 @@ def initialize( parent, record, yaml )
|
|
86
86
|
end
|
87
87
|
@html = ''
|
88
88
|
@js = ''
|
89
|
+
@css = @yaml['css']
|
89
90
|
self
|
90
91
|
end
|
91
92
|
|
93
|
+
####################################################################
|
94
|
+
# Returns html code together with CSS code.
|
95
|
+
####################################################################
|
96
|
+
def html
|
97
|
+
@html + (@css ? "\n<style type=\"text/css\">#{@css}</style>" : '')
|
98
|
+
end
|
99
|
+
|
92
100
|
####################################################################
|
93
101
|
# Wrapper for i18 t method, with some spice added. If translation is not found English
|
94
102
|
# translation value will be returned. And if still not found default value will be returned if passed.
|
@@ -1302,8 +1310,9 @@ end
|
|
1302
1310
|
# 10:
|
1303
1311
|
# name: title
|
1304
1312
|
# type: text_field
|
1313
|
+
# size: 30
|
1305
1314
|
# html:
|
1306
|
-
#
|
1315
|
+
# required: yes
|
1307
1316
|
###########################################################################
|
1308
1317
|
class TextField < DrgcmsField
|
1309
1318
|
|
@@ -1320,6 +1329,64 @@ def render
|
|
1320
1329
|
end
|
1321
1330
|
end
|
1322
1331
|
|
1332
|
+
###########################################################################
|
1333
|
+
# Implementation of number_field DRG CMS form field. Number fields can be
|
1334
|
+
# formated for display with thousands delimiters and decimal separators and
|
1335
|
+
# can have currency symbol.
|
1336
|
+
#
|
1337
|
+
# ===Form options:
|
1338
|
+
# * +type:+ number_field (required)
|
1339
|
+
# * +name:+ Field name (required)
|
1340
|
+
# * +format:+ Format options
|
1341
|
+
# * +decimals:+ No of decimal places
|
1342
|
+
# * +separator:+ decimal separator (yes no , .) Default yes if decimals > 0
|
1343
|
+
# * +delimiter:+ Thousands delimiter (yes no , .) Default defind by locals
|
1344
|
+
# * +currency:+ Currency sign (yes no sign) Default no. If yes defined by locals
|
1345
|
+
# * +html:+ html options which apply to text_field field (optional)
|
1346
|
+
#
|
1347
|
+
# Form example:
|
1348
|
+
# 10:
|
1349
|
+
# name: title
|
1350
|
+
# type: number_field
|
1351
|
+
# size: 10
|
1352
|
+
# format:
|
1353
|
+
# decimals: 2
|
1354
|
+
# delimiter: false
|
1355
|
+
###########################################################################
|
1356
|
+
class NumberField < DrgcmsField
|
1357
|
+
|
1358
|
+
###########################################################################
|
1359
|
+
# Render text_field field html code
|
1360
|
+
###########################################################################
|
1361
|
+
def render
|
1362
|
+
return ro_standard if @readonly
|
1363
|
+
set_initial_value
|
1364
|
+
#
|
1365
|
+
record = record_text_for(@yaml['name'])
|
1366
|
+
@yaml['html'] ||= {}
|
1367
|
+
@yaml['html']['class'] = 'dc-number'
|
1368
|
+
@yaml['html']['data-decimal'] = @yaml.dig('format','decimal') || 2
|
1369
|
+
@yaml['html']['data-delimiter'] = @yaml.dig('format','delimiter') || I18n.t('number.currency.format.delimiter')
|
1370
|
+
@yaml['html']['data-separator'] = @yaml.dig('format','separator') || I18n.t('number.currency.format.separator')
|
1371
|
+
# @yaml['html']['data-currency'] = @yaml.dig('format','currency') == 'yes' ? I18n.t('number.currency.format.currency') : @yaml.dig('format','currency')
|
1372
|
+
value = @record[@yaml['name']] || 0
|
1373
|
+
|
1374
|
+
@html << @parent.hidden_field( record, @yaml['name'], value: value )
|
1375
|
+
|
1376
|
+
@yaml['html']['value'] = @parent.dc_format_number(value, @yaml['html']['data-decimal'], @yaml['html']['data-separator'], @yaml['html']['data-delimiter'] )
|
1377
|
+
@html << @parent.text_field( nil,"record_#{@yaml['name']}1", @yaml['html'])
|
1378
|
+
self
|
1379
|
+
end
|
1380
|
+
|
1381
|
+
###########################################################################
|
1382
|
+
# Return value. Return nil if input field is empty
|
1383
|
+
###########################################################################
|
1384
|
+
def self.get_data(params, name)
|
1385
|
+
return 0 if params['record'][name].blank?
|
1386
|
+
params['record'][name].match('.') ? BigDecimal.new(params['record'][name]) : Integer.new(params['record'][name])
|
1387
|
+
end
|
1388
|
+
end
|
1389
|
+
|
1323
1390
|
###########################################################################
|
1324
1391
|
# Implementation of text_with_select DRG CMS form field. Field will provide
|
1325
1392
|
# text_field entry field with select dropdown box with optional values for the field.
|
data/drg_cms.gemspec
CHANGED
@@ -27,8 +27,7 @@ Gem::Specification.new do |s|
|
|
27
27
|
|
28
28
|
s.add_dependency 'bcrypt' #, '~> 3.0.0'
|
29
29
|
s.add_dependency 'mongoid'#, '~> 5'
|
30
|
-
|
31
|
-
# s.add_dependency 'kaminari'
|
30
|
+
|
32
31
|
s.add_dependency 'kaminari-mongoid'
|
33
32
|
s.add_dependency 'kaminari-actionview'
|
34
33
|
s.add_dependency 'font-awesome-rails'
|
data/lib/drg_cms/engine.rb
CHANGED
data/lib/drg_cms/version.rb
CHANGED
@@ -1,4 +1,27 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2012+ Damjan Rems
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
# a copy of this software and associated documentation files (the
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
# the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be
|
13
|
+
# included in all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
#++
|
23
|
+
|
1
24
|
module DrgCms #:nodoc:
|
2
25
|
# drg_cms gem version
|
3
|
-
VERSION = "0.5.52.
|
26
|
+
VERSION = "0.5.52.12"
|
4
27
|
end
|
@@ -82,15 +82,20 @@ result_set:
|
|
82
82
|
# Choose from
|
83
83
|
# #{@model.attribute_names.join(',')}
|
84
84
|
columns:
|
85
|
-
|
85
|
+
10:
|
86
86
|
name: #{@model.attribute_names[1]}
|
87
|
-
style: '
|
88
|
-
|
87
|
+
style: 'color: red'
|
88
|
+
width: 10%
|
89
|
+
align: right
|
90
|
+
20:
|
89
91
|
name: #{@model.attribute_names[2]}
|
90
|
-
|
92
|
+
30:
|
91
93
|
name: created_at
|
92
94
|
format: '%d.%m.%Y'
|
93
|
-
|
95
|
+
40:
|
96
|
+
name: created_by
|
97
|
+
eval: dc_name4_id,dc_user,name
|
98
|
+
50:
|
94
99
|
name: active
|
95
100
|
eval: dc_icon4_boolean
|
96
101
|
|
@@ -53,7 +53,7 @@ def collections(what)
|
|
53
53
|
next if model.nil?
|
54
54
|
next unless model.respond_to?(:mongo_client)
|
55
55
|
record = {'id' => collection, 'description' => I18n.t("helpers.label.#{collection}.tabletitle") }
|
56
|
-
list << [record,
|
56
|
+
list << [record, model_fields(collection)]
|
57
57
|
end
|
58
58
|
list
|
59
59
|
end
|
@@ -61,7 +61,7 @@ end
|
|
61
61
|
######################################################################
|
62
62
|
# List field definition for single model
|
63
63
|
######################################################################
|
64
|
-
def
|
64
|
+
def model_fields(collection)
|
65
65
|
records = []
|
66
66
|
model = collection.classify.constantize
|
67
67
|
document = model.new
|
@@ -112,11 +112,11 @@ def create_output(descriptions)
|
|
112
112
|
body = ''
|
113
113
|
descriptions.each do |description|
|
114
114
|
collection = description.first
|
115
|
-
|
115
|
+
all_fields = description.last
|
116
116
|
body << "#\n# == Schema information\n#\n"
|
117
117
|
body << "# Collection name: #{collection['id']} : #{collection['description']}\n#\n"
|
118
118
|
|
119
|
-
|
119
|
+
all_fields.each do |field|
|
120
120
|
body << "# #{field['field'].ljust(20)} #{field['type'].to_s.ljust(20)} #{field['description']}\n"
|
121
121
|
end
|
122
122
|
body << "\n\n"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: drg_cms
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.52.
|
4
|
+
version: 0.5.52.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Damjan Rems
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-07-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|