alchemy_cms 2.0.rc3 → 2.0.rc4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (219) hide show
  1. data/.gitignore +3 -1
  2. data/.rspec +1 -2
  3. data/.travis.yml +11 -0
  4. data/.yardopts +0 -1
  5. data/Gemfile +1 -2
  6. data/README.md +14 -0
  7. data/alchemy_cms.gemspec +4 -2
  8. data/app/controllers/admin/clipboard_controller.rb +8 -9
  9. data/app/controllers/admin/contents_controller.rb +4 -2
  10. data/app/controllers/admin/essence_pictures_controller.rb +2 -2
  11. data/app/controllers/admin/layoutpages_controller.rb +2 -0
  12. data/app/controllers/admin/pages_controller.rb +5 -5
  13. data/app/controllers/admin/pictures_controller.rb +2 -1
  14. data/app/controllers/admin/trash_controller.rb +2 -0
  15. data/app/controllers/alchemy_controller.rb +10 -4
  16. data/app/controllers/elements_controller.rb +1 -1
  17. data/app/helpers/admin/elements_helper.rb +32 -1
  18. data/app/helpers/alchemy_helper.rb +15 -818
  19. data/app/helpers/contents_helper.rb +69 -0
  20. data/app/helpers/elements_helper.rb +161 -0
  21. data/app/helpers/essences_helper.rb +167 -0
  22. data/app/helpers/pages_helper.rb +401 -19
  23. data/app/models/attachment.rb +4 -0
  24. data/app/models/element.rb +27 -14
  25. data/app/models/page.rb +75 -38
  26. data/app/views/admin/essence_pictures/destroy.js.erb +1 -1
  27. data/app/views/admin/pages/_create_language_form.html.erb +2 -1
  28. data/app/views/admin/pages/new.html.erb +1 -1
  29. data/app/views/admin/pages/update.js.erb +1 -1
  30. data/app/views/admin/partials/_upload_form.html.erb +2 -2
  31. data/app/views/admin/pictures/index.html.erb +7 -4
  32. data/app/views/essences/_essence_picture_editor.html.erb +1 -3
  33. data/app/views/layouts/alchemy.html.erb +59 -59
  34. data/app/views/layouts/pages.html.erb +2 -4
  35. data/app/views/{partials/_navigation_image_link.html.erb → navigation/_image_link.html.erb} +0 -0
  36. data/app/views/{partials/_navigation_link.html.erb → navigation/_link.html.erb} +1 -1
  37. data/app/views/{partials/_navigation_renderer.html.erb → navigation/_renderer.html.erb} +0 -0
  38. data/app/views/page_layouts/_contact.html.erb +1 -1
  39. data/app/views/page_layouts/_external.html.erb +0 -1
  40. data/app/views/page_layouts/_intro.html.erb +1 -1
  41. data/app/views/page_layouts/_news.html.erb +1 -1
  42. data/app/views/page_layouts/_search.html.erb +1 -1
  43. data/app/views/page_layouts/_standard.html.erb +1 -1
  44. data/assets/images/icons.png +0 -0
  45. data/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/alchemy/window.css +49 -31
  46. data/assets/stylesheets/alchemy.css +111 -91
  47. data/assets/stylesheets/elements.css +12 -16
  48. data/bin/alchemy +1 -1
  49. data/config/alchemy/config.yml +4 -0
  50. data/config/initializers/tinymce_hammer.rb +1 -0
  51. data/config/locales/de.yml +3 -1
  52. data/config/locales/en.yml +2 -0
  53. data/config/routes.rb +6 -4
  54. data/lib/alchemy/capistrano.rb +4 -7
  55. data/lib/alchemy/page_layout.rb +12 -8
  56. data/lib/alchemy/version.rb +1 -1
  57. data/spec/controllers/admin/clipboard_controller_spec.rb +23 -0
  58. data/spec/dummy/db/schema.rb +9 -9
  59. data/spec/factories.rb +24 -6
  60. data/spec/helpers/admin/elements_helper_spec.rb +20 -0
  61. data/spec/helpers/alchemy_helper_spec.rb +41 -0
  62. data/spec/helpers/contents_helper_spec.rb +27 -0
  63. data/spec/helpers/elements_helper_spec.rb +39 -0
  64. data/spec/helpers/essences_helper_spec.rb +49 -0
  65. data/spec/helpers/pages_helper_spec.rb +140 -0
  66. data/spec/integration/security_spec.rb +1 -1
  67. data/spec/integration/standardset_spec.rb +29 -0
  68. data/spec/models/element_spec.rb +49 -0
  69. data/spec/{language_spec.rb → models/language_spec.rb} +0 -0
  70. data/spec/models/page_spec.rb +139 -0
  71. data/spec/{user_spec.rb → models/user_spec.rb} +0 -0
  72. data/spec/page_layout_spec.rb +21 -0
  73. data/spec/routing_spec.rb +53 -0
  74. data/spec/spec_helper.rb +12 -11
  75. metadata +54 -303
  76. data/spec/dummy/config/alchemy/config.yml +0 -199
  77. data/spec/dummy/config/alchemy/elements.yml +0 -91
  78. data/spec/dummy/config/alchemy/page_layouts.yml +0 -29
  79. data/spec/dummy/public/images/alchemy/ajax_loader.gif +0 -0
  80. data/spec/dummy/public/images/alchemy/alchemy-logo.png +0 -0
  81. data/spec/dummy/public/images/alchemy/flags.png +0 -0
  82. data/spec/dummy/public/images/alchemy/gui/navi-tab.png +0 -0
  83. data/spec/dummy/public/images/alchemy/gui/shading.png +0 -0
  84. data/spec/dummy/public/images/alchemy/gui/shading_90.png +0 -0
  85. data/spec/dummy/public/images/alchemy/gui/toggle.png +0 -0
  86. data/spec/dummy/public/images/alchemy/icons.png +0 -0
  87. data/spec/dummy/public/images/alchemy/jquery-sb/select_arrow.gif +0 -0
  88. data/spec/dummy/public/images/alchemy/jquery-sb/select_arrow_bg.gif +0 -0
  89. data/spec/dummy/public/images/alchemy/jquery-sb/select_arrow_bg_hover.gif +0 -0
  90. data/spec/dummy/public/images/alchemy/jquery-ui/ui-icons_666666_256x240.png +0 -0
  91. data/spec/dummy/public/images/alchemy/placeholder.png +0 -0
  92. data/spec/dummy/public/images/alchemy/swfupload/browse_button.png +0 -0
  93. data/spec/dummy/public/javascripts/alchemy/alchemy.element_editor_selector.js +0 -88
  94. data/spec/dummy/public/javascripts/alchemy/alchemy.growler.js +0 -44
  95. data/spec/dummy/public/javascripts/alchemy/alchemy.image_cropper.js +0 -56
  96. data/spec/dummy/public/javascripts/alchemy/alchemy.js +0 -892
  97. data/spec/dummy/public/javascripts/alchemy/alchemy.link_overlay.js +0 -221
  98. data/spec/dummy/public/javascripts/alchemy/alchemy.page_sorter.js +0 -42
  99. data/spec/dummy/public/javascripts/alchemy/alchemy.preview.js +0 -145
  100. data/spec/dummy/public/javascripts/alchemy/jquery-ui.js +0 -428
  101. data/spec/dummy/public/javascripts/alchemy/jquery.Jcrop.min.js +0 -246
  102. data/spec/dummy/public/javascripts/alchemy/jquery.dialogextend.min.js +0 -8
  103. data/spec/dummy/public/javascripts/alchemy/jquery.in-place-edit.js +0 -171
  104. data/spec/dummy/public/javascripts/alchemy/jquery.js +0 -18
  105. data/spec/dummy/public/javascripts/alchemy/jquery.rails.js +0 -315
  106. data/spec/dummy/public/javascripts/alchemy/jquery.sb.min.js +0 -14
  107. data/spec/dummy/public/javascripts/alchemy/jquery.scrollTo-1.4.2-min.js +0 -11
  108. data/spec/dummy/public/javascripts/alchemy/jquery.ui.nestedSortable.js +0 -291
  109. data/spec/dummy/public/javascripts/alchemy/jquery.ui.tabspaging.js +0 -281
  110. data/spec/dummy/public/javascripts/alchemy/swfupload/fileprogress.js +0 -203
  111. data/spec/dummy/public/javascripts/alchemy/swfupload/handlers.js +0 -171
  112. data/spec/dummy/public/javascripts/alchemy/swfupload/queue.js +0 -98
  113. data/spec/dummy/public/javascripts/alchemy/swfupload/swfupload.js +0 -980
  114. data/spec/dummy/public/javascripts/alchemy/swfupload/swfupload.swf +0 -0
  115. data/spec/dummy/public/javascripts/alchemy/tiny_mce/jquery.tinymce.js +0 -1
  116. data/spec/dummy/public/javascripts/alchemy/tiny_mce/langs/de.js +0 -1
  117. data/spec/dummy/public/javascripts/alchemy/tiny_mce/langs/en.js +0 -223
  118. data/spec/dummy/public/javascripts/alchemy/tiny_mce/license.txt +0 -504
  119. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/alchemy_link/editor_plugin.js +0 -43
  120. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/alchemy_link/langs/de.js +0 -4
  121. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/alchemy_link/langs/en.js +0 -4
  122. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/fullscreen/editor_plugin.js +0 -1
  123. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/fullscreen/fullscreen.htm +0 -109
  124. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/inlinepopups/editor_plugin.js +0 -1
  125. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/inlinepopups/skins/alchemy/window.css +0 -402
  126. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/inlinepopups/template.htm +0 -387
  127. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/lists/editor_plugin.js +0 -1
  128. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/paste/editor_plugin.js +0 -1
  129. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/paste/js/pastetext.js +0 -36
  130. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/paste/js/pasteword.js +0 -51
  131. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/paste/langs/de_dlg.js +0 -1
  132. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/paste/langs/en_dlg.js +0 -5
  133. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/paste/pastetext.htm +0 -27
  134. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/paste/pasteword.htm +0 -21
  135. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/cell.htm +0 -180
  136. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/css/cell.css +0 -17
  137. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/css/row.css +0 -25
  138. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/css/table.css +0 -13
  139. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/editor_plugin.js +0 -1
  140. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/js/cell.js +0 -319
  141. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/js/merge_cells.js +0 -27
  142. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/js/row.js +0 -237
  143. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/js/table.js +0 -450
  144. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/langs/de_dlg.js +0 -1
  145. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/langs/en_dlg.js +0 -75
  146. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/merge_cells.htm +0 -32
  147. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/row.htm +0 -158
  148. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/table.htm +0 -188
  149. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/about.htm +0 -52
  150. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/anchor.htm +0 -26
  151. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/charmap.htm +0 -51
  152. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/color_picker.htm +0 -74
  153. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/editor_template.js +0 -1
  154. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/image.htm +0 -80
  155. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/colorpicker.jpg +0 -0
  156. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/flash.gif +0 -0
  157. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/icons.gif +0 -0
  158. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/iframe.gif +0 -0
  159. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/pagebreak.gif +0 -0
  160. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/quicktime.gif +0 -0
  161. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/realmedia.gif +0 -0
  162. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/shockwave.gif +0 -0
  163. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/trans.gif +0 -0
  164. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/video.gif +0 -0
  165. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/windowsmedia.gif +0 -0
  166. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/js/about.js +0 -73
  167. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/js/anchor.js +0 -42
  168. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/js/charmap.js +0 -355
  169. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/js/color_picker.js +0 -329
  170. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/js/image.js +0 -247
  171. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/js/link.js +0 -153
  172. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/js/source_editor.js +0 -56
  173. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/langs/de.js +0 -1
  174. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/langs/de_dlg.js +0 -1
  175. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/langs/en.js +0 -68
  176. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/langs/en_dlg.js +0 -54
  177. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/link.htm +0 -57
  178. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/shortcuts.htm +0 -47
  179. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/default/content.css +0 -47
  180. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/default/dialog.css +0 -117
  181. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/default/img/buttons.png +0 -0
  182. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/default/img/items.gif +0 -0
  183. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif +0 -0
  184. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/default/img/menu_check.gif +0 -0
  185. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/default/img/progress.gif +0 -0
  186. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/default/img/tabs.gif +0 -0
  187. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/default/ui.css +0 -214
  188. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/highcontrast/content.css +0 -23
  189. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/highcontrast/dialog.css +0 -105
  190. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/highcontrast/ui.css +0 -102
  191. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/o2k7/content.css +0 -46
  192. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/o2k7/dialog.css +0 -117
  193. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png +0 -0
  194. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png +0 -0
  195. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png +0 -0
  196. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/o2k7/ui.css +0 -217
  197. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/o2k7/ui_black.css +0 -8
  198. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css +0 -5
  199. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/source_editor.htm +0 -25
  200. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/simple/langs/de.js +0 -1
  201. data/spec/dummy/public/javascripts/alchemy/tiny_mce/tiny_mce.js +0 -1
  202. data/spec/dummy/public/javascripts/alchemy/tiny_mce/tiny_mce_popup.js +0 -5
  203. data/spec/dummy/public/javascripts/alchemy/tiny_mce/utils/editable_selects.js +0 -70
  204. data/spec/dummy/public/javascripts/alchemy/tiny_mce/utils/form_utils.js +0 -210
  205. data/spec/dummy/public/javascripts/alchemy/tiny_mce/utils/mctabs.js +0 -162
  206. data/spec/dummy/public/javascripts/alchemy/tiny_mce/utils/validate.js +0 -252
  207. data/spec/dummy/public/stylesheets/alchemy/Jcrop.gif +0 -0
  208. data/spec/dummy/public/stylesheets/alchemy/alchemy.css +0 -3653
  209. data/spec/dummy/public/stylesheets/alchemy/alchemy_tinymce_content.css +0 -94
  210. data/spec/dummy/public/stylesheets/alchemy/alchemy_tinymce_dialog.css +0 -415
  211. data/spec/dummy/public/stylesheets/alchemy/default/img/tabs.gif +0 -0
  212. data/spec/dummy/public/stylesheets/alchemy/elements.css +0 -900
  213. data/spec/dummy/public/stylesheets/alchemy/flags.css +0 -1
  214. data/spec/dummy/public/stylesheets/alchemy/ie6.css +0 -18
  215. data/spec/dummy/public/stylesheets/alchemy/jquery-ui-1.8.7.alchemy.css +0 -2023
  216. data/spec/dummy/public/stylesheets/alchemy/jquery.Jcrop.css +0 -35
  217. data/spec/dummy/public/stylesheets/alchemy/jquery.sb.css +0 -244
  218. data/spec/dummy/public/stylesheets/alchemy/standard_set.css +0 -374
  219. data/spec/page_spec.rb +0 -50
