drg_cms 0.5.8 → 0.5.8.2

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.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/drg_cms/drg_cms.js +53 -0
  3. data/app/assets/javascripts/drg_cms/jquery.the-modal.js +260 -0
  4. data/app/assets/javascripts/drg_cms_cms.js +3 -0
  5. data/app/assets/stylesheets/drg_cms/drg_cms.css +68 -33
  6. data/app/assets/stylesheets/drg_cms/the-modal.css +33 -0
  7. data/app/assets/stylesheets/drg_cms_cms.css +1 -0
  8. data/app/controllers/cmsedit_controller.rb +69 -54
  9. data/app/controllers/dc_application_controller.rb +21 -17
  10. data/app/controllers/dc_common_controller.rb +0 -0
  11. data/app/forms/all_options.yml +3 -2
  12. data/app/forms/cms_menu.yml +30 -17
  13. data/app/forms/dc_big_table_value.yml +3 -0
  14. data/app/forms/dc_filter.yml +56 -0
  15. data/app/forms/dc_key_value_store.yml +33 -0
  16. data/app/helpers/cmsedit_helper.rb +32 -82
  17. data/app/models/dc_ad.rb +27 -1
  18. data/app/models/dc_ad_stat.rb +10 -1
  19. data/app/models/dc_big_menu.rb +18 -1
  20. data/app/models/dc_big_table.rb +15 -2
  21. data/app/models/dc_big_table_locale.rb +13 -2
  22. data/app/models/dc_big_table_value.rb +14 -2
  23. data/app/models/dc_category.rb +16 -2
  24. data/app/models/dc_design.rb +17 -1
  25. data/app/models/dc_dummy.rb +5 -1
  26. data/app/models/dc_filter.rb +172 -0
  27. data/app/models/dc_folder_permission.rb +11 -1
  28. data/app/models/dc_ident.rb +9 -1
  29. data/app/models/dc_internals.rb +58 -0
  30. data/app/models/dc_journal.rb +14 -1
  31. data/app/models/dc_key_value_store.rb +8 -2
  32. data/app/models/dc_link.rb +14 -1
  33. data/app/models/dc_menu.rb +16 -1
  34. data/app/models/dc_menu_item.rb +19 -1
  35. data/app/models/dc_page.rb +43 -1
  36. data/app/models/dc_part.rb +28 -1
  37. data/app/models/dc_permission.rb +11 -1
  38. data/app/models/dc_piece.rb +25 -1
  39. data/app/models/dc_policy.rb +14 -1
  40. data/app/models/dc_policy_role.rb +10 -1
  41. data/app/models/dc_policy_rule.rb +9 -1
  42. data/app/models/dc_poll.rb +23 -1
  43. data/app/models/dc_poll_item.rb +16 -1
  44. data/app/models/dc_simple_menu.rb +16 -1
  45. data/app/models/dc_simple_menu_item.rb +17 -1
  46. data/app/models/dc_site.rb +43 -13
  47. data/app/models/dc_stat.rb +14 -3
  48. data/app/models/dc_user.rb +38 -1
  49. data/app/models/dc_user_role.rb +13 -1
  50. data/app/models/dc_visit.rb +11 -1
  51. data/app/models/drgcms_form_fields.rb +20 -4
  52. data/config/locales/drgcms_en.yml +11 -6
  53. data/config/locales/drgcms_sl.yml +8 -4
  54. data/config/locales/models_en.yml +20 -1
  55. data/config/locales/models_sl.yml +18 -0
  56. data/lib/drg_cms/version.rb +1 -1
  57. data/lib/generators/new_drg_form/new_drg_form_generator.rb +1 -1
  58. data/lib/tasks/browse_models.rake +17 -2
  59. metadata +8 -2
