drg_cms 0.5.50.2 → 0.5.51.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.log +47 -0
- data/README.md +2 -1
- data/app/assets/images/32px.png +0 -0
- data/app/assets/images/drg_cms/32px.png +0 -0
- data/app/assets/images/drg_cms/40px.png +0 -0
- data/app/assets/images/drg_cms/throbber.gif +0 -0
- data/app/assets/images/throbber.gif +0 -0
- data/app/assets/javascripts/drg_cms/drg_cms.js +3 -3
- data/app/assets/javascripts/drg_cms/jstree.min.js +6 -0
- data/app/assets/javascripts/drg_cms_cms.js +2 -1
- data/app/assets/stylesheets/drg_cms/drg_cms.css +9 -0
- data/app/assets/stylesheets/drg_cms/jstree.css +1108 -0
- data/app/assets/stylesheets/drg_cms_cms.css +1 -0
- data/app/controllers/cmsedit_controller.rb +14 -12
- data/app/controllers/dc_application_controller.rb +2 -2
- data/app/controllers/dc_common_controller.rb +15 -20
- data/app/controllers/dc_page_control.rb +8 -0
- data/app/controllers/design_element_settings_control.rb +135 -0
- data/app/forms/all_options.yml +7 -1
- data/app/forms/cms_menu.yml +1 -1
- data/app/forms/dc_browse_fields.yml +1 -1
- data/app/forms/dc_browse_models.yml +2 -2
- data/app/forms/dc_category.yml +4 -4
- data/app/forms/dc_menu.yml +6 -0
- data/app/forms/dc_page.yml +22 -12
- data/app/forms/dc_simple_menu.yml +6 -0
- data/app/forms/dc_site.yml +6 -0
- data/app/helpers/cmsedit_helper.rb +12 -8
- data/app/helpers/dc_application_helper.rb +79 -18
- data/app/helpers/dc_menu_renderer.rb +6 -1
- data/app/helpers/dc_part_renderer.rb +1 -1
- data/app/models/concerns/dc_page_concern.rb +133 -0
- data/app/models/concerns/dc_piece_concern.rb +57 -0
- data/app/models/concerns/dc_policy_rule_concern.rb +78 -0
- data/app/models/concerns/dc_site_concern.rb +94 -0
- data/app/models/concerns/dc_user_concern.rb +130 -0
- data/app/models/dc_ad.rb +1 -1
- data/app/models/dc_big_menu.rb +1 -1
- data/app/models/dc_category.rb +19 -4
- data/app/models/dc_dummy.rb +3 -2
- data/app/models/dc_link.rb +1 -1
- data/app/models/dc_memory.rb +127 -0
- data/app/models/dc_menu.rb +69 -3
- data/app/models/dc_menu_item.rb +17 -0
- data/app/models/dc_page.rb +0 -106
- data/app/models/dc_part.rb +0 -1
- data/app/models/dc_piece.rb +0 -35
- data/app/models/dc_policy_rule.rb +0 -56
- data/app/models/dc_simple_menu.rb +36 -0
- data/app/models/dc_simple_menu_item.rb +0 -0
- data/app/models/dc_site.rb +1 -71
- data/app/models/dc_user.rb +0 -108
- data/app/models/drgcms_form_fields.rb +187 -26
- data/app/views/cmsedit/_result.html.erb +3 -4
- data/config/locales/models_en.yml +11 -3
- data/config/locales/models_sl.yml +7 -0
- data/lib/drg_cms.rb +1 -0
- data/lib/drg_cms/version.rb +1 -1
- data/lib/tasks/log_statistics.rb +14 -8
- metadata +16 -2
@@ -234,7 +234,7 @@ def index
|
|
234
234
|
return render(action: :index)
|
235
235
|
end
|
236
236
|
# pagination but only if not already set
|
237
|
-
unless (@form['table'] == '
|
237
|
+
unless (@form['table'] == 'dc_memory' or @records.options[:limit])
|
238
238
|
per_page = (@form['result_set']['per_page'] || 30).to_i
|
239
239
|
@records = @records.page(params[:page]).per(per_page) if per_page > 0
|
240
240
|
end
|
@@ -590,6 +590,11 @@ def read_drg_cms_form
|
|
590
590
|
if @form['extend']
|
591
591
|
form = YAML.load_file( dc_find_form_file(@form['extend']) )
|
592
592
|
@form = forms_merge(form, @form)
|
593
|
+
# If combined form contains tabs and fields options, merge fields into tabs
|
594
|
+
if @form['form']['tabs'] and @form['form']['fields']
|
595
|
+
@form['form']['tabs']['fields'] = @form['form']['fields']
|
596
|
+
@form['form']['fields'] = nil
|
597
|
+
end
|
593
598
|
end
|
594
599
|
# add readonly key to form if readonly parameter is passed in url
|
595
600
|
@form['readonly'] = 1 if params['readonly'] #and %w(1 yes true).include?(params['readonly'].to_s.downcase.strip)
|
@@ -756,7 +761,7 @@ def process_return_to(return_to)
|
|
756
761
|
when return_to.match(/reload/i) then 'location.href=location.href;'
|
757
762
|
else "location.href='#{return_to}'"
|
758
763
|
end
|
759
|
-
render
|
764
|
+
render html: js_tag(script).html_safe, layout: false
|
760
765
|
end
|
761
766
|
|
762
767
|
########################################################################
|
@@ -785,11 +790,12 @@ def save_data
|
|
785
790
|
return true if fields.size == 0
|
786
791
|
#
|
787
792
|
fields.each do |v|
|
788
|
-
|
789
|
-
next if v['type'].
|
790
|
-
|
791
|
-
|
792
|
-
|
793
|
+
session[:form_processing] = v['name'] # for debuging
|
794
|
+
next if v['type'].nil? or
|
795
|
+
v['type'].match('embedded') or # don't wipe embedded types
|
796
|
+
(params[:edit_only] and params[:edit_only] != v['name']) or # otherwise other fields would be wiped
|
797
|
+
v['readonly'] or # fields with readonly option don't return value and would be wiped
|
798
|
+
!@record.respond_to?(v['name']) # there can be temporary fields on the form
|
793
799
|
# return value from form field definition
|
794
800
|
value = DrgcmsFormFields.const_get(v['type'].camelize).get_data(params, v['name'])
|
795
801
|
@record.send("#{v['name']}=", value)
|
@@ -802,17 +808,13 @@ def save_data
|
|
802
808
|
# dont's save if callback method returns false
|
803
809
|
return false if ret.class == FalseClass
|
804
810
|
end
|
805
|
-
#
|
806
|
-
@record.dc_before_save(self) if @record.respond_to?('dc_before_save')
|
807
|
-
#
|
811
|
+
# save data
|
808
812
|
changes = @record.changes
|
809
813
|
update_standards() if changes.size > 0 # update only if there has been some changes
|
810
814
|
if (saved = @record.save)
|
811
815
|
save_journal(operation, changes)
|
812
816
|
# callback methods
|
813
817
|
if (m = callback_method('after_save') ) then call_callback_method(m) end
|
814
|
-
# check if model has dc_after_save method
|
815
|
-
@record.dc_after_save(self) if @record.respond_to?('dc_after_save')
|
816
818
|
end
|
817
819
|
saved
|
818
820
|
end
|
@@ -143,8 +143,8 @@ end
|
|
143
143
|
# return dc_render_404('Site') unless site
|
144
144
|
########################################################################
|
145
145
|
def dc_render_404(where_the_error_is=nil)
|
146
|
-
|
147
|
-
|
146
|
+
logger.info("Error 404: path=#{params[:path]} site=#{@site.name if @site} page=#{@page.subject if @page} design=#{@design}")
|
147
|
+
render(file: "#{Rails.root}/public/404", :status => 404, :layout => false, :formats => [:html])
|
148
148
|
end
|
149
149
|
|
150
150
|
########################################################################
|
@@ -46,7 +46,7 @@ layout false
|
|
46
46
|
########################################################################
|
47
47
|
def autocomplete
|
48
48
|
# return '' unless session[:edit_mode] > 0 #
|
49
|
-
return render
|
49
|
+
return render plain: t('drgcms.not_authorized') unless dc_user_can(DcPermission::CAN_VIEW)
|
50
50
|
# TODO Double check if previous line works as it should.
|
51
51
|
table = params['table'].classify.constantize
|
52
52
|
id = [params['id']] || '_id'
|
@@ -144,7 +144,7 @@ def login
|
|
144
144
|
end
|
145
145
|
|
146
146
|
####################################################################
|
147
|
-
# Action
|
147
|
+
# Action for restoring document data from journal document.
|
148
148
|
####################################################################
|
149
149
|
def restore_from_journal
|
150
150
|
# Only administrators can perform this operation
|
@@ -152,17 +152,18 @@ def restore_from_journal
|
|
152
152
|
return render inline: { 'msg_info' => (t ('drgcms.not_authorized')) }.to_json, formats: 'js'
|
153
153
|
end
|
154
154
|
# selected fields to hash
|
155
|
-
restore =
|
155
|
+
restore = {}
|
156
|
+
params[:select].each {|key,value| restore[key] = value if value == '1' }
|
156
157
|
result = if restore.size == 0
|
157
158
|
{ 'msg_error' => (t ('drgcms.dc_journal.zero_selected')) }
|
158
159
|
else
|
159
|
-
|
160
|
+
journal_doc = DcJournal.find(params[:id])
|
160
161
|
# update hash with data to be restored
|
161
|
-
JSON.parse(
|
162
|
-
# determine tables and
|
163
|
-
tables =
|
164
|
-
ids = (
|
165
|
-
# find
|
162
|
+
JSON.parse(journal_doc.diff).each {|k,v| restore[k] = v.first if restore[k] }
|
163
|
+
# determine tables and document ids
|
164
|
+
tables = journal_doc.tables.split(';')
|
165
|
+
ids = (journal_doc.ids.blank? ? [] : journal_doc.ids.split(';') ) << journal_doc.doc_id
|
166
|
+
# find document
|
166
167
|
doc = nil
|
167
168
|
tables.each_index do |i|
|
168
169
|
doc = if doc.nil?
|
@@ -171,11 +172,8 @@ def restore_from_journal
|
|
171
172
|
doc.send(tables[i].pluralize).find(ids[i])
|
172
173
|
end
|
173
174
|
end
|
174
|
-
# restore values
|
175
|
-
restore.each
|
176
|
-
doc.send("#{k}=",v)
|
177
|
-
end
|
178
|
-
# save record
|
175
|
+
# restore and save values
|
176
|
+
restore.each { |field,value| doc.send("#{field}=",value) }
|
179
177
|
doc.save
|
180
178
|
# TODO Error checking
|
181
179
|
{ 'msg_info' => (t ('drgcms.dc_journal.restored')) }
|
@@ -189,7 +187,7 @@ end
|
|
189
187
|
########################################################################
|
190
188
|
def copy_clipboard
|
191
189
|
# Only administrators can perform this operation
|
192
|
-
return render(
|
190
|
+
return render(plain: t('drgcms.not_authorized') ) unless dc_user_has_role('admin')
|
193
191
|
#
|
194
192
|
respond_to do |format|
|
195
193
|
# just open new window to same url and come back with html request
|
@@ -198,7 +196,7 @@ def copy_clipboard
|
|
198
196
|
format.html do
|
199
197
|
doc = dc_find_document(params[:table], params[:id], params[:ids])
|
200
198
|
text = "<br><br>[#{params[:table]},#{params[:id]},#{params[:ids]}]<br>"
|
201
|
-
render
|
199
|
+
render plain: text + doc.as_document.to_json
|
202
200
|
end
|
203
201
|
|
204
202
|
end
|
@@ -211,7 +209,7 @@ end
|
|
211
209
|
########################################################################
|
212
210
|
def paste_clipboard
|
213
211
|
# Only administrators can perform this operation
|
214
|
-
return render(
|
212
|
+
return render(plain: t('drgcms.not_authorized') ) unless dc_user_has_role('admin')
|
215
213
|
|
216
214
|
result = ''
|
217
215
|
respond_to do |format|
|
@@ -322,9 +320,7 @@ def fill_login_data(user, remember_me)
|
|
322
320
|
# check if role is active in this site
|
323
321
|
policy_role = default_policy.dc_policy_rules.find_by(dc_policy_role_id: role.dc_policy_role_id)
|
324
322
|
next unless policy_role
|
325
|
-
|
326
323
|
# set edit_mode
|
327
|
-
# session[:edit_mode] = 1 if policy_role.has_cms_menu
|
328
324
|
session[:edit_mode] = 1 if policy_role.permission > 1
|
329
325
|
session[:user_roles] << role.dc_policy_role_id
|
330
326
|
end
|
@@ -335,7 +331,6 @@ def fill_login_data(user, remember_me)
|
|
335
331
|
guest = DcUserRole.find_by(:system_name => 'guest')
|
336
332
|
session[:user_roles] << guest.id if guest
|
337
333
|
end
|
338
|
-
|
339
334
|
# Save remember me cookie if not CMS user and remember me is selected
|
340
335
|
if session[:edit_mode] == 0 and remember_me
|
341
336
|
cookies.signed[:remember_me] = { :value => user.id, :expires => 180.days.from_now}
|
@@ -40,4 +40,12 @@ def dc_new_record()
|
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
+
######################################################################
|
44
|
+
# Caled just after record is saved to DB.
|
45
|
+
######################################################################
|
46
|
+
def dc_after_save()
|
47
|
+
menu_class = dc_get_site.menu_class.classify.constantize
|
48
|
+
menu_class.update_menu_item_link(@record.menu_id, @record.subject_link)
|
49
|
+
end
|
50
|
+
|
43
51
|
end
|
@@ -0,0 +1,135 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
#--
|
3
|
+
# Copyright (c) 2014+ Damjan Rems
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
# a copy of this software and associated documentation files (the
|
7
|
+
# "Software"), to deal in the Software without restriction, including
|
8
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
# the following conditions:
|
12
|
+
#
|
13
|
+
# The above copyright notice and this permission notice shall be
|
14
|
+
# included in all copies or substantial portions of the Software.
|
15
|
+
#
|
16
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
23
|
+
#++
|
24
|
+
|
25
|
+
######################################################################
|
26
|
+
# DrgcmsControls for editing settings in a document.
|
27
|
+
#
|
28
|
+
# Parameters to settings call:
|
29
|
+
# :location - model_name where settings document is located. Typicaly dc_page or dc_site.
|
30
|
+
# :field_name - name of the field where settings are saved
|
31
|
+
# :element - element name as defined on design
|
32
|
+
# :id - document id
|
33
|
+
######################################################################
|
34
|
+
module DesignElementSettingsControl
|
35
|
+
|
36
|
+
######################################################################
|
37
|
+
# Check if settings control document exists and return document and
|
38
|
+
# settings values as yaml string.
|
39
|
+
#
|
40
|
+
# Return:
|
41
|
+
# [document, data] : Mongoid document, yaml as String
|
42
|
+
######################################################################
|
43
|
+
def get_settings()
|
44
|
+
# On save. Set required variables
|
45
|
+
if params[:record]
|
46
|
+
params[:location] = params[:record][:dc_location]
|
47
|
+
params[:field_name] = params[:record][:dc_field_name]
|
48
|
+
params[:element] = params[:record][:dc_element]
|
49
|
+
params[:id] = params[:record][:dc_document_id]
|
50
|
+
end
|
51
|
+
# Check model
|
52
|
+
begin
|
53
|
+
model = params[:location].classify.constantize
|
54
|
+
rescue
|
55
|
+
flash[:error] = 'Invalid or undefined model name!'
|
56
|
+
return false
|
57
|
+
end
|
58
|
+
# Check fild name
|
59
|
+
begin
|
60
|
+
document = model.find(params[:id])
|
61
|
+
params[:field_name] = case
|
62
|
+
when params[:location] == 'dc_page' then 'params'
|
63
|
+
when params[:location] == 'dc_site' then 'options'
|
64
|
+
otherwise params[:field_name]
|
65
|
+
end
|
66
|
+
# field not defined on document
|
67
|
+
raise unless document.respond_to?(params[:field_name])
|
68
|
+
yaml = document[params[:field_name]]
|
69
|
+
yaml = '' if yaml.blank?
|
70
|
+
rescue
|
71
|
+
flash[:error] = 'Invalid or undefined field name!'
|
72
|
+
return false
|
73
|
+
end
|
74
|
+
# Check data
|
75
|
+
begin
|
76
|
+
data = YAML.load(yaml) || {}
|
77
|
+
rescue
|
78
|
+
flash[:error] = 'Invalid configuration data found!'
|
79
|
+
return false
|
80
|
+
end
|
81
|
+
[document, data]
|
82
|
+
end
|
83
|
+
|
84
|
+
######################################################################
|
85
|
+
# Called before edit.
|
86
|
+
#
|
87
|
+
# Load fields on form with values from settings document.
|
88
|
+
######################################################################
|
89
|
+
def dc_new_record()
|
90
|
+
document, data = get_settings
|
91
|
+
return false if document.class == FalseClass and data.nil?
|
92
|
+
# fill values with settings values
|
93
|
+
if data['settings'] and data['settings'][ params[:element] ]
|
94
|
+
data['settings'][ params[:element] ].each { |key, value| @record.send("#{key}=", value) }
|
95
|
+
end
|
96
|
+
# add some fields required at post as hidden fields to form
|
97
|
+
form = @form['form']['tabs'] ? @form['form']['tabs'].to_a.last : @form['form']['fields']
|
98
|
+
form[9999] = {'type' => 'hidden_field', 'name' => 'dc_location', 'html' => {'value' => params[:location]}}
|
99
|
+
form[9998] = {'type' => 'hidden_field', 'name' => 'dc_field_name'}
|
100
|
+
@record[:dc_field_name] = params[:field_name]
|
101
|
+
form[9997] = {'type' => 'hidden_field', 'name' => 'dc_element'}
|
102
|
+
@record.dc_element = params[:element]
|
103
|
+
form[9996] = {'type' => 'hidden_field', 'name' => 'dc_document_id', 'html' => {'value' => params[:id]}}
|
104
|
+
true
|
105
|
+
end
|
106
|
+
|
107
|
+
######################################################################
|
108
|
+
# Called before save.
|
109
|
+
#
|
110
|
+
# Convert data from fields on form to yaml and save it to document settings field.
|
111
|
+
######################################################################
|
112
|
+
def dc_before_save()
|
113
|
+
document, data = get_settings
|
114
|
+
return false if document.class == FalseClass and data.nil?
|
115
|
+
#
|
116
|
+
fields_on_form.each do |v|
|
117
|
+
session[:form_processing] = v['name'] # for debuging
|
118
|
+
next if v['type'].nil? or
|
119
|
+
v['readonly'] # fields with readonly option don't return value and would be wiped
|
120
|
+
# return value from form field definition
|
121
|
+
value = DrgcmsFormFields.const_get(v['type'].camelize).get_data(params, v['name'])
|
122
|
+
data['settings'] ||= {}
|
123
|
+
data['settings'][ params[:element] ] ||= {}
|
124
|
+
data['settings'][ params[:element] ][ v['name'] ] = value
|
125
|
+
end
|
126
|
+
# save data to document field
|
127
|
+
document.send("#{params[:field_name]}=", data.to_yaml)
|
128
|
+
document.save
|
129
|
+
# to re-set form again
|
130
|
+
dc_new_record
|
131
|
+
false # must be
|
132
|
+
end
|
133
|
+
|
134
|
+
|
135
|
+
end
|
data/app/forms/all_options.yml
CHANGED
data/app/forms/cms_menu.yml
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
## Registration form. Not yet implemented.
|
2
2
|
---
|
3
|
-
table:
|
3
|
+
table: dc_memory
|
4
4
|
title: Browse collection models
|
5
5
|
controls: browse_models
|
6
6
|
permissions:
|
@@ -11,7 +11,7 @@ result_set:
|
|
11
11
|
|
12
12
|
dblclick:
|
13
13
|
type: link
|
14
|
-
table:
|
14
|
+
table: dc_memory
|
15
15
|
formname: dc_browse_fields
|
16
16
|
action: index
|
17
17
|
|
data/app/forms/dc_category.yml
CHANGED
@@ -50,15 +50,15 @@ form:
|
|
50
50
|
html:
|
51
51
|
size: 5
|
52
52
|
50:
|
53
|
-
name:
|
53
|
+
name: dc_site_id
|
54
54
|
type: select
|
55
|
-
eval:
|
55
|
+
eval: DcSite.choices4_site
|
56
56
|
html:
|
57
57
|
include_blank: true
|
58
58
|
60:
|
59
|
-
name:
|
59
|
+
name: parent
|
60
60
|
type: select
|
61
|
-
eval:
|
61
|
+
eval: DcCategory.values_for_parent
|
62
62
|
html:
|
63
63
|
include_blank: true
|
64
64
|
|
data/app/forms/dc_menu.yml
CHANGED
data/app/forms/dc_page.yml
CHANGED
@@ -87,18 +87,20 @@ form:
|
|
87
87
|
type: datetime_select
|
88
88
|
options:
|
89
89
|
include_blank: true
|
90
|
+
# 120:
|
91
|
+
# name: kats
|
92
|
+
# type: select
|
93
|
+
# multiple: true
|
94
|
+
# eval: "dc_choices4('DcCategory','name','_id',site: :with_nil)"
|
95
|
+
# html:
|
96
|
+
# include_blank: true
|
97
|
+
# size: 4
|
90
98
|
120:
|
91
99
|
name: kats
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
type: select
|
97
|
-
multiple: true
|
98
|
-
eval: "dc_choices4('DcCategory','name','_id',site: :with_nil)"
|
99
|
-
html:
|
100
|
-
include_blank: true
|
101
|
-
size: 4
|
100
|
+
type: tree_select
|
101
|
+
eval: "DcCategory.choices4_categories(@parent.dc_get_site)"
|
102
|
+
style: 'max-height: 300px'
|
103
|
+
|
102
104
|
|
103
105
|
2advanced:
|
104
106
|
10:
|
@@ -107,10 +109,18 @@ form:
|
|
107
109
|
eval: DcDesign.choices4_design(@parent.dc_get_site)
|
108
110
|
html:
|
109
111
|
include_blank: true
|
112
|
+
|
110
113
|
20:
|
111
114
|
name: menu_id
|
112
|
-
type:
|
113
|
-
eval:
|
115
|
+
type: tree_select
|
116
|
+
eval: '@parent.dc_menu_class.choices4_menu_as_tree(@record.dc_site_id)'
|
117
|
+
style: 'max-height: 300px'
|
118
|
+
single: true
|
119
|
+
|
120
|
+
# 20:
|
121
|
+
# name: menu_id
|
122
|
+
# type: select
|
123
|
+
# eval: dc_choices4_menu
|
114
124
|
|
115
125
|
30:
|
116
126
|
name: params
|