@@ -68,6 +68,10 @@ class Attachment < ActiveRecord::Base
68
68
  then "word"
69
69
  when "application/vnd.ms-excel"
70
70
  then "excel"
71
+ when "text/x-vcard"
72
+ then "vcard"
73
+ when "application/vcard"
74
+ then "vcard"
71
75
  else
72
76
  "file"
73
77
  end
@@ -17,7 +17,10 @@ class Element < ActiveRecord::Base
17
17
 
18
18
  # TODO: add a trashed column to elements table
19
19
  scope :trashed, where(:page_id => nil).order('updated_at DESC')
20
-
20
+ scope :published, where(:public => true)
21
+ scope :named, lambda { |names| where(arel_table[:name].in(names)) }
22
+ scope :excluded, lambda { |names| where(arel_table[:name].not_in(names)) }
23
+
21
24
  # Returns next Element on self.page or nil. Pass a Element.name to get next of this kind.
22
25
  def next(name = nil)
23
26
  if name.nil?
@@ -38,13 +41,15 @@ class Element < ActiveRecord::Base
38
41
  self.class.where(find_conditions).order("position DESC").limit(1)
39
42
  end
40
43
 
41
- def store_page page
44
+ # Stores the page into `to_be_sweeped_pages` (Pages that have to be sweeped after updating element).
45
+ def store_page(page)
46
+ return true if page.nil?
42
47
  unless self.to_be_sweeped_pages.include? page
