alchemy_cms 2.1.beta6 → 2.1.rc2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (137) hide show
  1. data/.gitignore +3 -1
  2. data/Gemfile +10 -2
  3. data/Guardfile +16 -0
  4. data/README.md +3 -3
  5. data/Rakefile +0 -5
  6. data/alchemy_cms.gemspec +1 -9
  7. data/app/assets/javascripts/alchemy/alchemy.base.js +5 -4
  8. data/app/assets/javascripts/alchemy/{alchemy.dragndrop.js.erb → alchemy.dragndrop.js} +0 -0
  9. data/app/assets/javascripts/alchemy/alchemy.elements_window.js +96 -0
  10. data/app/assets/javascripts/alchemy/alchemy.image_cropper.js +48 -50
  11. data/app/assets/javascripts/alchemy/alchemy.jquery_loader.js +41 -0
  12. data/app/assets/javascripts/alchemy/alchemy.js +2 -0
  13. data/app/assets/javascripts/alchemy/alchemy.menubar.js +55 -0
  14. data/app/assets/javascripts/alchemy/alchemy.preview.js +94 -139
  15. data/app/assets/javascripts/alchemy/alchemy.preview_window.js +98 -0
  16. data/app/assets/javascripts/alchemy/alchemy.windows.js +1 -174
  17. data/app/assets/javascripts/alchemy/menubar.js +2 -0
  18. data/app/assets/javascripts/alchemy/preview.js +2 -1
  19. data/app/assets/stylesheets/alchemy/_defaults.scss +7 -8
  20. data/app/assets/stylesheets/alchemy/base.css.scss +29 -33
  21. data/app/assets/stylesheets/alchemy/elements.css.scss +4 -4
  22. data/app/assets/stylesheets/alchemy/jquery-ui.alchemy.css.scss +1 -1
  23. data/app/assets/stylesheets/alchemy/jquery.Jcrop.css.scss +1 -1
  24. data/app/assets/stylesheets/alchemy/jquery.sb.css.scss +19 -4
  25. data/app/assets/stylesheets/alchemy/menubar.css.scss +85 -0
  26. data/app/assets/stylesheets/alchemy/standard_set.css +3 -5
  27. data/app/assets/stylesheets/alchemy/tinymce_content.css.scss +1 -1
  28. data/app/assets/stylesheets/alchemy/tinymce_dialog.css.scss +1 -1
  29. data/app/controllers/alchemy/admin/attachments_controller.rb +2 -18
  30. data/app/controllers/alchemy/admin/base_controller.rb +1 -1
  31. data/app/controllers/alchemy/admin/elements_controller.rb +2 -2
  32. data/app/controllers/alchemy/admin/essence_files_controller.rb +4 -2
  33. data/app/controllers/alchemy/admin/pictures_controller.rb +6 -20
  34. data/app/controllers/alchemy/admin/resources_controller.rb +7 -5
  35. data/app/controllers/alchemy/base_controller.rb +14 -4
  36. data/app/controllers/alchemy/messages_controller.rb +4 -4
  37. data/app/controllers/alchemy/pages_controller.rb +51 -32
  38. data/app/controllers/alchemy/pictures_controller.rb +0 -3
  39. data/app/controllers/alchemy/user_sessions_controller.rb +1 -1
  40. data/app/helpers/alchemy/admin/base_helper.rb +6 -4
  41. data/app/helpers/alchemy/base_helper.rb +26 -0
  42. data/app/helpers/alchemy/pages_helper.rb +42 -22
  43. data/app/models/alchemy/attachment.rb +10 -2
  44. data/app/models/alchemy/cell.rb +1 -0
  45. data/app/models/alchemy/content.rb +8 -6
  46. data/app/models/alchemy/element.rb +1 -1
  47. data/app/models/alchemy/essence_audio.rb +1 -8
  48. data/app/models/alchemy/essence_date.rb +2 -9
  49. data/app/models/alchemy/essence_file.rb +1 -8
  50. data/app/models/alchemy/essence_flash.rb +0 -7
  51. data/app/models/alchemy/essence_html.rb +1 -8
  52. data/app/models/alchemy/essence_picture.rb +0 -11
  53. data/app/models/alchemy/essence_richtext.rb +4 -12
  54. data/app/models/alchemy/essence_text.rb +1 -13
  55. data/app/models/alchemy/essence_video.rb +1 -8
  56. data/app/models/alchemy/page.rb +28 -22
  57. data/app/models/alchemy/picture.rb +19 -0
  58. data/app/sweepers/alchemy/pages_sweeper.rb +17 -6
  59. data/app/sweepers/alchemy/pictures_sweeper.rb +1 -3
  60. data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +2 -2
  61. data/app/views/alchemy/admin/attachments/_attachment.html.erb +1 -1
  62. data/app/views/alchemy/admin/attachments/_file_to_assign.html.erb +2 -2
  63. data/app/views/alchemy/admin/attachments/_files_list.html.erb +13 -11
  64. data/app/views/alchemy/admin/attachments/create.js.erb +1 -1
  65. data/app/views/alchemy/admin/attachments/edit.html.erb +2 -2
  66. data/app/views/alchemy/admin/elements/_new_element_form.html.erb +1 -2
  67. data/app/views/alchemy/admin/elements/new.html.erb +1 -1
  68. data/app/views/alchemy/admin/essence_files/edit.html.erb +32 -32
  69. data/app/views/alchemy/admin/essence_pictures/crop.html.erb +29 -29
  70. data/app/views/alchemy/admin/essence_pictures/update.js.erb +13 -12
  71. data/app/views/alchemy/admin/pages/_create_language_form.html.erb +4 -1
  72. data/app/views/alchemy/admin/pages/_new_page_form.html.erb +1 -1
  73. data/app/views/alchemy/admin/pages/edit.html.erb +8 -8
  74. data/app/views/alchemy/admin/pages/index.html.erb +1 -1
  75. data/app/views/alchemy/admin/pages/new.html.erb +1 -1
  76. data/app/views/alchemy/admin/pages/update.js.erb +19 -12
  77. data/app/views/alchemy/admin/pictures/_picture.html.erb +1 -1
  78. data/app/views/alchemy/admin/pictures/_pictures_list.html.erb +8 -6
  79. data/app/views/alchemy/admin/pictures/show_in_window.html.erb +6 -1
  80. data/app/views/alchemy/admin/resources/_table.html.erb +1 -1
  81. data/app/views/alchemy/admin/users/_table.html.erb +13 -13
  82. data/app/views/alchemy/admin/users/_user.html.erb +1 -1
  83. data/app/views/alchemy/admin/users/index.html.erb +2 -2
  84. data/app/views/alchemy/elements/_contactform_view.html.erb +78 -78
  85. data/app/views/alchemy/elements/_download_editor.html.erb +1 -0
  86. data/app/views/alchemy/elements/_download_view.html.erb +3 -0
  87. data/app/views/alchemy/essences/_essence_date_editor.html.erb +1 -1
  88. data/app/views/alchemy/essences/_essence_file_editor.html.erb +1 -0
  89. data/app/views/alchemy/essences/_essence_file_view.html.erb +6 -2
  90. data/app/views/alchemy/essences/_essence_picture_editor.html.erb +3 -2
  91. data/app/views/alchemy/essences/_essence_picture_view.html.erb +1 -1
  92. data/app/views/alchemy/navigation/_link.html.erb +1 -2
  93. data/app/views/alchemy/notifications/admin_user_created.text.erb +7 -7
  94. data/app/views/alchemy/notifications/registered_user_created.text.erb +5 -5
  95. data/app/views/alchemy/user_sessions/login.html.erb +34 -35
  96. data/app/views/layouts/alchemy/login.html.erb +3 -8
  97. data/app/views/layouts/alchemy/pages.html.erb +1 -0
  98. data/bin/alchemy +43 -75
  99. data/config/alchemy/config.yml +10 -0
  100. data/config/alchemy/elements.yml +5 -0
  101. data/config/alchemy/page_layouts.yml +1 -1
  102. data/config/locales/alchemy.de.yml +21 -8
  103. data/config/locales/alchemy.en.yml +20 -4
  104. data/config/routes.rb +25 -20
  105. data/db/migrate/{20111116125112_namespace_models.rb → 20111116125112_namespace_alchemy_models.rb} +1 -1
  106. data/lib/alchemy/capistrano.rb +4 -17
  107. data/lib/alchemy/engine.rb +2 -0
  108. data/lib/alchemy/essence.rb +29 -41
  109. data/lib/alchemy/i18n.rb +1 -1
  110. data/lib/alchemy/mount_point.rb +10 -0
  111. data/lib/alchemy/page_layout.rb +7 -7
  112. data/lib/alchemy/seeder.rb +85 -47
  113. data/lib/alchemy/upgrader.rb +115 -0
  114. data/lib/alchemy/version.rb +1 -1
  115. data/lib/alchemy_cms.rb +4 -3
  116. data/lib/rails/generators/alchemy/scaffold/scaffold_generator.rb +6 -2
  117. data/lib/tasks/ferret.rake +12 -0
  118. data/lib/tasks/install.rake +16 -105
  119. data/lib/tasks/routes.rake +29 -0
  120. data/lib/tasks/upgrade.rake +5 -67
  121. data/spec/controllers/admin/pages_controller_spec.rb +1 -1
  122. data/spec/controllers/pages_controller_spec.rb +31 -0
  123. data/spec/factories.rb +24 -15
  124. data/spec/helpers/admin/base_helper_spec.rb +0 -7
  125. data/spec/helpers/pages_helper_spec.rb +54 -29
  126. data/spec/helpers/url_helpers_spec.rb +40 -0
  127. data/spec/integration/admin/pages_controller_spec.rb +3 -3
  128. data/spec/integration/pages_controller_spec.rb +80 -6
  129. data/spec/integration/security_spec.rb +2 -2
  130. data/spec/models/content_spec.rb +24 -0
  131. data/spec/models/page_spec.rb +174 -47
  132. data/spec/models/picture_spec.rb +54 -0
  133. data/spec/page_layout_spec.rb +2 -2
  134. data/spec/routing_spec.rb +205 -1
  135. data/spec/spec_helper.rb +53 -32
  136. metadata +51 -46
  137. data/lib/alchemy/file_utilz.rb +0 -73