@@ -0,0 +1,33 @@
1
+ .themodal-lock {
2
+ /* when modal is opened we're removing scrollbars from the main content */
3
+ overflow: hidden;
4
+ }
5
+
6
+ .themodal-overlay {
7
+ /* overlay will stay fixed and will take all the space available */
8
+ position: fixed;
9
+ bottom: 0;
10
+ left: 0;
11
+ top: 0;
12
+ right: 0;
13
+ z-index: 100;
14
+
15
+ /* if modal content doesn't fit inside the overlay, display scrollbars */
16
+ overflow: auto;
17
+
18
+ /* allow one-finger iPad scrolling */
19
+ -webkit-overflow-scrolling: touch;
20
+
21
+ }
22
+
23
+ /* fix for iPad glitches */
24
+ .themodal-overlay > * {
25
+ -webkit-transform: translateZ(0px);
26
+ }
27
+
28
+ .themodal-overlay {
29
+ background: rgba(0, 0, 0, 0.5);
30
+ /* IE6–IE8 */
31
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = #7F000000, endColorstr = #7F000000);
32
+ zoom: 1;
33
+ }
@@ -16,6 +16,7 @@
16
16
  *= #require ../javascripts/drg_cms/elfinder/css/elfinder.min.css
17
17
  *= #require ../javascripts/drg_cms/elfinder/css/theme.css
18
18
  *= require font-awesome
19
+ *= require drg_cms/the-modal.css
19
20
  */
20
21
 
21
22
  /* Required for link buttons to look alike */
@@ -107,33 +107,64 @@ end
107
107
  # Set aditional filter options when filter is defined by filter method in control object.
108
108
  ########################################################################
109
109
  def user_filter_options(model) #:nodoc:
110
- # no filter is active or set off
111
- if params[:filter] == 'off' or (params[:filter].nil? and session[:tmp_filter].nil?)
112
- session[:tmp_filter] = nil
113
- return model
114
- end
115
- #
116
- table, field, oper, value = if params[:filter] == 'on'
117
- [model.to_s, params[:filter_field], params[:filter_oper], params[:record][params[:filter_field]] ]
110
+ table_name = @tables.first[1]
111
+ if session[table_name]
112
+ DcFilter.get_filter(session[table_name][:filter]) || model
118
113
  else
119
- session[:tmp_filter].split("\t")
114
+ model
115
+ end
116
+ end
117
+
118
+ ########################################################################
119
+ # Will set session[table_name][:filter] and save last filter settings to session.
120
+ # subroutine of check_filter_options.
121
+ ########################################################################
122
+ def set_session_filter(table_name)
123
+ if params[:filter] == 'off' # clear all values
124
+ session[table_name][:filter] = nil
125
+ return
120
126
  end
121
- # filter set previously on other collection
122
- if table != model.to_s
123
- session[:tmp_filter] = nil
124
- return model
127
+
128
+ filter_value = if params[:filter_value].nil?
129
+ # NIL indicates that no filtering is needed
130
+ '#NIL'
131
+ else
132
+ if params[:filter_value].class == String and params[:filter_value][0] == '@'
133
+ # Internal value. Remove leading @ and evaluate expression
134
+ expression = DcInternals.get(params[:filter_value])
135
+ eval(expression) rescue nil
136
+ else
137
+ # No filter when empty
138
+ params[:filter_value] == '' ? '#NIL' : params[:filter_value]
139
+ end
125
140
  end
126
- #
127
- field = '_id' if field == 'id' # must be
128
- value = /#{value}/ if oper == 'like' # do regex if operation is like
129
- # when field type is ObjectId transform value
130
- if model.fields[field] and model.fields[field].type == BSON::ObjectId
131
- value = BSON::ObjectId.from_string(value) rescue nil
132
- flash[:error] = t('drgcms.not_id') if value.nil?
133
- end
134
- # save filter to session
135
- session[:tmp_filter] = [ table, field, oper, value ].join("\t")
136
- model.where(field => value)
141
+ # if filter field parameter is omitted then just set filter value
142
+ session[table_name][:filter] =
143
+ if params[:filter_field].nil?
144
+ saved = YAML.load(session[table_name][:filter])
145
+ saved['value'] = filter_value
146
+ saved.to_yaml
147
+ else
148
+ # As field defined. Split name and alternative input field
149
+ field = if params[:filter_field].match(' as ')
150
+ params[:filter_input] = params[:filter_field].split(' as ').last.strip
151
+ params[:filter_field].split(' as ').first.strip
152
+ else
153
+ params[:filter_field]
154
+ end
155
+ #
156
+ {'field' => field,
157
+ 'operation' => params[:filter_oper],
158
+ 'value' => filter_value,
159
+ 'input' => params[:filter_input],
160
+ 'table' => table_name }.to_yaml
161
+ end
162
+ # must be. Otherwise kaminari includes parameter on paging
163
+ params[:filter] = nil
164
+ params[:filter_id] = nil
165
+ params[:filter_oper] = nil
166
+ params[:filter_input] = nil
167
+ params[:filter_field] = nil
137
168
  end