43
48
  self.to_be_sweeped_pages << page
44
49
  self.save
45
50
  end
46
51
  end
47
-
52
+
48
53
  # nullifies the page_id aka. trashs it.
49
54
  def trash
50
55
  self.page_id = nil
@@ -104,14 +109,23 @@ class Element < ActiveRecord::Base
104
109
  copy
105
110
  end
106
111
 
112
+ # Returns the descriptions from elements.yml file.
113
+ # Alchemy comes with its own elements.yml file. As so called standard set.
114
+ # Place a elements.yml file inside your apps config/alchemy folder to define
115
+ # your own set of elements
107
116
  def self.descriptions
108
117
  if File.exists? "#{Rails.root}/config/alchemy/elements.yml"
109
- @elements = YAML.load_file( "#{Rails.root}/config/alchemy/elements.yml" )
110
- elsif File.exists? "#{Rails.root}/vendor/plugins/alchemy/config/alchemy/elements.yml"
111
- @elements = YAML.load_file( "#{Rails.root}/vendor/plugins/alchemy/config/alchemy/elements.yml" )
112
- else
113
- raise "Could not read config/alchemy/elements.yml"
114
- end
118
+ element_definitions = YAML.load_file( "#{Rails.root}/config/alchemy/elements.yml" )
119
+ end
120
+ if !element_definitions
121
+ if File.exists?(File.join(File.dirname(__FILE__), "../../config/alchemy/elements.yml"))
122
+ element_definitions = YAML.load_file( File.join(File.dirname(__FILE__), "../../config/alchemy/elements.yml") )
123
+ end
124
+ end
125
+ if !element_definitions
126
+ raise LoadError, "Could not find elements.yml file! Please run: rails generate alchemy:scaffold"
127
+ end
128
+ element_definitions
115
129
  end
