drg_cms 0.7.0.2 → 0.7.1.1
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 +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
@@ -27,7 +27,6 @@
|
|
27
27
|
##########################################################################
|
28
28
|
class DcApplicationController < ActionController::Base
|
29
29
|
protect_from_forgery with: :null_session, only: Proc.new { |c| c.request.format.json? }
|
30
|
-
before_action :dc_reload_patches if Rails.env.development?
|
31
30
|
before_action :dc_set_locale
|
32
31
|
|
33
32
|
########################################################################
|
@@ -86,12 +85,12 @@ def dc_get_site
|
|
86
85
|
uri = URI.parse(request.url)
|
87
86
|
cache_key = ['dc_site', uri.host]
|
88
87
|
|
89
|
-
@site =
|
88
|
+
@site = DrgCms.cache_read(cache_key)
|
90
89
|
return @site if @site
|
91
90
|
|
92
91
|
@site = DcSite.find_by(name: uri.host)
|
93
92
|
# Site can be aliased
|
94
|
-
if @site
|
93
|
+
if @site&.alias_for.present?
|
95
94
|
@site = DcSite.find_by(name: @site.alias_for)
|
96
95
|
end
|
97
96
|
# Development environment. Check if site with name test exists and use
|
@@ -101,7 +100,7 @@ def dc_get_site
|
|
101
100
|
@site = DcSite.find_by(name: @site.alias_for) if @site
|
102
101
|
end
|
103
102
|
@site = nil if @site && !@site.active # site is disabled
|
104
|
-
|
103
|
+
DrgCms.cache_write(cache_key, @site)
|
105
104
|
end
|
106
105
|
|
107
106
|
##########################################################################
|
@@ -161,15 +160,11 @@ protected
|
|
161
160
|
# if dc_user_can(DcPermission::CAN_VIEW, params[:table]) then ...
|
162
161
|
############################################################################
|
163
162
|
def dc_user_can(permission, table = params[:table])
|
163
|
+
return false if session[:user_roles].nil?
|
164
|
+
|
164
165
|
table = table.underscore
|
165
|
-
|
166
|
-
permissions
|
167
|
-
if permissions.nil?
|
168
|
-
permissions = DcPermission.permissions_for_table(table)
|
169
|
-
dc_cache_write(cache_key, permissions)
|
170
|
-
end
|
171
|
-
session[:user_roles].each { |r| return true if permissions[r] && permissions[r] >= permission }
|
172
|
-
false
|
166
|
+
permissions = DrgCms.cache_read(['dc_permission', table, dc_get_site.id]) { DcPermission.permissions_for_table(table) }
|
167
|
+
session[:user_roles].inject(false) { |r, rule| break true if permissions[rule] && permissions[rule] >= permission }
|
173
168
|
end
|
174
169
|
|
175
170
|
####################################################################
|
@@ -440,7 +435,7 @@ def dc_error_messages_for(document)
|
|
440
435
|
msg = ''
|
441
436
|
document.errors.each do |error|
|
442
437
|
label = t("helpers.label.#{decamelize_type(document.class)}.#{error.attribute}")
|
443
|
-
label = error.attribute if label.match(
|
438
|
+
label = error.attribute if label.match(/translation missing/i)
|
444
439
|
msg << "<li>#{label} : #{error.message}</li>"
|
445
440
|
end
|
446
441
|
|
@@ -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:]
|
@@ -124,19 +124,20 @@ end
|
|
124
124
|
####################################################################
|
125
125
|
def process_login
|
126
126
|
# Somebody is probably playing
|
127
|
-
return dc_render_404 unless ( params
|
127
|
+
return dc_render_404 unless ( params.dig(:record, :username) && params.dig(:record, :password) )
|
128
128
|
|
129
|
-
|
129
|
+
return_to = request.env['HTTP_REFERER'] || '/'
|
130
|
+
if params[:record][:password].present? #password must not be empty
|
130
131
|
user = DcUser.find_by(username: params[:record][:username], active: true)
|
131
132
|
if user && user.authenticate(params[:record][:password])
|
132
133
|
fill_login_data(user, params[:record][:remember_me].to_i == 1)
|
133
|
-
return redirect_to(params[:return_to] ||
|
134
|
+
return redirect_to(params[:return_to] || return_to, allow_other_host: true)
|
134
135
|
else
|
135
136
|
clear_login_data # on the safe side
|
136
137
|
end
|
137
138
|
end
|
138
139
|
flash[:error] = t('drgcms.invalid_username')
|
139
|
-
redirect_to
|
140
|
+
redirect_to return_to
|
140
141
|
end
|
141
142
|
|
142
143
|
####################################################################
|
@@ -219,8 +220,10 @@ def copy_clipboard
|
|
219
220
|
format.html do
|
220
221
|
table = CmsHelper.table_param(params)
|
221
222
|
doc = dc_find_document(table, params[:id], params[:ids])
|
222
|
-
text =
|
223
|
-
|
223
|
+
text = '<style>body {font-family: monospace;}</style><pre>'
|
224
|
+
text << "JSON:<br>[#{table},#{params[:id]},#{params[:ids]}]<br>#{doc.as_document.to_json}<br><br>"
|
225
|
+
text << "YAML:<br>#{doc.as_document.to_hash.to_yaml.gsub("\n", '<br>')}</pre>"
|
226
|
+
render plain: text
|
224
227
|
end
|
225
228
|
end
|
226
229
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
#--
|
2
|
-
# Copyright (c)
|
2
|
+
# Copyright (c) 2022+ Damjan Rems
|
3
3
|
#
|
4
4
|
# Permission is hereby granted, free of charge, to any person obtaining
|
5
5
|
# a copy of this software and associated documentation files (the
|
@@ -22,40 +22,25 @@
|
|
22
22
|
#++
|
23
23
|
|
24
24
|
######################################################################
|
25
|
-
#
|
25
|
+
# DRG CMS controls for DcGallery collection
|
26
26
|
######################################################################
|
27
|
-
module
|
27
|
+
module DcGalleryControl
|
28
28
|
|
29
29
|
######################################################################
|
30
|
-
#
|
30
|
+
# Remove picture from gallery.
|
31
31
|
######################################################################
|
32
|
-
def
|
33
|
-
|
34
|
-
|
35
|
-
end
|
36
|
-
if params[:from_menu]
|
37
|
-
# find menu and submenu. Menu class is defined in Site.
|
38
|
-
menu_a = params[:id].split(';')
|
39
|
-
menu = dc_get_site.menu_klass.find(menu_a.shift)
|
40
|
-
menu_items_method = "#{dc_get_site.menu_class}_items".underscore
|
41
|
-
menu_i = menu.send(menu_items_method).find(menu_a.shift)
|
42
|
-
while menu_a.size > 0 do menu_i = menu_i.send(menu_items_method).find(menu_a.shift) end
|
43
|
-
# Fill values for form
|
44
|
-
@record.subject = menu_i.caption
|
45
|
-
@record.dc_site_id = menu.dc_site_id
|
46
|
-
@record.menu_id = params[:id]
|
47
|
-
# set update_menu on save parameter
|
48
|
-
params['p__update_menu'] = '1'
|
49
|
-
else
|
50
|
-
@record.design_id = params[:design_id] if params[:design_id]
|
51
|
-
return unless params[:page_id]
|
52
|
-
# inherit some values from currently active page
|
53
|
-
if page = DcPage.find(params[:page_id])
|
54
|
-
@record.design_id = page.design_id
|
55
|
-
@record.menu = page.menu
|
56
|
-
@record.dc_site_id = page.dc_site_id
|
57
|
-
end
|
32
|
+
def picture_remove
|
33
|
+
unless dc_user_can(DcPermission::CAN_DELETE, 'dc_gallery')
|
34
|
+
return render json: { alert: t('drgcms.not_authorized') }
|
58
35
|
end
|
36
|
+
|
37
|
+
doc = DcGallery.find(params[:id])
|
38
|
+
pic = Rails.root.join('public', doc.picture.delete_prefix('/'))
|
39
|
+
File.delete(pic) if File.exist?(pic)
|
40
|
+
pic = Rails.root.join('public', doc.thumbnail.delete_prefix('/'))
|
41
|
+
File.delete(pic) if File.exist?(pic)
|
42
|
+
doc.delete
|
43
|
+
render json: { reload: true }
|
59
44
|
end
|
60
45
|
|
61
46
|
end
|
@@ -0,0 +1,180 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2022+ 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
|
+
|
24
|
+
######################################################################
|
25
|
+
# DrgcmsControls for DcImage data entry.
|
26
|
+
######################################################################
|
27
|
+
module DcImageControl
|
28
|
+
|
29
|
+
######################################################################
|
30
|
+
#
|
31
|
+
######################################################################
|
32
|
+
def search_filter
|
33
|
+
flash[:record] ||= {}
|
34
|
+
|
35
|
+
created_by = flash[:record][:created_by]
|
36
|
+
qry = created_by.present? ? DcImage.where(created_by: created_by) : DcImage.all
|
37
|
+
|
38
|
+
short_name = flash[:record][:short]
|
39
|
+
qry = qry.and(short: /#{short_name}/i) if short_name.present?
|
40
|
+
|
41
|
+
category = flash[:record][:categories]
|
42
|
+
qry = qry.and(categories: category) if category.present?
|
43
|
+
qry.limit(30).order_by(created_at: -1)
|
44
|
+
end
|
45
|
+
|
46
|
+
######################################################################
|
47
|
+
# Invoke images search. Just forward parameters and reload form. Filter parameters will
|
48
|
+
# be taken into account on reload.
|
49
|
+
######################################################################
|
50
|
+
def images_search
|
51
|
+
flash[:record] = {}
|
52
|
+
flash[:record][:short] = params[:record][:short]
|
53
|
+
flash[:record][:created_by] = params[:record][:created_by]
|
54
|
+
flash[:record][:categories] = params[:record][:categories]
|
55
|
+
|
56
|
+
url = url_for(controller: :cmsedit, table: :dc_image, form_name: :dc_image_search, field_name: params[:field_name])
|
57
|
+
render json: { url: url }
|
58
|
+
end
|
59
|
+
|
60
|
+
######################################################################
|
61
|
+
# Set some default values when new record
|
62
|
+
######################################################################
|
63
|
+
def dc_new_record
|
64
|
+
default_sizes = dc_get_site.params.dig('dc_image', 'sizes').to_s.split(',')
|
65
|
+
@record.size_ls = default_sizes.shift
|
66
|
+
@record.size_ms = default_sizes.shift
|
67
|
+
@record.size_ss = default_sizes.shift
|
68
|
+
end
|
69
|
+
|
70
|
+
######################################################################
|
71
|
+
# Save uploaded file if selected and extract properties data
|
72
|
+
######################################################################
|
73
|
+
def dc_before_save
|
74
|
+
return if @record.size_o.present? || !params[:upload_file]
|
75
|
+
|
76
|
+
input_file_name = params[:upload_file].original_filename
|
77
|
+
type = File.extname(input_file_name).to_s.downcase.gsub('.', '').strip
|
78
|
+
unless %w(jpg jpeg png gif svg webp).include?(type)
|
79
|
+
flash[:error] = t 'drgcms.dc_image.wrong_type'
|
80
|
+
return false
|
81
|
+
end
|
82
|
+
name = File.basename(input_file_name)
|
83
|
+
path = File.dirname(params[:upload_file].tempfile)
|
84
|
+
|
85
|
+
@record.img_type = dc_get_site.params.dig('dc_image', 'img_type') || type
|
86
|
+
@record.short = File.basename(input_file_name, '.*') if @record.short.blank?
|
87
|
+
@record.name = File.join(path, name)
|
88
|
+
FileUtils.mv(params[:upload_file].tempfile, @record.name, force: nil)
|
89
|
+
end
|
90
|
+
|
91
|
+
######################################################################
|
92
|
+
# Prepare additional images
|
93
|
+
######################################################################
|
94
|
+
def dc_after_save
|
95
|
+
%w[l m s o].each { |size| image_convert(size) }
|
96
|
+
end
|
97
|
+
|
98
|
+
private
|
99
|
+
|
100
|
+
######################################################################
|
101
|
+
#
|
102
|
+
######################################################################
|
103
|
+
def image_convert(which)
|
104
|
+
new_file_name = "#{@record.id}-#{which}.#{@record.img_type}"
|
105
|
+
new_file_name = Rails.root.join('public', images_location, new_file_name)
|
106
|
+
new_size = @record["size_#{which}"]
|
107
|
+
# remove file if not needed
|
108
|
+
if new_size.blank?
|
109
|
+
FileUtils.rm(new_file_name) if File.exist?(new_file_name)
|
110
|
+
return
|
111
|
+
end
|
112
|
+
|
113
|
+
original_file_name = Rails.root.join('public', images_location, "#{@record.id}-o.#{@record.img_type}")
|
114
|
+
@record.name = original_file_name unless @record.name.present? && File.exist?(@record.name)
|
115
|
+
if !File.exist?(@record.name)
|
116
|
+
flash[:warning] = t 'drgcms.dc_image.no_file'
|
117
|
+
return
|
118
|
+
end
|
119
|
+
|
120
|
+
image_magick_do(new_size, new_file_name)
|
121
|
+
end
|
122
|
+
|
123
|
+
######################################################################
|
124
|
+
# Crop and resize image
|
125
|
+
#
|
126
|
+
# @new_size [String] new_size widthxheight+offsetx+offsety 300x200+1000+0
|
127
|
+
# @file_name [String] Image file name
|
128
|
+
######################################################################
|
129
|
+
def image_magick_do(new_size, file_name)
|
130
|
+
image = MiniMagick::Image.open(@record.name)
|
131
|
+
|
132
|
+
a = new_size.split(/x|\+/).map(&:to_i)
|
133
|
+
a += [0, 0] if a.size < 4
|
134
|
+
image_offset(image, a[2, 2]) if a[2, 2] != [0, 0]
|
135
|
+
|
136
|
+
img_w, img_h = image.width, image.height
|
137
|
+
new_w, new_h = a[0, 2]
|
138
|
+
img_ratio = img_w.to_f / img_h
|
139
|
+
new_ratio = new_w.to_f / new_h
|
140
|
+
formula = if new_ratio > img_ratio
|
141
|
+
"#{img_w}x#{img_w/new_ratio}+0+0"
|
142
|
+
else
|
143
|
+
"#{img_h*new_ratio}x#{img_h}+0+0"
|
144
|
+
end
|
145
|
+
image.crop(formula)
|
146
|
+
|
147
|
+
image.resize("#{new_w}x#{new_h}")
|
148
|
+
image.write(file_name)
|
149
|
+
image_reduce(file_name)
|
150
|
+
end
|
151
|
+
|
152
|
+
######################################################################
|
153
|
+
# Reduce image quality of image
|
154
|
+
######################################################################
|
155
|
+
def image_reduce(file_name)
|
156
|
+
if (quality = dc_get_site.params.dig('dc_image', 'quality').to_i) > 0
|
157
|
+
convert = MiniMagick::Tool::Convert.new
|
158
|
+
convert << file_name
|
159
|
+
convert.quality(quality)
|
160
|
+
convert << file_name
|
161
|
+
convert.call
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
######################################################################
|
166
|
+
# Offset image if requested
|
167
|
+
######################################################################
|
168
|
+
def image_offset(image, offset)
|
169
|
+
img_w, img_h = image.width - offset[0], image.height - offset[1]
|
170
|
+
image.crop("#{img_w}x#{img_h}+#{offset[0]}+#{offset[1]}")
|
171
|
+
end
|
172
|
+
|
173
|
+
######################################################################
|
174
|
+
# Returns location of images files relative to public directory
|
175
|
+
######################################################################
|
176
|
+
def images_location
|
177
|
+
dc_get_site.params.dig('dc_image', 'location') || 'images'
|
178
|
+
end
|
179
|
+
|
180
|
+
end
|
@@ -22,14 +22,14 @@
|
|
22
22
|
#++
|
23
23
|
|
24
24
|
######################################################################
|
25
|
-
#
|
25
|
+
# DRG Controls for DcPage model.
|
26
26
|
######################################################################
|
27
27
|
module DcPageControl
|
28
28
|
|
29
29
|
######################################################################
|
30
30
|
# Called when new empty record is created
|
31
31
|
######################################################################
|
32
|
-
def dc_new_record
|
32
|
+
def dc_new_record
|
33
33
|
# Called from menu. Fill in values, that could be obtained from menu
|
34
34
|
if params[:from_menu]
|
35
35
|
# find menu and submenu. Menu class is defined in Site.
|
@@ -59,7 +59,7 @@ end
|
|
59
59
|
######################################################################
|
60
60
|
# Called just after record is saved to DB.
|
61
61
|
######################################################################
|
62
|
-
def dc_after_save
|
62
|
+
def dc_after_save
|
63
63
|
if params.dig(:_record,:_update_menu).to_s == '1'
|
64
64
|
dc_get_site.menu_klass.update_menu_item_link(@record)
|
65
65
|
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
#encoding: utf-8
|
2
1
|
#--
|
3
2
|
# Copyright (c) 2014+ Damjan Rems
|
4
3
|
#
|
@@ -23,66 +22,66 @@
|
|
23
22
|
#++
|
24
23
|
|
25
24
|
######################################################################
|
26
|
-
#
|
25
|
+
# DRG Controls for DcPage model.
|
27
26
|
######################################################################
|
28
27
|
module DcPollResultControl
|
29
28
|
|
30
29
|
######################################################################
|
31
|
-
#
|
30
|
+
# Set filter action called from form.
|
32
31
|
######################################################################
|
33
|
-
def
|
34
|
-
|
35
|
-
|
32
|
+
def filter_set
|
33
|
+
record = params[:record]
|
34
|
+
filter = "DcPollResult.where(dc_poll_id: '#{record[:dc_poll_id]}')"
|
35
|
+
filter << ".and(:created_at.gte => '#{Time.parse(record[:start_date]).beginning_of_day}')" if record[:start_date].present?
|
36
|
+
filter << ".and(:created_at.lte => '#{Time.parse(record[:end_date]).end_of_day}')" if record[:end_date].present?
|
36
37
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
)
|
46
|
-
dc_render_ajax(operation: :url, value: url)
|
38
|
+
session['dc_poll_result'][:filter] = {'field' => I18n.t('drgcms.filter_off'),
|
39
|
+
'operation' => 'eval',
|
40
|
+
'value' => filter,
|
41
|
+
'input' => '',
|
42
|
+
'table' => 'dc_poll_result' }.to_yaml
|
43
|
+
session['dc_poll_result'][:page] = 1 # must also be set
|
44
|
+
|
45
|
+
render json: { url: '/cmsedit?t=dc_poll_result'}
|
47
46
|
end
|
48
47
|
|
49
48
|
######################################################################
|
50
49
|
# Export data to file
|
51
50
|
######################################################################
|
52
|
-
def
|
51
|
+
def data_export
|
53
52
|
c, keys = '', []
|
54
|
-
|
55
|
-
# ensure, that fields are always in same order
|
53
|
+
data_get.each do |doc|
|
56
54
|
data = YAML.load(doc.data)
|
55
|
+
# header and ensure fields are always in same order
|
57
56
|
if c.blank?
|
58
|
-
|
59
|
-
c << I18n.t('helpers.label.dc_poll_result.created_at') + "
|
60
|
-
c << keys.join("
|
57
|
+
keys = data.map(&:first)
|
58
|
+
c << I18n.t('helpers.label.dc_poll_result.created_at') + ";"
|
59
|
+
c << keys.join(";") + "\n"
|
61
60
|
end
|
62
|
-
|
63
|
-
|
64
|
-
|
61
|
+
|
62
|
+
c << doc.created_at.strftime(I18n.t('time.formats.default')) + ";"
|
63
|
+
keys.each do |k|
|
64
|
+
c << if data[k].class == String
|
65
|
+
%("#{data[k].gsub(/\"/, "'").gsub(';', ',')}";)
|
66
|
+
else
|
67
|
+
%("#{data[k]}";)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
c << "\r\n"
|
65
71
|
end
|
66
|
-
File.write(Rails.root.join('public','export.csv'), c)
|
67
|
-
|
72
|
+
File.write(Rails.root.join('public', 'export.csv'), c)
|
73
|
+
render json: { 'window_' => 'export.csv' }
|
68
74
|
end
|
69
75
|
|
70
76
|
private
|
71
77
|
######################################################################
|
72
78
|
# Creates query for Poll results
|
73
79
|
######################################################################
|
74
|
-
def
|
75
|
-
if
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
unless params[:record][:start_date].blank?
|
80
|
-
start_date = DrgcmsFormFields::DatePicker.get_data(params,'start_date').beginning_of_day
|
81
|
-
end_date = DrgcmsFormFields::DatePicker.get_data(params,'end_date').end_of_day
|
82
|
-
qry = qry.and(:created_at.gt => start_date).and(:created_at.lt => end_date)
|
83
|
-
end
|
84
|
-
end
|
85
|
-
qry
|
80
|
+
def data_get
|
81
|
+
return [] if session.dig('dc_poll_result', :filter).blank?
|
82
|
+
|
83
|
+
filter = YAML.load(session['dc_poll_result'][:filter])
|
84
|
+
eval filter['value'] rescue []
|
86
85
|
end
|
87
86
|
|
88
87
|
end
|
data/app/controls/dc_report.rb
CHANGED
@@ -55,7 +55,7 @@ def print
|
|
55
55
|
render json: { msg_error: t('drgcms.runtime_error') } and return
|
56
56
|
end
|
57
57
|
|
58
|
-
pdf_file = "tmp/
|
58
|
+
pdf_file = "tmp/document-#{Time.now.to_i}.pdf"
|
59
59
|
@pdf.render_file Rails.root.join('public', pdf_file)
|
60
60
|
|
61
61
|
render json: print_response(pdf_file)
|
@@ -142,14 +142,19 @@ def export_to_excel(report_id)
|
|
142
142
|
columns.each_with_index do |column, i|
|
143
143
|
caption = column.last['caption'] || column.last['label']
|
144
144
|
label = t(caption)
|
145
|
-
excel[n, i] = label.match(
|
145
|
+
excel[n, i] = label.match(/translation missing/i) ? caption : label
|
146
146
|
end
|
147
147
|
|
148
148
|
data_filter.each do |doc|
|
149
149
|
n += 1
|
150
150
|
columns.each_with_index do |column, i|
|
151
|
-
value = doc[column.last['name']]
|
152
|
-
value = value.
|
151
|
+
value = doc[column.last['name']]
|
152
|
+
value = case value.class.to_s
|
153
|
+
when /Integer|Float/ then value
|
154
|
+
when /Decimal/ then value.to_s.to_f
|
155
|
+
else
|
156
|
+
value.to_s.gsub('<br>', ";").gsub(/\<\/strong\>|\<strong\>|\<\/b\>|\<b\>/, '')
|
157
|
+
end
|
153
158
|
excel[n, i] = value
|
154
159
|
end
|
155
160
|
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2024+ 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
|
+
|
24
|
+
################################################################################
|
25
|
+
# Controls for DcSetup edit form.
|
26
|
+
################################################################################
|
27
|
+
module DcSetupControl
|
28
|
+
|
29
|
+
################################################################################
|
30
|
+
# Update edit form. Admin sees everything while user sees only setup fields.
|
31
|
+
################################################################################
|
32
|
+
def dc_update_form
|
33
|
+
return unless params[:id]
|
34
|
+
|
35
|
+
record = if BSON::ObjectId.legal?(params[:id])
|
36
|
+
DcSetup.find(params[:id])
|
37
|
+
else
|
38
|
+
DcSetup.find_by(name: params[:id])
|
39
|
+
end
|
40
|
+
|
41
|
+
unless dc_user_has_role('admin')
|
42
|
+
@form['form'].delete('tabs')
|
43
|
+
@form['readonly'] = true unless record.editors.include?(session[:user_id])
|
44
|
+
end
|
45
|
+
|
46
|
+
form = YAML.load(record.form) rescue nil
|
47
|
+
if form.present?
|
48
|
+
@form['form']['tabs'] ||= {}
|
49
|
+
@form['form']['tabs'].merge!(form)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|