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.
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