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
data/.gitignore CHANGED
@@ -18,4 +18,5 @@ spec/dummy/uploads/
18
18
  spec/dummy/db/test.sqlite3-journal
19
19
  spec/dummy/db/seeds.rb
20
20
  .rvmrc
21
- spec/dummy/config/locales/**/*
21
+ spec/dummy/config/locales/**/*
22
+ /coverage/
data/.travis.yml CHANGED
@@ -6,7 +6,9 @@ branches:
6
6
  only:
7
7
  - master
8
8
  before_script:
9
- - "phantomjs -v"
9
+ - sudo spec/support/ci/install_phantomjs
10
+ - "export PATH=phantomjs/bin:$PATH"
11
+ - phantomjs --version
10
12
  - "sh -c 'cd spec/dummy && RAILS_ENV=test bundle exec rake db:create db:schema:load --trace'"
11
13
  script: "bundle exec rspec spec"
12
14
  env:
data/.yardopts CHANGED
@@ -1,5 +1,5 @@
1
1
  --title "Alchemy CMS"
2
2
  app/**/*.rb
3
3
  config/**/*.yml
4
- lib/**/*
4
+ lib/**/*.rb
5
5
  README.md
data/Gemfile CHANGED
@@ -10,9 +10,10 @@ group :test do
10
10
  gem 'sqlite3' if ENV['DB'].nil? || ENV['DB'] == 'sqlite'
11
11
  gem 'mysql2' if ENV['DB'] == 'mysql'
12
12
  gem 'pg' if ENV['DB'] == 'postgresql'
13
- gem 'poltergeist', '0.7.0'
13
+ gem 'poltergeist', '1.0.2'
14
14
  unless ENV['CI']
15
15
  gem 'launchy'
16
+ gem 'simplecov', :require => false
16
17
  end
17
18
  end
18
19
 
data/alchemy_cms.gemspec CHANGED
@@ -20,23 +20,24 @@ Gem::Specification.new do |s|
20
20
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
21
21
  s.require_paths = ["lib"]
22
22
 
23
- s.add_runtime_dependency %q<rails>, ["~> 3.2.8"]
24
- s.add_runtime_dependency %q<authlogic>, ["~> 3.1.3"]
25
- s.add_runtime_dependency %q<awesome_nested_set>, ["~> 2.0"]
26
- s.add_runtime_dependency %q<acts-as-taggable-on>, ["~> 2.1"]
27
- s.add_runtime_dependency %q<declarative_authorization>, ["= 0.5.5"]
28
- s.add_runtime_dependency %q<tvdeyen-fleximage>, ["~> 1.2.0"]
29
- s.add_runtime_dependency %q<kaminari>, ["~> 0.13.0"]
30
- s.add_runtime_dependency %q<acts_as_ferret>, ["~> 0.5"]
31
- s.add_runtime_dependency %q<acts_as_list>, ["~> 0.1"]
32
- s.add_runtime_dependency %q<magiclabs-userstamp>, ["~> 2.0.2"]
33
- s.add_runtime_dependency %q<dynamic_form>, ["~> 1.1"]
34
- s.add_runtime_dependency %q<jquery-rails>, ["~> 2.1.3"]
35
- s.add_runtime_dependency %q<attachment_magic>, ["~> 0.2.1"]
36
- s.add_runtime_dependency %q<sass-rails>, ['~> 3.2.3']
37
- s.add_runtime_dependency %q<coffee-rails>, ['~> 3.2.1']
38
- s.add_runtime_dependency %q<compass-rails>, ['~> 1.0.3']
39
- s.add_runtime_dependency %q<sassy-buttons>, ['~> 0.1.3']
23
+ s.add_runtime_dependency %q<rails>, ["~> 3.2.8"]
24
+ s.add_runtime_dependency %q<authlogic>, ["~> 3.1.3"]
25
+ s.add_runtime_dependency %q<awesome_nested_set>, ["~> 2.0"]
26
+ s.add_runtime_dependency %q<acts-as-taggable-on>, ["~> 2.1"]
27
+ s.add_runtime_dependency %q<declarative_authorization>, ["= 0.5.5"]
28
+ s.add_runtime_dependency %q<tvdeyen-fleximage>, ["~> 1.2.0"]
29
+ s.add_runtime_dependency %q<kaminari>, ["~> 0.13.0"]
30
+ s.add_runtime_dependency %q<acts_as_ferret>, ["~> 0.5"]
31
+ s.add_runtime_dependency %q<acts_as_list>, ["~> 0.1"]
32
+ s.add_runtime_dependency %q<magiclabs-userstamp>, ["~> 2.0.2"]
33
+ s.add_runtime_dependency %q<dynamic_form>, ["~> 1.1"]
34
+ s.add_runtime_dependency %q<jquery-rails>, ["~> 2.1.3"]
35
+ s.add_runtime_dependency %q<attachment_magic>, ["~> 0.2.1"]
36
+ s.add_runtime_dependency %q<sass-rails>, ['~> 3.2.3']
37
+ s.add_runtime_dependency %q<coffee-rails>, ['~> 3.2.1']
38
+ s.add_runtime_dependency %q<compass-rails>, ['~> 1.0.3']
39
+ s.add_runtime_dependency %q<sassy-buttons>, ['~> 0.1.3']
40
+ s.add_runtime_dependency %q<rails3-jquery-autocomplete>, ['~> 1.0.10']
40
41
 