116
130
 
117
131
  def self.definitions
@@ -148,7 +162,6 @@ class Element < ActiveRecord::Base
148
162
 
149
163
  # returns the description of the element with my name in element.yml
150
164
  def description
151
- return nil if Element.descriptions.blank?
152
165
  Element.descriptions.detect{ |d| d['name'] == self.name }
153
166
  end
154
167
 
@@ -390,13 +403,14 @@ private
390
403
  end
391
404
 
392
405
  def self.all_definitions_for(element_names)
406
+ return [] if element_names.blank?
393
407
  if element_names.to_s == "all"
394
408
  return element_descriptions
395
409
  else
396
410
  return definitions.select { |e| element_names.include? e['name'] }
397
411
  end
398
412
  end
399
-
413
+
400
414
  # makes a copy of source and makes copies of the contents from source
401
415
  def self.copy(source, differences = {})
402
416
  attributes = source.attributes.except("id").merge(differences)
@@ -410,12 +424,11 @@ private
410
424
 
411
425
  # creates the contents for this element as described in the elements.yml
412
426
  def create_contents
413
- element_scratch = description
414
427
  contents = []
415
- if element_scratch["contents"].blank?
428
+ if description["contents"].blank?
416
429
  logger.warn "\n++++++\nWARNING! Could not find any content descriptions for element: #{self.name}\n++++++++\n"
