typus 3.0.10 → 3.0.11.rc1

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 (113) hide show
  1. data/.gitignore +0 -1
  2. data/Gemfile +9 -5
  3. data/README.md +17 -53
  4. data/app/assets/vendor/typus/javascripts/application.js +2 -0
  5. data/app/assets/vendor/typus/javascripts/jquery.application.js +29 -0
  6. data/app/assets/vendor/typus/javascripts/jquery.rails.autocomplete.js +32 -0
  7. data/app/assets/vendor/typus/javascripts/jquery.rails.js +158 -0
  8. data/app/assets/vendor/typus/javascripts/jquery.searchField.js +91 -0
  9. data/app/assets/vendor/typus/stylesheets/application.css +11 -0
  10. data/app/assets/vendor/typus/stylesheets/reset.css +48 -0
  11. data/app/assets/vendor/typus/stylesheets/screen.css +361 -0
  12. data/app/assets/vendor/typus/vendor/jquery-tokeninput/css/token-input-facebook.css +122 -0
  13. data/app/assets/vendor/typus/vendor/jquery-tokeninput/css/token-input-mac.css +204 -0
  14. data/app/assets/vendor/typus/vendor/jquery-tokeninput/css/token-input.css +120 -0
  15. data/app/assets/vendor/typus/vendor/jquery-tokeninput/js/jquery.tokeninput.js +736 -0
  16. data/app/assets/vendor/typus/vendor/jquery-ui-1.8.12.custom/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  17. data/app/assets/vendor/typus/vendor/jquery-ui-1.8.12.custom/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  18. data/app/assets/vendor/typus/vendor/jquery-ui-1.8.12.custom/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png +0 -0
  19. data/app/assets/vendor/typus/vendor/jquery-ui-1.8.12.custom/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  20. data/app/assets/vendor/typus/vendor/jquery-ui-1.8.12.custom/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  21. data/app/assets/vendor/typus/vendor/jquery-ui-1.8.12.custom/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  22. data/app/assets/vendor/typus/vendor/jquery-ui-1.8.12.custom/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  23. data/app/assets/vendor/typus/vendor/jquery-ui-1.8.12.custom/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  24. data/app/assets/vendor/typus/vendor/jquery-ui-1.8.12.custom/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  25. data/app/assets/vendor/typus/vendor/jquery-ui-1.8.12.custom/css/ui-lightness/images/ui-icons_222222_256x240.png +0 -0
  26. data/app/assets/vendor/typus/vendor/jquery-ui-1.8.12.custom/css/ui-lightness/images/ui-icons_228ef1_256x240.png +0 -0
  27. data/app/assets/vendor/typus/vendor/jquery-ui-1.8.12.custom/css/ui-lightness/images/ui-icons_ef8c08_256x240.png +0 -0
  28. data/app/assets/vendor/typus/vendor/jquery-ui-1.8.12.custom/css/ui-lightness/images/ui-icons_ffd27a_256x240.png +0 -0
  29. data/app/assets/vendor/typus/vendor/jquery-ui-1.8.12.custom/css/ui-lightness/images/ui-icons_ffffff_256x240.png +0 -0
  30. data/app/assets/vendor/typus/vendor/jquery-ui-1.8.12.custom/css/ui-lightness/jquery-ui-1.8.12.custom.css +578 -0
  31. data/app/assets/vendor/typus/vendor/jquery-ui-1.8.12.custom/index.html +367 -0
  32. data/app/assets/vendor/typus/vendor/jquery-ui-1.8.12.custom/js/jquery-1.5.1.min.js +16 -0
  33. data/app/assets/vendor/typus/vendor/jquery-ui-1.8.12.custom/js/jquery-ui-1.8.12.custom.min.js +783 -0
  34. data/app/assets/vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox/blank.gif +0 -0
  35. data/app/assets/vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox/fancy_close.png +0 -0
  36. data/app/assets/vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox/fancy_loading.png +0 -0
  37. data/app/assets/vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox/fancy_nav_left.png +0 -0
  38. data/app/assets/vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox/fancy_nav_right.png +0 -0
  39. data/app/assets/vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox/fancy_shadow_e.png +0 -0
  40. data/app/assets/vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox/fancy_shadow_n.png +0 -0
  41. data/app/assets/vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox/fancy_shadow_ne.png +0 -0
  42. data/app/assets/vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox/fancy_shadow_nw.png +0 -0
  43. data/app/assets/vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox/fancy_shadow_s.png +0 -0
  44. data/app/assets/vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox/fancy_shadow_se.png +0 -0
  45. data/app/assets/vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox/fancy_shadow_sw.png +0 -0
  46. data/app/assets/vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox/fancy_shadow_w.png +0 -0
  47. data/app/assets/vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox/fancy_title_left.png +0 -0
  48. data/app/assets/vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox/fancy_title_main.png +0 -0
  49. data/app/assets/vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox/fancy_title_over.png +0 -0
  50. data/app/assets/vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox/fancy_title_right.png +0 -0
  51. data/app/assets/vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox/fancybox-x.png +0 -0
  52. data/app/assets/vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox/fancybox-y.png +0 -0
  53. data/app/assets/vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox/fancybox.png +0 -0
  54. data/app/assets/vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox/jquery.easing-1.3.pack.js +72 -0
  55. data/app/assets/vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox/jquery.fancybox-1.3.4.css +359 -0
  56. data/app/assets/vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox/jquery.fancybox-1.3.4.js +1156 -0
  57. data/app/assets/vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox/jquery.fancybox-1.3.4.pack.js +46 -0
  58. data/app/assets/vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox/jquery.mousewheel-3.0.4.pack.js +14 -0
  59. data/app/controllers/admin/account_controller.rb +2 -2
  60. data/app/controllers/admin/base_controller.rb +4 -0
  61. data/app/controllers/admin/resources_controller.rb +8 -83
  62. data/app/controllers/admin/session_controller.rb +10 -2
  63. data/app/helpers/admin/file_preview_helper.rb +15 -1
  64. data/app/helpers/admin/filters_helper.rb +4 -4
  65. data/app/helpers/admin/relationships_helper.rb +11 -6
  66. data/app/helpers/admin/resources_helper.rb +4 -1
  67. data/app/helpers/admin/table_helper.rb +6 -3
  68. data/app/views/admin/dashboard/_sidebar.html.erb +1 -3
  69. data/app/views/admin/helpers/table/_table.html.erb +0 -8
  70. data/app/views/admin/resources/index.html.erb +3 -1
  71. data/app/views/admin/shared/_head.html.erb +30 -0
  72. data/app/views/admin/templates/_belongs_to_with_autocomplete.html.erb +23 -4
  73. data/app/views/admin/templates/_relate_form.html.erb +1 -1
  74. data/app/views/admin/templates/_selector.html.erb +5 -1
  75. data/app/views/layouts/admin/base.html.erb +1 -30
  76. data/app/views/layouts/admin/headless.html.erb +1 -30
  77. data/app/views/layouts/admin/session.html.erb +1 -19
  78. data/doc/mongo_db.md +10 -0
  79. data/lib/generators/typus/typus_generator.rb +0 -5
  80. data/lib/support/active_record.rb +8 -0
  81. data/lib/typus.rb +2 -1
  82. data/lib/typus/controller/actions.rb +7 -0
  83. data/lib/typus/controller/acts_as.rb +22 -0
  84. data/lib/typus/controller/associations.rb +66 -0
  85. data/lib/typus/controller/autocomplete.rb +1 -1
  86. data/lib/typus/controller/format.rb +1 -1
  87. data/lib/typus/engine.rb +7 -2
  88. data/lib/typus/orm/active_record/class_methods.rb +1 -1
  89. data/lib/typus/version.rb +1 -1
  90. data/test/app/controllers/admin/assets_controller_test.rb +8 -5
  91. data/test/app/controllers/admin/pages_controller_test.rb +2 -2
  92. data/test/app/controllers/admin/posts_controller_test.rb +27 -2
  93. data/test/app/controllers/admin/views_controller_test.rb +36 -0
  94. data/test/app/helpers/admin/file_preview_helper_test.rb +9 -1
  95. data/test/app/helpers/admin/filters_helper_test.rb +5 -0
  96. data/test/app/helpers/admin/resources_helper_test.rb +2 -2
  97. data/test/app/helpers/admin/table_helper_test.rb +26 -0
  98. data/test/factories.rb +11 -0
  99. data/test/fixtures/rails_app/app/controllers/admin/hits_controller.rb +0 -3
  100. data/test/fixtures/rails_app/app/controllers/admin/views_controller.rb +6 -0
  101. data/test/fixtures/rails_app/app/models/asset.rb +16 -4
  102. data/test/fixtures/rails_app/app/models/site.rb +16 -0
  103. data/test/fixtures/rails_app/app/models/view.rb +2 -0
  104. data/test/fixtures/rails_app/config/typus/crud_extended.yml +2 -2
  105. data/test/fixtures/rails_app/db/schema.rb +15 -0
  106. data/test/lib/support/active_record_test.rb +24 -0
  107. data/test/lib/typus/orm/active_record/class_methods_test.rb +4 -4
  108. data/test/lib/typus_test.rb +1 -1
  109. metadata +68 -190
  110. data/.gemtest +0 -0
  111. data/doc/hudson_setup.md +0 -19
  112. data/lib/generators/typus/assets_generator.rb +0 -19
  113. data/test/fixtures/rails_app/app/views/layouts/admin/headless.html.erb +0 -38
