alchemy_cms 2.0.rc3 → 2.0.rc4

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