417
430
  else
418
- element_scratch["contents"].each do |content_hash|
431
+ description["contents"].each do |content_hash|
419
432
  contents << Content.create_from_scratch(self, content_hash.symbolize_keys)
420
433
  end
421
434
  end
@@ -1,5 +1,8 @@
1
1
  # encoding: UTF-8
2
2
  class Page < ActiveRecord::Base
3
+
4
+ RESERVED_PAGE_LAYOUTS = %w(rootpage)
5
+ RESERVED_URLNAMES = %w(admin messages)
3
6
 
4
7
  acts_as_nested_set
5
8
  stampable
@@ -12,8 +15,11 @@ class Page < ActiveRecord::Base
12
15
 
13
16
  validates_presence_of :name, :message => N_("please enter a name")
14
17
  validates_presence_of :page_layout, :message => N_("Please choose a page layout.")
18
+ validates_presence_of :parent_id, :message => N_("No parent page was given."), :unless => :rootpage?
15
19
  validates_length_of :urlname, :minimum => 3, :too_short => N_("urlname_to_short"), :if => :urlname_entered?
16
20
  validates_uniqueness_of :urlname, :message => N_("URL-Name already token"), :scope => 'language_id', :if => :urlname_entered?
21
+ validates :page_layout, :exclusion => { :in => RESERVED_PAGE_LAYOUTS, :message => N_("This page_layout name is reserved.") }, :unless => :rootpage?
22
+ validates :urlname, :exclusion => { :in => RESERVED_URLNAMES, :message => N_("This urlname is reserved.") }
17
23
 
18
24
  attr_accessor :do_not_autogenerate
19
25
  attr_accessor :do_not_sweep
@@ -34,7 +40,7 @@ class Page < ActiveRecord::Base
34
40
  scope :accessable, where(:restricted => false)
35
41
  scope :restricted, where(:restricted => true)
36
42
  scope :public_language_roots, lambda {
37
- where("language_root = 1 AND language_code IN ('#{Language.all_codes_for_published.join('\',\'')}') AND public = 1")
43
+ where(:language_root => true).where("language_code IN ('#{Language.all_codes_for_published.join('\',\'')}')").where(:public => true)
38
44
  }
39
45
  scope :all_last_edited_from, lambda { |user| where(:updater_id => user.id).order('updated_at DESC').limit(5) }
40
46
 
@@ -44,24 +50,37 @@ class Page < ActiveRecord::Base
44
50
 
45
51
  scope :contentpages, where("pages.layoutpage = 0 AND pages.parent_id IS NOT NULL")
46
52
 
47
- # Finds selected elements from page either except a passed collection or only the passed collection
48
- # Collection is an array of strings from element names. E.g.: ['text', 'headline']
49
- # Returns only public ones
50
- def find_selected_elements(options, show_non_public = false)
51
- public_condition = show_non_public ? nil : ' AND elements.public = 1'
52
- if !options[:except].blank?
53
- condition = ["elements.name NOT IN (?)#{public_condition}", options[:except]]
54
- elsif !options[:only].blank?
55
- condition = ["elements.name IN (?)#{public_condition}", options[:only]]
53
+ # Finds selected elements from page.
54
+ #
55
+ # Options are:
56
+ #
57
+ # :only => Array of element names # Returns only elements with given names
58
+ # :except => Array of element names # Returns all elements except the ones with given names
59
+ # :count => Integer # Limit the count of returned elements
60
+ # :offset => Integer # Starts with an offset while returning elements
61
+ # :random => Boolean # Returning elements randomly shuffled
62
+ #
63
+ # Returns only public elements by default.
64
+ # Pass true as second argument to get all elements.
65
+ #
66
+ def find_selected_elements(options = {}, show_non_public = false)
67
+ elements = self.elements
68
+ if !options[:only].blank?
69
+ elements = self.elements.named(options[:only])
70
+ elsif !options[:except].blank?
71
+ elements = self.elements.excluded(options[:except])
72
+ end
73
+ elements = elements.offset(options[:offset]).limit(options[:count])
74
+ elements = elements.order("RAND()") if options[:random]
75
+ if show_non_public
76
+ elements
56
77
  else
57
- condition = show_non_public.nil? ? nil : {:public => true}
78
+ elements.published
58
79
  end
