alchemy_cms 3.3.3 → 3.4.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (133) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -1
  3. data/CHANGELOG.md +42 -4
  4. data/README.md +7 -3
  5. data/alchemy_cms.gemspec +1 -0
  6. data/app/assets/javascripts/alchemy/{alchemy.js → admin.js} +1 -2
  7. data/app/assets/javascripts/alchemy/alchemy.datepicker.js.coffee +28 -25
  8. data/app/assets/javascripts/alchemy/alchemy.dialog.js.coffee +1 -0
  9. data/app/assets/javascripts/alchemy/alchemy.i18n.js.coffee +7 -1
  10. data/app/assets/javascripts/alchemy/alchemy.link_dialog.js.coffee +1 -1
  11. data/app/assets/javascripts/alchemy/alchemy.sitemap.js.coffee +26 -0
  12. data/app/assets/javascripts/alchemy/alchemy.translations.js.coffee +56 -1
  13. data/app/assets/stylesheets/alchemy/_variables.scss +1 -0
  14. data/app/assets/stylesheets/alchemy/admin.scss +2 -1
  15. data/app/assets/stylesheets/alchemy/archive.scss +7 -0
  16. data/app/assets/stylesheets/alchemy/base.scss +0 -42
  17. data/app/assets/stylesheets/alchemy/buttons.scss +2 -1
  18. data/app/assets/stylesheets/alchemy/form_fields.scss +9 -0
  19. data/app/assets/stylesheets/alchemy/forms.scss +36 -10
  20. data/app/assets/stylesheets/alchemy/frame.scss +12 -1
  21. data/app/assets/stylesheets/alchemy/icons.scss +1 -1
  22. data/app/assets/stylesheets/alchemy/jquery-ui.scss +0 -260
  23. data/app/assets/stylesheets/alchemy/jquery.datetimepicker.scss +507 -0
  24. data/app/assets/stylesheets/alchemy/lists.scss +62 -0
  25. data/app/assets/stylesheets/alchemy/selects.scss +9 -2
  26. data/app/assets/stylesheets/alchemy/sitemap.scss +28 -51
  27. data/app/assets/stylesheets/alchemy/toolbar.scss +0 -2
  28. data/app/controllers/alchemy/admin/attachments_controller.rb +4 -6
  29. data/app/controllers/alchemy/admin/base_controller.rb +2 -2
  30. data/app/controllers/alchemy/admin/dashboard_controller.rb +2 -2
  31. data/app/controllers/alchemy/admin/languages_controller.rb +5 -0
  32. data/app/controllers/alchemy/admin/pages_controller.rb +14 -5
  33. data/app/controllers/alchemy/admin/resources_controller.rb +17 -1
  34. data/app/controllers/alchemy/base_controller.rb +1 -0
  35. data/app/controllers/alchemy/messages_controller.rb +1 -1
  36. data/app/controllers/alchemy/pages_controller.rb +16 -26
  37. data/app/controllers/alchemy/pictures_controller.rb +23 -10
  38. data/app/controllers/concerns/alchemy/page_redirects.rb +7 -7
  39. data/app/helpers/alchemy/admin/base_helper.rb +22 -19
  40. data/app/helpers/alchemy/admin/essences_helper.rb +26 -11
  41. data/app/helpers/alchemy/admin/pages_helper.rb +2 -1
  42. data/app/helpers/alchemy/essences_helper.rb +0 -35
  43. data/app/helpers/alchemy/url_helper.rb +1 -1
  44. data/app/mailers/alchemy/base_mailer.rb +18 -0
  45. data/app/mailers/alchemy/{messages.rb → messages_mailer.rb} +1 -1
  46. data/app/models/alchemy/attachment.rb +9 -0
  47. data/app/models/alchemy/cell.rb +1 -1
  48. data/app/models/alchemy/essence_picture.rb +4 -1
  49. data/app/models/alchemy/essence_picture_view.rb +68 -0
  50. data/app/models/alchemy/language.rb +8 -10
  51. data/app/models/alchemy/language/code.rb +4 -1
  52. data/app/models/alchemy/page.rb +69 -26
  53. data/app/models/alchemy/page/page_natures.rb +22 -0
  54. data/app/models/alchemy/page/page_scopes.rb +20 -6
  55. data/app/models/alchemy/picture.rb +37 -4
  56. data/app/models/alchemy/site.rb +8 -0
  57. data/app/serializers/alchemy/page_tree_serializer.rb +1 -1
  58. data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +9 -6
  59. data/app/views/alchemy/admin/attachments/_file_to_assign.html.erb +11 -9
  60. data/app/views/alchemy/admin/attachments/_filter_bar.html.erb +32 -0
  61. data/app/views/alchemy/admin/attachments/_overlay_file_list.html.erb +14 -2
  62. data/app/views/alchemy/admin/attachments/index.html.erb +10 -9
  63. data/app/views/alchemy/admin/dashboard/_locked_pages.html.erb +20 -9
  64. data/app/views/alchemy/admin/dashboard/_recent_pages.html.erb +11 -1
  65. data/app/views/alchemy/admin/languages/_form.html.erb +1 -0
  66. data/app/views/alchemy/admin/languages/index.html.erb +7 -8
  67. data/app/views/alchemy/admin/layoutpages/_layoutpage.html.erb +1 -1
  68. data/app/views/alchemy/admin/layoutpages/index.html.erb +2 -2
  69. data/app/views/alchemy/admin/pages/_current_page.html.erb +4 -0
  70. data/app/views/alchemy/admin/pages/_form.html.erb +16 -1
  71. data/app/views/alchemy/admin/pages/_locked_page.html.erb +2 -12
  72. data/app/views/alchemy/admin/pages/_page.html.erb +1 -1
  73. data/app/views/alchemy/admin/pages/_page_for_links.html.erb +2 -2
  74. data/app/views/alchemy/admin/pages/_page_status.html.erb +23 -11
  75. data/app/views/alchemy/admin/pages/edit.html.erb +2 -1
  76. data/app/views/alchemy/admin/pages/index.html.erb +2 -2
  77. data/app/views/alchemy/admin/partials/_language_tree_select.html.erb +3 -0
  78. data/app/views/alchemy/admin/partials/_site_select.html.erb +9 -0
  79. data/app/views/alchemy/admin/pictures/_picture.html.erb +6 -1
  80. data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +2 -1
  81. data/app/views/alchemy/admin/pictures/show.html.erb +1 -1
  82. data/app/views/alchemy/admin/resources/_filter_bar.html.erb +31 -0
  83. data/app/views/alchemy/admin/resources/_form.html.erb +6 -0
  84. data/app/views/alchemy/admin/resources/_tag_list.html.erb +16 -0
  85. data/app/views/alchemy/admin/resources/index.html.erb +13 -1
  86. data/app/views/alchemy/essences/_essence_file_view.html.erb +2 -5
  87. data/app/views/alchemy/essences/_essence_picture_view.html.erb +5 -3
  88. data/app/views/alchemy/{messages → messages_mailer}/contact_form_mail.de.text.erb +0 -0
  89. data/app/views/alchemy/{messages → messages_mailer}/contact_form_mail.en.text.erb +0 -0
  90. data/app/views/alchemy/{messages → messages_mailer}/contact_form_mail.es.text.erb +0 -0
  91. data/app/views/alchemy/{messages → messages_mailer}/new.html.erb +0 -0
  92. data/app/views/layouts/alchemy/admin.html.erb +3 -8
  93. data/config/alchemy/config.yml +4 -3
  94. data/config/initializers/assets.rb +2 -2
  95. data/config/initializers/dragonfly.rb +3 -0
  96. data/config/initializers/mime_types.rb +1 -0
  97. data/config/locales/alchemy.de.yml +10 -2
  98. data/config/locales/alchemy.en.yml +6 -2
  99. data/config/locales/alchemy.es.yml +6 -3
  100. data/config/locales/alchemy.fr.yml +6 -2
  101. data/config/locales/alchemy.it.yml +937 -0
  102. data/config/locales/alchemy.nl.yml +6 -2
  103. data/config/locales/alchemy.ru.yml +3 -2
  104. data/config/locales/simple_form.it.yml +25 -0
  105. data/db/migrate/20160108174834_add_timebased_publishing_columns_to_pages.rb +32 -0
  106. data/db/migrate/20160422195310_add_image_file_format_to_alchemy_pictures.rb +21 -0
  107. data/db/migrate/20160617224938_change_alchemy_pages_locked_to_locked_at.rb +22 -0
  108. data/lib/alchemy/ability_helper.rb +23 -0
  109. data/lib/alchemy/configuration_methods.rb +2 -2
  110. data/lib/alchemy/controller_actions.rb +4 -33
  111. data/lib/alchemy/engine.rb +1 -0
  112. data/lib/alchemy/resource.rb +30 -13
  113. data/lib/alchemy/resources_helper.rb +17 -0
  114. data/lib/alchemy/test_support/factories/page_factory.rb +7 -2
  115. data/lib/alchemy/upgrader.rb +1 -0
  116. data/lib/alchemy/upgrader/tasks/install_asset_manifests.rb +15 -0
  117. data/lib/alchemy/upgrader/three_point_four.rb +16 -0
  118. data/lib/alchemy/version.rb +1 -1
  119. data/lib/rails/generators/alchemy/elements/elements_generator.rb +8 -7
  120. data/lib/rails/generators/alchemy/essence/essence_generator.rb +2 -6
  121. data/lib/rails/generators/alchemy/install/files/all.css +11 -0
  122. data/lib/rails/generators/alchemy/install/files/all.js +11 -0
  123. data/lib/rails/generators/alchemy/install/files/{alchemy.elements.css.scss → article.scss} +0 -0
  124. data/lib/rails/generators/alchemy/install/install_generator.rb +20 -19
  125. data/lib/rails/generators/alchemy/module/module_generator.rb +3 -5
  126. data/lib/rails/generators/alchemy/page_layouts/page_layouts_generator.rb +7 -6
  127. data/lib/rails/generators/alchemy/site_layouts/site_layouts_generator.rb +7 -6
  128. data/vendor/assets/javascripts/date-formatter.js +161 -0
  129. data/vendor/assets/javascripts/jquery_plugins/jquery.datetimepicker.full.min.js +2 -0
  130. data/vendor/assets/javascripts/tinymce/langs/it.js +219 -0
  131. metadata +48 -13
  132. data/app/assets/javascripts/alchemy/alchemy.custom.js +0 -1
  133. data/app/assets/stylesheets/alchemy/custom.scss +0 -1