138
169
 
139
170
  ########################################################################
@@ -141,40 +172,22 @@ end
141
172
  ########################################################################
142
173
  def check_filter_options() #:nodoc:
143
174
  table_name = @tables.first[1]
175
+ model = @tables.first[0]
144
176
  session[table_name] ||= {}
145
177
  # process page
146
178
  session[table_name][:page] = params[:page] if params[:page]
147
179
  # new filter is applied
148
180
  if params[:filter]
149
- session[table_name][:filter] =
150
- if params[:filter] == 'off' # clear all values
151
- nil
152
- else
153
- [ params[:filter_field], params[:filter_oper], params[:record][params[:filter_field]] ].join("\t")
154
- end
181
+ set_session_filter(table_name)
155
182
  session[table_name][:page] = 1
156
- params[:filter] = nil # must be. Otherwise kaminari includes parameter on paging and everything goes wrong
157
183
  end
158
- # if data model has field dc_site_id ensure that only documents which belong
159
- # to the site are selected.
160
- model = @tables.first[0]
184
+ # if data model has field dc_site_id ensure that only documents which belong to the site are selected.
161
185
  site_id = dc_get_site._id if dc_get_site
162
186
  # dont't filter site if no dc_site_id field or user is ADMIN
163
187
  site_id = nil if !model.method_defined?('dc_site_id') or dc_user_can(DcPermission::CAN_ADMIN)
164
- if session[table_name][:filter]
165
- field, oper, value = session[table_name][:filter].split( "\t")
166
- field = '_id' if field == 'id' # must be
167
- value = /#{value}/i if oper == 'like' # do regex if operation is like
168
- # when field type is ObjectId transform value
169
- if model.fields[field] and model.fields[field].type == BSON::ObjectId
170
- value = BSON::ObjectId.from_string(value) rescue nil
171
- flash[:error] = t('drgcms.not_id') if value.nil?
172
- end
173
- @records = if site_id
174
- model.where(dc_site_id: site_id, field => value)
175
- else
176
- model.where(field => value)
177
- end
188
+ #
189
+ if @records = DcFilter.get_filter(session[table_name][:filter])
190
+ @records = @records.and(dc_site_id: site_id) if site_id
178
191
  else
179
192
  @records = if site_id
180
193
  model.where(dc_site_id: site_id)
@@ -182,6 +195,7 @@ def check_filter_options() #:nodoc:
182
195
  model
183
196
  end
184
197
  end
198
+
185
199
  # pagination if required
186
200
  per_page = (@form['result_set']['per_page'] || 30).to_i
187
201
  if per_page > 0
@@ -197,6 +211,11 @@ def index
197
211
  if @form['result_set'].nil?
198
212
  return process_return_to(params[:return_to] || 'reload')
199
213
  end
214
+ # for now enable only filtering of main tables
215
+ if @tables.size == 1
216
+ check_filter_options()
217
+ check_sort_options()
218
+ end
200
219
  # result set is defined by filter method in control object
201
220
  if @form['result_set']['filter']
202
221
  if respond_to?(@form['result_set']['filter'])
@@ -204,7 +223,7 @@ def index
204
223
  # something iz wrong. flash[] should have explanation.
205
224
  if @records.class == FalseClass
206
225
  @records = []
207
- return render(action: :index)
226
+ return render(action: :index)
208
227
  end
209
228
  # pagination
210
229
  unless @form['table'] == 'dc_dummy'
@@ -215,13 +234,9 @@ def index
215
234
  p "Error: result_set:filter: #{@form['result_set']['filter']} not found in controls!"
216
235
  end
217
236
  else
218
- if @tables.size == 1 # for now enable only filtering of main tables
219
- check_filter_options()
220
- check_sort_options()
221
- else
237
+ if @tables.size > 1
222
238
  rec = @tables.first[0].find(@ids.first) # top most document.id
223
239
  1.upto(@tables.size - 2) { |i| rec = rec.send(@tables[i][1].pluralize).find(@ids[i]) } # find embedded childrens by ids