data/.gitignore CHANGED
@@ -15,4 +15,6 @@ spec/dummy/index/
15
15
  log
16
16
  spec/dummy/uploads/
17
17
  .sass-cache
18
- spec/dummy/db/test.sqlite3-journal
18
+ spec/dummy/db/test.sqlite3-journal
19
+ spec/dummy/db/seeds.rb
20
+ .rvmrc
data/Gemfile CHANGED
@@ -2,8 +2,6 @@ source "http://rubygems.org"
2
2
 
3
3
  gemspec
4
4
 
5
- gem 'declarative_authorization', :git => 'git://github.com/stffn/declarative_authorization.git'
6
-
7
5
  group :test do
8
6
  gem 'factory_girl_rails'
9
7
  gem "capybara"
@@ -17,3 +15,13 @@ group :assets do
17
15
  gem 'sass-rails', '~> 3.1.4'
18
16
  gem 'uglifier', '>= 1.0.3'
19
17
  end
18
+
19
+ group :development do
20
+ if !ENV["CI"]
21
+ gem 'ruby-debug-base19', '~> 0.11.26', :platform => :ruby_19
22
+ gem 'linecache19', '~> 0.5.13', :platform => :ruby_19
23
+ gem 'ruby-debug19', '~> 0.11.6', :require => 'ruby-debug', :platform => :ruby_19
24
+ gem 'ruby-debug', :platform => :ruby_18
25
+ gem 'guard-spork'
26
+ end
27
+ end
@@ -0,0 +1,16 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard 'spork', :cucumber_env => { 'RAILS_ENV' => 'test' }, :rspec_env => { 'RAILS_ENV' => 'test' } do
5
+ watch(%r{lib/})
6
+ watch('spec/dummy/config/application.rb')
7
+ watch('spec/dummy/config/environment.rb')
8
+ watch(%r{^spec/dummy/config/environments/.+\.rb$})
9
+ watch(%r{^spec/dummy/config/initializers/.+\.rb$})
10
+ watch('Gemfile')
11
+ watch('Gemfile.lock')
12
+ watch('spec/factories.rb')
13
+ watch('spec/spec_helper.rb') { :rspec }
14
+ watch('test/test_helper.rb') { :test_unit }
15
+ watch(%r{features/support/}) { :cucumber }
16
+ end
data/README.md CHANGED
@@ -95,14 +95,14 @@ Add to existing Rails project
95
95
 