@@ -0,0 +1,62 @@
1
+ ul.list {
2
+ margin: 0;
3
+ padding: 0;
4
+ list-style-type: none;
5
+
6
+ &#layoutpages {
7
+ margin-top: 16px;
8
+
9
+ li {
10
+ margin-left: 8px;
11
+ }
12
+ }
13
+
14
+ &#sitemap {
15
+ padding: 0 0 104px 0;
16
+ }
17
+
18
+ li {
19
+ list-style-type: none;
20
+ display: block;
21
+ overflow: hidden;
22
+ margin-bottom: 0;
23
+
24
+ &.legend, &.list-header {
25
+ background-color: transparent;
26
+ font-weight: bold;
27
+ padding: $default-padding;
28
+
29
+ .list-secondary {
30
+ color: $text-color;
31
+ }
32
+ }
33
+
34
+ &.even {
35
+ background-color: #fff;
36
+ }
37
+
38
+ &.odd {
39
+ background-color: #eaf3f9;
40
+ }
41
+ }
42
+
43
+ .list-primary,
44
+ .list-secondary {
45
+ display: inline-block;
46
+ overflow: hidden;
47
+ text-overflow: ellipsis;
48
+ vertical-align: middle;
49
+ }
50
+
51
+ .list-primary {
52
+ float: left;
53
+ max-width: 65%;
54
+ }
55
+
56
+ .list-secondary, .right {
57
+ float: right;
58
+ text-align: left;
59
+ width: 30%;
60
+ color: $dark-gray;
61
+ }
62
+ }
@@ -214,9 +214,16 @@ select {
214
214
  margin: 0 3*$default-margin;
215
215
  @include inline-block(top);
216
216
 
217
- label {
217
+ label, form {
218
218
  @include inline-block;
219
- margin-right: 2*$default-margin;
219
+ }
220
+
221
+ select { margin: 0; }
222
+
223
+ label {
224
+ margin-right: $default-margin;
225
+
226
+ &:after { content: ':'; }
220
227
  }
221
228
  }
222
229
 
@@ -33,7 +33,7 @@
33
33
  background-color: #fff;
34
34
  color: black;
35
35
  display: block;
36
- padding-left: 4px;
36
+ padding-left: $default-padding;
37
37
  text-decoration: none;
38
38
  @include transition(background-color, 400ms);
39
39
 
@@ -49,23 +49,23 @@
49
49
  width: 16px;
50
50
  height: 16px;
51
51
  float: left;
52
- margin-right: 4px;
52
+ margin-right: $default-margin;
53
53
  background: image-url('alchemy/icons.png') -160px -168px;
54
- margin-top: 4px;
54
+ margin-top: $default-margin;
55
55
  }
