alchemy_cms 2.4.beta2 → 2.4.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (168) hide show
  1. data/.gitignore +2 -1
  2. data/.travis.yml +3 -1
  3. data/.yardopts +1 -1
  4. data/Gemfile +2 -1
  5. data/alchemy_cms.gemspec +18 -17
  6. data/app/assets/images/alchemy/ajax_loader.gif +0 -0
  7. data/app/assets/images/alchemy/alchemy-logo.png +0 -0
  8. data/app/assets/images/alchemy/icons.png +0 -0
  9. data/app/assets/images/alchemy/image_loader.gif +0 -0
  10. data/app/assets/images/alchemy/placeholder.png +0 -0
  11. data/app/assets/images/alchemy/shading.png +0 -0
  12. data/app/assets/images/alchemy/swfupload/browse_button.png +0 -0
  13. data/app/assets/images/alchemy/tabs.gif +0 -0
  14. data/app/assets/images/alchemy/ui-icons_666666_256x240.png +0 -0
  15. data/app/assets/images/sassy-ie-overlay.png +0 -0
  16. data/app/assets/javascripts/alchemy/alchemy.base.js +1 -3
  17. data/app/assets/javascripts/alchemy/alchemy.browser.js.coffee +28 -0
  18. data/app/assets/javascripts/alchemy/alchemy.jquery_loader.js +2 -2
  19. data/app/assets/javascripts/alchemy/alchemy.js +2 -0
  20. data/app/assets/javascripts/alchemy/alchemy.link_overlay.js.coffee +79 -47
  21. data/app/assets/javascripts/alchemy/alchemy.menubar.js +12 -4
  22. data/app/assets/javascripts/alchemy/alchemy.onload.js.coffee +1 -1
  23. data/app/assets/javascripts/alchemy/alchemy.preview.js.coffee +103 -0
  24. data/app/assets/javascripts/alchemy/alchemy.swf_upload.js +1 -1
  25. data/app/assets/javascripts/alchemy/alchemy.uploader.js +4 -6
  26. data/app/assets/javascripts/alchemy/preview.js +1 -0
  27. data/app/assets/stylesheets/alchemy/admin.css.scss +25 -0
  28. data/app/assets/stylesheets/alchemy/{archive.css.scss → archive.scss} +0 -2
  29. data/app/assets/stylesheets/alchemy/{base.css.scss → base.scss} +1 -57
  30. data/app/assets/stylesheets/alchemy/{custom.css → custom.scss} +0 -0
  31. data/app/assets/stylesheets/alchemy/{dashboard.css.scss → dashboard.scss} +0 -2
  32. data/app/assets/stylesheets/alchemy/defaults.scss +5 -0
  33. data/app/assets/stylesheets/alchemy/{elements.css.scss → elements.scss} +24 -37
  34. data/app/assets/stylesheets/alchemy/{errors.css.scss → errors.scss} +0 -2
  35. data/app/assets/stylesheets/alchemy/{flash.css.scss → flash.scss} +0 -2
  36. data/app/assets/stylesheets/alchemy/{form_elements.css.scss → form_elements.scss} +39 -12
  37. data/app/assets/stylesheets/alchemy/{frame.css.scss → frame.scss} +0 -2
  38. data/app/assets/stylesheets/alchemy/{icons.css.scss → icons.scss} +20 -2
  39. data/app/assets/stylesheets/alchemy/{jquery-ui.alchemy.css.scss → jquery-ui.scss} +6 -3
  40. data/app/assets/stylesheets/alchemy/{login.css.scss → login.scss} +3 -3
  41. data/app/assets/stylesheets/alchemy/menubar.css.scss +0 -1
  42. data/app/assets/stylesheets/alchemy/{_defaults.scss → mixins.scss} +2 -39
  43. data/app/assets/stylesheets/alchemy/{modules.css.scss → modules.scss} +4 -2
  44. data/app/assets/stylesheets/alchemy/notices.scss +51 -0
  45. data/app/assets/stylesheets/alchemy/{pagination.css.scss → pagination.scss} +0 -2
  46. data/app/assets/stylesheets/alchemy/{print.css → print.css.scss} +3 -3
  47. data/app/assets/stylesheets/alchemy/search.scss +63 -0
  48. data/app/assets/stylesheets/alchemy/{sitemap.css.scss → sitemap.scss} +1 -2
  49. data/app/assets/stylesheets/alchemy/{tables.css.scss → tables.scss} +16 -3
  50. data/app/assets/stylesheets/alchemy/tinymce_content.css.scss +3 -0
  51. data/app/assets/stylesheets/alchemy/tinymce_dialog.css.scss +3 -0
  52. data/app/assets/stylesheets/alchemy/{upload.css.scss → upload.scss} +0 -2
  53. data/app/assets/stylesheets/alchemy/variables.scss +33 -0
  54. data/app/controllers/alchemy/admin/elements_controller.rb +1 -2
  55. data/app/controllers/alchemy/admin/tags_controller.rb +64 -0
  56. data/app/controllers/alchemy/base_controller.rb +8 -23
  57. data/app/controllers/alchemy/pages_controller.rb +5 -18
  58. data/app/helpers/alchemy/admin/base_helper.rb +1 -1
  59. data/app/helpers/alchemy/admin/elements_helper.rb +1 -0
  60. data/app/helpers/alchemy/elements_block_helper.rb +162 -0
  61. data/app/helpers/alchemy/elements_helper.rb +41 -3
  62. data/app/helpers/alchemy/pages_helper.rb +2 -1
  63. data/app/models/alchemy/attachment.rb +2 -1
  64. data/app/models/alchemy/element.rb +13 -10
  65. data/app/models/alchemy/essence_link.rb +11 -0
  66. data/app/models/alchemy/essence_picture.rb +15 -4
  67. data/app/models/alchemy/page.rb +23 -25
  68. data/app/models/alchemy/picture.rb +2 -2
  69. data/app/models/alchemy/tag.rb +16 -0
  70. data/app/models/alchemy/user.rb +3 -1
  71. data/app/views/alchemy/admin/attachments/_attachment.html.erb +12 -12
  72. data/app/views/alchemy/admin/attachments/edit.html.erb +10 -4
  73. data/app/views/alchemy/admin/elements/_element.html.erb +10 -13
  74. data/app/views/alchemy/admin/elements/_element_foot.html.erb +1 -1
  75. data/app/views/alchemy/admin/essence_files/edit.html.erb +12 -76
  76. data/app/views/alchemy/admin/essence_pictures/crop.html.erb +9 -4
  77. data/app/views/alchemy/admin/layoutpages/_layoutpage.html.erb +1 -1
  78. data/app/views/alchemy/admin/layoutpages/index.html.erb +1 -1
  79. data/app/views/alchemy/admin/pages/_external_link.html.erb +9 -4
  80. data/app/views/alchemy/admin/pages/configure.html.erb +22 -12
  81. data/app/views/alchemy/admin/pages/edit.html.erb +40 -40
  82. data/app/views/alchemy/admin/partials/_autocomplete_tag_list.html.erb +9 -0
  83. data/app/views/alchemy/admin/pictures/edit.html.erb +1 -1
  84. data/app/views/alchemy/admin/pictures/edit_multiple.html.erb +11 -2
  85. data/app/views/alchemy/admin/tags/_radio_tag.html.erb +6 -0
  86. data/app/views/alchemy/admin/tags/_tag.html.erb +29 -0
  87. data/app/views/alchemy/admin/tags/edit.html.erb +41 -0
  88. data/app/views/alchemy/admin/tags/index.html.erb +46 -0
  89. data/app/views/alchemy/admin/tags/new.html.erb +16 -0
  90. data/app/views/alchemy/admin/users/_table.html.erb +18 -10
  91. data/app/views/alchemy/admin/users/_user.html.erb +2 -1
  92. data/app/views/alchemy/admin/users/index.html.erb +2 -1
  93. data/app/views/alchemy/elements/_article_view.html.erb +1 -1
  94. data/app/views/alchemy/essences/_essence_link_editor.html.erb +23 -0
  95. data/app/views/alchemy/essences/_essence_link_view.html.erb +0 -0
  96. data/app/views/alchemy/essences/_essence_picture_tools.html.erb +1 -1
  97. data/app/views/alchemy/essences/_essence_text_editor.html.erb +1 -9
  98. data/app/views/alchemy/essences/_linkable_essence_tools.html.erb +19 -0
  99. data/app/views/layouts/alchemy/admin.html.erb +1 -1
  100. data/config/alchemy/elements.yml +2 -0
  101. data/config/alchemy/modules.yml +12 -0
  102. data/config/alchemy/page_layouts.yml +2 -0
  103. data/config/authorization_rules.rb +2 -0
  104. data/config/locales/alchemy.de.yml +36 -5
  105. data/config/locales/alchemy.en.yml +3 -0
  106. data/config/routes.rb +6 -4
  107. data/db/migrate/20121026100815_alchemy_two_point_three.rb +0 -36
  108. data/db/migrate/20121113115120_create_alchemy_essence_links.rb +13 -0
  109. data/db/migrate/20121115100736_add_cached_tag_list_to_elements_pages_and_users.rb +7 -0
  110. data/db/migrate/20121116140636_add_cached_tag_list_to_alchemy_attachments.rb +5 -0
  111. data/db/migrate/20121116141016_change_alchemy_pictures_tag_list_column.rb +9 -0
  112. data/lib/alchemy/engine.rb +1 -1
  113. data/lib/alchemy/resource.rb +1 -1
  114. data/lib/alchemy/resources_helper.rb +1 -1
  115. data/lib/alchemy/upgrader.rb +17 -0
  116. data/lib/alchemy/version.rb +1 -1
  117. data/lib/alchemy_cms.rb +1 -0
  118. data/lib/rails/generators/alchemy/base.rb +41 -0
  119. data/lib/rails/generators/alchemy/deploy_script/templates/deploy.rb.tt +10 -3
  120. data/lib/rails/generators/alchemy/elements/elements_generator.rb +6 -14
  121. data/lib/rails/generators/alchemy/elements/templates/editor.html.erb +8 -6
  122. data/lib/rails/generators/alchemy/elements/templates/editor.html.haml +13 -0
  123. data/lib/rails/generators/alchemy/elements/templates/editor.html.slim +13 -0
  124. data/lib/rails/generators/alchemy/elements/templates/view.html.erb +4 -4
  125. data/lib/rails/generators/alchemy/elements/templates/view.html.haml +15 -0
  126. data/lib/rails/generators/alchemy/elements/templates/view.html.slim +15 -0
  127. data/lib/rails/generators/alchemy/essence/essence_generator.rb +1 -1
  128. data/lib/rails/generators/alchemy/essence/templates/editor.html.erb +2 -3
  129. data/lib/rails/generators/alchemy/page_layouts/page_layouts_generator.rb +4 -13
  130. data/lib/rails/generators/alchemy/page_layouts/templates/layout.html.haml +1 -0
  131. data/lib/rails/generators/alchemy/page_layouts/templates/layout.html.slim +1 -0
  132. data/spec/controllers/pages_controller_spec.rb +41 -34
  133. data/spec/dummy/app/views/layouts/application.html.erb +51 -0
  134. data/spec/dummy/db/migrate/20121026100815_alchemy_two_point_three.rb +0 -36
  135. data/spec/dummy/db/migrate/20121113115120_create_alchemy_essence_links.rb +13 -0
  136. data/spec/dummy/db/migrate/20121115100736_add_cached_tag_list_to_elements_pages_and_users.rb +7 -0
  137. data/spec/dummy/db/migrate/20121116140636_add_cached_tag_list_to_alchemy_attachments.rb +5 -0
  138. data/spec/dummy/db/migrate/20121116141016_change_alchemy_pictures_tag_list_column.rb +9 -0
  139. data/spec/dummy/db/schema.rb +24 -45
  140. data/spec/helpers/elements_block_helper_spec.rb +135 -0
  141. data/spec/helpers/elements_helper_spec.rb +43 -5
  142. data/spec/integration/pages_controller_spec.rb +22 -18
  143. data/spec/integration/translation_integration_spec.rb +0 -15
  144. data/spec/models/element_spec.rb +44 -36
  145. data/spec/models/essence_picture_spec.rb +22 -6
  146. data/spec/models/page_spec.rb +28 -0
  147. data/spec/spec_helper.rb +8 -3
  148. data/spec/support/ci/install_phantomjs +6 -0
  149. metadata +82 -40
  150. data/app/assets/images/alchemy/gui/navi-tab.png +0 -0
  151. data/app/assets/images/alchemy/gui/shading_90.png +0 -0
  152. data/app/assets/images/alchemy/jquery-sb/select_arrow.gif +0 -0
  153. data/app/assets/images/alchemy/jquery-sb/select_arrow_bg.gif +0 -0
  154. data/app/assets/images/alchemy/jquery-sb/select_arrow_bg_hover.gif +0 -0
  155. data/app/assets/javascripts/alchemy/alchemy.preview.js +0 -98
  156. data/app/assets/stylesheets/alchemy/alchemy.css +0 -21
  157. data/app/controllers/alchemy/admin/essence_audios_controller.rb +0 -12
  158. data/app/controllers/alchemy/admin/essence_flashes_controller.rb +0 -12
  159. data/app/controllers/alchemy/admin/essence_videos_controller.rb +0 -12
  160. data/app/models/alchemy/essence_audio.rb +0 -14
  161. data/app/models/alchemy/essence_flash.rb +0 -12
  162. data/app/models/alchemy/essence_video.rb +0 -20
  163. data/app/views/alchemy/essences/_essence_audio_editor.html.erb +0 -1
  164. data/app/views/alchemy/essences/_essence_audio_view.html.erb +0 -33
  165. data/app/views/alchemy/essences/_essence_flash_editor.html.erb +0 -1
  166. data/app/views/alchemy/essences/_essence_flash_view.html.erb +0 -26
  167. data/app/views/alchemy/essences/_essence_video_editor.html.erb +0 -1
  168. 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>&nbsp;<&nbsp;</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
