refinerycms 0.9.8 → 0.9.8.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (134) hide show
  1. data/Gemfile +6 -6
  2. data/app/controllers/application_controller.rb +2 -1
  3. data/bin/refinerycms +36 -32
  4. data/changelog.md +471 -0
  5. data/config/environments/production.rb +1 -1
  6. data/db/migrate/20100606135207_change_thumbnail_sizes_for_dragonfly.rb +4 -4
  7. data/db/migrate/20100826232810_move_inquiry_settings_to_refinery_settings.rb +2 -2
  8. data/db/migrate/20100831122919_move_page_to_nested_set.rb +28 -0
  9. data/db/schema.rb +7 -1
  10. data/db/seeds/refinery_settings.rb +2 -4
  11. data/license.md +21 -0
  12. data/readme.md +97 -0
  13. data/todo.md +61 -0
  14. data/vendor/refinerycms/authentication/app/views/admin/users/index.html.erb +5 -13
  15. data/vendor/refinerycms/authentication/app/views/layouts/login.html.erb +1 -1
  16. data/vendor/refinerycms/authentication/config/locales/de.yml +53 -56
  17. data/vendor/refinerycms/authentication/config/locales/en.yml +1 -2
  18. data/vendor/refinerycms/authentication/config/locales/lv.yml +38 -38
  19. data/vendor/refinerycms/authentication/config/locales/pt-BR.yml +21 -48
  20. data/vendor/refinerycms/authentication/features/lost_password.feature +40 -0
  21. data/vendor/refinerycms/authentication/features/manage_users.feature +57 -0
  22. data/vendor/refinerycms/authentication/features/step_definitions/lost_password.rb +8 -0
  23. data/vendor/refinerycms/authentication/features/step_definitions/user_steps.rb +32 -0
  24. data/vendor/refinerycms/authentication/features/support/factories.rb +17 -0
  25. data/vendor/refinerycms/authentication/features/support/paths.rb +24 -0
  26. data/vendor/refinerycms/authentication/lib/authenticated_system.rb +1 -1
  27. data/vendor/refinerycms/authentication/lib/authentication.rb +1 -1
  28. data/vendor/refinerycms/core/app/views/admin/_head.html.erb +4 -4
  29. data/vendor/refinerycms/core/app/views/admin/_menu_tab.html.erb +2 -2
  30. data/vendor/refinerycms/core/app/views/layouts/admin.html.erb +1 -1
  31. data/vendor/refinerycms/core/app/views/layouts/admin_dialog.html.erb +1 -1
  32. data/vendor/refinerycms/core/app/views/shared/_footer.html.erb +1 -1
  33. data/vendor/refinerycms/core/app/views/shared/_google_analytics.html.erb +1 -1
  34. data/vendor/refinerycms/core/app/views/shared/_header.html.erb +1 -1
  35. data/vendor/refinerycms/core/app/views/shared/_menu.html.erb +5 -2
  36. data/vendor/refinerycms/core/app/views/shared/_menu_branch.html.erb +6 -3
  37. data/vendor/refinerycms/core/app/views/shared/_site_bar.html.erb +11 -15
  38. data/vendor/refinerycms/core/app/views/shared/admin/_form_actions.html.erb +1 -0
  39. data/vendor/refinerycms/core/app/views/shared/admin/_image_picker.html.erb +3 -3
  40. data/vendor/refinerycms/core/app/views/shared/admin/_make_sortable.html.erb +2 -1
  41. data/vendor/refinerycms/core/app/views/shared/admin/_resource_picker.html.erb +24 -17
  42. data/vendor/refinerycms/core/app/views/wymiframe.html.erb +1 -1
  43. data/vendor/refinerycms/core/config/locales/de.yml +50 -51
  44. data/vendor/refinerycms/core/config/locales/en.yml +5 -2
  45. data/vendor/refinerycms/core/config/locales/lv.yml +6 -3
  46. data/vendor/refinerycms/core/config/locales/pt-BR.yml +34 -38
  47. data/vendor/refinerycms/core/crud.md +12 -12
  48. data/vendor/refinerycms/core/features/engine_generator.feature +27 -0
  49. data/vendor/refinerycms/core/features/search.feature +56 -0
  50. data/vendor/refinerycms/core/features/site_bar.feature +24 -0
  51. data/vendor/refinerycms/core/features/step_definitions/core_steps.rb +61 -0
  52. data/vendor/refinerycms/core/features/step_definitions/engine_generator_steps.rb +19 -0
  53. data/vendor/refinerycms/core/features/step_definitions/generator_steps.rb +11 -0
  54. data/vendor/refinerycms/core/features/support/paths.rb +14 -0
  55. data/vendor/refinerycms/core/features/uploads/beach.jpeg +0 -0
  56. data/vendor/refinerycms/core/features/uploads/refinery_is_awesome.txt +1 -0
  57. data/vendor/refinerycms/core/lib/core.rb +52 -53
  58. data/vendor/refinerycms/core/lib/generators/refinery_engine/refinery_engine_generator.rb +14 -3
  59. data/vendor/refinerycms/core/lib/generators/refinery_engine/templates/app/controllers/admin/plural_name_controller.rb +3 -1
  60. data/vendor/refinerycms/core/lib/generators/refinery_engine/templates/app/models/singular_name.rb +4 -3
  61. data/vendor/refinerycms/core/lib/generators/refinery_engine/templates/app/views/admin/plural_name/_form.html.erb +2 -1
  62. data/vendor/refinerycms/core/lib/generators/refinery_engine/templates/app/views/admin/plural_name/_singular_name.html.erb +6 -2
  63. data/vendor/refinerycms/core/lib/generators/refinery_engine/templates/app/views/plural_name/index.html.erb +3 -1
  64. data/vendor/refinerycms/core/lib/generators/refinery_engine/templates/app/views/plural_name/show.html.erb +7 -3
  65. data/vendor/refinerycms/core/lib/refinery/application_controller.rb +85 -75
  66. data/vendor/refinerycms/core/lib/refinery/application_helper.rb +10 -190
  67. data/vendor/refinerycms/core/lib/refinery/crud.rb +283 -0
  68. data/vendor/refinerycms/core/lib/refinery/{form_helpers.rb → helpers/form_helper.rb} +0 -0
  69. data/vendor/refinerycms/core/lib/refinery/helpers/html_truncation_helper.rb +26 -0
  70. data/vendor/refinerycms/core/lib/refinery/helpers/image_helper.rb +37 -0
  71. data/vendor/refinerycms/core/lib/refinery/helpers/menu_helper.rb +38 -0
  72. data/vendor/refinerycms/core/lib/refinery/helpers/meta_helper.rb +67 -0
  73. data/vendor/refinerycms/core/lib/refinery/helpers/script_helper.rb +36 -0
  74. data/vendor/refinerycms/core/lib/refinery/helpers/site_bar_helper.rb +26 -0
  75. data/vendor/refinerycms/core/lib/refinery/helpers/tag_helper.rb +19 -0
  76. data/vendor/refinerycms/core/lib/refinery/helpers/translation_helper.rb +17 -0
  77. data/vendor/refinerycms/core/lib/refinery/plugin.rb +3 -3
  78. data/vendor/refinerycms/core/lib/tasks/refinery.rake +4 -3
  79. data/vendor/refinerycms/core/public/javascripts/refinery/admin.js +93 -101
  80. data/vendor/refinerycms/core/public/javascripts/refinery/core.js +3 -0
  81. data/vendor/refinerycms/core/public/javascripts/refinery/nestedsortables.js +164 -0
  82. data/vendor/refinerycms/core/public/javascripts/refinery/serializelist.js +66 -0
  83. data/vendor/refinerycms/core/public/stylesheets/refinery/refinery.css +11 -73
  84. data/vendor/refinerycms/dashboard/config/locales/de.yml +6 -6
  85. data/vendor/refinerycms/dashboard/config/locales/pt-BR.yml +3 -5
  86. data/vendor/refinerycms/dashboard/features/dashboard.feature +54 -0
  87. data/vendor/refinerycms/dashboard/features/support/paths.rb +14 -0
  88. data/vendor/refinerycms/images/app/controllers/admin/images_controller.rb +6 -6
  89. data/vendor/refinerycms/images/app/helpers/admin/images_helper.rb +1 -1
  90. data/vendor/refinerycms/images/app/views/admin/images/_existing_image.html.erb +15 -13
  91. data/vendor/refinerycms/images/app/views/admin/images/_grid_view.html.erb +1 -1
  92. data/vendor/refinerycms/images/app/views/admin/images/_list_view_image.html.erb +1 -1
  93. data/vendor/refinerycms/images/config/locales/de.yml +21 -25
  94. data/vendor/refinerycms/images/config/locales/pt-BR.yml +13 -23
  95. data/vendor/refinerycms/images/features/manage_images.feature +48 -0
  96. data/vendor/refinerycms/images/features/step_definitions/image_steps.rb +37 -0
  97. data/vendor/refinerycms/images/features/support/paths.rb +17 -0
  98. data/vendor/refinerycms/images/features/uploads/beach.jpeg +0 -0
  99. data/vendor/refinerycms/images/features/uploads/id-rather-be-here.jpg +0 -0
  100. data/vendor/refinerycms/images/features/uploads/refinery_is_awesome.txt +1 -0
  101. data/vendor/refinerycms/images/lib/images.rb +6 -0
  102. data/vendor/refinerycms/images/readme.md +12 -36
  103. data/vendor/refinerycms/pages/app/controllers/admin/pages_controller.rb +4 -42
  104. data/vendor/refinerycms/pages/app/controllers/pages_controller.rb +1 -1
  105. data/vendor/refinerycms/pages/app/models/page.rb +3 -4
  106. data/vendor/refinerycms/pages/app/sweepers/page_sweeper.rb +18 -0
  107. data/vendor/refinerycms/pages/app/views/admin/pages/_form_advanced_options.html.erb +1 -1
  108. data/vendor/refinerycms/pages/app/views/admin/pages/_page.html.erb +6 -5
  109. data/vendor/refinerycms/pages/config/locales/de.yml +66 -36
  110. data/vendor/refinerycms/pages/config/locales/pt-BR.yml +29 -57
  111. data/vendor/refinerycms/pages/features/manage_pages.feature +45 -0
  112. data/vendor/refinerycms/pages/features/step_definitions/page_steps.rb +29 -0
  113. data/vendor/refinerycms/pages/features/support/paths.rb +18 -0
  114. data/vendor/refinerycms/pages/lib/pages.rb +5 -0
  115. data/vendor/refinerycms/pages/spec/models/page_spec.rb +13 -0
  116. data/vendor/refinerycms/refinery.rb +1 -1
  117. data/vendor/refinerycms/resources/app/views/admin/resources/_existing_resource.html.erb +2 -2
  118. data/vendor/refinerycms/resources/config/locales/de.yml +16 -17
  119. data/vendor/refinerycms/resources/config/locales/pt-BR.yml +15 -17
  120. data/vendor/refinerycms/resources/features/manage_files.feature +39 -0
  121. data/vendor/refinerycms/resources/features/step_definitions/file_steps.rb +21 -0
  122. data/vendor/refinerycms/resources/features/support/paths.rb +17 -0
  123. data/vendor/refinerycms/resources/features/uploads/beach.jpeg +0 -0
  124. data/vendor/refinerycms/resources/features/uploads/refinery_is_awesome.txt +1 -0
  125. data/vendor/refinerycms/resources/lib/resources.rb +17 -1
  126. data/vendor/refinerycms/settings/app/models/refinery_setting.rb +82 -64
  127. data/vendor/refinerycms/settings/config/locales/de.yml +36 -16
  128. data/vendor/refinerycms/settings/config/locales/pt-BR.yml +32 -34
  129. data/vendor/refinerycms/settings/features/manage_refinery_settings.feature +5 -0
  130. data/vendor/refinerycms/settings/lib/settings.rb +1 -1
  131. metadata +86 -53
  132. data/vendor/refinerycms/core/lib/crud.rb +0 -265
  133. data/vendor/refinerycms/core/lib/refinery/html_truncation_helper.rb +0 -22
  134. data/vendor/refinerycms/core/public/javascripts/jquery/jquery.nestedsortables.js +0 -186
