alchemy_cms 2.4.beta2 → 2.4.rc1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -1
- data/.travis.yml +3 -1
- data/.yardopts +1 -1
- data/Gemfile +2 -1
- data/alchemy_cms.gemspec +18 -17
- data/app/assets/images/alchemy/ajax_loader.gif +0 -0
- data/app/assets/images/alchemy/alchemy-logo.png +0 -0
- data/app/assets/images/alchemy/icons.png +0 -0
- data/app/assets/images/alchemy/image_loader.gif +0 -0
- data/app/assets/images/alchemy/placeholder.png +0 -0
- data/app/assets/images/alchemy/shading.png +0 -0
- data/app/assets/images/alchemy/swfupload/browse_button.png +0 -0
- data/app/assets/images/alchemy/tabs.gif +0 -0
- data/app/assets/images/alchemy/ui-icons_666666_256x240.png +0 -0
- data/app/assets/images/sassy-ie-overlay.png +0 -0
- data/app/assets/javascripts/alchemy/alchemy.base.js +1 -3
- data/app/assets/javascripts/alchemy/alchemy.browser.js.coffee +28 -0
- data/app/assets/javascripts/alchemy/alchemy.jquery_loader.js +2 -2
- data/app/assets/javascripts/alchemy/alchemy.js +2 -0
- data/app/assets/javascripts/alchemy/alchemy.link_overlay.js.coffee +79 -47
- data/app/assets/javascripts/alchemy/alchemy.menubar.js +12 -4
- data/app/assets/javascripts/alchemy/alchemy.onload.js.coffee +1 -1
- data/app/assets/javascripts/alchemy/alchemy.preview.js.coffee +103 -0
- data/app/assets/javascripts/alchemy/alchemy.swf_upload.js +1 -1
- data/app/assets/javascripts/alchemy/alchemy.uploader.js +4 -6
- data/app/assets/javascripts/alchemy/preview.js +1 -0
- data/app/assets/stylesheets/alchemy/admin.css.scss +25 -0
- data/app/assets/stylesheets/alchemy/{archive.css.scss → archive.scss} +0 -2
- data/app/assets/stylesheets/alchemy/{base.css.scss → base.scss} +1 -57
- data/app/assets/stylesheets/alchemy/{custom.css → custom.scss} +0 -0
- data/app/assets/stylesheets/alchemy/{dashboard.css.scss → dashboard.scss} +0 -2
- data/app/assets/stylesheets/alchemy/defaults.scss +5 -0
- data/app/assets/stylesheets/alchemy/{elements.css.scss → elements.scss} +24 -37
- data/app/assets/stylesheets/alchemy/{errors.css.scss → errors.scss} +0 -2
- data/app/assets/stylesheets/alchemy/{flash.css.scss → flash.scss} +0 -2
- data/app/assets/stylesheets/alchemy/{form_elements.css.scss → form_elements.scss} +39 -12
- data/app/assets/stylesheets/alchemy/{frame.css.scss → frame.scss} +0 -2
- data/app/assets/stylesheets/alchemy/{icons.css.scss → icons.scss} +20 -2
- data/app/assets/stylesheets/alchemy/{jquery-ui.alchemy.css.scss → jquery-ui.scss} +6 -3
- data/app/assets/stylesheets/alchemy/{login.css.scss → login.scss} +3 -3
- data/app/assets/stylesheets/alchemy/menubar.css.scss +0 -1
- data/app/assets/stylesheets/alchemy/{_defaults.scss → mixins.scss} +2 -39
- data/app/assets/stylesheets/alchemy/{modules.css.scss → modules.scss} +4 -2
- data/app/assets/stylesheets/alchemy/notices.scss +51 -0
- data/app/assets/stylesheets/alchemy/{pagination.css.scss → pagination.scss} +0 -2
- data/app/assets/stylesheets/alchemy/{print.css → print.css.scss} +3 -3
- data/app/assets/stylesheets/alchemy/search.scss +63 -0
- data/app/assets/stylesheets/alchemy/{sitemap.css.scss → sitemap.scss} +1 -2
- data/app/assets/stylesheets/alchemy/{tables.css.scss → tables.scss} +16 -3
- data/app/assets/stylesheets/alchemy/tinymce_content.css.scss +3 -0
- data/app/assets/stylesheets/alchemy/tinymce_dialog.css.scss +3 -0
- data/app/assets/stylesheets/alchemy/{upload.css.scss → upload.scss} +0 -2
- data/app/assets/stylesheets/alchemy/variables.scss +33 -0
- data/app/controllers/alchemy/admin/elements_controller.rb +1 -2
- data/app/controllers/alchemy/admin/tags_controller.rb +64 -0
- data/app/controllers/alchemy/base_controller.rb +8 -23
- data/app/controllers/alchemy/pages_controller.rb +5 -18
- data/app/helpers/alchemy/admin/base_helper.rb +1 -1
- data/app/helpers/alchemy/admin/elements_helper.rb +1 -0
- data/app/helpers/alchemy/elements_block_helper.rb +162 -0
- data/app/helpers/alchemy/elements_helper.rb +41 -3
- data/app/helpers/alchemy/pages_helper.rb +2 -1
- data/app/models/alchemy/attachment.rb +2 -1
- data/app/models/alchemy/element.rb +13 -10
- data/app/models/alchemy/essence_link.rb +11 -0
- data/app/models/alchemy/essence_picture.rb +15 -4
- data/app/models/alchemy/page.rb +23 -25
- data/app/models/alchemy/picture.rb +2 -2
- data/app/models/alchemy/tag.rb +16 -0
- data/app/models/alchemy/user.rb +3 -1
- data/app/views/alchemy/admin/attachments/_attachment.html.erb +12 -12
- data/app/views/alchemy/admin/attachments/edit.html.erb +10 -4
- data/app/views/alchemy/admin/elements/_element.html.erb +10 -13
- data/app/views/alchemy/admin/elements/_element_foot.html.erb +1 -1
- data/app/views/alchemy/admin/essence_files/edit.html.erb +12 -76
- data/app/views/alchemy/admin/essence_pictures/crop.html.erb +9 -4
- data/app/views/alchemy/admin/layoutpages/_layoutpage.html.erb +1 -1
- data/app/views/alchemy/admin/layoutpages/index.html.erb +1 -1
- data/app/views/alchemy/admin/pages/_external_link.html.erb +9 -4
- data/app/views/alchemy/admin/pages/configure.html.erb +22 -12
- data/app/views/alchemy/admin/pages/edit.html.erb +40 -40
- data/app/views/alchemy/admin/partials/_autocomplete_tag_list.html.erb +9 -0
- data/app/views/alchemy/admin/pictures/edit.html.erb +1 -1
- data/app/views/alchemy/admin/pictures/edit_multiple.html.erb +11 -2
- data/app/views/alchemy/admin/tags/_radio_tag.html.erb +6 -0
- data/app/views/alchemy/admin/tags/_tag.html.erb +29 -0
- data/app/views/alchemy/admin/tags/edit.html.erb +41 -0
- data/app/views/alchemy/admin/tags/index.html.erb +46 -0
- data/app/views/alchemy/admin/tags/new.html.erb +16 -0
- data/app/views/alchemy/admin/users/_table.html.erb +18 -10
- data/app/views/alchemy/admin/users/_user.html.erb +2 -1
- data/app/views/alchemy/admin/users/index.html.erb +2 -1
- data/app/views/alchemy/elements/_article_view.html.erb +1 -1
- data/app/views/alchemy/essences/_essence_link_editor.html.erb +23 -0
- data/app/views/alchemy/essences/_essence_link_view.html.erb +0 -0
- data/app/views/alchemy/essences/_essence_picture_tools.html.erb +1 -1
- data/app/views/alchemy/essences/_essence_text_editor.html.erb +1 -9
- data/app/views/alchemy/essences/_linkable_essence_tools.html.erb +19 -0
- data/app/views/layouts/alchemy/admin.html.erb +1 -1
- data/config/alchemy/elements.yml +2 -0
- data/config/alchemy/modules.yml +12 -0
- data/config/alchemy/page_layouts.yml +2 -0
- data/config/authorization_rules.rb +2 -0
- data/config/locales/alchemy.de.yml +36 -5
- data/config/locales/alchemy.en.yml +3 -0
- data/config/routes.rb +6 -4
- data/db/migrate/20121026100815_alchemy_two_point_three.rb +0 -36
- data/db/migrate/20121113115120_create_alchemy_essence_links.rb +13 -0
- data/db/migrate/20121115100736_add_cached_tag_list_to_elements_pages_and_users.rb +7 -0
- data/db/migrate/20121116140636_add_cached_tag_list_to_alchemy_attachments.rb +5 -0
- data/db/migrate/20121116141016_change_alchemy_pictures_tag_list_column.rb +9 -0
- data/lib/alchemy/engine.rb +1 -1
- data/lib/alchemy/resource.rb +1 -1
- data/lib/alchemy/resources_helper.rb +1 -1
- data/lib/alchemy/upgrader.rb +17 -0
- data/lib/alchemy/version.rb +1 -1
- data/lib/alchemy_cms.rb +1 -0
- data/lib/rails/generators/alchemy/base.rb +41 -0
- data/lib/rails/generators/alchemy/deploy_script/templates/deploy.rb.tt +10 -3
- data/lib/rails/generators/alchemy/elements/elements_generator.rb +6 -14
- data/lib/rails/generators/alchemy/elements/templates/editor.html.erb +8 -6
- data/lib/rails/generators/alchemy/elements/templates/editor.html.haml +13 -0
- data/lib/rails/generators/alchemy/elements/templates/editor.html.slim +13 -0
- data/lib/rails/generators/alchemy/elements/templates/view.html.erb +4 -4
- data/lib/rails/generators/alchemy/elements/templates/view.html.haml +15 -0
- data/lib/rails/generators/alchemy/elements/templates/view.html.slim +15 -0
- data/lib/rails/generators/alchemy/essence/essence_generator.rb +1 -1
- data/lib/rails/generators/alchemy/essence/templates/editor.html.erb +2 -3
- data/lib/rails/generators/alchemy/page_layouts/page_layouts_generator.rb +4 -13
- data/lib/rails/generators/alchemy/page_layouts/templates/layout.html.haml +1 -0
- data/lib/rails/generators/alchemy/page_layouts/templates/layout.html.slim +1 -0
- data/spec/controllers/pages_controller_spec.rb +41 -34
- data/spec/dummy/app/views/layouts/application.html.erb +51 -0
- data/spec/dummy/db/migrate/20121026100815_alchemy_two_point_three.rb +0 -36
- data/spec/dummy/db/migrate/20121113115120_create_alchemy_essence_links.rb +13 -0
- data/spec/dummy/db/migrate/20121115100736_add_cached_tag_list_to_elements_pages_and_users.rb +7 -0
- data/spec/dummy/db/migrate/20121116140636_add_cached_tag_list_to_alchemy_attachments.rb +5 -0
- data/spec/dummy/db/migrate/20121116141016_change_alchemy_pictures_tag_list_column.rb +9 -0
- data/spec/dummy/db/schema.rb +24 -45
- data/spec/helpers/elements_block_helper_spec.rb +135 -0
- data/spec/helpers/elements_helper_spec.rb +43 -5
- data/spec/integration/pages_controller_spec.rb +22 -18
- data/spec/integration/translation_integration_spec.rb +0 -15
- data/spec/models/element_spec.rb +44 -36
- data/spec/models/essence_picture_spec.rb +22 -6
- data/spec/models/page_spec.rb +28 -0
- data/spec/spec_helper.rb +8 -3
- data/spec/support/ci/install_phantomjs +6 -0
- metadata +82 -40
- data/app/assets/images/alchemy/gui/navi-tab.png +0 -0
- data/app/assets/images/alchemy/gui/shading_90.png +0 -0
- data/app/assets/images/alchemy/jquery-sb/select_arrow.gif +0 -0
- data/app/assets/images/alchemy/jquery-sb/select_arrow_bg.gif +0 -0
- data/app/assets/images/alchemy/jquery-sb/select_arrow_bg_hover.gif +0 -0
- data/app/assets/javascripts/alchemy/alchemy.preview.js +0 -98
- data/app/assets/stylesheets/alchemy/alchemy.css +0 -21
- data/app/controllers/alchemy/admin/essence_audios_controller.rb +0 -12
- data/app/controllers/alchemy/admin/essence_flashes_controller.rb +0 -12
- data/app/controllers/alchemy/admin/essence_videos_controller.rb +0 -12
- data/app/models/alchemy/essence_audio.rb +0 -14
- data/app/models/alchemy/essence_flash.rb +0 -12
- data/app/models/alchemy/essence_video.rb +0 -20
- data/app/views/alchemy/essences/_essence_audio_editor.html.erb +0 -1
- data/app/views/alchemy/essences/_essence_audio_view.html.erb +0 -33
- data/app/views/alchemy/essences/_essence_flash_editor.html.erb +0 -1
- data/app/views/alchemy/essences/_essence_flash_view.html.erb +0 -26
- data/app/views/alchemy/essences/_essence_video_editor.html.erb +0 -1
- data/app/views/alchemy/essences/_essence_video_view.html.erb +0 -35
@@ -0,0 +1,51 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<!-- Your site title-prefix (That is YourSite in "YourSite - CurrentPage" is taken from a layout-page by default.
|
5
|
+
Alternatively you can hardcode it here -->
|
6
|
+
<%= render_meta_data(:title_prefix => sitename_from_header_page, :title_seperator => "-") %>
|
7
|
+
<!-- Paths here are relative to app/assets/stylesheets.
|
8
|
+
alchemy/standard_set, though, is located in Alchemy-source and doesn't have to be present in your app,
|
9
|
+
but you can copy it over and customize it of course. -->
|
10
|
+
<%= stylesheet_link_tag "alchemy/standard_set", :media => :screen %>
|
11
|
+
<%= stylesheet_link_tag "alchemy/standard_set", :media => :print %>
|
12
|
+
<!-- Here is also the place for custom javascripts. Put them in app/assets/javascripts/yourscript.js (or yourscript.js.coffee)
|
13
|
+
and include them like this (remove the \):
|
14
|
+
<\%= javascript_include_tag "yourscript" %> -->
|
15
|
+
</head>
|
16
|
+
<body>
|
17
|
+
<div id="page">
|
18
|
+
<div id="language_select">
|
19
|
+
<!-- Render links with flags for all public languages -->
|
20
|
+
<%= language_switches(:linkname => :code) %>
|
21
|
+
</div>
|
22
|
+
<div id="breadcrump">
|
23
|
+
<!-- Renders a breadcrumb/ariadne-path. For customizing see docs for render_breadcrumb (link?) -->
|
24
|
+
<%= render_breadcrumb :seperator => "<span> < </span>" %>
|
25
|
+
</div>
|
26
|
+
<div id="navigation">
|
27
|
+
<!-- Renders main navigation. For customizing see docs for render_navigation (link?)
|
28
|
+
You can overwrite app/views/navigation/_renderer.html.erb and app/views/navigation/_link.html.erb
|
29
|
+
if you want to roll out your own markup -->
|
30
|
+
<%= render_navigation :all_sub_menues => true %>
|
31
|
+
</div>
|
32
|
+
<!-- Most important call here!
|
33
|
+
This yields (=inserts) all content of the current page.
|
34
|
+
Markup depends on page_layout, elements and essences and can be changed in app/views/alchemy/... -->
|
35
|
+
<%= yield %>
|
36
|
+
<div class="footer">
|
37
|
+
<!-- Renders elements that are called "footnote" (name-attribute in elements.yml)
|
38
|
+
from page_layout "layout_footer" (name-attribute in page_layout.yml) -->
|
39
|
+
<%= render_elements(
|
40
|
+
:from_page => 'layout_footer',
|
41
|
+
:only => ['footnote']
|
42
|
+
) %>
|
43
|
+
</div>
|
44
|
+
</div>
|
45
|
+
<!-- This is used in Alchemy's backend to prevent navigating to other pages through the preview window -->
|
46
|
+
<%= alchemy_preview_mode_code %>
|
47
|
+
<!-- Renders a menu_bar when a user with sufficient rights visits a page -->
|
48
|
+
<%= alchemy_menu_bar %>
|
49
|
+
</body>
|
50
|
+
</html>
|
51
|
+
|
@@ -63,18 +63,6 @@ class AlchemyTwoPointThree < ActiveRecord::Migration
|
|
63
63
|
t.integer "page_id"
|
64
64
|
end
|
65
65
|
|
66
|
-
create_table "alchemy_essence_audios", :force => true do |t|
|
67
|
-
t.integer "attachment_id"
|
68
|
-
t.integer "width", :default => 400
|
69
|
-
t.integer "height", :default => 300
|
70
|
-
t.boolean "show_eq", :default => true
|
71
|
-
t.boolean "show_navigation", :default => true
|
72
|
-
t.integer "creator_id"
|
73
|
-
t.integer "updater_id"
|
74
|
-
t.datetime "created_at", :null => false
|
75
|
-
t.datetime "updated_at", :null => false
|
76
|
-
end
|
77
|
-
|
78
66
|
create_table "alchemy_essence_booleans", :force => true do |t|
|
79
67
|
t.boolean "value"
|
80
68
|
t.datetime "created_at", :null => false
|
@@ -103,17 +91,6 @@ class AlchemyTwoPointThree < ActiveRecord::Migration
|
|
103
91
|
t.datetime "updated_at", :null => false
|
104
92
|
end
|
105
93
|
|
106
|
-
create_table "alchemy_essence_flashes", :force => true do |t|
|
107
|
-
t.integer "attachment_id"
|
108
|
-
t.integer "width", :default => 400
|
109
|
-
t.integer "height", :default => 300
|
110
|
-
t.string "player_version", :default => "9.0.28"
|
111
|
-
t.integer "creator_id"
|
112
|
-
t.integer "updater_id"
|
113
|
-
t.datetime "created_at", :null => false
|
114
|
-
t.datetime "updated_at", :null => false
|
115
|
-
end
|
116
|
-
|
117
94
|
create_table "alchemy_essence_htmls", :force => true do |t|
|
118
95
|
t.text "source"
|
119
96
|
t.integer "creator_id"
|
@@ -176,19 +153,6 @@ class AlchemyTwoPointThree < ActiveRecord::Migration
|
|
176
153
|
t.datetime "updated_at", :null => false
|
177
154
|
end
|
178
155
|
|
179
|
-
create_table "alchemy_essence_videos", :force => true do |t|
|
180
|
-
t.integer "attachment_id"
|
181
|
-
t.integer "width"
|
182
|
-
t.integer "height"
|
183
|
-
t.boolean "allow_fullscreen", :default => true
|
184
|
-
t.boolean "auto_play", :default => false
|
185
|
-
t.boolean "show_navigation", :default => true
|
186
|
-
t.integer "creator_id"
|
187
|
-
t.integer "updater_id"
|
188
|
-
t.datetime "created_at", :null => false
|
189
|
-
t.datetime "updated_at", :null => false
|
190
|
-
end
|
191
|
-
|
192
156
|
create_table "alchemy_folded_pages", :force => true do |t|
|
193
157
|
t.integer "page_id"
|
194
158
|
t.integer "user_id"
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class CreateAlchemyEssenceLinks < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :alchemy_essence_links do |t|
|
4
|
+
t.string :link
|
5
|
+
t.string :link_title
|
6
|
+
t.string :link_target
|
7
|
+
t.string :link_class_name
|
8
|
+
|
9
|
+
t.timestamps
|
10
|
+
t.userstamps
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/spec/dummy/db/schema.rb
CHANGED
@@ -11,7 +11,7 @@
|
|
11
11
|
#
|
12
12
|
# It's strongly recommended to check this file into your version control system.
|
13
13
|
|
14
|
-
ActiveRecord::Schema.define(:version =>
|
14
|
+
ActiveRecord::Schema.define(:version => 20121116141016) do
|
15
15
|
|
16
16
|
create_table "alchemy_attachments", :force => true do |t|
|
17
17
|
t.string "name"
|
@@ -20,8 +20,9 @@ ActiveRecord::Schema.define(:version => 20121026104128) do
|
|
20
20
|
t.integer "size"
|
21
21
|
t.integer "creator_id"
|
22
22
|
t.integer "updater_id"
|
23
|
-
t.datetime "created_at",
|
24
|
-
t.datetime "updated_at",
|
23
|
+
t.datetime "created_at", :null => false
|
24
|
+
t.datetime "updated_at", :null => false
|
25
|
+
t.text "cached_tag_list"
|
25
26
|
end
|
26
27
|
|
27
28
|
create_table "alchemy_cells", :force => true do |t|
|
@@ -49,14 +50,15 @@ ActiveRecord::Schema.define(:version => 20121026104128) do
|
|
49
50
|
t.string "name"
|
50
51
|
t.integer "position"
|
51
52
|
t.integer "page_id"
|
52
|
-
t.boolean "public",
|
53
|
-
t.boolean "folded",
|
54
|
-
t.boolean "unique",
|
55
|
-
t.datetime "created_at",
|
56
|
-
t.datetime "updated_at",
|
53
|
+
t.boolean "public", :default => true
|
54
|
+
t.boolean "folded", :default => false
|
55
|
+
t.boolean "unique", :default => false
|
56
|
+
t.datetime "created_at", :null => false
|
57
|
+
t.datetime "updated_at", :null => false
|
57
58
|
t.integer "creator_id"
|
58
59
|
t.integer "updater_id"
|
59
60
|
t.integer "cell_id"
|
61
|
+
t.text "cached_tag_list"
|
60
62
|
end
|
61
63
|
|
62
64
|
add_index "alchemy_elements", ["page_id", "position"], :name => "index_elements_on_page_id_and_position"
|
@@ -66,18 +68,6 @@ ActiveRecord::Schema.define(:version => 20121026104128) do
|
|
66
68
|
t.integer "page_id"
|
67
69
|
end
|
68
70
|
|
69
|
-
create_table "alchemy_essence_audios", :force => true do |t|
|
70
|
-
t.integer "attachment_id"
|
71
|
-
t.integer "width", :default => 400
|
72
|
-
t.integer "height", :default => 300
|
73
|
-
t.boolean "show_eq", :default => true
|
74
|
-
t.boolean "show_navigation", :default => true
|
75
|
-
t.integer "creator_id"
|
76
|
-
t.integer "updater_id"
|
77
|
-
t.datetime "created_at", :null => false
|
78
|
-
t.datetime "updated_at", :null => false
|
79
|
-
end
|
80
|
-
|
81
71
|
create_table "alchemy_essence_booleans", :force => true do |t|
|
82
72
|
t.boolean "value"
|
83
73
|
t.datetime "created_at", :null => false
|
@@ -106,17 +96,6 @@ ActiveRecord::Schema.define(:version => 20121026104128) do
|
|
106
96
|
t.datetime "updated_at", :null => false
|
107
97
|
end
|
108
98
|
|
109
|
-
create_table "alchemy_essence_flashes", :force => true do |t|
|
110
|
-
t.integer "attachment_id"
|
111
|
-
t.integer "width", :default => 400
|
112
|
-
t.integer "height", :default => 300
|
113
|
-
t.string "player_version", :default => "9.0.28"
|
114
|
-
t.integer "creator_id"
|
115
|
-
t.integer "updater_id"
|
116
|
-
t.datetime "created_at", :null => false
|
117
|
-
t.datetime "updated_at", :null => false
|
118
|
-
end
|
119
|
-
|
120
99
|
create_table "alchemy_essence_htmls", :force => true do |t|
|
121
100
|
t.text "source"
|
122
101
|
t.integer "creator_id"
|
@@ -125,6 +104,17 @@ ActiveRecord::Schema.define(:version => 20121026104128) do
|
|
125
104
|
t.datetime "updated_at", :null => false
|
126
105
|
end
|
127
106
|
|
107
|
+
create_table "alchemy_essence_links", :force => true do |t|
|
108
|
+
t.string "link"
|
109
|
+
t.string "link_title"
|
110
|
+
t.string "link_target"
|
111
|
+
t.string "link_class_name"
|
112
|
+
t.datetime "created_at", :null => false
|
113
|
+
t.datetime "updated_at", :null => false
|
114
|
+
t.integer "creator_id"
|
115
|
+
t.integer "updater_id"
|
116
|
+
end
|
117
|
+
|
128
118
|
create_table "alchemy_essence_pictures", :force => true do |t|
|
129
119
|
t.integer "picture_id"
|
130
120
|
t.string "caption"
|
@@ -179,19 +169,6 @@ ActiveRecord::Schema.define(:version => 20121026104128) do
|
|
179
169
|
t.datetime "updated_at", :null => false
|
180
170
|
end
|
181
171
|
|
182
|
-
create_table "alchemy_essence_videos", :force => true do |t|
|
183
|
-
t.integer "attachment_id"
|
184
|
-
t.integer "width"
|
185
|
-
t.integer "height"
|
186
|
-
t.boolean "allow_fullscreen", :default => true
|
187
|
-
t.boolean "auto_play", :default => false
|
188
|
-
t.boolean "show_navigation", :default => true
|
189
|
-
t.integer "creator_id"
|
190
|
-
t.integer "updater_id"
|
191
|
-
t.datetime "created_at", :null => false
|
192
|
-
t.datetime "updated_at", :null => false
|
193
|
-
end
|
194
|
-
|
195
172
|
create_table "alchemy_folded_pages", :force => true do |t|
|
196
173
|
t.integer "page_id"
|
197
174
|
t.integer "user_id"
|
@@ -242,6 +219,7 @@ ActiveRecord::Schema.define(:version => 20121026104128) do
|
|
242
219
|
t.integer "creator_id"
|
243
220
|
t.integer "updater_id"
|
244
221
|
t.integer "language_id"
|
222
|
+
t.text "cached_tag_list"
|
245
223
|
end
|
246
224
|
|
247
225
|
add_index "alchemy_pages", ["language_id"], :name => "index_pages_on_language_id"
|
@@ -258,7 +236,7 @@ ActiveRecord::Schema.define(:version => 20121026104128) do
|
|
258
236
|
t.integer "creator_id"
|
259
237
|
t.integer "updater_id"
|
260
238
|
t.string "upload_hash"
|
261
|
-
t.
|
239
|
+
t.text "cached_tag_list"
|
262
240
|
end
|
263
241
|
|
264
242
|
create_table "alchemy_users", :force => true do |t|
|
@@ -285,6 +263,7 @@ ActiveRecord::Schema.define(:version => 20121026104128) do
|
|
285
263
|
t.datetime "updated_at", :null => false
|
286
264
|
t.integer "creator_id"
|
287
265
|
t.integer "updater_id"
|
266
|
+
t.text "cached_tag_list"
|
288
267
|
end
|
289
268
|
|
290
269
|
add_index "alchemy_users", ["perishable_token"], :name => "index_users_on_perishable_token"
|
@@ -0,0 +1,135 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
include Alchemy::ElementsHelper
|
4
|
+
|
5
|
+
module Alchemy
|
6
|
+
describe ElementsBlockHelper do
|
7
|
+
let(:page) { FactoryGirl.create(:public_page) }
|
8
|
+
let(:element) { FactoryGirl.create(:element, page: page, tag_list: 'foo, bar') }
|
9
|
+
let(:expected_wrapper_tag) { "div.#{element.name}##{element_dom_id(element)}" }
|
10
|
+
|
11
|
+
describe '#element_view_for' do
|
12
|
+
it "should yield an instance of ElementViewHelper" do
|
13
|
+
expect { |b| element_view_for(element, &b) }.
|
14
|
+
to yield_with_args(ElementsBlockHelper::ElementViewHelper)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should wrap its output in a DOM element" do
|
18
|
+
element_view_for(element).
|
19
|
+
should have_css expected_wrapper_tag
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should change the wrapping DOM element according to parameters" do
|
23
|
+
element_view_for(element, tag: 'span', class: 'some_class', id: 'some_id').
|
24
|
+
should have_css 'span.some_class#some_id'
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should include the element's tags in the wrapper DOM element" do
|
28
|
+
element_view_for(element).
|
29
|
+
should have_css "#{expected_wrapper_tag}[data-element-tags='foo bar']"
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should use the provided tags formatter to format tags" do
|
33
|
+
element_view_for(element, tags_formatter: lambda { |tags| tags.join ", " }).
|
34
|
+
should have_css "#{expected_wrapper_tag}[data-element-tags='foo, bar']"
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should include the contents rendered by the block passed to it" do
|
38
|
+
element_view_for(element) do
|
39
|
+
'view'
|
40
|
+
end.should have_content 'view'
|
41
|
+
end
|
42
|
+
|
43
|
+
context "when/if preview mode is not active" do
|
44
|
+
subject { element_view_for(element) }
|
45
|
+
it { should have_css expected_wrapper_tag }
|
46
|
+
it { should_not have_css "#{expected_wrapper_tag}[data-alchemy-element]" }
|
47
|
+
end
|
48
|
+
|
49
|
+
context "when/if preview mode is active" do
|
50
|
+
before do
|
51
|
+
assign(:preview_mode, true)
|
52
|
+
assign(:page, page)
|
53
|
+
end
|
54
|
+
|
55
|
+
subject { helper.element_view_for(element) }
|
56
|
+
it { should have_css "#{expected_wrapper_tag}[data-alchemy-element='#{element.id}']" }
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe '#element_editor_for' do
|
61
|
+
it "should yield an instance of ElementEditorHelper" do
|
62
|
+
expect { |b| element_editor_for(element, &b) }.
|
63
|
+
to yield_with_args(ElementsBlockHelper::ElementEditorHelper)
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should not add any extra elements" do
|
67
|
+
element_editor_for(element) do
|
68
|
+
'view'
|
69
|
+
end.should == 'view'
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe ElementsBlockHelper::ElementViewHelper do
|
74
|
+
let(:scope) { mock }
|
75
|
+
subject { ElementsBlockHelper::ElementViewHelper.new(scope, element: element) }
|
76
|
+
|
77
|
+
it 'should have a reference to the specified element' do
|
78
|
+
subject.element == element
|
79
|
+
end
|
80
|
+
|
81
|
+
describe '#render' do
|
82
|
+
it 'should delegate to the render_essence_view_by_name helper' do
|
83
|
+
scope.should_receive(:render_essence_view_by_name).with(element, "title", foo: 'bar')
|
84
|
+
subject.render :title, foo: 'bar'
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
describe '#content' do
|
89
|
+
it "should delegate to the element's #content_by_name method" do
|
90
|
+
element.should_receive(:content_by_name).with(:title)
|
91
|
+
subject.content :title
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
describe '#ingredient' do
|
96
|
+
it "should delegate to the element's #ingredient method" do
|
97
|
+
element.should_receive(:ingredient).with(:title)
|
98
|
+
subject.ingredient :title
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
describe '#has?' do
|
103
|
+
it "should delegate to the element's #has_ingredient? method" do
|
104
|
+
element.should_receive(:has_ingredient?).with(:title)
|
105
|
+
subject.has? :title
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
describe '#essence' do
|
110
|
+
it "should provide the specified content essence" do
|
111
|
+
subject.should_receive(:content).with(:title).
|
112
|
+
and_return(mock('content', :essence => mock('essence')))
|
113
|
+
|
114
|
+
subject.essence :title
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
describe ElementsBlockHelper::ElementEditorHelper do
|
120
|
+
let(:scope) { mock }
|
121
|
+
subject { ElementsBlockHelper::ElementEditorHelper.new(scope, element: element) }
|
122
|
+
|
123
|
+
it 'should have a reference to the specified element' do
|
124
|
+
subject.element == element
|
125
|
+
end
|
126
|
+
|
127
|
+
describe '#edit' do
|
128
|
+
it "should delegate to the render_essence_editor_by_name helper" do
|
129
|
+
scope.should_receive(:render_essence_editor_by_name).with(element, "title", foo: 'bar')
|
130
|
+
subject.edit :title, foo: 'bar'
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
@@ -158,14 +158,52 @@ describe Alchemy::ElementsHelper do
|
|
158
158
|
end
|
159
159
|
|
160
160
|
context "in preview mode" do
|
161
|
+
describe '#element_preview_code_attributes' do
|
162
|
+
it "should return the data-alchemy-element HTML attribute for element" do
|
163
|
+
@preview_mode = true
|
164
|
+
helper.element_preview_code_attributes(@element).should == {:'data-alchemy-element' => @element.id}
|
165
|
+
end
|
166
|
+
|
167
|
+
it "should return an empty hash if not in preview_mode" do
|
168
|
+
helper.element_preview_code_attributes(@element).should == {}
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
describe '#element_preview_code' do
|
173
|
+
it "should return the data-alchemy-element HTML attribute for element" do
|
174
|
+
assign(:preview_mode, true)
|
175
|
+
helper.element_preview_code(@element).should == " data-alchemy-element=\"#{@element.id}\""
|
176
|
+
end
|
177
|
+
|
178
|
+
it "should not return the data-alchemy-element HTML attribute if not in preview_mode" do
|
179
|
+
helper.element_preview_code(@element).should_not == " data-alchemy-element=\"#{@element.id}\""
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
describe '#element_tags' do
|
185
|
+
|
186
|
+
context "element having tags" do
|
187
|
+
before { @element.tag_list = "peter, lustig"; @element.save! }
|
161
188
|
|
162
|
-
|
163
|
-
|
164
|
-
|
189
|
+
context "with no formatter lambda given" do
|
190
|
+
it "should return tag list as HTML data attribute" do
|
191
|
+
helper.element_tags(@element).should == " data-element-tags=\"peter lustig\""
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
context "with a formatter lambda given" do
|
196
|
+
it "should return a properly formatted HTML data attribute" do
|
197
|
+
helper.element_tags(@element, :formatter => lambda { |tags| tags.join ", " }).
|
198
|
+
should == " data-element-tags=\"peter, lustig\""
|
199
|
+
end
|
200
|
+
end
|
165
201
|
end
|
166
202
|
|
167
|
-
|
168
|
-
|
203
|
+
context "element not having tags" do
|
204
|
+
it "should return empty string" do
|
205
|
+
helper.element_tags(@element).should be_blank
|
206
|
+
end
|
169
207
|
end
|
170
208
|
|
171
209
|
end
|