41
42
  s.add_development_dependency %q<bumpy>
42
43
  s.add_development_dependency %q<capybara>
Binary file
Binary file
Binary file
Binary file
@@ -200,9 +200,7 @@ if (typeof(Alchemy) === 'undefined') {
200
200
  isFirefox: navigator.userAgent.match(/Firefox/i) !== null,
201
201
  isChrome: navigator.userAgent.match(/Chrome/i) !== null,
202
202
  isSafari: navigator.userAgent.match(/Safari/i) !== null,
203
- isIE: navigator.userAgent.match(/MSIE/i) !== null,
204
-
205
- locale: 'en'
203
+ isIE: navigator.userAgent.match(/MSIE/i) !== null
206
204
 
207
205
  });
208
206
 
@@ -0,0 +1,28 @@
1
+ window.Alchemy = {} if typeof (Alchemy) is "undefined"
2
+ run = ($) ->
3
+ Alchemy.Browser =
4
+ isiPhone: navigator.userAgent.match(/iPhone/i) isnt null
5
+ isiPad: navigator.userAgent.match(/iPad/i) isnt null
6
+ isiPod: navigator.userAgent.match(/iPod/i) isnt null
7
+ isiOS: navigator.userAgent.match(/iPad|iPhone|iPod/i) isnt null
8
+ isFirefox: navigator.userAgent.match(/Firefox/i) isnt null
9
+ isChrome: navigator.userAgent.match(/Chrome/i) isnt null
10
+ isSafari: navigator.userAgent.match(/AppleWebKit/) and not navigator.userAgent.match(/Chrome/)
11
+ isIE: navigator.userAgent.match(/MSIE/i) isnt null
12
+ getVersion: (browser) ->
13
+ if Alchemy.Browser["is" + browser]
14
+ parseInt(navigator.userAgent.match(new RegExp(browser + ".[0-9]+", "i"))[0].replace(new RegExp(browser + "."), ""), 10)
15
+ else
16
+ null
17
+
18
+ Alchemy.Browser.ChromeVersion = Alchemy.Browser.getVersion("Chrome")
19
+ Alchemy.Browser.FirefoxVersion = Alchemy.Browser.getVersion("Firefox")
20
+ Alchemy.Browser.SafariVersion = Alchemy.Browser.getVersion("Safari")
21
+ Alchemy.Browser.IEVersion = Alchemy.Browser.getVersion("MSIE")
22
+ Alchemy.Browser.isWebKit = Alchemy.Browser.isChrome || Alchemy.Browser.isSafari
23
+ return
24
+
25
+ if typeof (jQuery) is "undefined"
26
+ Alchemy.loadjQuery(run)
27
+ else
28
+ run(jQuery)
@@ -30,12 +30,12 @@ Alchemy.loadjQuery = function(callback) {
30
30
  head.appendChild(script);
31
31
  }
32
32
 