@@ -0,0 +1,36 @@
1
+ module Refinery
2
+ module Helpers
3
+ module ScriptHelper
4
+
5
+ # This function helps when including both the jquery and jqueryui libraries.
6
+ # If you use this function then whenever we update or relocate the version of jquery or jquery ui in use
7
+ # we will update the reference here and your existing application starts to use it.
8
+ # Use <%= jquery_include_tags %> to include it in your <head> section.
9
+ def jquery_include_tags(options={})
10
+ # Merge in options
11
+ options = {
12
+ :caching => RefinerySetting.find_or_set(:use_resource_caching, Rails.root.writable?),
13
+ :google => RefinerySetting.find_or_set(:use_google_ajax_libraries, false),
14
+ :jquery_ui => true
15
+ }.merge(options)
16
+
17
+ # render the tags normally unless
18
+ unless options[:google] and !local_request?
19
+ if options[:jquery_ui]
20
+ javascript_include_tag "jquery#{"-min" if Rails.env.production?}", "jquery-ui-custom-min",
21
+ :cache => (options[:caching] ? "cache/jquery" : nil)
22
+ else
23
+ javascript_include_tag "jquery#{"-min" if Rails.env.production?}"
24
+ end
25
+ else
26
+ "#{javascript_include_tag("http://www.google.com/jsapi").gsub(".js", "")}
27
+ <script type='text/javascript'>
28
+ google.load('jquery', '1.4');
29
+ #{"google.load('jqueryui', '1.8');" if options[:jquery_ui]}
30
+ </script>".html_safe
31
+ end
32
+ end
33
+
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,26 @@
1
+ module Refinery
2
+ module Helpers
3
+ module SiteBarHelper
4
+
5
+ # Generates the link to determine where the site bar switch button returns to.
6
+ def site_bar_switch_link
7
+ link_to_if(admin?, t('.switch_to_your_website'),
8
+ (if session.keys.include?(:website_return_to) and session[:website_return_to].present?
9
+ session[:website_return_to]
10
+ else
11
+ root_url(:only_path => true)
12
+ end)) do
13
+ link_to t('.switch_to_your_website_editor'),
14
+ (if session.keys.include?(:refinery_return_to) and session[:refinery_return_to].present?
15
+ session[:refinery_return_to]
16
+ elsif defined?(@page) and @page.present? and !@page.home?
17
+ edit_admin_page_url(@page, :only_path => true)
18
+ else
19
+ (request.fullpath.to_s == '/') ? admin_root_url(:only_path => true) : "/admin#{request.request_uri}/edit"
20
+ end rescue admin_root_url(:only_path => true))
21
+ end
22
+ end
23
+
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,19 @@
1
+ module Refinery
2
+ module Helpers
3
+ module TagHelper
4
+
5
+ # Returns <span class='help' title='Your Input'>(help)</span>
6
+ # Remember to wrap your block with <span class='label_with_help'></span> if you're using a label next to the help tag.
7
+ def refinery_help_tag(title='')
8
+ "<span class='help' title='#{title}'>(#{t('shared.admin.help')})</span>".html_safe
9
+ end
10
+
11
+ # This is just a quick wrapper to render an image tag that lives inside refinery/icons.
12
+ # They are all 16x16 so this is the default but is able to be overriden with supplied options.
13
+ def refinery_icon_tag(filename, options = {})
14
+ image_tag "refinery/icons/#{filename}", {:width => 16, :height => 16}.merge(options)
15
+ end
16
+
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,17 @@
1
+ module Refinery
2
+ module Helpers
3
+ module TranslationHelper
4
+
5
+ # Overrides Rails' core I18n.t() function to produce a more helpful error message.
6
+ # The default one wreaks havoc with CSS and makes it hard to understand the problem.
7
+ def t(key, options = {})
8
+ if (val = super) =~ /class.+?translation_missing/
9
+ val = val.to_s.gsub(/<span[^>]*>/, 'i18n: ').gsub('</span>', '').gsub(', ', '.')
10
+ end
11
+
12
+ val
13
+ end
14
+
15
+ end
16
+ end
17
+ end
@@ -96,11 +96,11 @@ module Refinery
96
96
  return @url if defined?(@url)