96
96
  In your Gemfile:
97
97
 
98
- gem 'alchemy_cms', '~> 2.1.beta5', :git => 'git://github.com/magiclabs/alchemy_cms.git', :branch => 'next_stable'
98
+ gem 'alchemy_cms', '~> 2.1.beta7', :git => 'git://github.com/magiclabs/alchemy_cms.git', :branch => 'next_stable'
99
99
 
100
100
  Run in terminal:
101
101
 
102
102
  bundle install
103
- rake alchemy:prepare
103
+ rake alchemy:install:migrations
104
104
  rake db:migrate
105
- rake db:seed
105
+ rake alchemy:db:seed
106
106
 
107
107
  Tipps
108
108
  -----
data/Rakefile CHANGED
@@ -24,11 +24,6 @@ RDoc::Task.new(:rdoc) do |rdoc|
24
24
  rdoc.rdoc_files.include('app/**/*.rb')
25
25
  end
26
26
 
27
- APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
28
-
29
- # uncomment the next line if you want to see all dummy app rake tasks
30
- # load 'rails/tasks/engine.rake'
31
-
32
27
  require 'rspec/core'
33
28
  require 'rspec/core/rake_task'
34
29
 
@@ -32,15 +32,7 @@ Gem::Specification.new do |s|
32
32
  s.add_runtime_dependency(%q<jquery-rails>, ["~> 1.0.16"])