59
- elements = self.elements.where(condition).limit(options[:count]).offset(options[:offset])
60
- elements.order("RAND()") unless options[:random].blank?
61
- elements
62
80
  end
63
81
 
64
- def find_elements(options, show_non_public = false)
82
+ def find_elements(options = {}, show_non_public = false) #:nodoc:
83
+ # TODO: What is this? A Kind of proxy method? Why not rendering the elements directly if you already have them????
65
84
  if !options[:collection].blank? && options[:collection].is_a?(Array)
66
85
  all_elements = options[:collection]
67
86
  else
@@ -69,7 +88,7 @@ class Page < ActiveRecord::Base
69
88
  end
70
89
  all_elements
71
90
  end
72
-
91
+
73
92
  def elements_grouped_by_cells
74
93
  group = ActiveSupport::OrderedHash.new
75
94
  cells.each { |cell| group[cell] = cell.elements }
@@ -324,30 +343,39 @@ class Page < ActiveRecord::Base
324
343
  self.language_roots.find_by_language_id(language_id)
325
344
  end
326
345
 
327
- # Creates a copy of source (an Page object) and does a copy of all elements depending to source.
346
+ # Creates a copy of source (a Page object) and does a copy of all elements depending to source.
328
347
  # You can pass any kind of Page#attributes as a difference to source.
329
348
  # Notice: It prevents the element auto_generator from running.
330
- def self.copy(source, differences = {})
331
- attributes = source.attributes.symbolize_keys.merge(differences)
332
- attributes.merge!(
333
- :do_not_autogenerate => true,
334
- :do_not_sweep => true,
335
- :visible => false,
336
- :public => false,
337
- :locked => false,
338
- :locked_by => nil
339
- )
340
- page = self.new(attributes.except(["id", "updated_at", "created_at", "created_id", "updater_id"]))
341
- if page.save
342
- source.elements.each do |element|
343
- new_element = Element.copy(element, :page_id => page.id)
344
- new_element.move_to_bottom
345
- end
346
- return page
347
- else
348
- raise page.errors.full_messages
349
- end
350
- end
349
+ def self.copy(source, differences = {})
350
+ attributes = source.attributes.symbolize_keys.merge(differences)
351
+ attributes.merge!(
352
+ :do_not_autogenerate => true,
353
+ :do_not_sweep => true,
354
+ :visible => false,
355
+ :public => false,
356
+ :locked => false,
357
+ :locked_by => nil
358
+ )
359
+ page = self.new(attributes.except(["id", "updated_at", "created_at", "created_id", "updater_id"]))
360
+ if page.save
361
+ # copy the page´s cells
362
+ source.cells.each do |cell|
363
+ new_cell = Cell.create(:name => cell.name, :page_id => page.id)
364
+ end
365
+ # copy the page´s elements
366
+ source.elements.each do |element|
367
+ # detect cell for element
368
+ # if cell is nil also pass nil to element.cell_id
369
+ cell = nil
370
+ cell = page.cells.detect{ |c| c.name == element.cell.name } if element.cell
371
+ new_element = Element.copy(element, :page_id => page.id, :cell_id => (cell.blank? ? nil : cell.id))
372
+ new_element.move_to_bottom
373
+ end
374
+ return page
375
+ else
376
+ raise page.errors.full_messages
377
+ end
378
+ end
351
379
 
352
380
  # Gets the language_root page for page
353
381
  def get_language_root
@@ -432,6 +460,15 @@ class Page < ActiveRecord::Base
432
460
  return N_('unknown') if self.locker.nil?
433
461
  self.locker.name
434
462
  end
463
+
464
+ # is the curent object the main rootpage?
465
+ def rootpage?
466
+ (self.page_layout == "rootpage") && self.parent_id.blank?
467
+ end
468
+
469
+ def self.rootpage
470
+ where(:page_layout => 'rootpage').where(:parent_id => nil).first
471
+ end
435
472
 
436
473
  private
437
474
 
@@ -3,7 +3,7 @@
3
3
  $('#essence_picture_<%= @content_id -%>').remove();
4
4
  Alchemy.SortableContents('#element_<%= @element.id -%>_contents', '<%= form_authenticity_token -%>');
5
5
 