56
56
  }
57
57
  }
58
58
 
59
59
  .redirect_url {
60
60
  position: absolute;
61
- top: 4px;
61
+ top: $default-padding;
62
62
  right: 199px;
63
63
  text-align: right;
64
64
  background-color: #fff0c4;
65
- line-height: 22px;
66
- padding-right: 4px;
65
+ line-height: $sitemap-line-height;
66
+ padding-right: $default-padding;
67
67
  font-size: 10px;
68
- padding-left: 4px;
68
+ padding-left: $default-padding;
69
69
  max-width: 45%;
70
70
  white-space: nowrap;
71
71
  overflow: hidden;
@@ -85,14 +85,10 @@
85
85
  height: 28px;
86
86
  }
87
87
 
88
- #layoutpages li {
89
- padding: 0;
90
- }
91
-
92
88
  .sitemap_page {
93
- height: 22px;
94
- padding-bottom: 4px;
95
- padding-top: 4px;
89
+ height: $sitemap-line-height;
90
+ padding-bottom: $default-padding;
91
+ padding-top: $default-padding;
96
92
  position: relative;
97
93
 
98
94
  &.highlight .sitemap_pagename_link {
@@ -117,7 +113,7 @@ div.sitemap_left_images {
117
113
  }
118
114
 
119
115
  .sitemap_right_tools {
120
- height: 22px;
116
+ height: $sitemap-line-height;
121
117
  background-color: $light-gray;
122
118
  padding-left: 8px;
123
119
  float: right;
@@ -188,43 +184,36 @@ ul#sitemap {
188
184
  }
189
185
 
190
186
  li {
191
- padding-left: 22px;
187
+ padding-left: $sitemap-line-height;
192
188
  padding-right: 0;
193
189
  }
194
190
  }
195
191
  }