97
97
 
98
98
  if self.controller.present?
99
- @url = {:controller => "admin/#{self.controller}"}
99
+ @url = {:controller => "/admin/#{self.controller}"}
100
100
  elsif self.directory.present?
101
- @url = {:controller => "admin/#{self.directory.split('/').pop}"}
101
+ @url = {:controller => "/admin/#{self.directory.split('/').pop}"}
102
102
  else
103
- @url = {:controller => "admin/#{self.name}"}
103
+ @url = {:controller => "/admin/#{self.name}"}
104
104
  end
105
105
  end
106
106
 
@@ -118,11 +118,12 @@ end
118
118
 
119
119
  desc 'Removes trailing whitespace across the entire application.'
120
120
  task :whitespace do
121
- if RUBY_PLATFORM =~ /linux/
121
+ require 'rbconfig'
122
+ if Config::CONFIG['host_os'] =~ /linux/
122
123
  sh %{find . -name '*.*rb' -exec sed -i 's/\t/ /g' {} \\; -exec sed -i 's/ *$//g' {} \\; }
123
- elsif RUBY_PLATFORM =~ /darwin/
124
+ elsif Config::CONFIG['host_os'] =~ /darwin/
124
125
  sh %{find . -name '*.*rb' -exec sed -i '' 's/\t/ /g' {} \\; -exec sed -i '' 's/ *$//g' {} \\; }