6
- <%- if !max_image_count.blank? && (@essence_pictures.length == max_image_count) -%>
6
+ <%- if max_image_count.blank? || (@essence_pictures.length < max_image_count) -%>
7
7
  $('#element_<%= @element.id -%>_contents').append('<%= escape_javascript(
8
8
  render(
9
9
  :partial => "admin/elements/add_content",
@@ -33,10 +33,11 @@
33
33
  <%= form.hidden_field :language_code, :value => lang.code %>
34
34
  <%= form.hidden_field :page_layout, :value => lang.page_layout %>
35
35
  <%= form.hidden_field :language_root, :value => true %>
36
+ <%= form.hidden_field :parent_id, :value => Page.rootpage.id %>
36
37
  <%= form.submit(_("%{language}_as_new_language") % {:language => lang.name}, :class => 'button', :onclick => 'Alchemy.pleaseWaitOverlay();') %>
37
38
  <% end %>
38
39
  <%- end -%>
39
40
  <%- else -%>
40
- <p>Diese Sprache existiert noch nicht. Bitte legen Sie diese Sprache erst in den Sprachen an.</p>
41
+ <p><%= _("Actually this language does not exist. Please create this language first.") %></p>
41
42
  <%- end -%>
42
43
  </div>
@@ -12,7 +12,7 @@
12
12
  </div>
13
13
  <div id="paste_page_tab">
14
14
  <%= form_for([:admin, @page], :remote => true, :html => {:id => 'paste_page_form'}) do |f| %>
15
- <%= f.hidden_field("parent_id", :value => @parent_id) %>
15
+ <%= f.hidden_field(:parent_id) %>
16
16
  <table id="new_page_form">
17
17
  <tr>
18
18
  <td class="label very_long">
@@ -2,7 +2,7 @@
2
2
  Alchemy.closeCurrentWindow();
3
3
  <%- if request.referer.include?('edit') -%>
4
4
  Alchemy.reloadPreview();
5
- $('#<%= dom_id(@page) -%>_status').replaceWith(<%= escape_javascript(render(:partial => 'page_status')) -%>)
5
+ $('#<%= dom_id(@page) -%>_status').replaceWith('<%= escape_javascript(render(:partial => "page_status")) -%>');
6
6
  <%- else -%>
7
7
  $('#<%= dom_id(@page) -%> > .sitemap_page > .sitemap_sitename .sitemap_pagename_link').text('<%= @page.name -%>');
8
8
  <%- if @page.locked? && @page.locker == current_user -%>
@@ -74,10 +74,10 @@
74
74
  flash9_url : "/javascripts/alchemy/swfupload/swfupload.swf",
75
75
  upload_url: '<%= new_asset_path_with_session_information(model_name) %>',
76
76
  post_params: <%= post_params.html_safe %>,
77
- file_size_limit : "500 MB",
77
+ file_size_limit : "<%= configuration(:uploader)[:file_size_limit] -%> MB",
78
78
  file_types : '<%= file_types.map{ |f| "*.#{f}" }.join(";") %>',
79
79
  file_types_description : "<%= file_types_description %>",
80
- file_upload_limit : 500,
80
+ file_upload_limit : <%= configuration(:uploader)[:upload_limit] -%>,
81
81
  file_queue_limit : 0,
82
82
  custom_settings : {
83
83
  progressTarget : "uploadProgressContainer",
@@ -56,11 +56,11 @@
56
56
  <%= link_to(
57
57
  content_tag('span', '', :class => 'icon flush'),
58
58
  flush_admin_pictures_path,
59
- :before => 'Alchemy.pleaseWaitOverlay();',
60
- :complete => 'Alchemy.pleaseWaitOverlay(false);',
61
59
  :class => 'icon_button',
62
60
  :remote => true,
63
- :title => _('Flush picture cache')
61
+ :method => :post,
62
+ :title => _('Flush picture cache'),
63
+ :id => 'flush_picture_cache_button'
64
64
  ) -%><br />
65
65
  <label><%= _('Flush picture cache') %></label>
66
66
  </div>
@@ -75,11 +75,14 @@
75
75
  <%- content_for :javascripts do -%>
76
76
  <script type="text/javascript" charset="utf-8">
77
77
 
78
- jQuery(document).ready(function() {
78
+ jQuery(document).ready(function($) {
79
79
  Alchemy.inPlaceEditor({
80
80
  save_label: "<%= _('save') %>",
81
81
  cancel_label: "<%= _('cancel') %>"
82
82
  });
83
+ $('#flush_picture_cache_button').click(function() {
84
+ Alchemy.pleaseWaitOverlay();
85
+ });
83
86
  });
84
87
 
85
88
  </script>
@@ -4,9 +4,7 @@
4
4
  <%= link_to_confirmation_window(
5
5
  "",
6
6
  _("confirm_to_delete_image"),
7
- url_for(
8
- :controller => 'essence_pictures',
9
- :action => 'destroy',
7
+ admin_essence_picture_path(
10
8
  :id => content,
11
9
  :options => options
12
10
  ),
@@ -1,60 +1,60 @@
1
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
- <html xmlns="http://www.w3.org/1999/xhtml" lang="<%= current_user.language.blank? ? 'de' : current_user.language rescue 'de' %>">
4
- <head>
5
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
6
- <meta http-equiv="content-language" content="<%= current_user.language.blank? ? 'de' : current_user.language rescue 'de' %>">
7
- <title><%= render_alchemy_title %></title>
8
- <!--[if IE 6]><link rel="stylesheet" type="text/css" href="/plugin_assets/stylesheets/ie6.css" /><![endif]-->
9
- <%= yield :stylesheets %>
10
- <%= yield :javascript_includes %>
11
- <script type="text/javascript" charset="utf-8">
12
- // <![CDATA[
13
- if(typeof(jQuery)=='function') {
14
- jQuery.noConflict();
15
- }
16
- // ]]>
17
- </script>
18
- </head>
19
-
20
- <body id="alchemy">
21
- <%#= overlay for indication of loading %>
22
- <div id="overlay">
23
- <div id="overlay_text_box">
24
- <%= image_tag('alchemy/ajax_loader.gif', :id => 'ajax_loader') %>
25
- <span id="overlay_text"><%= _("please_wait") %></span>
26
- </div>
27
- </div>
28
- <%#= overlay end %>
29
- <div id="corner"></div>
30
- <div id="main_menu">
31
- <div id="main_navi">
32
- <%= yield(:navigation) %>
33
- <%= admin_main_navigation %>
34
- </div>
35
- <div id="main_menu_background"></div>
36
- <div id="logout">
37
- <%= link_to_overlay_window("<span class='module icon exit'></span><br /> #{_('leave')}".html_safe, leave_admin_path, {:size => "300x140", :title => _("Leave Alchemy")}) %>
38
- </div>
39
- </div>
40
- <div id="top_menu">
41
- <div id="sub_navigation">
42
- <%= admin_subnavigation %>
43
- <div id="subnav_additions">
44
- <%= yield(:subnav_additions) %>
45
- </div>
46
- </div>
47
- <%= yield(:toolbar) %>
48
- <%- if current_user -%>
49
- <div id="user_info">
50
- <%= _('Logged in as') %> <%= current_user.name %>
51
- </div>
52
- <%- end -%>
53
- </div>
54
- <%= render :partial => 'admin/partials/flash_notices' %>
55
- <div id="main_content">
56
- <%= yield %>
57
- </div>
58
- <%= yield(:javascripts) %>
59
- </body>
1
+ <!DOCTYPE>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
5
+ <meta http-equiv="content-language" content="<%= current_user.language.blank? ? 'de' : current_user.language rescue 'de' %>">
6
+ <title><%= render_alchemy_title %></title>
7
+ <%= csrf_meta_tag %>
8
+ <!--[if IE 6]><link rel="stylesheet" type="text/css" href="/plugin_assets/stylesheets/ie6.css" /><![endif]-->
9
+ <%= yield :stylesheets %>
10
+ <%= yield :javascript_includes %>
11
+ <script type="text/javascript" charset="utf-8">
12
+ // <![CDATA[
13
+ if(typeof(jQuery)=='function') {
14
+ jQuery.noConflict();
15
+ }
16
+ // ]]>
17
+ </script>
18
+ </head>
19
+
20
+ <body id="alchemy">
21
+ <%#= overlay for indication of loading %>
22
+ <div id="overlay">
23
+ <div id="overlay_text_box">
24
+ <%= image_tag('alchemy/ajax_loader.gif', :id => 'ajax_loader') %>
25
+ <span id="overlay_text"><%= _("please_wait") %></span>
26
+ </div>
27
+ </div>
28
+ <%#= overlay end %>
29
+ <div id="corner"></div>
30
+ <div id="main_menu">
31
+ <div id="main_navi">
32
+ <%= yield(:navigation) %>
33
+ <%= admin_main_navigation %>
34
+ </div>
35
+ <div id="main_menu_background"></div>
36
+ <div id="logout">
37
+ <%= link_to_overlay_window("<span class='module icon exit'></span><br /> #{_('leave')}".html_safe, leave_admin_path, {:size => "300x140", :title => _("Leave Alchemy")}) %>
38
+ </div>
39
+ </div>
40
+ <div id="top_menu">
41
+ <div id="sub_navigation">
42
+ <%= admin_subnavigation %>
43
+ <div id="subnav_additions">
44
+ <%= yield(:subnav_additions) %>
45
+ </div>
46
+ </div>
47
+ <%= yield(:toolbar) %>
48
+ <%- if current_user -%>
49
+ <div id="user_info">
50
+ <%= _('Logged in as') %> <%= current_user.name %>
51
+ </div>
52
+ <%- end -%>
53
+ </div>
54
+ <%= render :partial => 'admin/partials/flash_notices' %>
55
+ <div id="main_content">
56
+ <%= yield %>
57
+ </div>
58
+ <%= yield(:javascripts) %>
59
+ </body>
60
60
  </html>