196
192
 
197
- ul#sitemap li,
198
- ul#layoutpages li {
199
- list-style-type: none;
200
- display: block;
201
- margin-left: 0;
202
- margin-bottom: 0;
203
- line-height: 22px;
204
- }
205
-
206
193
  ul#sitemap li .sitemap_toolrow,
207
194
  ul.list li .sitemap_toolrow {
208
195
  margin: 0;
209
196
  overflow: auto;
210
- padding: 4px 0;
197
+ padding: $default-padding 0;
211
198
  }
212
199
 
213
200
  ul#sitemap .sitemap_sitename,
214
201
  ul.list .sitemap_sitename {
215
- height: 22px;
216
- line-height: 22px;
202
+ height: $sitemap-line-height;
203
+ line-height: $sitemap-line-height;
217
204
  overflow: hidden;
218
205
  }
219
206
 
220
- div.page_infos {
207
+ .page_infos {
221
208
  @extend .right-rounded-border;
222
209
  background-color: #fff;
223
210
  border-left: 1px solid $light-gray;
224
211
  float: right;
225
- height: 20px;
226
- padding: 1px;
227
- width: 68px;
212
+ height: $sitemap-line-height;
213
+
214
+ .page_status {
215
+ margin: $default-margin;
216
+ }
228
217
  }
229
218
 
230
219
  #sub_navigation .page_status_and_name .page_status {
@@ -268,14 +257,6 @@ div.page_infos {
268
257
  }
269
258
  }
270
259
 
271
- #sitemap .page_status {
272
- margin: 2px 2px 0 4px;
273
- }
274
-
275
- .alchemy-dialog .page_status {
276
- margin: 2px 4px 0 0;
277
- }
278
-
279
260
  #sitemap {
280
261
 