224
- # p rec,@tables, @tables.last[1].pluralize
225
240
  @records = rec.send(@tables.last[1].pluralize) # current embedded set
226
241
  # sort by order if order field is present in model
227
242
  if @tables.last[1].classify.constantize.respond_to?(:order)
@@ -23,15 +23,19 @@
23
23
  #++
24
24
 
25
25
  ##########################################################################
26
- # Controller holds methods which are of use for all application controllers.
26
+ # DcApplicationControllerController holds methods which are useful for all
27
+ # application controllers.
27
28
  ##########################################################################
28
29
  class DcApplicationController < ActionController::Base
29
30
  protect_from_forgery
30
31
 
32
+ before_filter :dc_reload_patches if Rails.env.development?
33
+
31
34
  ########################################################################
32
- # Writes anything passed as parameter to logger file.
35
+ # Writes anything passed as parameter to logger file.
36
+ # Very useful for debuging strange errors.
33
37
  #
34
- # Very usefull for debuging strange errors.
38
+ # @param [Objects] args any parameter can be passed
35
39
  ########################################################################
36
40
  def dc_dump(*args)
37
41
  args.each do |arg|
@@ -49,15 +53,13 @@ end
49
53
  ####################################################################
50
54
  # Checks if user has required role.
51
55
  #
52
- # [Parameters:]
53
- # [role]
54
- # Role can be passed as DcPolicyRole object or as string. If string
55
- # is passed, dc_policy_roles files is searched for appropriate role.
56
+ # @param [DcPolicyRole] role can be passed as DcPolicyRole object or
57
+ # @param [String] role as role name. If passed as name, dc_policy_roles
58
+ # is searched for appropriate role.
56
59
  #
57
- # [Return:]
58
- # Boolean. True if user has required role added to his profile.
60
+ # @return [Boolean] True if user has required role added to his profile.
59
61
  #
60
- # [Example:]
62
+ # @example If user has required role
61
63
  # if dc_user_has_role('admin') ...
62
64
  # if dc_user_has_role('Site editors') ...
63
65
  ####################################################################
@@ -73,12 +75,14 @@ def dc_user_has_role(role)
73
75
  end
74
76
 
75
77
  ####################################################################
76
- # Determine site from url and return site document.
78
+ # Determines site from url and returns site document.
77
79
  #
78
- # [Return:]
79
- # Site document. If site is not found and not in production environment 'test'
80
- # site document is returned. If site has alias set then alias site document is
80
+ # @return [DcSite] site document. If site is not found and not in production environment,
81
+ # 'test' document is returned. If site has alias set then alias site document is
81
82
  # returned.
83
+ #
84
+ # @example Returns Google analytics code from site settings
85
+ # settings = dc_get_site.params['ga_acc']
82
86
  ####################################################################
83
87
  def dc_get_site()
84
88
  return @site if @site
@@ -101,9 +105,9 @@ end
101
105
  ####################################################################
102
106
  # Determine and return site record from url. It would be nice but it is not working.
103
107
  ####################################################################
104
- def self.dc_get_site_() #:nodoc:
105
- #self.dc_get_site()
106
- end
108
+ #def self.dc_get_site_() #:nodoc:
109
+ # self.dc_get_site()
110
+ #end
107
111
 
108
112
  ########################################################################
109
113
  # Searches forms path for file_name and returns full file name or nil if not found.
File without changes
@@ -44,9 +44,9 @@ result_set:
44
44
  actions_width: 100
45
45
  per_page: 10
46
46
  table_style: 'color: green;'
47
- table_class: 'color: green;'
47
+ table_class: tclass
48
48
  tr_style: 'color: green;'
49
- tr_class: 'color: green;'
49
+ tr_class: trclass
50
50
 
51
51
  actions: standard
52
52
 
@@ -75,6 +75,7 @@ result_set:
75
75
  columns:
76
76
  1:
77
77
  name: name
78
+ eval: dc_name4_id,dc_site,name
78
79
  style: 'align: left; width: 100px'
79
80
  2:
80
81
  name: title
@@ -23,7 +23,7 @@
23
23
 
24
24
  menu:
25
25
  10_system_menu:
26
- caption: drgcms.system_menu
26
+ caption: drgcms.cms_main
27
27
  icon: support lg
28
28
 
29
29
  items:
