alchemy_cms 2.3.2 → 2.4.beta2
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.
- data/.gitignore +1 -2
- data/.travis.yml +1 -5
- data/Gemfile +4 -4
- data/README.md +22 -15
- data/alchemy_cms.gemspec +38 -38
- data/app/assets/javascripts/alchemy/alchemy.base.js +2 -2
- data/app/assets/javascripts/alchemy/alchemy.buttons.js.coffee +31 -0
- data/app/assets/javascripts/alchemy/alchemy.dragndrop.js +1 -1
- data/app/assets/javascripts/alchemy/alchemy.elements_window.js +24 -15
- data/app/assets/javascripts/alchemy/alchemy.gui.js.coffee +9 -3
- data/app/assets/javascripts/alchemy/alchemy.jquery_loader.js +2 -2
- data/app/assets/javascripts/alchemy/alchemy.js +1 -0
- data/app/assets/javascripts/alchemy/alchemy.menubar.js +4 -12
- data/app/assets/javascripts/alchemy/alchemy.onload.js.coffee +32 -0
- data/app/assets/javascripts/alchemy/alchemy.windows.js +4 -4
- data/app/assets/stylesheets/alchemy/_defaults.scss +0 -1
- data/app/assets/stylesheets/alchemy/alchemy.css +2 -1
- data/app/assets/stylesheets/alchemy/base.css.scss +2 -54
- data/app/assets/stylesheets/alchemy/elements.css.scss +8 -5
- data/app/assets/stylesheets/alchemy/errors.css.scss +51 -0
- data/app/assets/stylesheets/alchemy/flash.css.scss +0 -2
- data/app/assets/stylesheets/alchemy/form_elements.css.scss +31 -75
- data/app/assets/stylesheets/alchemy/icons.css.scss +5 -5
- data/app/assets/stylesheets/alchemy/menubar.css.scss +0 -2
- data/app/assets/stylesheets/alchemy/sitemap.css.scss +0 -1
- data/app/assets/stylesheets/alchemy/tables.css.scss +3 -1
- data/app/controllers/alchemy/admin/base_controller.rb +19 -12
- data/app/controllers/alchemy/admin/elements_controller.rb +52 -24
- data/app/controllers/alchemy/admin/pages_controller.rb +11 -5
- data/app/controllers/alchemy/admin/resources_controller.rb +3 -4
- data/app/controllers/alchemy/admin/users_controller.rb +1 -0
- data/app/controllers/alchemy/base_controller.rb +34 -8
- data/app/controllers/alchemy/pictures_controller.rb +16 -1
- data/app/controllers/alchemy/user_sessions_controller.rb +6 -1
- data/app/helpers/alchemy/base_helper.rb +14 -0
- data/app/helpers/alchemy/elements_helper.rb +10 -5
- data/app/helpers/alchemy/pages_helper.rb +1 -2
- data/app/helpers/alchemy/url_helper.rb +43 -24
- data/app/models/alchemy/element.rb +23 -16
- data/app/models/alchemy/page.rb +25 -14
- data/app/models/alchemy/picture.rb +24 -0
- data/app/views/alchemy/admin/contents/create.js.erb +1 -1
- data/app/views/alchemy/admin/elements/_new_element_form.html.erb +1 -1
- data/app/views/alchemy/admin/elements/create.js.erb +11 -3
- data/app/views/alchemy/admin/elements/fold.js.erb +1 -1
- data/app/views/alchemy/admin/elements/new.html.erb +1 -1
- data/app/views/alchemy/admin/elements/update.js.erb +1 -1
- data/app/views/alchemy/admin/essence_pictures/crop.html.erb +1 -1
- data/app/views/alchemy/admin/languages/_form.html.erb +1 -1
- data/app/views/alchemy/admin/pages/_new_page_form.html.erb +1 -1
- data/app/views/alchemy/admin/pages/_page.html.erb +1 -1
- data/app/views/alchemy/admin/pages/configure.html.erb +10 -6
- data/app/views/alchemy/admin/pages/configure_external.html.erb +1 -1
- data/app/views/alchemy/admin/pages/edit.html.erb +1 -2
- data/app/views/alchemy/admin/pages/new.html.erb +2 -2
- data/app/views/alchemy/admin/pages/update.js.erb +10 -2
- data/app/views/alchemy/admin/partials/_sub_navigation_tab.html.erb +5 -5
- data/app/views/alchemy/admin/pictures/_filter_bar.html.erb +2 -1
- data/app/views/alchemy/admin/pictures/_picture.html.erb +2 -2
- data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +2 -1
- data/app/views/alchemy/admin/pictures/show_in_window.html.erb +3 -2
- data/app/views/alchemy/admin/resources/_form.html.erb +1 -1
- data/app/views/alchemy/admin/users/_table.html.erb +4 -4
- data/app/views/alchemy/admin/users/edit.html.erb +1 -1
- data/app/views/alchemy/admin/users/new.html.erb +1 -1
- data/app/views/alchemy/base/error_notice.js.erb +1 -1
- data/app/views/alchemy/base/remote_errors.js.erb +2 -3
- data/app/views/alchemy/essences/_essence_picture_editor.html.erb +10 -7
- data/app/views/alchemy/essences/_essence_picture_view.html.erb +24 -21
- data/app/views/layouts/alchemy/admin.html.erb +9 -31
- data/bin/alchemy +20 -24
- data/config/alchemy/config.yml +6 -0
- data/config/alchemy/page_layouts.yml +2 -0
- data/config/authorization_rules.rb +1 -1
- data/config/locales/alchemy.de.yml +3 -0
- data/config/locales/alchemy.en.yml +4 -1
- data/db/migrate/20121026100815_alchemy_two_point_three.rb +312 -0
- data/lib/alchemy/mount_point.rb +9 -3
- data/lib/alchemy/page_layout.rb +89 -73
- data/lib/alchemy/version.rb +1 -1
- data/lib/rails/generators/alchemy/deploy_script/deploy_script_generator.rb +45 -12
- data/lib/rails/generators/alchemy/deploy_script/templates/deploy.rb.tt +3 -1
- data/lib/rails/generators/alchemy/essence/essence_generator.rb +51 -0
- data/lib/rails/generators/alchemy/essence/templates/editor.html.erb +18 -0
- data/lib/rails/generators/alchemy/essence/templates/view.html.erb +2 -0
- data/lib/rails/templates/alchemy.rb +1 -1
- data/lib/tasks/install.rake +57 -2
- data/spec/controllers/admin/elements_controller_spec.rb +170 -22
- data/spec/controllers/admin/trash_controller_spec.rb +1 -1
- data/spec/controllers/admin/users_controller_spec.rb +36 -0
- data/spec/controllers/base_controller_spec.rb +12 -1
- data/spec/controllers/elements_controller_spec.rb +17 -13
- data/spec/controllers/pictures_controller_spec.rb +4 -4
- data/spec/dummy/config/application.rb +1 -1
- data/spec/dummy/db/migrate/20121026100815_alchemy_two_point_three.rb +312 -0
- data/spec/dummy/db/migrate/20121026104128_create_events.rb +19 -0
- data/spec/dummy/db/schema.rb +1 -1
- data/spec/factories.rb +0 -1
- data/spec/helpers/base_helper_spec.rb +48 -0
- data/spec/helpers/elements_helper_spec.rb +14 -3
- data/spec/helpers/url_helper_spec.rb +8 -3
- data/spec/integration/picture_security_spec.rb +35 -0
- data/spec/integration/translation_integration_spec.rb +6 -5
- data/spec/models/element_spec.rb +5 -5
- data/spec/models/page_layout_spec.rb +10 -16
- data/spec/models/page_spec.rb +25 -2
- data/spec/models/picture_spec.rb +24 -2
- data/spec/routing_spec.rb +115 -115
- data/spec/support/alchemy/specs_helpers.rb +4 -4
- data/{app/assets/images/alchemy → vendor/assets/images}/Jcrop.gif +0 -0
- data/vendor/assets/javascripts/jquery_plugins/jquery.Jcrop.min.js +19 -243
- data/vendor/assets/javascripts/jquery_plugins/jquery.selectboxit.min.js +1 -0
- data/vendor/assets/javascripts/jquery_plugins/jquery.ui.tabspaging.js +6 -6
- data/vendor/assets/stylesheets/jquery.Jcrop.min.css +28 -0
- metadata +48 -82
- data/app/assets/javascripts/alchemy/alchemy.buttons.js +0 -50
- data/app/assets/stylesheets/alchemy/jquery.Jcrop.css.scss +0 -54
- data/app/helpers/alchemy/pictures_helper.rb +0 -19
- data/db/migrate/20100607143125_create_pages.rb +0 -34
- data/db/migrate/20100607144254_create_elements.rb +0 -20
- data/db/migrate/20100607145256_create_contents.rb +0 -18
- data/db/migrate/20100607145719_create_users.rb +0 -32
- data/db/migrate/20100607150611_create_pictures.rb +0 -16
- data/db/migrate/20100607150812_create_attachments.rb +0 -16
- data/db/migrate/20100607153647_create_folded_pages.rb +0 -13
- data/db/migrate/20100607161345_create_essence_texts.rb +0 -19
- data/db/migrate/20100607162339_create_elements_pages.rb +0 -12
- data/db/migrate/20100607193638_create_essence_pictures.rb +0 -23
- data/db/migrate/20100607193646_create_essence_richtexts.rb +0 -16
- data/db/migrate/20100607193653_create_essence_htmls.rb +0 -13
- data/db/migrate/20100609111653_create_essence_dates.rb +0 -13
- data/db/migrate/20100609111809_create_essence_files.rb +0 -15
- data/db/migrate/20100609111821_create_essence_flashes.rb +0 -16
- data/db/migrate/20100609111837_create_essence_videos.rb +0 -18
- data/db/migrate/20100616150753_create_essence_audios.rb +0 -17
- data/db/migrate/20100812085225_add_crop_from_and_crop_size_to_essence_pictures.rb +0 -11
- data/db/migrate/20100909140701_change_essence_htmls_source_column_type.rb +0 -9
- data/db/migrate/20101109150312_alter_pages_visible_column_default.rb +0 -9
- data/db/migrate/20101109151812_create_languages.rb +0 -19
- data/db/migrate/20101216151419_add_language_id_to_pages.rb +0 -27
- data/db/migrate/20101216155216_add_index_to_languages.rb +0 -9
- data/db/migrate/20101216173323_add_default_to_languages.rb +0 -9
- data/db/migrate/20101218130049_add_urlname_index_to_pages.rb +0 -9
- data/db/migrate/20110115123343_remove_css_class_default_from_essence_pictures.rb +0 -11
- data/db/migrate/20110224105120_change_pages_visible_default.rb +0 -11
- data/db/migrate/20110228182659_remove_default_page_layout_from_pages.rb +0 -11
- data/db/migrate/20110414163140_remove_display_name_from_elements.rb +0 -11
- data/db/migrate/20110511100516_rename_essence_texts_title_to_link_title.rb +0 -9
- data/db/migrate/20110529130429_create_cells.rb +0 -14
- data/db/migrate/20110529130500_add_cell_id_to_elements.rb +0 -11
- data/db/migrate/20110530102804_change_pages_page_layout_column.rb +0 -11
- data/db/migrate/20110707190728_add_render_size_to_essence_pictures.rb +0 -9
- data/db/migrate/20110711142057_change_open_link_in_new_window_to_link_target.rb +0 -19
- data/db/migrate/20110919110451_add_default_role_to_users.rb +0 -9
- data/db/migrate/20111116125112_namespace_alchemy_models.rb +0 -23
- data/db/migrate/20120216135355_add_country_code_to_languages.rb +0 -9
- data/db/migrate/20120608085509_create_alchemy_essence_selects.rb +0 -11
- data/db/migrate/20120611221734_create_alchemy_essence_booleans.rb +0 -11
- data/db/migrate/20120704181529_add_upload_hash_to_alchemy_picture.rb +0 -5
- data/db/migrate/20120705214247_acts_as_taggable_on_migration.rb +0 -28
- data/db/migrate/20120728185830_add_cached_tag_list_to_alchemy_pictures.rb +0 -5
- data/db/migrate/20120831135441_set_alchemy_languages_country_code_default_to_empty_string.rb +0 -9
- data/spec/helpers/pictures_helper_spec.rb +0 -14
- data/vendor/assets/javascripts/jquery_plugins/jquery.selectBoxIt.js +0 -1909
|
@@ -15,7 +15,7 @@ module Alchemy
|
|
|
15
15
|
# :fallback => { # You can use the fallback option as an override. So you can take elements from a glo´bal laout page and only if the user adds an element on current page the local one gets rendered.
|
|
16
16
|
# :for => 'ELEMENT_NAME', # The name of the element the fallback is for
|
|
17
17
|
# :with => 'ELEMENT_NAME', # (OPTIONAL) the name of element to fallback with
|
|
18
|
-
# :from =>
|
|
18
|
+
# :from => String || Page # Pass a page_layout name from a page the fallback elements lie on or pass the page object.
|
|
19
19
|
# } #
|
|
20
20
|
# :sort_by => Content#name # A Content name to sort the elements by
|
|
21
21
|
# :reverse => boolean # Reverse the rendering order
|
|
@@ -55,13 +55,18 @@ module Alchemy
|
|
|
55
55
|
else
|
|
56
56
|
all_elements = page.find_elements(options)
|
|
57
57
|
end
|
|
58
|
-
|
|
58
|
+
if options[:sort_by].present?
|
|
59
59
|
all_elements = all_elements.sort_by { |e| e.contents.detect { |c| c.name == options[:sort_by] }.ingredient }
|
|
60
60
|
end
|
|
61
61
|
element_string = ""
|
|
62
62
|
if options[:fallback]
|
|
63
|
-
|
|
64
|
-
if
|
|
63
|
+
if all_elements.detect { |e| e.name == options[:fallback][:for] }.blank?
|
|
64
|
+
if options[:fallback][:from].class.name == 'Alchemy::Page'
|
|
65
|
+
from = options[:fallback][:from]
|
|
66
|
+
else
|
|
67
|
+
from = Page.not_restricted.where(:page_layout => options[:fallback][:from]).with_language(session[:language_id]).first
|
|
68
|
+
end
|
|
69
|
+
if from
|
|
65
70
|
all_elements += from.elements.named(options[:fallback][:with].blank? ? options[:fallback][:for] : options[:fallback][:with])
|
|
66
71
|
end
|
|
67
72
|
end
|
|
@@ -163,7 +168,7 @@ module Alchemy
|
|
|
163
168
|
|
|
164
169
|
# Returns the full url containing host, page and anchor for the given element
|
|
165
170
|
def full_url_for_element(element)
|
|
166
|
-
"
|
|
171
|
+
"#{current_server}/#{element.page.urlname}##{element_dom_id(element)}"
|
|
167
172
|
end
|
|
168
173
|
|
|
169
174
|
end
|
|
@@ -3,7 +3,6 @@ module Alchemy
|
|
|
3
3
|
|
|
4
4
|
include Alchemy::BaseHelper
|
|
5
5
|
include Alchemy::ElementsHelper
|
|
6
|
-
include Alchemy::PicturesHelper
|
|
7
6
|
include Alchemy::UrlHelper
|
|
8
7
|
|
|
9
8
|
def render_classes(classes=[])
|
|
@@ -479,7 +478,7 @@ module Alchemy
|
|
|
479
478
|
Alchemy.loadAlchemyMenuBar({
|
|
480
479
|
page_id: #{@page.id},
|
|
481
480
|
route: '#{Alchemy.mount_point}',
|
|
482
|
-
locale: '#{current_user.language
|
|
481
|
+
locale: '#{current_user.language}'
|
|
483
482
|
});
|
|
484
483
|
} catch(e) {
|
|
485
484
|
if(console){console.log(e)}
|
|
@@ -5,14 +5,6 @@
|
|
|
5
5
|
module Alchemy
|
|
6
6
|
module UrlHelper
|
|
7
7
|
|
|
8
|
-
# Returns the correct params-hash for passing to show_page_path
|
|
9
|
-
def show_page_path_params(page, optional_params={})
|
|
10
|
-
url_params = {:level1 => nil, :level2 => nil, :level3 => nil, :urlname => page.urlname}
|
|
11
|
-
url_params.update(optional_params)
|
|
12
|
-
url_params.update(params_for_nested_url(page)) if configuration(:url_nesting)
|
|
13
|
-
multi_language? ? url_params.update(:lang => page.language_code) : url_params
|
|
14
|
-
end
|
|
15
|
-
|
|
16
8
|
# Returns the path for rendering an alchemy page
|
|
17
9
|
def show_alchemy_page_path(page, optional_params={})
|
|
18
10
|
alchemy.show_page_path(show_page_path_params(page, optional_params))
|
|
@@ -23,22 +15,6 @@ module Alchemy
|
|
|
23
15
|
alchemy.show_page_url(show_page_path_params(page, optional_params))
|
|
24
16
|
end
|
|
25
17
|
|
|
26
|
-
# Returns the correct params-hash for passing to show_picture_path
|
|
27
|
-
def show_picture_path_params(picture, optional_params={})
|
|
28
|
-
url_params = {:id => picture.id, :name => picture.urlname, :format => configuration(:image_output_format)}
|
|
29
|
-
url_params.update(optional_params.update({:crop => optional_params[:crop] ? 'crop' : nil}))
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
# Returns the path for rendering an alchemy picture
|
|
33
|
-
def show_alchemy_picture_path(picture, optional_params={})
|
|
34
|
-
alchemy.show_picture_path(show_picture_path_params(picture, optional_params))
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
# Returns the url for rendering an alchemy picture
|
|
38
|
-
def show_alchemy_picture_url(picture, optional_params={})
|
|
39
|
-
alchemy.show_picture_url(show_picture_path_params(picture, optional_params))
|
|
40
|
-
end
|
|
41
|
-
|
|
42
18
|
# This helper returns a path for use inside a link_to helper.
|
|
43
19
|
#
|
|
44
20
|
# You may pass a page_layout or an urlname.
|
|
@@ -63,5 +39,48 @@ module Alchemy
|
|
|
63
39
|
alchemy.show_page_path({:urlname => urlname, :lang => multi_language? ? session[:language_code] : nil}.merge(options.except(:page_layout, :urlname, :lang)))
|
|
64
40
|
end
|
|
65
41
|
|
|
42
|
+
# This helper returns a path to picture for use inside a image_tag helper.
|
|
43
|
+
#
|
|
44
|
+
# Any additional options are passed to the url_helper, so you can add arguments to your url.
|
|
45
|
+
#
|
|
46
|
+
# Example:
|
|
47
|
+
#
|
|
48
|
+
# <%= image_tag show_alchemy_picture_path(picture, :size => '320x200', :format => :png) %>
|
|
49
|
+
#
|
|
50
|
+
def show_alchemy_picture_path(picture, optional_params={})
|
|
51
|
+
alchemy.show_picture_path(show_picture_path_params(picture, optional_params))
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# This helper returns an url to picture for use inside a image_tag helper.
|
|
55
|
+
#
|
|
56
|
+
# Any additional options are passed to the url_helper, so you can add arguments to your url.
|
|
57
|
+
#
|
|
58
|
+
# Example:
|
|
59
|
+
#
|
|
60
|
+
# <%= image_tag show_alchemy_picture_url(picture, :size => '320x200', :format => :png) %>
|
|
61
|
+
#
|
|
62
|
+
def show_alchemy_picture_url(picture, optional_params={})
|
|
63
|
+
alchemy.show_picture_url(show_picture_path_params(picture, optional_params))
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Returns the correct params hash for passing to show_picture_path
|
|
67
|
+
def show_picture_path_params(picture, optional_params={})
|
|
68
|
+
url_params = {
|
|
69
|
+
:id => picture.id,
|
|
70
|
+
:name => picture.urlname,
|
|
71
|
+
:format => configuration(:image_output_format),
|
|
72
|
+
:sh => picture.security_token(optional_params)
|
|
73
|
+
}
|
|
74
|
+
url_params.update(optional_params.update({:crop => optional_params[:crop] ? 'crop' : nil}))
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Returns the correct params-hash for passing to show_page_path
|
|
78
|
+
def show_page_path_params(page, optional_params={})
|
|
79
|
+
url_params = {:level1 => nil, :level2 => nil, :level3 => nil, :urlname => page.urlname}
|
|
80
|
+
url_params.update(optional_params)
|
|
81
|
+
url_params.update(params_for_nested_url(page)) if configuration(:url_nesting)
|
|
82
|
+
multi_language? ? url_params.update(:lang => page.language_code) : url_params
|
|
83
|
+
end
|
|
84
|
+
|
|
66
85
|
end
|
|
67
86
|
end
|
|
@@ -28,7 +28,7 @@ module Alchemy
|
|
|
28
28
|
|
|
29
29
|
attr_accessor :create_contents_after_create
|
|
30
30
|
|
|
31
|
-
after_create :create_contents, :unless =>
|
|
31
|
+
after_create :create_contents, :unless => proc { |e| e.create_contents_after_create == false }
|
|
32
32
|
|
|
33
33
|
scope :trashed, where(:position => nil).order('updated_at DESC')
|
|
34
34
|
scope :not_trashed, where(Element.arel_table[:position].not_eq(nil))
|
|
@@ -44,16 +44,16 @@ module Alchemy
|
|
|
44
44
|
|
|
45
45
|
# Builds a new element as described in +/config/alchemy/elements.yml+
|
|
46
46
|
def new_from_scratch(attributes)
|
|
47
|
-
attributes.
|
|
48
|
-
return new if attributes[
|
|
47
|
+
attributes = attributes.dup.symbolize_keys
|
|
48
|
+
return new if attributes[:name].blank?
|
|
49
49
|
return nil if descriptions.blank?
|
|
50
50
|
# clean the name from cell name
|
|
51
|
-
attributes[
|
|
52
|
-
element_scratch = descriptions.detect { |
|
|
51
|
+
attributes[:name] = attributes[:name].split('#').first
|
|
52
|
+
element_scratch = descriptions.detect { |el| el['name'] == attributes[:name] }
|
|
53
53
|
if element_scratch
|
|
54
|
-
new(element_scratch.except(*FORBIDDEN_DEFINITION_ATTRIBUTES)
|
|
54
|
+
new(element_scratch.merge(attributes).except(*FORBIDDEN_DEFINITION_ATTRIBUTES))
|
|
55
55
|
else
|
|
56
|
-
raise "Element description for #{attributes[
|
|
56
|
+
raise "Element description for #{attributes[:name]} not found. Please check your elements.yml"
|
|
57
57
|
end
|
|
58
58
|
end
|
|
59
59
|
|
|
@@ -81,6 +81,9 @@ module Alchemy
|
|
|
81
81
|
raise LoadError, "Could not find elements.yml file! Please run: rails generate alchemy:scaffold"
|
|
82
82
|
end
|
|
83
83
|
element_definitions
|
|
84
|
+
rescue TypeError => e
|
|
85
|
+
Rails.logger.warn "\n++++ WARNING: Your elements.yml is empty.\n"
|
|
86
|
+
[]
|
|
84
87
|
end
|
|
85
88
|
alias_method :definitions, :descriptions
|
|
86
89
|
|
|
@@ -153,8 +156,7 @@ module Alchemy
|
|
|
153
156
|
"created_at",
|
|
154
157
|
"updated_at",
|
|
155
158
|
"creator_id",
|
|
156
|
-
"updater_id"
|
|
157
|
-
"cell_id"
|
|
159
|
+
"updater_id"
|
|
158
160
|
).merge(differences.stringify_keys)
|
|
159
161
|
element = self.create!(attributes.merge(:create_contents_after_create => false))
|
|
160
162
|
source.contents.each do |content|
|
|
@@ -309,7 +311,12 @@ module Alchemy
|
|
|
309
311
|
|
|
310
312
|
# returns the description of the element with my name in element.yml
|
|
311
313
|
def description
|
|
312
|
-
self.class.descriptions.detect { |d| d['name'] == self.name }
|
|
314
|
+
description = self.class.descriptions.detect { |d| d['name'] == self.name }
|
|
315
|
+
if description.blank?
|
|
316
|
+
raise "Could not find element definition for #{self.name}. Please check your elements.yml"
|
|
317
|
+
else
|
|
318
|
+
return description
|
|
319
|
+
end
|
|
313
320
|
end
|
|
314
321
|
alias_method :definition, :description
|
|
315
322
|
|
|
@@ -459,12 +466,12 @@ module Alchemy
|
|
|
459
466
|
essence_errors.each do |content_name, errors|
|
|
460
467
|
errors.each do |error|
|
|
461
468
|
messages << I18n.t(error,
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
469
|
+
:scope => [:content_validations, self.name, content_name],
|
|
470
|
+
:default => [
|
|
471
|
+
"alchemy.content_validations.fields.#{content_name}.#{error}".to_sym,
|
|
472
|
+
"alchemy.content_validations.errors.#{error}".to_sym
|
|
473
|
+
],
|
|
474
|
+
:field => Content.translated_label_for(content_name)
|
|
468
475
|
)
|
|
469
476
|
end
|
|
470
477
|
end
|
data/app/models/alchemy/page.rb
CHANGED
|
@@ -58,6 +58,8 @@ module Alchemy
|
|
|
58
58
|
before_save :inherit_restricted_status, :if => proc { |page| !page.systempage? && page.parent && page.parent.restricted? }
|
|
59
59
|
after_create :create_cells, :unless => :systempage?
|
|
60
60
|
after_create :autogenerate_elements, :unless => proc { |page| page.systempage? || page.do_not_autogenerate }
|
|
61
|
+
after_update :trash_not_allowed_elements, :if => :page_layout_changed?
|
|
62
|
+
after_update :autogenerate_elements, :if => :page_layout_changed?
|
|
61
63
|
|
|
62
64
|
scope :language_roots, where(:language_root => true)
|
|
63
65
|
scope :layoutpages, where(:layoutpage => true)
|
|
@@ -66,9 +68,8 @@ module Alchemy
|
|
|
66
68
|
scope :not_locked, where(:locked => false)
|
|
67
69
|
scope :visible, where(:visible => true)
|
|
68
70
|
scope :published, where(:public => true)
|
|
69
|
-
scope :accessible, where(:restricted => false)
|
|
70
|
-
scope :restricted, where(:restricted => true)
|
|
71
71
|
scope :not_restricted, where(:restricted => false)
|
|
72
|
+
scope :restricted, where(:restricted => true)
|
|
72
73
|
scope :public_language_roots, lambda {
|
|
73
74
|
where(:language_root => true, :language_code => Language.all_codes_for_published, :public => true)
|
|
74
75
|
}
|
|
@@ -339,7 +340,6 @@ module Alchemy
|
|
|
339
340
|
description
|
|
340
341
|
end
|
|
341
342
|
end
|
|
342
|
-
|
|
343
343
|
alias_method :definition, :layout_description
|
|
344
344
|
|
|
345
345
|
def cell_definitions
|
|
@@ -562,21 +562,27 @@ module Alchemy
|
|
|
562
562
|
# If the page has cells, it looks if there are elements to generate.
|
|
563
563
|
#
|
|
564
564
|
def autogenerate_elements
|
|
565
|
+
elements_already_on_page = self.elements.available.collect(&:name)
|
|
565
566
|
elements = self.layout_description["autogenerate"]
|
|
566
567
|
if elements.present?
|
|
567
568
|
elements.each do |element|
|
|
568
|
-
if
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
569
|
+
next if elements_already_on_page.include?(element)
|
|
570
|
+
Element.create_from_scratch(attributes_for_element_name(element))
|
|
571
|
+
end
|
|
572
|
+
end
|
|
573
|
+
end
|
|
574
|
+
|
|
575
|
+
# Returns a hash of attributes for given element name
|
|
576
|
+
def attributes_for_element_name(element)
|
|
577
|
+
if self.has_cells? && (cell_definition = cell_definitions.detect { |c| c['elements'].include?(element) })
|
|
578
|
+
cell = self.cells.find_by_name(cell_definition['name'])
|
|
579
|
+
if cell
|
|
580
|
+
return {:page_id => self.id, :cell_id => cell.id, :name => element}
|
|
581
|
+
else
|
|
582
|
+
raise "Cell not found for page #{self.inspect}"
|
|
579
583
|
end
|
|
584
|
+
else
|
|
585
|
+
return {:page_id => self.id, :name => element}
|
|
580
586
|
end
|
|
581
587
|
end
|
|
582
588
|
|
|
@@ -592,5 +598,10 @@ module Alchemy
|
|
|
592
598
|
end
|
|
593
599
|
end
|
|
594
600
|
|
|
601
|
+
# Trashes all elements that are not allowed for this page_layout.
|
|
602
|
+
def trash_not_allowed_elements
|
|
603
|
+
elements.select { |e| !definition['elements'].include?(e.name) }.map(&:trash)
|
|
604
|
+
end
|
|
605
|
+
|
|
595
606
|
end
|
|
596
607
|
end
|
|
@@ -141,5 +141,29 @@ module Alchemy
|
|
|
141
141
|
pages.any? && pages.not_restricted.blank?
|
|
142
142
|
end
|
|
143
143
|
|
|
144
|
+
# Returns a security token for signed picture rendering requests.
|
|
145
|
+
#
|
|
146
|
+
# Pass a params hash containing:
|
|
147
|
+
#
|
|
148
|
+
# size [String] (Optional)
|
|
149
|
+
# crop [Boolean] (Optional)
|
|
150
|
+
# crop_from [String] (Optional)
|
|
151
|
+
# crop_size [String] (Optional)
|
|
152
|
+
#
|
|
153
|
+
# to sign them.
|
|
154
|
+
#
|
|
155
|
+
def security_token(params = {})
|
|
156
|
+
@params = params.stringify_keys
|
|
157
|
+
@params.update({'crop' => @params['crop'] ? 'crop' : nil})
|
|
158
|
+
Digest::SHA1.hexdigest(secured_params)[0..15]
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
private
|
|
162
|
+
|
|
163
|
+
def secured_params
|
|
164
|
+
secret = Rails.configuration.secret_token
|
|
165
|
+
[id, @params['size'], @params['crop'], @params['crop_from'], @params['crop_size'], secret].join('-')
|
|
166
|
+
end
|
|
167
|
+
|
|
144
168
|
end
|
|
145
169
|
end
|
|
@@ -1,14 +1,22 @@
|
|
|
1
1
|
var $el;
|
|
2
|
+
var $element_area = $('#cell_<%= @cell_name -%>');
|
|
3
|
+
var element_html = '<%= escape_javascript render(:partial => "element", :object => @element, :locals => {:draggable => true}) -%>';
|
|
4
|
+
|
|
2
5
|
<% if @cutted_element_id %>
|
|
3
6
|
$('.element_editor[data-element-id="<%= @cutted_element_id %>"]').remove();
|
|
4
7
|
<% end %>
|
|
5
8
|
|
|
6
9
|
<% if @page.can_have_cells? %>
|
|
7
|
-
Alchemy.selectOrCreateCellTab('<%= @
|
|
10
|
+
Alchemy.selectOrCreateCellTab('<%= @cell_name -%>', '<%= @cell.nil? ? t("other Elements") : @cell.name_for_label -%>');
|
|
11
|
+
<% end %>
|
|
12
|
+
|
|
13
|
+
<% if @insert_at_top %>
|
|
14
|
+
$element_area.prepend(element_html);
|
|
15
|
+
<% else %>
|
|
16
|
+
$element_area.append(element_html);
|
|
8
17
|
<% end %>
|
|
9
18
|
|
|
10
|
-
$
|
|
11
|
-
$('#cell_<%= @cell.nil? ? "for_other_elements" : @cell.name -%>').sortable('refresh');
|
|
19
|
+
$element_area.sortable('refresh');
|
|
12
20
|
Alchemy.growl('<%= t("successfully_added_element") -%>');
|
|
13
21
|
Alchemy.closeCurrentWindow();
|
|
14
22
|
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
</div>
|
|
12
12
|
<div id="paste_element_tab">
|
|
13
13
|
<%= form_for([:admin, @element], :remote => true, :id => 'paste_element_form') do |f| %>
|
|
14
|
-
<div id="
|
|
14
|
+
<div id="paste_element_errors" class="errors"></div>
|
|
15
15
|
<table>
|
|
16
16
|
<tr>
|
|
17
17
|
<td class="label">
|
|
@@ -19,6 +19,6 @@ $('#element_<%= @element.id %>_errors').html('<%= @error_message %><ul><li><%= @
|
|
|
19
19
|
$("#element_<%= @element.id %>_errors").show();
|
|
20
20
|
$('div.content_editor').removeClass('validation_failed');
|
|
21
21
|
$('<%= @element.contents_with_errors.map { |content| "#" + content_dom_id(content) }.join(", ") %>').addClass('validation_failed');
|
|
22
|
-
Alchemy.
|
|
22
|
+
Alchemy.Buttons.enable($el);
|
|
23
23
|
|
|
24
24
|
<% end %>
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
|
|
31
31
|
<div id="jscropper">
|
|
32
32
|
<%= image_tag(
|
|
33
|
-
alchemy.zoom_picture_path(:id => @essence_picture.picture.id, :name => @essence_picture.picture.urlname, :format => @options[:format] ),
|
|
33
|
+
alchemy.zoom_picture_path(:id => @essence_picture.picture.id, :name => @essence_picture.picture.urlname, :format => @options[:format], :sh => @essence_picture.picture.security_token),
|
|
34
34
|
:id => 'imageToCrop',
|
|
35
35
|
:onload => "Alchemy.ImageCropper.init(
|
|
36
36
|
[#{@initial_box[:x1]}, #{@initial_box[:y1]}, #{@initial_box[:x2]}, #{@initial_box[:y2]}],
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<%= form_for([:admin, @page], :remote => true, :html => {:id => 'new_page_form'}) do |f| %>
|
|
2
2
|
<%= f.hidden_field(:parent_id) %>
|
|
3
3
|
<%= f.hidden_field(:layoutpage) %>
|
|
4
|
-
<div id="errors"
|
|
4
|
+
<div id="errors"></div>
|
|
5
5
|
<table id="new_page_form">
|
|
6
6
|
<tr>
|
|
7
7
|
<td class="label">
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
alchemy.configure_admin_page_path(page),
|
|
32
32
|
{
|
|
33
33
|
:title => t('edit_page_properties'),
|
|
34
|
-
:size => page.redirects_to_external? ? '410x270' : '
|
|
34
|
+
:size => page.redirects_to_external? ? '410x270' : '410x655'
|
|
35
35
|
},
|
|
36
36
|
:class => '',
|
|
37
37
|
:title => t('edit_page_properties')
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
<%= form_for([:admin, @page], :remote => true) do |f| %>
|
|
2
|
-
<div id="errors"
|
|
2
|
+
<div id="errors"></div>
|
|
3
3
|
<table id="page_names">
|
|
4
4
|
<tr>
|
|
5
5
|
<td class="label"><%= t("page_type") %>: </td>
|
|
6
|
-
<td class="
|
|
6
|
+
<td class="select">
|
|
7
|
+
<%= f.select('page_layout', @page_layouts, {}, {:class => 'alchemy_selectbox long'}) %>
|
|
8
|
+
</td>
|
|
7
9
|
</tr>
|
|
8
10
|
<%- unless @page.layoutpage -%>
|
|
9
11
|
<tr>
|
|
@@ -64,10 +66,12 @@
|
|
|
64
66
|
</tr>
|
|
65
67
|
<%- end -%>
|
|
66
68
|
<tr>
|
|
67
|
-
<td colspan="2" class="
|
|
69
|
+
<td colspan="2" class="submit">
|
|
70
|
+
<p class="foot_note">
|
|
71
|
+
*<%= t('pages.update.comma_seperated') %>
|
|
72
|
+
</p>
|
|
73
|
+
<%= f.button t("save"), :class => 'button' %>
|
|
74
|
+
</td>
|
|
68
75
|
</tr>
|
|
69
76
|
</table>
|
|
70
|
-
<p class="foot_note">
|
|
71
|
-
*<%= t('pages.update.comma_seperated') %>
|
|
72
|
-
</p>
|
|
73
77
|
<% end %>
|