data/.gitignore CHANGED
@@ -12,4 +12,3 @@ log/*.log
12
12
  test/fixtures/rails_app/public/system/*
13
13
  test/fixtures/rails_app/tmp/*
14
14
  tmp/**/*
15
- vendor/
data/Gemfile CHANGED
@@ -8,7 +8,7 @@ gemspec
8
8
 
9
9
  gem 'acts_as_list'
10
10
  gem 'acts_as_tree'
11
- gem 'dragonfly', '~>0.8.1'
11
+ gem 'dragonfly', '~> 0.9'
12
12
  gem 'factory_girl'
13
13
  gem 'paperclip'
14
14
  gem 'rack-cache', :require => 'rack/cache'
@@ -32,7 +32,7 @@ group :development, :test do
32
32
  end
33
33
 
34
34
  platforms :ruby do
35
- gem 'mysql2'
35
+ gem 'mysql2', '0.2.7'
36
36
  gem 'pg'
37
37
  gem 'sqlite3'
38
38
  end
@@ -41,9 +41,13 @@ end
41
41
 
42
42
  # MongoDB support is still in "beta" mode, so I'm not testing it for the moment.
43
43
  group :production do
44
- # MongoDB support
45
- gem 'mongoid', '2.0.0.rc.7'
46
- gem 'bson_ext'
44
+
45
+ gem 'mongoid'
46
+
47
+ platforms :ruby do
48
+ gem 'bson_ext'
49
+ end
50
+
47
51
  end