@@ -42,11 +42,6 @@ menu:
42
42
  controller: cmsedit
43
43
  icon: file-text-o lg
44
44
  table: dc_page
45
- 40:
46
- caption: helpers.label.dc_user.tabletitle
47
- controller: cmsedit
48
- icon: users lg
49
- table: dc_user
50
45
  50:
51
46
  caption: helpers.label.dc_piece.tabletitle
52
47
  controller: cmsedit
@@ -83,37 +78,55 @@ menu:
83
78
  controller: cmsedit
84
79
  icon: money lg
85
80
  table: dc_ad
86
- 120:
87
- caption: helpers.label.dc_big_table.tabletitle
81
+
82
+ 11_system_menu:
83
+ caption: drgcms.cms_advanced
84
+ icon: star lg
85
+ items:
86
+ 10:
87
+ caption: helpers.label.dc_user.tabletitle
88
88
  controller: cmsedit
89
- icon: table lg
90
- table: dc_big_table
91
- 130:
89
+ icon: users lg
90
+ table: dc_user
91
+ 20:
92
92
  caption: helpers.label.dc_policy_role.tabletitle
93
93
  controller: cmsedit
94
94
  icon: user-secret lg
95
95
  table: dc_policy_role
96
- 140:
96
+ 30:
97
97
  caption: helpers.label.dc_permission.tabletitle
98
98
  controller: cmsedit
99
99
  icon: shield lg
100
100
  table: dc_permission
101
- 150:
101
+ 40:
102
102
  caption: helpers.label.dc_folder_permission.tabletitle
103
103
  controller: cmsedit
104
104
  icon: shield lg
105
105
  table: dc_folder_permission
106
- 160:
106
+ 60:
107
+ caption: helpers.label.dc_big_table.tabletitle
108
+ controller: cmsedit
109
+ icon: table lg
110
+ table: dc_big_table
111
+ 70:
112
+ caption: helpers.label.dc_key_value_store.tabletitle
113
+ controller: cmsedit
114
+ icon: list lg
115
+ table: dc_key_value_store
116
+ 80:
117
+ caption: helpers.label.dc_filter.tabletitle
118
+ controller: cmsedit
119
+ icon: filter lg
120
+ table: dc_filter
121
+ 500:
107
122
  caption: helpers.label.dc_journal.tabletitle
108
123
  controller: cmsedit
109
124
  icon: undo lg
110
125
  table: dc_journal
111
126
 
112
- 500:
127
+ 600:
113
128
  caption: drgcms.browse_collections
114
129
  controller: cmsedit
115
130
  icon: table lg
116
131
  table: dc_dummy
117
132
  formname: dc_browse_models
118
-
119
-
@@ -22,6 +22,9 @@ result_set:
22
22
  name: value
23
23
  2:
24
24
  name: description
25
+ 3:
26
+ name: active
27
+ eval: dc_icon4_boolean
25
28
 
26
29
  form:
27
30
  title:
@@ -0,0 +1,56 @@
1
+ ## DRG Form for dc_filter
2
+ ---
3
+ table: dc_filter
4
+
5
+ index:
6
+ filter: description,table,dc_user_id
7
+ actions: standard
8
+
9
+ result_set:
10
+ actions: standard
11
+
12
+ columns:
13
+ 10:
14
+ name: dc_user_id
15
+ eval: dc_name4_id,dc_user,name
16
+ 20:
17
+ name: table
18
+ 30:
19
+ name: description
20
+ 40:
21
+ name: public
22
+ eval: dc_icon4_boolean
23
+
24
+ form:
25
+ actions: standard
26
+
27
+ fields:
28
+
29
+ 10:
30
+ name: description
31
+ type: text_field
32
+ html:
33
+ size: 50
34
+
35
+ 20:
36
+ name: table
37
+ type: text_with_select
38
+ eval: dc_choices4_all_collections
39
+ html:
40
+ size: 30
41
+
42
+ 30:
43
+ name: dc_user_id
44
+ type: select
45
+ eval: dc_choices4('dc_user','name','_id')
46
+ html:
47
+ include_blank: true
48
+ 40:
49
+ name: public
50
+ type: check_box
51
+
52
+ 50:
53
+ name: filter
54
+ type: text_area
55
+ html:
56
+ size: 80x20