33
- getScript('//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js', function() {
33
+ getScript('//code.jquery.com/jquery.min.js', function() {
34
34
  if (typeof(jQuery) !== 'undefined') {
35
35
  if (thisPageUsingOtherJSLibrary) {
36
36
  jQuery.noConflict();
37
37
  }
38
- callback();
38
+ callback(jQuery);
39
39
  }
40
40
  });
41
41
 
@@ -3,11 +3,13 @@
3
3
  //= require jquery
4
4
  //= require jquery-ui
5
5
  //= require jquery_ujs
6
+ //= require autocomplete-rails
6
7
  //= require tiny_mce/tiny_mce
7
8
  //= require_tree ../../../../vendor/assets/javascripts/jquery_plugins/
8
9
  //= require_tree ../../../../vendor/assets/javascripts/swfupload/
9
10
  //= require alchemy/alchemy.routes
10
11
  //= require alchemy/alchemy.base
12
+ //= require alchemy/alchemy.browser
11
13
  //= require alchemy/alchemy.buttons
12
14
  //= require alchemy/alchemy.datepicker
13
15
  //= require alchemy/alchemy.dirty
@@ -1,5 +1,4 @@
1
- ''
2
- (($, window, document) ->
1
+ (($, window) ->
3
2
 
4
3
  if (typeof(Alchemy) is 'undefined')
5
4
  window.Alchemy = {}
@@ -9,12 +8,13 @@
9
8
 
10
9
  Alchemy.LinkOverlay = {
11
10
 
12
- open: (linked_element, width) ->
11
+ open: (linked_element, width) ->
12
+ self = Alchemy.LinkOverlay
13
13
  $dialog = $('<div style="display:none" id="alchemyLinkOverlay"></div>')
14
14
 
15
15
  $dialog.html(Alchemy.getOverlaySpinner({x: width}))
16
16
 
17
- Alchemy.LinkOverlay.current = $dialog.dialog({
17
+ self.current = $dialog.dialog({
18
18
  modal: true,
19
19
  minWidth: if parseInt(width) < 600 then 600 else parseInt(width),
20
20
  minHeight: 450,
@@ -30,14 +30,14 @@
30
30
  Alchemy.SelectBox('#alchemyLinkOverlay')
31
31
  $dialog.css overflow: 'visible'
32
32
  $dialog.dialog('widget').css overflow: 'visible'
33
- Alchemy.LinkOverlay.attachEvents();
33
+ self.attachEvents()
34
34
  error: (XMLHttpRequest, textStatus, errorThrown) ->
35
35
  Alchemy.AjaxErrorHandler($dialog, XMLHttpRequest.status, textStatus, errorThrown)
36
36
  })
37
37
  close: ->
38
38
  $dialog.remove()
39
39
  })
40
- Alchemy.LinkOverlay.current.linked_element = linked_element
40
+ self.current.linked_element = linked_element
41
41
 
42
42
  attachEvents: ->
43
43
  self = Alchemy.LinkOverlay
@@ -62,43 +62,33 @@
62
62
  $('#sitemap_sitename_' + selected_element).addClass('selected_page').attr('name', urlname)
63
63
 
64
64
  createLink : (link_type, url, title, target) ->
65
+ self = Alchemy.LinkOverlay
66
+ if link_type == 'external'
67
+ if self.validateURLFormat(url)
68
+ self.setLink(url, link_type, title, target)
69
+ else
70
+ return self.showValidationError()
71
+ else
72
+ self.setLink(url, link_type, title, target)
73
+ self.close()
74
+
75
+ setLink: (url, link_type, title, target) ->
76
+ self = Alchemy.LinkOverlay
65
77
  element = Alchemy.LinkOverlay.current.linked_element
66
78
  Alchemy.setElementDirty($(element).parents('.element_editor'))
67
79
  if (element.editor)
68
80
  # aka we are linking text inside of TinyMCE
69
- editor = element.editor
70
- editor.execCommand('mceInsertLink', false, {
71
- href: url,
72
- 'class': link_type,
73
- title: title,
74
- 'data-link-target': target,
75
- target: if target == 'blank' then '_blank' else null
76
- })
77
- editor.selection.collapse()
81
+ self.executeTinyMCEcommand(url, title, link_type, target)
78
82
  else
79
83
  # aka: we are linking an essence
80
- essence_type = element.name.replace('essence_', '').split('_')[0]
81
- content_id = null
82
- switch (essence_type)
83
- when "picture" then content_id = element.name.replace('essence_picture_', '')
84
- when "text" then content_id = element.name.replace('essence_text_', '')
85
-
86
- $('#contents_content_' + content_id + '_link').val(url).change()
87
- $('#contents_content_' + content_id + '_link_title').val(title)
88
- $('#contents_content_' + content_id + '_link_class_name').val(link_type)
89
- $('#contents_content_' + content_id + '_link_target').val(target)
90
- $(element).addClass('linked')
91
- $(element).next().addClass('linked').removeClass('disabled')
84
+ self.linkEssence(url, title, link_type, target)
92
85
 
93
86
  # Selects the tab for kind of link and fills all fields.
94
87
  selectTab : ->
95
88
  linked_element = Alchemy.LinkOverlay.current.linked_element
96
- link = '' # initialization really needed?
97
-
98
89
  # Creating an temporary anchor node if we are linking an EssencePicture or EssenceText.
99
90
  if (linked_element.nodeType)
100
91
  link = Alchemy.LinkOverlay.createTempLink(linked_element)
101
-
102
92
  # Restoring the bookmarked selection inside the TinyMCE of an EssenceRichtext.
103
93
  else
104
94
  if (linked_element.node.nodeName == 'A')
@@ -146,16 +136,16 @@
146
136
 
147
137
  # Handling a contactform link.
148
138
  if (link.className == 'contact')
149
- link_url = link.pathname;
150
- link_params = link.search;
151
- link_subject = link_params.split('&')[0];
152
- link_mailto = link_params.split('&')[1];
153
- link_body = link_params.split('&')[2];
154
- $('#overlay_tabs').tabs("select", '#overlay_tab_contactform_link');
155
- $('#contactform_url').val(link_url);
156
- $('#contactform_subject').val(unescape(link_subject.replace(/subject=/, '')).replace(/\?/, ''));
157
- $('#contactform_body').val(unescape(link_body.replace(/body=/, '')).replace(/\?/, ''));
158
- $('#contactform_mailto').val(link_mailto.replace(/mail_to=/, '').replace(/\?/, ''));
139
+ link_url = link.pathname
140
+ link_params = link.search
141
+ link_subject = link_params.split('&')[0]
142
+ link_mailto = link_params.split('&')[1]
143
+ link_body = link_params.split('&')[2]
144
+ $('#overlay_tabs').tabs("select", '#overlay_tab_contactform_link')
145
+ $('#contactform_url').val(link_url)
146
+ $('#contactform_subject').val(unescape(link_subject.replace(/subject=/, '')).replace(/\?/, ''))
147
+ $('#contactform_body').val(unescape(link_body.replace(/body=/, '')).replace(/\?/, ''))
148
+ $('#contactform_mailto').val(link_mailto.replace(/mail_to=/, '').replace(/\?/, ''))
159
149
 
160
150
  showElementsSelect: (id) ->
161
151
  $('#elements_for_page_' + id).show()
@@ -169,12 +159,7 @@
169
159
 
170
160
  createTempLink: (linked_element) ->
171
161
  $tmp_link = $("<a></a>")
172
- essence_type = $(linked_element).attr('name').replace('essence_', '').split('_')[0]
173
- content_id
174
- switch (essence_type)
175
- when "picture" then content_id = $(linked_element).attr('name').replace('essence_picture_', '')
176
- when "text" then content_id = $(linked_element).attr('name').replace('essence_text_', '')
177
-
162
+ content_id = $(linked_element).data('contentId')
178
163
  $tmp_link.attr('href', $('#contents_content_' + content_id + '_link').val())
179
164
  $tmp_link.attr('title', $('#contents_content_' + content_id + '_link_title').val())
180
165
  $tmp_link.attr('data-link-target', $('#contents_content_' + content_id + '_link_target').val())
@@ -190,5 +175,52 @@
190
175
  $('#contents_content_' + content_id + '_link_target').val('')
191
176
  $(link).removeClass('linked').addClass('disabled')
192
177
  $('#edit_link_' + content_id).removeClass('linked')
178
+
179
+ executeTinyMCEcommand: (url, title, link_type, target) ->
180
+ element = Alchemy.LinkOverlay.current.linked_element
181
+ editor = element.editor
182
+ editor.execCommand('mceInsertLink', false, {
183
+ href: url,
184
+ 'class': link_type,
185
+ title: title,
186
+ 'data-link-target': target,
187
+ target: if target == 'blank' then '_blank' else null
188
+ })
189
+ editor.selection.collapse()
190
+
191
+ linkEssence: (url, title, link_type, target) ->
192
+ element = Alchemy.LinkOverlay.current.linked_element
193
+ content_id = $(element).data('contentId')
194
+ $('#contents_content_' + content_id + '_link').val(url).change()
195
+ $('#contents_content_' + content_id + '_link_title').val(title)
196
+ $('#contents_content_' + content_id + '_link_class_name').val(link_type)
197
+ $('#contents_content_' + content_id + '_link_target').val(target)
198
+ $(element).addClass('linked')
199
+ $(element).next().addClass('linked').removeClass('disabled')
200
+
201
+ validateURLFormat: (url) ->
202
+ if url.match(/^(\/|[a-z]+:\/\/)/)
203
+ return true
204
+ else
205
+ return false
206
+
207
+ showValidationError: ->
208
+ self = Alchemy.LinkOverlay
209
+ $('#errors ul').html("<li>#{self.t('url_validation_failed')}</li>")
210
+ $('#errors').show()
211
+
212
+ t: (id) ->
213
+ self = Alchemy.LinkOverlay
214
+ translation = self.translations[id]
215
+ if translation
216
+ return translation[Alchemy.locale]
217
+ else
218
+ return id
219
+
220
+ translations:
221
+ 'url_validation_failed':
222
+ 'de': 'Die URL hat kein gültiges Format.'
223
+ 'en': 'The url has no valid format.'
224
+
193
225
  }
194
- )(jQuery, window, document)
226
+ )(jQuery, window)
@@ -6,12 +6,20 @@ Alchemy.loadAlchemyMenuBar = function(options) {
6
6
 
7
7
  Alchemy.Menubar = {
8
8
 
9
+ init: function ($) {
10
+ var self = Alchemy.Menubar;
11
+ self._$ = $;
12
+ self.show();
13
+ },
14
+
9
15
  show: function() {
10
- $('body').prepend(Alchemy.Menubar.build());
16
+ var self = Alchemy.Menubar;
17
+ self._$('body').prepend(Alchemy.Menubar.build());
11
18
  },
12
19
 
13
20
  build: function() {
14
- var bar = $('<div id="alchemy_menubar"/>').append('<ul/>');
21
+ var self = Alchemy.Menubar;
22
+ var bar = self._$('<div id="alchemy_menubar"/>').append('<ul/>');
15
23
  bar.find('ul').append('<li><a href="' + options.route + '/admin">' + Alchemy.Menubar.t("to_alchemy") + '</a></li>').append('<li><a href="' + options.route + '/admin/pages/' + options.page_id + '/edit">' + Alchemy.Menubar.t("edit_page") + '</a></li>').append('<li><a href="' + options.route + '/admin/logout">' + Alchemy.Menubar.t("logout") + '</a></li>');
16
24
  return bar;
17
25
  },
@@ -43,9 +51,9 @@ Alchemy.loadAlchemyMenuBar = function(options) {
43
51
  };
44
52
 
45
53
  if (typeof(jQuery) === 'undefined') {
46
- Alchemy.loadjQuery(Alchemy.Menubar.show);
54
+ Alchemy.loadjQuery(Alchemy.Menubar.init);
47
55
  } else {
48
- Alchemy.Menubar.show();
56
+ Alchemy.Menubar.init(jQuery);
49
57
  }
50
58
 
51
59
  };
@@ -24,7 +24,7 @@ $ ->
24
24
  # Locale select handler
25
25
  $('select#change_locale').on 'change', (e) ->
26
26
  url = Alchemy.current_url
27
- delimiter = url.match(/\?/) ? '&' : '?'
27
+ delimiter = if url.match(/\?/) then '&' else '?'
28
28
  window.location = url + delimiter + 'locale=' + $(this).val()
29
29
 
30
30
  # Resize the Alchemy frame on every browser resize.
@@ -0,0 +1,103 @@
1
+ window.Alchemy = {} if typeof (Alchemy) is "undefined"
2
+ Alchemy.initAlchemyPreviewMode = ($) ->
3
+
4
+ # Setting jQueryUIs global animation duration
5
+ $.fx.speeds._default = 400
6
+
7
+ # The Alchemy JavaScript Object contains all Functions
8
+ $.extend Alchemy,
9
+ ElementSelector:
10
+
11
+ # defaults
12
+ scrollOffset: 20
13
+
14
+ styles:
15
+ reset:
16
+ outline: ""
17
+ "outline-offset": ""
18
+ "-moz-outline-radius": ""
19
+
20
+ default_hover:
21
+ outline: "3px solid #F0B437"
22
+ "outline-offset": "4px"
23
+
24
+ webkit_hover:
25
+ outline: "4px auto #F0B437"
26
+
27
+ moz_hover:
28
+ "-moz-outline-radius": "3px"
29
+
30
+ default_selected:
31
+ outline: "3px solid #90B9D0"
32
+ "outline-offset": "4px"
33
+
34
+ webkit_selected:
35
+ outline: "4px auto #90B9D0"
36
+
37
+ moz_selected:
38
+ "-moz-outline-radius": "3px"
39
+
40
+ init: ->
41
+ self = Alchemy.ElementSelector
42
+ $elements = $("[data-alchemy-element]")
43
+ $elements.bind "mouseover", (e) ->
44
+ $(this).attr("title", "Klicken zum bearbeiten")
45
+ $(this).css(self.getStyle("hover")) unless $(this).hasClass("selected")
46
+
47
+ $elements.bind "mouseout", ->
48
+ $(this).removeAttr("title")
49
+ $(this).css(self.getStyle("reset")) unless $(this).hasClass("selected")
50
+
51
+ $elements.bind("Alchemy.SelectElement", self.selectElement)
52
+ $elements.bind("click", self.clickElement)
53
+ self.$previewElements = $elements
54
+
55
+ selectElement: (e) ->
56
+ $this = $(this)
57
+ self = Alchemy.ElementSelector
58
+ $elements = self.$previewElements
59
+ offset = self.scrollOffset
60
+ e.preventDefault()
61
+ $elements.removeClass("selected").css(self.getStyle("reset"))
62
+ $this.addClass("selected").css(self.getStyle("selected"))
63
+ $("html, body").animate
64
+ scrollTop: $this.offset().top - offset
65
+ scrollLeft: $this.offset().left - offset
66
+ , 400
67
+ return
68
+
69
+ clickElement: (e) ->
70
+ $this = $(this)
71
+ parent$ = window.parent.jQuery
72
+ target_id = $this.data("alchemy-element")
73
+ $element_editor = parent$("#element_area .element_editor").closest("[id=\"element_" + target_id + "\"]")
74
+ $elementsWindow = parent$("#alchemyElementWindow")
75
+ e.preventDefault()
76
+ $element_editor.trigger("Alchemy.SelectElementEditor", target_id)
77
+ if $elementsWindow.dialog
78
+ if $elementsWindow.dialog("isOpen")
79
+ $elementsWindow.dialog("moveToTop")
80
+ else
81
+ $elementsWindow.dialog "open"
82
+ $this.trigger("Alchemy.SelectElement")
83
+ return
84
+
85
+ getStyle: (state) ->
86
+ self = Alchemy.ElementSelector
87
+ if state == "reset"
88
+ self.styles["reset"]
89
+ else
90
+ default_state_style = self.styles["default_#{state}"]
91
+ browser = "webkit" if Alchemy.Browser.isWebKit
92
+ browser = "moz" if Alchemy.Browser.isFirefox
93
+ if browser
94
+ $.extend(default_state_style, self.styles["#{browser}_#{state}"])
95
+ else
96
+ default_state_style
97
+
98
+ Alchemy.ElementSelector.init()
99
+
100
+ if typeof (jQuery) is "undefined"
101
+ Alchemy.loadjQuery(Alchemy.initAlchemyPreviewMode)
102
+ else
103
+ Alchemy.initAlchemyPreviewMode(jQuery)