48
52
 
49
53
  group :production do
data/README.md CHANGED
@@ -1,83 +1,47 @@
1
1
  # Typus: Admin Panel for Ruby on Rails applications
2
2
 
3
- **Typus** is designed for a single activity:
4
-
5
- Trusted users editing structured content.
6
-
7
- **Typus** doesn't try to be all the things to all the people but it's
8
- extensible enough to match lots of use cases.
3
+ **Typus** allows trusted users to edit structured content.
9
4
 
10
5
  ## Key Features
11
6
 
12
- - Built-in Authentication.
13
- - User Permissions by using Access Control Lists. (stored in yaml files)
7
+ - Built-in Authentication and Access Control Lists.
14
8
  - CRUD and custom actions for your models on a clean interface.
15
- - Internationalized interface (Català, German, Greek, English, Español,
16
- Français, Magyar, Italiano, Portuguese, Russian, 中文)
9
+ - Internationalized interface ([See available translations][locales])
17
10
  - Customizable and extensible templates.
18
- - Integrated [paperclip][1] and [dragonfly][2] attachments viewer.
19
- - Low memory footprint.
20
- - Works with `Rails 3.0.5`.
21
- - Tested with `ruby-1.8.7-p334`, `ree-1.8.7-2011.03` and `ruby-1.9.2-p180` and `jruby-1.5.6`.
11
+ - Integrated [paperclip][paperclip] and [dragonfly][dragonfly] attachments viewer.
12
+ - Works with `Rails 3.0.X`.
13
+ - Tested with latest versions of `1.8.7`, `ree`, `1.9.2` and `jruby`.
22
14
  - Tested with `SQLite`, `MySQL` and `PostgreSQL`.