33
33
  s.add_runtime_dependency(%q<attachment_magic>, ["~> 0.2.1"])
34
34
 
35
- s.add_development_dependency(%q<rspec-rails>, ["~> 2.7"])
35
+ s.add_development_dependency(%q<rspec-rails>, ["~> 2.8"])
36
36
  s.add_development_dependency(%q<sqlite3>)
37
37
 
38
- if !ENV["CI"]
39
- if RUBY_VERSION =~ /^1.9/
40
- s.add_development_dependency(%q<ruby-debug19>)
41
- else
42
- s.add_development_dependency(%q<ruby-debug>)
43
- end
44
- end
45
-
46
38
  end
@@ -127,7 +127,6 @@ if (typeof(Alchemy) === 'undefined') {
127
127
 
128
128
  resizeFrame : function() {
129
129
  var options = {
130
- top: 90,
131
130
  left: 65,
132
131
  right: 0
133
132
  };
@@ -135,11 +134,12 @@ if (typeof(Alchemy) === 'undefined') {
135
134
  var $topFrame = $('#top_menu');
136
135
  var view_height = $(window).height();
137
136
  var view_width = $(window).width();
138
- var mainFrameHeight = view_height - options.top;
139
- var topFrameHeight = options.top;
137
+ var topFrameHeight = $topFrame.height();
138
+ var mainFrameHeight = view_height - topFrameHeight;
140
139
  var width = view_width - options.left - options.right;
141
140
  if ($mainFrame.length > 0) {
142
141
  $mainFrame.css({
142
+ top: topFrameHeight,
143
143
  width: width,
144
144
  height: mainFrameHeight
145
145
  });
@@ -216,7 +216,8 @@ if (typeof(Alchemy) === 'undefined') {
216
216
 
217
217
  getUrlParam : function(name){
218
218
  var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(window.location.href);
219
- return results[1] || 0;
219
+ if (results)
220
+ return results[1] || 0;
220
221
  }
221
222
 
222
223
  });
@@ -0,0 +1,96 @@
1
+ if (typeof(Alchemy) === 'undefined') {
2
+ var Alchemy = {};
3
+ }
4
+
5
+ (function($) {
6
+
7
+ var ElementsWindow = {};
8
+ $.extend(Alchemy, ElementsWindow);
9
+
10
+ Alchemy.ElementsWindow = {
11
+
12
+ init : function (path, options, callback) {
13
+ var $dialog = $('<div style="display: none" id="alchemyElementWindow"></div>');
14
+ var closeCallback = function() {
15
+ $dialog.dialog("destroy");
16
+ $('#alchemyElementWindow').remove();
17
+ Alchemy.ElementsWindow.button.enable();
18
+ };
19
+ $dialog.html(Alchemy.getOverlaySpinner({x: 420, y: 300}));
20
+ Alchemy.ElementsWindow.currentWindow = $dialog.dialog({
21
+ modal: false,
22
+ minWidth: 422,
23
+ minHeight: 300,
24
+ height: $(window).height() - 90,
25
+ title: options.texts.title,
26
+ show: "fade",
27
+ hide: "fade",
28
+ position: [$(window).width() - 428, 84],
29
+ closeOnEscape: false,
30
+ create: function() {
31
+ $dialog.before(Alchemy.ElementsWindow.createToolbar(options.toolbarButtons));
32
+ },
33
+ open: function(event, ui) {
34
+ Alchemy.ElementsWindow.button.disable();
35
+ $.ajax({
36
+ url: path,
37
+ success: function(data, textStatus, XMLHttpRequest) {
38
+ $dialog.html(data);
39
+ Alchemy.ButtonObserver('#alchemyElementWindow .button');
40
+ callback.call();
41
+ },
42
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
43
+ Alchemy.AjaxErrorHandler($dialog, XMLHttpRequest.status, textStatus, errorThrown);
44
+ }
45
+ });
46
+ },
47
+ beforeClose : function() {
48
+ if (Alchemy.isPageDirty()) {
49
+ Alchemy.openConfirmWindow({
50
+ title: options.texts.dirtyTitle,
51
+ message: options.texts.dirtyMessage,
52
+ okLabel: options.texts.okLabel,
53
+ cancelLabel: options.texts.cancelLabel,
54
+ okCallback: closeCallback
55
+ });
56
+ return false;
57
+ } else {
58
+ return true;
59
+ }
60
+ },
61
+ close: closeCallback
62
+ });
63
+ },
64
+
65
+ button : {
66
+ enable: function() {
67
+ $('div#show_element_window').removeClass('disabled');
68
+ },
69
+ disable: function() {
70
+ $('div#show_element_window').addClass('disabled');
71
+ },
72
+ toggle: function() {
73
+ $('div#show_element_window').toggleClass('disabled');
74
+ }
75
+ },
76
+
77
+ createToolbar : function(buttons) {
78
+ var $toolbar = $('<div id="overlay_toolbar"></div>'), btn;
79
+ for (i = 0; i < buttons.length; i++) {
80
+ btn = buttons[i];
81
+ $toolbar.append(
82
+ Alchemy.ToolbarButton({
83
+ buttonTitle: btn.title,
84
+ buttonLabel: btn.label,
85
+ iconClass: btn.iconClass,
86
+ onClick: btn.onClick,
87
+ buttonId: btn.buttonId
88
+ })
89
+ );
90
+ }
91
+ return $toolbar;
92
+ }
93
+
94
+ }
95
+
96
+ })(jQuery);
@@ -1,56 +1,54 @@
1
1
  if (typeof(Alchemy) === 'undefined') {
2
- var Alchemy = {};
2
+ var Alchemy = {};
3
3
  }
4
4
 
5
5
  (function($) {
6
-
7
- var ImageCropper = {};
8
- ImageCropper.initialized = false;
9
- $.extend(Alchemy, ImageCropper);
10
-
11
- Alchemy.ImageCropper = {
12
-
13
- init : function (box, size_x, size_y, default_box, ratio) {
14
- var crop_from_field = $('#essence_picture_crop_from');
15
- var crop_size_field = $('#essence_picture_crop_size');
16
- var options = {
17
- onSelect: function(coords) {
18
- crop_from_field.val(coords.x + "x" + coords.y);
19
- crop_size_field.val(coords.w + "x" + coords.h);
20
- },
21
- setSelect: box,
22
- aspectRatio: ratio ? ratio : undefined,
23
- minSize: [size_x, size_y]
24
- };
25
- Alchemy.ImageCropper.box = box;
26
- Alchemy.ImageCropper.default_box = default_box;
27
- Alchemy.ImageCropper.crop_from_field = crop_from_field;
28
- Alchemy.ImageCropper.crop_size_field = crop_size_field;
29
-
30
- if (!Alchemy.ImageCropper.initialized) {
31
- Alchemy.ImageCropper.api = $.Jcrop('#imageToCrop', options);
32
- Alchemy.ImageCropper.initialized = true;
33
- }
34
-
35
- $('#image_cropper_form').submit(Alchemy.ImageCropper.destroy);
36
- $('.ui-dialog-titlebar-close').click(Alchemy.ImageCropper.destroy);
37
- },
38
-
39
- undo : function() {
40
- Alchemy.ImageCropper.api.setSelect(Alchemy.ImageCropper.box);
41
- },
42
-
43
- reset : function() {
44
- Alchemy.ImageCropper.api.setSelect(Alchemy.ImageCropper.default_box);
45
- Alchemy.ImageCropper.crop_from_field.val('');
46
- Alchemy.ImageCropper.crop_size_field.val('');
47
- },
48
-
49
- destroy : function() {
50
- Alchemy.ImageCropper.api.destroy();
51
- Alchemy.ImageCropper.initialized = false;
52
- }
53
-
6
+
7
+ var ImageCropper = {};
8
+ ImageCropper.initialized = false;
9
+ $.extend(Alchemy, ImageCropper);
10
+
11
+ Alchemy.ImageCropper = {
12
+
13
+ init : function (box, size_x, size_y, default_box, ratio) {
14
+ var crop_from_field = $('#essence_picture_crop_from');
15
+ var crop_size_field = $('#essence_picture_crop_size');
16
+ var options = {
17
+ onSelect: function(coords) {
18
+ crop_from_field.val(coords.x + "x" + coords.y);
19
+ crop_size_field.val(coords.w + "x" + coords.h);
20
+ },
21
+ setSelect: box,
22
+ aspectRatio: ratio ? ratio : undefined,
23
+ minSize: [size_x, size_y]
24
+ };
25
+ Alchemy.ImageCropper.box = box;
26
+ Alchemy.ImageCropper.default_box = default_box;
27
+ Alchemy.ImageCropper.crop_from_field = crop_from_field;
28
+ Alchemy.ImageCropper.crop_size_field = crop_size_field;
29
+
30
+ if (!Alchemy.ImageCropper.initialized) {
31
+ Alchemy.ImageCropper.api = $.Jcrop('#imageToCrop', options);
32
+ Alchemy.ImageCropper.initialized = true;
33
+ }
34
+ $('.ui-dialog-titlebar-close').click(Alchemy.ImageCropper.destroy);
35
+ },
36
+
37
+ undo : function() {
38
+ Alchemy.ImageCropper.api.setSelect(Alchemy.ImageCropper.box);
39
+ },
40
+
41
+ reset : function() {
42
+ Alchemy.ImageCropper.api.setSelect(Alchemy.ImageCropper.default_box);
43
+ Alchemy.ImageCropper.crop_from_field.val('');
44
+ Alchemy.ImageCropper.crop_size_field.val('');
45
+ },
46
+
47
+ destroy : function() {
48
+ Alchemy.ImageCropper.api.destroy();
49
+ Alchemy.ImageCropper.initialized = false;
50
+ }
51
+
54
52
  }
55
-
53
+
56
54
  })(jQuery);
@@ -0,0 +1,41 @@
1
+ if (typeof(Alchemy) === 'undefined') {
2
+ var Alchemy = {};
3
+ }
4
+
5
+ // Load jQuery on demand. Use this if jQuery is not present.
6
+ // Found on http://css-tricks.com/snippets/jquery/load-jquery-only-if-not-present/
7
+ Alchemy.loadjQuery = function(callback) {
8
+
9
+ var thisPageUsingOtherJSLibrary = false;
10
+
11
+ if (typeof($) === 'function') {
12
+ thisPageUsingOtherJSLibrary = true;
13
+ }
14
+
15
+ function getScript(url, success) {
16
+ var script = document.createElement('script');
17
+ var head = document.getElementsByTagName('head')[0], done = false;
18
+ script.src = url;
19
+ // Attach handlers for all browsers
20
+ script.onload = script.onreadystatechange = function() {
21
+ if (!done && (!this.readyState || this.readyState === 'loaded' || this.readyState === 'complete')) {
22
+ done = true;
23
+ // callback function provided as param
24
+ success();
25
+ script.onload = script.onreadystatechange = null;
26
+ head.removeChild(script);
27
+ };
28
+ };
29
+ head.appendChild(script);
30
+ };
31
+
32
+ getScript('/assets/jquery.min.js', function() {
33
+ if (typeof(jQuery) !== 'undefined') {
34
+ if (thisPageUsingOtherJSLibrary) {
35
+ jQuery.noConflict();
36
+ }
37
+ callback();
38
+ }
39
+ });
40
+
41
+ }
@@ -19,3 +19,5 @@
19
19
  //= require alchemy/alchemy.page_sorter
20
20
  //= require alchemy/alchemy.swf_upload
21
21
  //= require alchemy/alchemy.windows
22
+ //= require alchemy/alchemy.preview_window
23
+ //= require alchemy/alchemy.elements_window
@@ -0,0 +1,55 @@
1
+ if (typeof(Alchemy) === 'undefined') {
2
+ var Alchemy = {};
3
+ }
4
+
5
+ Alchemy.loadAlchemyMenuBar = function (options) {
6
+
7
+ Alchemy.Menubar = {
8
+
9
+ show: function() {
10
+ $('body').prepend(Alchemy.Menubar.build());
11
+ },
12
+
13
+ build: function() {
14
+ var bar = $('<div id="alchemy_menubar"/>')
15
+ .append('<ul/>');
16
+ bar.find('ul')
17
+ .append('<li><a href="'+options.route+'/admin">'+Alchemy.Menubar.t("to_alchemy")+'</a></li>')
18
+ .append('<li><a href="'+options.route+'/admin/pages/'+options.page_id+'/edit">'+Alchemy.Menubar.t("edit_page")+'</a></li>')
19
+ .append('<li><a href="'+options.route+'/admin/logout">'+Alchemy.Menubar.t("logout")+'</a></li>');
20
+ return bar;
21
+ },
22
+
23
+ translations: {
24
+ 'to_alchemy' : {
25
+ 'de' : 'zu Alchemy',
26
+ 'en' : 'To Alchemy'
27
+ },
28
+ 'edit_page' : {
29
+ 'de' : 'Seite bearbeiten',
30
+ 'en' : 'Edit Page'
31
+ },
32
+ 'logout' : {
33
+ 'de' : 'abmelden',
34
+ 'en' : 'Log out'
35
+ }
36
+ },
37
+
38
+ t : function(id) {
39
+ var translation = Alchemy.Menubar.translations[id];
40
+ if (translation) {
41
+ return translation[options.locale];
42
+ } else {
43
+ return id;
44
+ }
45
+ }
46
+
47
+ };
48
+
49
+ if (typeof(jQuery) === 'undefined') {
50
+ Alchemy.loadjQuery(Alchemy.Menubar.show);
51
+ } else {
52
+ Alchemy.Menubar.show();
53
+ }
54
+
55
+ };
@@ -1,145 +1,100 @@
1
- function initAlchemyPreviewMode() {
2
-
3
- if (typeof(Alchemy) === 'undefined') {
4
- var Alchemy = {};
5
- }
6
-
7
- (function ($) {
8
-
9
- // Setting jQueryUIs global animation duration
10
- $.fx.speeds._default = 400;
11
-
12
- // The Alchemy JavaScript Object contains all Functions
13
- $.extend(Alchemy, {
14
-
15
- ElementSelector : {
16
-
17
- // defaults
18
- styles : {
19
- reset : { outline: '0 none' },
20
- hover : {
21
- 'outline-width' : '2px',
22
- 'outline-style' : 'solid',
23
- 'outline-color' : '#98BAD5',
24
- 'outline-offset' : '4px',
25
- '-moz-outline-radius' : '4px',
26
- 'outline-radius' : '4px'
27
- },
28
- selected : {
29
- 'outline-width' : '2px',
30
- 'outline-style' : 'solid',
31
- 'outline-color' : '#DB694C',
32
- 'outline-offset' : '4px',
33
- '-moz-outline-radius' : '4px',
34
- 'outline-radius' : '4px'
35
- },
36
- },
37
-
38
- scrollOffset : 20,
39
-
40
- init : function() {
41
- var self = Alchemy.ElementSelector;
42
- var $elements = $('[data-alchemy-element]');
43
- var styles = self.styles;
44
- $elements.bind('mouseover', function(e) {
45
- $(this).attr('title', 'Klicken zum bearbeiten');
46
- if (!$(this).hasClass('selected'))
47
- $(this).css(styles.hover);
48
- });
49
- $elements.bind('mouseout', function() {
50
- $(this).removeAttr('title');
51
- if (!$(this).hasClass('selected'))
52
- $(this).css(styles.reset);
53
- });
54
- $elements.bind('Alchemy.SelectElement', self.selectElement);
55
- $elements.bind('click', self.clickElement);
56
- self.$previewElements = $elements;
57
- },
58
-
59
- selectElement : function(e) {
60
- var $this = $(this);
61
- var self = Alchemy.ElementSelector;
62
- var $elements = self.$previewElements;
63
- var styles = self.styles;
64
- var offset = self.scrollOffset;
65
- e.preventDefault();
66
- $elements.removeClass('selected').css(styles.reset);
67
- $this.addClass('selected').css(styles.selected);
68
- $('html, body').animate({
69
- scrollTop: $this.offset().top - offset,
70
- scrollLeft: $this.offset().left - offset
71
- }, 400);
1
+ if (typeof(Alchemy) === 'undefined') {
2
+ var Alchemy = {};
3
+ }
4
+
5
+ Alchemy.initAlchemyPreviewMode = function() {
6
+
7
+ // Setting jQueryUIs global animation duration
8
+ $.fx.speeds._default = 400;
9
+
10
+ // The Alchemy JavaScript Object contains all Functions
11
+ $.extend(Alchemy, {
12
+
13
+ ElementSelector : {
14
+
15
+ // defaults
16
+ styles : {
17
+ reset : { outline: '0 none' },
18
+ hover : {
19
+ 'outline-width' : '2px',
20
+ 'outline-style' : 'solid',
21
+ 'outline-color' : '#98BAD5',
22
+ 'outline-offset' : '4px',
23
+ '-moz-outline-radius' : '4px',
24
+ 'outline-radius' : '4px'
72
25
  },
73
-
74
- clickElement : function(e) {
75
- var $this = $(this);
76
- var parent$ = window.parent.jQuery;
77
- var target_id = $this.attr('data-alchemy-element');
78
- var $element_editor = parent$('#element_area .element_editor').closest('[id="element_'+target_id+'"]');
79
- var $elementsWindow = parent$('#alchemyElementWindow');
80
- e.preventDefault();
81
- $element_editor.trigger('Alchemy.SelectElementEditor', target_id);
82
- if ($elementsWindow.dialog("isOpen")) {
83
- $elementsWindow.dialog('moveToTop');
84
- } else {
85
- $elementsWindow.dialog('open');
86
- }
87
- $this.trigger('Alchemy.SelectElement');
26
+ selected : {
27
+ 'outline-width' : '2px',
28
+ 'outline-style' : 'solid',
29
+ 'outline-color' : '#DB694C',
30
+ 'outline-offset' : '4px',
31
+ '-moz-outline-radius' : '4px',
32
+ 'outline-radius' : '4px'
88
33
  },
89
-
90
34
  },
91
-
92
- });
93
-
94
- })(jQuery);
95
-
96
- Alchemy.ElementSelector.init();
97
-
98
- }
99
35
 
100
- // Found on http://css-tricks.com/snippets/jquery/load-jquery-only-if-not-present/
101
- //
102
- // Only do anything if jQuery isn't defined
103
- //
36
+ scrollOffset : 20,
37
+
38
+ init : function() {
39
+ var self = Alchemy.ElementSelector;
40
+ var $elements = $('[data-alchemy-element]');
41
+ var styles = self.styles;
42
+ $elements.bind('mouseover', function(e) {
43
+ $(this).attr('title', 'Klicken zum bearbeiten');
44
+ if (!$(this).hasClass('selected'))
45
+ $(this).css(styles.hover);
46
+ });
47
+ $elements.bind('mouseout', function() {
48
+ $(this).removeAttr('title');
49
+ if (!$(this).hasClass('selected'))
50
+ $(this).css(styles.reset);
51
+ });
52
+ $elements.bind('Alchemy.SelectElement', self.selectElement);
53
+ $elements.bind('click', self.clickElement);
54
+ self.$previewElements = $elements;
55
+ },
104
56
 
105
- (function() {
106
-
107
- if (typeof(jQuery) === 'undefined') {
108
-
109
- var thisPageUsingOtherJSLibrary = false;
110
-
111
- if (typeof($) === 'function') {
112
- thisPageUsingOtherJSLibrary = true;
113
- }
114
-
115
- function getScript(url, success) {
116
- var script = document.createElement('script');
117
- var head = document.getElementsByTagName('head')[0], done = false;
118
- script.src = url;
119
- // Attach handlers for all browsers
120
- script.onload = script.onreadystatechange = function() {
121
- if (!done && (!this.readyState || this.readyState === 'loaded' || this.readyState === 'complete')) {
122
- done = true;
123
- // callback function provided as param
124
- success();
125
- script.onload = script.onreadystatechange = null;
126
- head.removeChild(script);
127
- };
128
- };
129
- head.appendChild(script);
130
- };
131
-
132
- getScript('/assets/jquery.min.js', function() {
133
- if (typeof(jQuery) !== 'undefined') {
134
- if (thisPageUsingOtherJSLibrary) {
135
- jQuery.noConflict();
57
+ selectElement : function(e) {
58
+ var $this = $(this);
59
+ var self = Alchemy.ElementSelector;
60
+ var $elements = self.$previewElements;
61
+ var styles = self.styles;
62
+ var offset = self.scrollOffset;
63
+ e.preventDefault();
64
+ $elements.removeClass('selected').css(styles.reset);
65
+ $this.addClass('selected').css(styles.selected);
66
+ $('html, body').animate({
67
+ scrollTop: $this.offset().top - offset,
68
+ scrollLeft: $this.offset().left - offset
69
+ }, 400);
70
+ },
71
+
72
+ clickElement : function(e) {
73
+ var $this = $(this);
74
+ var parent$ = window.parent.jQuery;
75
+ var target_id = $this.attr('data-alchemy-element');
76
+ var $element_editor = parent$('#element_area .element_editor').closest('[id="element_'+target_id+'"]');
77
+ var $elementsWindow = parent$('#alchemyElementWindow');
78
+ e.preventDefault();
79
+ $element_editor.trigger('Alchemy.SelectElementEditor', target_id);
80
+ if ($elementsWindow.dialog("isOpen")) {
81
+ $elementsWindow.dialog('moveToTop');
82
+ } else {
83
+ $elementsWindow.dialog('open');
136
84
  }
137
- initAlchemyPreviewMode();
138
- }
139
- });
140
-
141
- } else {
142
- initAlchemyPreviewMode();
143
- };
144
-
145
- })();
85
+ $this.trigger('Alchemy.SelectElement');
86
+ },
87
+
88
+ },
89
+
90
+ });
91
+
92
+ Alchemy.ElementSelector.init();
93
+
94
+ }
95
+
96
+ if (typeof(jQuery) === 'undefined') {
97
+ Alchemy.loadjQuery(Alchemy.initAlchemyPreviewMode);
98
+ } else {
99
+ Alchemy.initAlchemyPreviewMode();
100
+ }