drg_cms 0.5.8 → 0.5.8.2

Sign up to get free protection for your applications and to get access to all the features.
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