281
262
  &.sorting {
@@ -295,7 +276,7 @@ div.page_infos {
295
276
 
296
277
  .sitemap_sitestatus {
297
278
  float: right;
298
- margin-top: 4px;
279
+ margin-top: $default-margin;
299
280
  }
300
281
 
301
282
  a.folder_link {
@@ -313,18 +294,19 @@ a.folder_link {
313
294
  @extend %rounded-border;
314
295
  }
315
296
 
316
- h2#sitemap_heading {
297
+ #sitemap_heading {
317
298
  padding: 0;
318
299
 
319
- span.page_infos {
300
+ .page_infos {
320
301
  margin-right: 144px;
321
302
  width: 40px;
322
303
  text-align: center;
323
304
  float: right;
324
305
  line-height: 28px;
306
+ background: transparent;
325
307
  }
326
308
 
327
- span.page_name {
309
+ .page_name {
328
310
  line-height: 28px;
329
311
  margin-left: 24px;
330
312
  }
@@ -352,7 +334,7 @@ h2#sitemap_heading {
352
334
 
353
335
  .close_elements_from_page_selector {
354
336
  position: absolute;
355
- right: 4px;
337
+ right: $default-padding;
356
338
  top: 12px;
357
339
  font-size: 16px;
358
340
  width: 16px;
@@ -362,11 +344,6 @@ h2#sitemap_heading {
362
344
  }
363
345
  }
364
346
 
365
- .show_elements_to_link {
366
- @extend .icon;
367
- @extend .element_window;
368
- }
369
-
370
347
  .elements_from_page_selector {
371
348
  width: 100%;
372
349
  }
@@ -387,7 +364,7 @@ h2#sitemap_heading {
387
364
  .spinner {
388
365
  top: 17px !important;
389
366
  left: 50% !important;
390
- margin-left: 4px;
367
+ margin-left: $default-margin;
391
368
  }
392
369
 
393
370
  .alchemy_selectbox {
@@ -13,8 +13,6 @@
13
13
  margin: 0;
14
14
  @include inline-block;
15
15
  line-height: 5px;
16
-
17
- select { margin: 0 }
18
16
  }
19
17
  }
20
18
 
@@ -9,16 +9,14 @@ module Alchemy
9
9
  @query = Attachment.ransack(params[:q])
10
10
  @attachments = @query.result
11
11
 
12
- if params[:only].present?
13
- @attachments = @attachments.where("file_mime_type LIKE '%#{params[:only]}%'")
14
- end
15
- if params[:except].present?
16
- @attachments = @attachments.where("file_mime_type NOT LIKE '%#{params[:except]}%'")
17
- end
18
12
  if params[:tagged_with].present?
19
13
  @attachments = @attachments.tagged_with(params[:tagged_with])
20
14
  end
21
15
 
16
+ if params[:file_type].present?
17
+ @attachments = @attachments.with_file_type(params[:file_type])
18
+ end
19
+
22
20
  @attachments = @attachments
23
21
  .page(params[:page] || 1)
24
22
  .per(15)
@@ -165,10 +165,10 @@ module Alchemy
165
165
  end
166
166
 
167
167
  def load_locked_pages
168
- @locked_pages = Page.from_current_site.locked_by(current_alchemy_user)
168
+ @locked_pages = Page.locked_by(current_alchemy_user).order(:locked_at)
169
169
  end
170
170
 
171
- # Returns the current site.
171
+ # Returns the current site for admin controllers.
172
172
  #
173
173
  def current_alchemy_site
174
174
  @current_alchemy_site ||= begin
@@ -7,8 +7,8 @@ module Alchemy
7
7
  authorize_resource class: :alchemy_admin_dashboard
8
8
 
9
9
  def index
10
- @last_edited_pages = Page.from_current_site.all_last_edited_from(current_alchemy_user)
11
- @all_locked_pages = Page.from_current_site.locked
10
+ @last_edited_pages = Page.all_last_edited_from(current_alchemy_user)
11
+ @all_locked_pages = Page.locked
12
12
  if Alchemy.user_class.respond_to?(:logged_in)
13
13
  @online_users = Alchemy.user_class.logged_in.to_a - [current_alchemy_user]
14
14
  end
@@ -1,6 +1,11 @@
1
1
  module Alchemy
2
2
  module Admin
3
3
  class LanguagesController < ResourcesController
4
+ def index
5
+ @query = Language.on_current_site.ransack(params[:q])
6
+ @languages = @query.result.page(params[:page] || 1).per(per_page_value_for_screen_size)
7
+ end
8
+
4
9
  def new
5
10
  @language = Language.new
6
11
  @language.page_layout = configured_page_layout || @language.page_layout
@@ -24,10 +24,10 @@ module Alchemy
24
24
  def index
25
25
  authorize! :index, :alchemy_admin_pages
26
26
 
27
- @languages = Language.all
27
+ @languages = Language.on_current_site
28
28
  if !@page_root
29
29
  @language = Language.current
30
- @languages_with_page_tree = Language.with_root_page
30
+ @languages_with_page_tree = Language.on_current_site.with_root_page
31
31
  @page_layouts = PageLayout.layouts_for_select(@language.id)
32
32
  end
33
33
  end
@@ -75,12 +75,15 @@ module Alchemy
75
75
  end
76
76
 
77
77
  # Edit the content of the page and all its elements and contents.
78
+ #
79
+ # Locks the page to current user to prevent other users from editing it meanwhile.
80
+ #
78
81
  def edit
79
82
  # fetching page via before filter
80
83
  if page_is_locked?
81
84
  flash[:notice] = Alchemy.t('This page is locked', name: @page.locker_name)
82
85
  redirect_to admin_pages_path
83
- else
86
+ elsif page_needs_lock?
84
87
  @page.lock_to!(current_alchemy_user)
85
88
  end
86
89
  @layoutpage = @page.layoutpage?
@@ -171,9 +174,10 @@ module Alchemy
171
174
 
172
175
  def visit
173
176
  @page.unlock!
174
- redirect_to show_page_path(
177
+ redirect_to show_page_url(
175
178
  urlname: @page.urlname,
176
- locale: prefix_locale? ? @page.language_code : nil
179
+ locale: prefix_locale? ? @page.language_code : nil,
180
+ host: @page.site.host == "*" ? request.host : @page.site.host
177
181
  )
178
182
  end
179
183
 
@@ -369,6 +373,11 @@ module Alchemy
369
373
  @page.locked? && @page.locker.id != current_alchemy_user.id
370
374
  end
371
375
 
376
+ def page_needs_lock?
377
+ return true unless @page.locker
378
+ @page.locker.try!(:id) != current_alchemy_user.try!(:id)
379
+ end
380
+
372
381
  def paste_from_clipboard
373
382
  if params[:paste_from_clipboard]
374
383
  source = Page.find(params[:paste_from_clipboard])
@@ -7,7 +7,7 @@ module Alchemy
7
7
  class ResourcesController < Alchemy::Admin::BaseController
8
8
  include Alchemy::ResourcesHelper
9
9
 
10
- helper Alchemy::ResourcesHelper
10
+ helper Alchemy::ResourcesHelper, TagsHelper
11
11
  helper_method :resource_handler
12
12
 
13
13
  before_filter :load_resource,
@@ -20,9 +20,19 @@ module Alchemy
20
20
  def index
21
21
  @query = resource_handler.model.ransack(params[:q])
22
22
  items = @query.result
23
+
23
24
  if contains_relations?
24
25
  items = items.includes(*resource_relations_names)
25
26
  end
27
+
28
+ if params[:tagged_with].present?
29
+ items = items.tagged_with(params[:tagged_with])
30
+ end
31
+
32
+ if params[:filter].present?
33
+ items = items.public_send(sanitized_filter_params)
34
+ end
35
+
26
36
  respond_to do |format|
27
37
  format.html {
28
38
  items = items.page(params[:page] || 1).per(per_page_value_for_screen_size)
@@ -113,6 +123,12 @@ module Alchemy
113
123
  def resource_params
114
124
  params.require(resource_handler.namespaced_resource_name).permit!
115
125
  end
126
+
127
+ def sanitized_filter_params
128
+ resource_model.alchemy_resource_filters.detect do |filter|
129
+ filter == params[:filter]
130
+ end || :all
131
+ end
116
132
  end
117
133
  end
118
134
  end
@@ -3,6 +3,7 @@
3
3
  module Alchemy
4
4
  class BaseController < ApplicationController
5
5
  include Alchemy::ConfigurationMethods
6
+ include Alchemy::AbilityHelper
6
7
  include Alchemy::ControllerActions
7
8
  include Alchemy::Modules
8
9
  include Alchemy::SSLProtection