125
126
  else
126
- puts "This doesn't work on systems other than OSX or Linux. Please use a custom whitespace tool for your platform '#{RUBY_PLATFORM}'."
127
+ puts "This doesn't work on systems other than OSX or Linux. Please use a custom whitespace tool for your platform '#{Config::CONFIG["host_os"]}'."
127
128
  end
128
129
  end
@@ -53,9 +53,6 @@ init_interface = function() {
53
53
  }
54
54
  });
55
55
 
56
- // focus first field in an admin form.
57
- $('form input[type=text]:first').focus();
58
-
59
56
  // ensure that the menu isn't wider than the page_container or else it looks silly to round that corner.
60
57
  if (($menu = $('#menu')).length > 0) {
61
58
  $menu.jcarousel({
@@ -344,9 +341,6 @@ var link_dialog = {
344
341
  if((resource_selected = $('#existing_resource_area_content ul li.linked a')).length > 0) {
345
342
  resourceUrl = parseURL(resource_selected.attr('href'));
346
343
  relevant_href = resourceUrl.pathname;
347
- if (resourceUrl.protocol == "" && resourceUrl.hostname == "assets") {
348
- relevant_href = "/assets" + relevant_href;
349
- }
350
344
 
351
345
  // Add any alternate resource stores that need a absolute URL in the regex below
352
346
  if(resourceUrl.hostname.match(/s3.amazonaws.com/)) {
@@ -674,26 +668,34 @@ var image_dialog = {
674
668
  var imageThumbnailSize = $('#existing_image_size_area li.selected a').attr('data-size');
675
669
  var resize = $("#wants_to_resize_image").is(':checked');
676
670
 
671
+ var url = '/refinery/images/'+imageId+'/url';
677
672
  if (resize) {
678
- var url = '/refinery/images/'+imageId+'/url?size='+imageThumbnailSize;
679
- } else {
680
- var url = '/refinery/images/'+imageId+'/url'
673
+ url += '?size='+imageThumbnailSize;
681
674
  }
682
675
 
683
676
  var data;
684
- $.ajax({ async: false,
685
- url: url,
686
- success: function (result, status, xhr) {
687
- if (result.error) {
688
- alert("Something went wrong with the image insertion!");
689
- } else {
690
- data = result;
691
- }
692
- },
693
- error: function(xhr, txt, status) {
694
- alert("Something went wrong with the image insertion!");
695
- }
696
- });
677
+ $.ajax({
678
+ async: false,
679
+ url: url,
680
+ success: function (result, status, xhr) {
681
+ if (result.error) {
682
+ if (console && console.log) {
683
+ console.log("Something went wrong with the image insertion!");
684
+ console.log(result);
685
+ }
686
+ } else {
687
+ data = result;
688
+ }
689
+ },
690
+ error: function(xhr, txt, status) {
691
+ if (console && console.log) {
692
+ console.log("Something went wrong with the image insertion!");
693
+ console.log(xhr);
694
+ console.log(txt);
695
+ console.log(status);
696
+ }
697
+ }
698
+ });
697
699
 
698
700
  if (parent) {
699
701
  if ((wym_src = parent.document.getElementById('wym_src')) != null) {
@@ -706,7 +708,7 @@ var image_dialog = {
706
708
  wym_alt.value = $(img).attr('alt');
707
709
  }
708
710
  if ((wym_size = parent.document.getElementById('wym_size')) != null) {
709
- wym_size.value = imageThumbnailSize;
711
+ wym_size.value = imageThumbnailSize.replace(/[<>=]/g, '');
710
712
  }
711
713
  }
712
714
  }
@@ -757,101 +759,68 @@ var list_reorder = {
757
759
  init: function() {
758
760
  $('#reorder_action').click(list_reorder.enable_reordering);
759
761
  $('#reorder_action_done').click(list_reorder.disable_reordering);
762
+ list_reorder.sortable_list.nestedSortable({
763
+ disableNesting: 'no-nest',
764
+ forcePlaceholderSize: true,
765
+ handle: 'div',
766
+ items: 'li',
767
+ opacity: .6,
768
+ placeholder: 'placeholder',
769
+ tabSize: 25,
770
+ tolerance: 'pointer',
771
+ toleranceElement: '> div',
772
+ disabled: true,
773
+ start: function () {
774
+ },
775
+ change: function () {
776
+ list_reorder.reset_branch_classes(this);
777
+ },
778
+ stop: function () {
779
+ list_reorder.reset_branch_classes(this);
780
+ }
781
+ });
782
+ list_reorder.reset_branch_classes(list_reorder.sortable_list);
760
783
  }
761
784
 
762
- , enable_reordering: function(e) {
763
- if(e) { e.preventDefault(); }
785
+ ,reset_branch_classes: function (ul) {
786
+ $("li.ui-sortable-helper", this).removeClass("record").removeClass("branch_start").removeClass("branch_end");
787
+ $("li", ul).removeClass("branch_start").removeClass("branch_end");
764
788
 
765
- sortable_options = {
766
- 'tolerance': 'pointer'
767
- , 'placeholder': 'placeholder'
768
- , 'cursor': 'drag'
769
- , 'items': 'li'
770
- , 'axis': 'y'
771
- , 'connectWith' : '.nested'
772
- };
773
-
774
- $(list_reorder.sortable_list).find('li').each(function(index, li) {
775
- if ($('ul', li).length) { return; }
776
- $("<ul></ul>").appendTo(li);
777
- });
789
+ $("> li:first", ul).addClass("branch_start")
790
+ $("> li:last", ul).addClass("branch_end")
778
791
 
779
- if (list_reorder.tree && !$.browser.msie) {
780
- $(list_reorder.sortable_list).parent().nestedSortable($.extend(sortable_options, {
781
- 'maxDepth': 2
782
- , 'placeholderElement': 'li'
783
- }));
784
- $(list_reorder.sortable_list).addClass('ui-sortable');
785
- } else {
786
- $(list_reorder.sortable_list).sortable(sortable_options);
787
- }
792
+ var nested_ul = $("ul", ul);
793
+ $("> li:last", nested_ul).addClass("branch_end");
794
+ }
788
795
 
789
- $('#site_bar, header > *:not(script)').fadeTo(500, 0.3);
796
+ ,enable_reordering: function(e) {
797
+ if(e) { e.preventDefault(); }
798
+ $('#sortable_list').addClass("reordering");
799
+
800
+ $('#sortable_list .actions, #site_bar, header > *:not(script)').fadeTo(500, 0.3);
790
801
  $('#actions *:not("#reorder_action_done, #reorder_action")').not($('#reorder_action_done').parents('li, ul')).fadeTo(500, 0.55);
791
802
 
803
+ list_reorder.sortable_list.nestedSortable("enable");
792
804
  $('#reorder_action').hide();
793
805
  $('#reorder_action_done').show();
794
806
  }
795
807
 
796
- , parse_branch: function(indexes, li) {
797
- branch = "&sortable_list";
798
- $.each(indexes, function(i, index) {
799
- branch += "[" + index + "]";
800
- });
801
- branch += "[id]=" + $($(li).attr('id').split('_')).last().get(0);
802
-
803
- // parse any children branches too.
804
- $(li).find('> li[id], > ul li[id]').each(function(i, child) {
805
- current_indexes = $.merge($.merge([], indexes), [i]);
806
- branch += list_reorder.parse_branch(current_indexes, child);
807
- });
808
-
809
- return branch;
810
- }
811
-
812
808
  , disable_reordering: function(e) {
813
809
  if($('#reorder_action_done').hasClass('loading')){
814
810
  return false;
815
811
  }
816
812
  if(e) { e.preventDefault(); }
817
813
  $('#reorder_action_done').addClass('loading');
814
+ list_reorder.sortable_list.nestedSortable("disable");
815
+
816
+ $('#sortable_list').removeClass("reordering");
817
+
818
818
  if (list_reorder.update_url != null) {
819
- serialized = "";
820
- list_reorder.sortable_list.find('> li[id]').each(function(index, li) {
821
- if (list_reorder.tree) {
822
- serialized += list_reorder.parse_branch([index], li);
823
- }
824
- else {
825
- serialized += "&sortable_list[]=" + $($(li).attr('id').split('_')).last().get(0);
826
- }
827
- });
828
- serialized += "&tree=" + list_reorder.tree;
829
- serialized += "&authenticity_token=" + encodeURIComponent($('#reorder_authenticity_token').val());
830
- serialized += "&continue_reordering=false";
831
819
 
832
- $.post(list_reorder.update_url, serialized, function(data) {
833
- // handle the case where we get the whole list back including the <ul> or whatever.
834
- if ((matches = data.match(new RegExp("^<" + list_reorder.sortable_list.get(0).tagName.toLowerCase()
835
- + "[^>]+" + list_reorder.sortable_list.attr('id') + "[^>]>"))) != null)
836
- {
837
- // replace reorder authenticity token's value.
838
- $('#reorder_authenticity_token').val(
839
- $($(data.split('reorder_authenticity_token')).last().get(0).split('value=\''))
840
- .last().get(0).split('\'')[0]);
841
- // replace actual list content.
842
- $(list_reorder.sortable_list).html($(data).html());
843
- } else {
844
- $(list_reorder.sortable_list).html(data);
845
- }
820
+ var serialized = list_reorder.sortable_list.serializelist();
846
821
 
847
- // if we get passed a script tag, re-enable reordering.
848
- matches = data.replace('"', "'")
849
- .match(/<script\ type='text\/javascript'>([^<]*)<\/script>/im);
850
- if (matches != null && matches.length > 1) {
851
- list_reorder.enable_reordering();
852
- } else {
853
- list_reorder.restore_controls(e);
854
- }
822
+ $.post(list_reorder.update_url, serialized, function(data) {
823
+ list_reorder.restore_controls(e);
855
824
  });
856
825
  } else {
857
826
  list_reorder.restore_controls(e);
@@ -866,7 +835,7 @@ var list_reorder = {
866
835
  }
867
836
  $(list_reorder.sortable_list).removeClass('reordering, ui-sortable');
868
837
 
869
- $('#site_bar, header > *:not(script)').fadeTo(250, 1);
838
+ $('#sortable_list .actions, #site_bar, header > *:not(script)').fadeTo(250, 1);
870
839
  $('#actions *:not("#reorder_action_done, #reorder_action")').not($('#reorder_action_done').parents('li, ul')).fadeTo(250, 1, function() {
871
840
  $('#reorder_action_done').hide().removeClass('loading');
872
841
  $('#reorder_action').show();
@@ -913,7 +882,28 @@ var image_picker = {
913
882
  , changed: function(image) {
914
883
  $(this.options.field).val(image.id.replace("image_", ""));
915
884
 
916
- image.src = image.src.replace('_dialog_thumb', '_' + this.options.thumbnail).replace(/\?\d*/, '');
885
+ $.ajax({
886
+ async: false,
887
+ url: '/refinery/images/'+$(image).attr('data-id')+'/url?size='+this.options.thumbnail,
888
+ success: function (result, status, xhr) {
889
+ if (result.error) {
890
+ if (console && console.log) {
891
+ console.log("Something went wrong with the image insertion!");
892
+ console.log(result);
893
+ }
894
+ } else {
895
+ image.src = result.url;
896
+ }
897
+ },
898
+ error: function(xhr, txt, status) {
899
+ if (console && console.log) {
900
+ console.log("Something went wrong with the image insertion!");
901
+ console.log(xhr);
902
+ console.log(txt);
903
+ console.log(status);
904
+ }
905
+ }
906
+ });
917
907
 
918
908
  current_image = $(this.options.image_display);
919
909
  current_image.replaceWith($("<img src='"+image.src+"?"+Math.floor(Math.random() * 1000000000)+"' id='"+current_image.attr('id')+"' class='brown_border' />"));
@@ -969,7 +959,9 @@ parseURL = function(url)
969
959
 
970
960
  //splice and join the remainder to get the pathname
971
961
  parts.splice(0, 2);
972
- loc.pathname = '/' + parts.join('/');
962
+ // ensure we don't destroy absolute urls like /system/images/whatever.jpg
963
+ loc.pathname = (loc.href[0] == '/' ? ("/" + loc.host) : '');
964
+ loc.pathname += '/' + parts.join('/');
973
965
 
974
966
  //extract any hash and remove from the pathname
975
967
  loc.pathname = loc.pathname.split('#');
@@ -1,4 +1,7 @@
1
1
  $(document).ready(function(){
2
+ // focus first field in an admin form.
3
+ $('form input[type=text]:first').focus();
4
+
2
5
  init_flash_messages();
3
6
  });
4
7
 
@@ -0,0 +1,164 @@
1
+ /*
2
+ * jQuery UI Nested Sortable 1.0.1
3
+ *
4
+ * Copyright 2010, Manuele J Sarfatti
5
+ *
6
+ * http://mjsarfatti.com/sandbox/nestedSortable
7
+ *
8
+ * Depends:
9
+ * jquery.ui.core.js 1.8+
10
+ * jquery.ui.widget.js 1.8+
11
+ * jquery.ui.sortable.js 1.8+
12
+ */
13
+ (function($) {
14
+ $.widget("ui.nestedSortable", $.extend({}, $.ui.sortable.prototype, {
15
+ options: {
16
+ tabSize: 20,
17
+ disableNesting: 'ui-nestedSortable-no-nesting',
18
+ errorClass: 'ui-nestedSortable-error'
19
+ },
20
+ _create: function(){
21
+ this.element.data('sortable', this.element.data('sortableTree'));
22
+ return $.ui.sortable.prototype._create.apply(this, arguments);
23
+ },
24
+ _mouseDrag: function(event) {
25
+
26
+ //Compute the helpers position
27
+ this.position = this._generatePosition(event);
28
+ this.positionAbs = this._convertPositionTo("absolute");
29
+
30
+ if (!this.lastPositionAbs) {
31
+ this.lastPositionAbs = this.positionAbs;
32
+ }
33
+
34
+ //Do scrolling
35
+ if(this.options.scroll) {
36
+ var o = this.options, scrolled = false;
37
+ if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML') {
38
+
39
+ if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
40
+ this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
41
+ else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity)
42
+ this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
43
+
44
+ if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
45
+ this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
46
+ else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity)
47
+ this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;
48
+
49
+ } else {
50
+
51
+ if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
52
+ scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
53
+ else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
54
+ scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
55
+
56
+ if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
57
+ scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
58
+ else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
59
+ scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
60
+
61
+ }
62
+
63
+ if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
64
+ $.ui.ddmanager.prepareOffsets(this, event);
65
+ }
66
+
67
+ //Regenerate the absolute position used for position checks
68
+ this.positionAbs = this._convertPositionTo("absolute");
69
+
70
+ //Set the helper position
71
+ if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
72
+ if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
73
+
74
+ //Rearrange
75
+ for (var i = this.items.length - 1; i >= 0; i--) {
76
+
77
+ //Cache variables and intersection, continue if no intersection
78
+ var item = this.items[i], itemElement = item.item[0], intersection = this._intersectsWithPointer(item);
79
+ if (!intersection) continue;
80
+
81
+ if(itemElement != this.currentItem[0] //cannot intersect with itself
82
+ && this.placeholder[intersection == 1 ? "next" : "prev"]()[0] != itemElement //no useless actions that have been done before
83
+ && !$.ui.contains(this.placeholder[0], itemElement) //no action if the item moved is the parent of the item checked
84
+ && (this.options.type == 'semi-dynamic' ? !$.ui.contains(this.element[0], itemElement) : true)
85
+ //&& itemElement.parentNode == this.placeholder[0].parentNode // only rearrange items within the same container
86
+ ) {
87
+
88
+ this.direction = intersection == 1 ? "down" : "up";
89
+
90
+ if (this.options.tolerance == "pointer" || this._intersectsWithSides(item)) {
91
+ this._rearrange(event, item);
92
+ } else {
93
+ break;
94
+ }
95
+
96
+ // Clear emtpy ul's
97
+ this._clearUls(itemElement);
98
+
99
+ this._trigger("change", event, this._uiHash());
100
+ break;
101
+ }
102
+ }
103
+
104
+ // Get the real previous item
105
+ itemBefore = this.placeholder[0].previousSibling;
106
+ while (itemBefore != null) {
107
+ if (itemBefore.nodeType == 1 && itemBefore != this.currentItem[0]) {
108
+ break;
109
+ } else {
110
+ itemBefore = itemBefore.previousSibling;
111
+ }
112
+ }
113
+
114
+ parentItem = this.placeholder[0].parentNode.parentNode;
115
+ newUl = document.createElement('ul');
116
+
117
+ // Make/delete nested ul's
118
+ if (parentItem != null && parentItem.nodeName == 'LI' && this.positionAbs.left < parentItem.offsetLeft) {
119
+ $(parentItem).after(this.placeholder[0]);
120
+ this._clearUls(parentItem);
121
+ } else if (itemBefore != null && itemBefore.nodeName == 'LI' && this.position.left > itemBefore.offsetLeft + this.options.tabSize) {
122
+ if (!($(itemBefore).hasClass(this.options.disableNesting))) {
123
+ if ($(this.placeholder[0]).hasClass(this.options.errorClass)) {
124
+ $(this.placeholder[0]).css('marginLeft', 0).removeClass(this.options.errorClass);
125
+ }
126
+ if (itemBefore.children[1] == null) {
127
+ itemBefore.appendChild(newUl);
128
+ }
129
+ itemBefore.children[1].appendChild(this.placeholder[0]);
130
+ } else {
131
+ $(this.placeholder[0]).addClass(this.options.errorClass).css('marginLeft', this.options.tabSize);
132
+ }
133
+ } else if (itemBefore != null) {
134
+ if ($(this.placeholder[0]).hasClass(this.options.errorClass)) {
135
+ $(this.placeholder[0]).css('marginLeft', 0).removeClass(this.options.errorClass);
136
+ }
137
+ $(itemBefore).after(this.placeholder[0]);
138
+ }
139
+ //Post events to containers
140
+ this._contactContainers(event);
141
+ //Interconnect with droppables
142
+ if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
143
+ //Call callbacks
144
+ this._trigger('sort', event, this._uiHash());
145
+ this.lastPositionAbs = this.positionAbs;
146
+ return false;
147
+ },
148
+ _clear: function(event, noPropagation) {
149
+ $.ui.sortable.prototype._clear.apply(this, arguments);
150
+ // Clean last empty ul
151
+ for (var i = this.items.length - 1; i >= 0; i--) {
152
+ var item = this.items[i].item[0];
153
+ this._clearUls(item);
154
+ }
155
+ return true;
156
+ },
157
+ _clearUls: function(item) {
158
+ if (item.children[1] && item.children[1].children.length == 0) {
159
+ item.removeChild(item.children[1]);
160
+ }
161
+ }
162
+ }));
163
+ $.ui.nestedSortable.prototype.options = $.extend({}, $.ui.sortable.prototype.options, $.ui.nestedSortable.prototype.options);
164
+ })(jQuery);