23
- - MIT License, the same as Rails.
24
15
 
25
16
  ## Links
26
17
 
27
- - [Documentation](http://core.typuscms.com/)
28
- - [Demo](http://demo.typuscms.com/) ([Code][3])
18
+ - [Documentation](https://github.com/fesplugas/typus/wiki)
19
+ - [Issues](https://github.com/fesplugas/typus/issues)
20
+ - [Demo](http://demo.typuscms.com/) ([Code][code])
29
21
  - [Source Code](http://github.com/fesplugas/typus)
30
22
  - [Mailing List](http://groups.google.com/group/typus)
31
23
  - [Gems](http://rubygems.org/gems/typus)
32
24
  - [Contributors List](http://github.com/fesplugas/typus/contributors)
33
- - [Continous Integration](http://ci.typuscms.com/)
34
25
 
35
26
  ## Installing
36
27
 
37
28
  Add **Typus** to your `Gemfile`
38
29
 
39
- gem 'typus', :git => 'https://github.com/fesplugas/typus.git'
40
-
41
- # If you have problems with "Smart HTTP" use the "Git Transfer Protocol".
42
- # gem 'typus', :git => 'git://github.com/fesplugas/typus.git'
30
+ gem 'typus', :git => 'git://github.com/fesplugas/typus.git'
43
31
 
44
- Update your bundle
32
+ Update your bundle, run the generator and start the application server:
45
33
 
46
34
  $ bundle install
47
-
48
- Run the generator
49
-
50
35
  $ rails generate typus
51
-
52
- Start the application server
53
-
54
36
  $ rails server
55
37
 
56
38
  and go to <http://0.0.0.0:3000/admin>.
57
39
 
58
- ## MIT License
59
-
60
- Copyright (c) 2007-2011 Francesc Esplugas Marti
61
-
62
- Permission is hereby granted, free of charge, to any person obtaining
63
- a copy of this software and associated documentation files (the
64
- "Software"), to deal in the Software without restriction, including
65
- without limitation the rights to use, copy, modify, merge, publish,
66
- distribute, sublicense, and/or sell copies of the Software, and to
67
- permit persons to whom the Software is furnished to do so, subject to
68
- the following conditions:
69
-
70
- The above copyright notice and this permission notice shall be
71
- included in all copies or substantial portions of the Software.
40
+ ## License
72
41
 
73
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
74
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
75
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
76
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
77
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
78
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
79
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
42
+ Typus is released under the MIT license.
80
43
 
81
- [1]: http://rubygems.org/gems/paperclip
82
- [2]: http://rubygems.org/gems/dragonfly
83
- [3]: https://github.com/fesplugas/typus/tree/master/test/fixtures/rails_app
44
+ [paperclip]: http://rubygems.org/gems/paperclip
45
+ [dragonfly]: http://rubygems.org/gems/dragonfly
46
+ [code]: https://github.com/fesplugas/typus/tree/master/test/fixtures/rails_app
47
+ [locales]: https://github.com/fesplugas/typus/tree/master/config/locales
@@ -0,0 +1,2 @@
1
+ // Place your application-specific JavaScript functions and classes for
2
+ // the admin panel here.
@@ -0,0 +1,29 @@
1
+ $(document).ready(function() {
2
+
3
+ $("#quicksearch").searchField();
4
+
5
+ $('.resource :input', document.myForm).bind("change", function() { setConfirmUnload(true); });
6
+
7
+ $("a.fancybox").fancybox({
8
+ 'titlePosition': 'over',
9
+ 'type': 'image'
10
+ });
11
+
12
+ $(".iframe").fancybox({
13
+ 'width': '75%',
14
+ 'height': '100%',
15
+ 'autoScale': false,
16
+ 'transitionIn': 'none',
17
+ 'transitionOut': 'none',
18
+ 'type': 'iframe'
19
+ });
20
+
21
+ });
22
+
23
+ function setConfirmUnload(on) {
24
+ window.onbeforeunload = (on) ? unloadMessage : null;
25
+ }
26
+
27
+ function unloadMessage() {
28
+ return "You have entered new data on this page. If you navigate away from this page without first saving your data, the changes will be lost.";
29
+ }
@@ -0,0 +1,32 @@
1
+ /*
2
+ * Unobtrusive autocomplete
3
+ *
4
+ * To use it, you just have to include the HTML attribute autocomplete
5
+ * with the autocomplete URL as the value
6
+ *
7
+ * Example:
8
+ * <input type="text" autocomplete="/url/to/autocomplete">
9
+ *
10
+ * Optionally, you can use a jQuery selector to specify a field that can
11
+ * be updated with the element id whenever you find a matching value
12
+ *
13
+ * Example:
14
+ * <input type="text" autocomplete="/url/to/autocomplete" id_element="#id_field">
15
+ */
16
+
17
+ $(document).ready(function(){
18
+ $('input[data-autocomplete]').each(function(i){
19
+ $(this).autocomplete({
20
+ minLength: 3,
21
+ source: $(this).attr('data-autocomplete'),
22
+
23
+ select: function(event, ui) {
24
+ $(this).val(ui.item.value);
25
+ if ($(this).attr('id_element')) {
26
+ $($(this).attr('id_element')).val(ui.item.id);
27
+ }
28
+ return false;
29
+ }
30
+ });
31
+ });
32
+ });
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Unobtrusive scripting adapter for jQuery
3
+ *
4
+ * Requires jQuery 1.4.3 or later.
5
+ * https://github.com/rails/jquery-ujs
6
+ */
7
+
8
+ (function($) {
9
+ // Make sure that every Ajax request sends the CSRF token
10
+ function CSRFProtection(xhr) {
11
+ var token = $('meta[name="csrf-token"]').attr('content');
12
+ if (token) xhr.setRequestHeader('X-CSRF-Token', token);
13
+ }
14
+ if ('ajaxPrefilter' in $) $.ajaxPrefilter(function(options, originalOptions, xhr){ CSRFProtection(xhr) });
15
+ else $(document).ajaxSend(function(e, xhr){ CSRFProtection(xhr) });
16
+
17
+ // Triggers an event on an element and returns the event result
18
+ function fire(obj, name, data) {
19
+ var event = $.Event(name);
20
+ obj.trigger(event, data);
21
+ return event.result !== false;
22
+ }
23
+
24
+ // Submits "remote" forms and links with ajax
25
+ function handleRemote(element) {
26
+ var method, url, data,
27
+ dataType = element.data('type') || ($.ajaxSettings && $.ajaxSettings.dataType);
28
+
29
+ if (fire(element, 'ajax:before')) {
30
+ if (element.is('form')) {
31
+ method = element.attr('method');
32
+ url = element.attr('action');
33
+ data = element.serializeArray();
34
+ // memoized value from clicked submit button
35
+ var button = element.data('ujs:submit-button');
36
+ if (button) {
37
+ data.push(button);
38
+ element.data('ujs:submit-button', null);
39
+ }
40
+ } else {
41
+ method = element.data('method');
42
+ url = element.attr('href');
43
+ data = null;
44
+ }
45
+ $.ajax({
46
+ url: url, type: method || 'GET', data: data, dataType: dataType,
47
+ // stopping the "ajax:beforeSend" event will cancel the ajax request
48
+ beforeSend: function(xhr, settings) {
49
+ if (settings.dataType === undefined) {
50
+ xhr.setRequestHeader('accept', '*/*;q=0.5, ' + settings.accepts.script);
51
+ }
52
+ return fire(element, 'ajax:beforeSend', [xhr, settings]);
53
+ },
54
+ success: function(data, status, xhr) {
55
+ element.trigger('ajax:success', [data, status, xhr]);
56
+ },
57
+ complete: function(xhr, status) {
58
+ element.trigger('ajax:complete', [xhr, status]);
59
+ },
60
+ error: function(xhr, status, error) {
61
+ element.trigger('ajax:error', [xhr, status, error]);
62
+ }
63
+ });
64
+ }
65
+ }
66
+
67
+ // Handles "data-method" on links such as:
68
+ // <a href="/users/5" data-method="delete" rel="nofollow" data-confirm="Are you sure?">Delete</a>
69
+ function handleMethod(link) {
70
+ var href = link.attr('href'),
71
+ method = link.data('method'),
72
+ csrf_token = $('meta[name=csrf-token]').attr('content'),
73
+ csrf_param = $('meta[name=csrf-param]').attr('content'),
74
+ form = $('<form method="post" action="' + href + '"></form>'),
75
+ metadata_input = '<input name="_method" value="' + method + '" type="hidden" />';
76
+
77
+ if (csrf_param !== undefined && csrf_token !== undefined) {
78
+ metadata_input += '<input name="' + csrf_param + '" value="' + csrf_token + '" type="hidden" />';
79
+ }
80
+
81
+ form.hide().append(metadata_input).appendTo('body');
82
+ form.submit();
83
+ }
84
+
85
+ function disableFormElements(form) {
86
+ form.find('input[data-disable-with]').each(function() {
87
+ var input = $(this);
88
+ input.data('ujs:enable-with', input.val())
89
+ .val(input.data('disable-with'))
90
+ .attr('disabled', 'disabled');
91
+ });
92
+ }
93
+
94
+ function enableFormElements(form) {
95
+ form.find('input[data-disable-with]').each(function() {
96
+ var input = $(this);
97
+ input.val(input.data('ujs:enable-with')).removeAttr('disabled');
98
+ });
99
+ }
100
+
101
+ function allowAction(element) {
102
+ var message = element.data('confirm');
103
+ return !message || (fire(element, 'confirm') && confirm(message));
104
+ }
105
+
106
+ function requiredValuesMissing(form) {
107
+ var missing = false;
108
+ form.find('input[name][required]').each(function() {
109
+ if (!$(this).val()) missing = true;
110
+ });
111
+ return missing;
112
+ }
113
+
114
+ $('a[data-confirm], a[data-method], a[data-remote]').live('click.rails', function(e) {
115
+ var link = $(this);
116
+ if (!allowAction(link)) return false;
117
+
118
+ if (link.data('remote') != undefined) {
119
+ handleRemote(link);
120
+ return false;
121
+ } else if (link.data('method')) {
122
+ handleMethod(link);
123
+ return false;
124
+ }
125
+ });
126
+
127
+ $('form').live('submit.rails', function(e) {
128
+ var form = $(this), remote = form.data('remote') != undefined;
129
+ if (!allowAction(form)) return false;
130
+
131
+ // skip other logic when required values are missing
132
+ if (requiredValuesMissing(form)) return !remote;
133
+
134
+ if (remote) {
135
+ handleRemote(form);
136
+ return false;
137
+ } else {
138
+ // slight timeout so that the submit button gets properly serialized
139
+ setTimeout(function(){ disableFormElements(form) }, 13);
140
+ }
141
+ });
142
+
143
+ $('form input[type=submit], form button[type=submit], form button:not([type])').live('click.rails', function() {
144
+ var button = $(this);
145
+ if (!allowAction(button)) return false;
146
+ // register the pressed submit button
147
+ var name = button.attr('name'), data = name ? {name:name, value:button.val()} : null;
148
+ button.closest('form').data('ujs:submit-button', data);
149
+ });
150
+
151
+ $('form').live('ajax:beforeSend.rails', function(event) {
152
+ if (this == event.target) disableFormElements($(this));
153
+ });
154
+
155
+ $('form').live('ajax:complete.rails', function(event) {
156
+ if (this == event.target) enableFormElements($(this));
157
+ });
158
+ })( jQuery );
@@ -0,0 +1,91 @@
1
+ /*
2
+ * searchField - jQuery plugin to display and remove
3
+ * a default value in a searchvalue on blur/focus
4
+ *
5
+ * Copyright (c) 2008 J�örn Zaefferer
6
+ *
7
+ * $Id$
8
+ *
9
+ * Dual licensed under the MIT and GPL licenses:
10
+ * http://www.opensource.org/licenses/mit-license.php
11
+ * http://www.gnu.org/licenses/gpl.html
12
+ *
13
+ */
14
+
15
+ /**
16
+ * Clear the help text in a search field (either in the value or title attribute)
17
+ * when focused, and restore it on blur if nothing was entered. If the value is
18
+ * blank but there is a title attribute, the title will be moved to the initial value.
19
+ *
20
+ * @example $('#quicksearch').searchField();
21
+ * @before <input id="quicksearch" title="Enter search here" name="quicksearch" />
22
+ * @result <input id="quicksearch" value="Enter search here" name="quicksearch" />
23
+ *
24
+ * @name searchField
25
+ * @type jQuery
26
+ * @cat Plugins/SearchField
27
+ */
28
+ jQuery.fn.searchField = function(mark){
29
+ return this.each(function() {
30
+ var mark = mark || this.title;
31
+
32
+ if (!mark)
33
+ return;
34
+
35
+ var target = this;
36
+ var original = $(this);
37
+ if (this.type == "password") {
38
+ target = $("<input />")
39
+ .insertBefore(this)
40
+ .css("display", $(this).css("display"))
41
+ .attr("size", this.size)
42
+ .attr("title", this.title)
43
+ .attr("class", this.className)
44
+ .addClass("watermark")[0];
45
+ if (!this.value) {
46
+ $(this).hide();
47
+ } else {
48
+ $(target).hide();
49
+ }
50
+ }
51
+
52
+ if(!target.value || mark == this.value) {
53
+ $(target).addClass("watermark");
54
+ }
55
+
56
+ // setup initial value
57
+ if (!this.value || target != this) {
58
+ target.value = mark;
59
+ }
60
+
61
+ $(target).focus(function() {
62
+ if (target != original[0]) {
63
+ $(this).hide();
64
+ original.show().focus();
65
+ } else if (this.value == mark) {
66
+ this.value = '';
67
+ $(this).removeClass("watermark");
68
+ }
69
+ });
70
+ $(this).blur(function() {
71
+ if (!this.value.length) {
72
+ if (target != original[0]) {
73
+ $(target).show();
74
+ original.hide();
75
+ } else {
76
+ this.value = mark;
77
+ $(this).addClass("watermark")
78
+ }
79
+ }
80
+ });
81
+
82
+ // make sure that when the form is submitted, the watermark is
83
+ // replaced with the empty string, which is usually the expected behavior.
84
+ $(this).parents("form:first").submit(function(){
85
+ if ($(target).hasClass("watermark")) {
86
+ $(target).attr("value", "");
87
+ $(target).removeClass("watermark");
88
+ }
89
+ });
90
+ });
91
+ };