@@ -0,0 +1,7 @@
1
+ class AddCachedTagListToElementsPagesAndUsers < ActiveRecord::Migration
2
+ def change
3
+ add_column :alchemy_elements, :cached_tag_list, :text
4
+ add_column :alchemy_pages, :cached_tag_list, :text
5
+ add_column :alchemy_users, :cached_tag_list, :text
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ class AddCachedTagListToAlchemyAttachments < ActiveRecord::Migration
2
+ def change
3
+ add_column :alchemy_attachments, :cached_tag_list, :text
4
+ end
5
+ end
@@ -0,0 +1,9 @@
1
+ class ChangeAlchemyPicturesTagListColumn < ActiveRecord::Migration
2
+ def up
3
+ change_column :alchemy_pictures, :cached_tag_list, :text, :limit => nil
4
+ end
5
+
6
+ def down
7
+ change_column :alchemy_pictures, :cached_tag_list, :string
8
+ end
9
+ end
@@ -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 => 20121026104128) do
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", :null => false
24
- t.datetime "updated_at", :null => false
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", :default => true
53
- t.boolean "folded", :default => false
54
- t.boolean "unique", :default => false
55
- t.datetime "created_at", :null => false
56
- t.datetime "updated_at", :null => false
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.string "cached_tag_list"
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
- it "should return the data-alchemy-element HTML attribute for element" do
163
- @preview_mode = true
164
- helper.element_preview_code(@element).should == " data-alchemy-element='#{@element.id}'"
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
- it "should not return the data-alchemy-element HTML attribute if not in preview_mode" do
168
- helper.element_preview_code(@element).should_not == " data-alchemy-element='#{@element.id}'"
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