jquery-modal-rails 0.0.1
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.
- data/.gitignore +7 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +81 -0
- data/Rakefile +2 -0
- data/demoapp/Gemfile +41 -0
- data/demoapp/README.rdoc +261 -0
- data/demoapp/Rakefile +7 -0
- data/demoapp/app/assets/images/rails.png +0 -0
- data/demoapp/app/assets/javascripts/application.js +17 -0
- data/demoapp/app/assets/javascripts/users.js.coffee +3 -0
- data/demoapp/app/assets/stylesheets/application.css +15 -0
- data/demoapp/app/assets/stylesheets/scaffolds.css.scss +56 -0
- data/demoapp/app/assets/stylesheets/users.css.scss +3 -0
- data/demoapp/app/controllers/application_controller.rb +3 -0
- data/demoapp/app/controllers/users_controller.rb +89 -0
- data/demoapp/app/helpers/application_helper.rb +2 -0
- data/demoapp/app/helpers/users_helper.rb +2 -0
- data/demoapp/app/models/user.rb +7 -0
- data/demoapp/app/views/layouts/application.html.erb +14 -0
- data/demoapp/app/views/users/_form.html.erb +25 -0
- data/demoapp/app/views/users/edit.html.erb +6 -0
- data/demoapp/app/views/users/index.html.erb +31 -0
- data/demoapp/app/views/users/new.html.erb +5 -0
- data/demoapp/app/views/users/show.html.erb +15 -0
- data/demoapp/config.ru +4 -0
- data/demoapp/config/application.rb +62 -0
- data/demoapp/config/boot.rb +6 -0
- data/demoapp/config/database.yml +25 -0
- data/demoapp/config/environment.rb +5 -0
- data/demoapp/config/environments/development.rb +37 -0
- data/demoapp/config/environments/production.rb +67 -0
- data/demoapp/config/environments/test.rb +37 -0
- data/demoapp/config/initializers/backtrace_silencers.rb +7 -0
- data/demoapp/config/initializers/inflections.rb +15 -0
- data/demoapp/config/initializers/mime_types.rb +5 -0
- data/demoapp/config/initializers/secret_token.rb +7 -0
- data/demoapp/config/initializers/session_store.rb +8 -0
- data/demoapp/config/initializers/wrap_parameters.rb +14 -0
- data/demoapp/config/locales/en.yml +5 -0
- data/demoapp/config/routes.rb +4 -0
- data/demoapp/db/development.sqlite3 +0 -0
- data/demoapp/db/migrate/20120621084323_create_users.rb +10 -0
- data/demoapp/db/schema.rb +23 -0
- data/demoapp/db/seeds.rb +7 -0
- data/demoapp/doc/README_FOR_APP +2 -0
- data/demoapp/public/404.html +26 -0
- data/demoapp/public/422.html +26 -0
- data/demoapp/public/500.html +25 -0
- data/demoapp/public/favicon.ico +0 -0
- data/demoapp/public/robots.txt +5 -0
- data/demoapp/script/rails +6 -0
- data/demoapp/test/fixtures/users.yml +9 -0
- data/demoapp/test/functional/users_controller_test.rb +49 -0
- data/demoapp/test/performance/browsing_test.rb +12 -0
- data/demoapp/test/test_helper.rb +13 -0
- data/demoapp/test/unit/helpers/users_helper_test.rb +4 -0
- data/demoapp/test/unit/user_test.rb +7 -0
- data/jquery-modal-rails.gemspec +24 -0
- data/lib/jquery-modal-rails.rb +3 -0
- data/lib/jquery/modal/filters.rb +9 -0
- data/lib/jquery/modal/filters/ajax_request_filters.rb +18 -0
- data/lib/jquery/modal/helpers.rb +9 -0
- data/lib/jquery/modal/helpers/link_helpers.rb +33 -0
- data/lib/jquery/modal/rails.rb +7 -0
- data/lib/jquery/modal/rails/engine.rb +8 -0
- data/lib/jquery/modal/rails/version.rb +8 -0
- data/vendor/assets/images/close.png +0 -0
- data/vendor/assets/images/spinner.gif +0 -0
- data/vendor/assets/javascripts/jquery.modal.js +265 -0
- data/vendor/assets/stylesheets/jquery.modal.css +45 -0
- metadata +189 -0
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/jquery/modal/rails/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = "jquery-modal-rails"
|
6
|
+
s.version = Jquery::Modal::Rails::VERSION
|
7
|
+
s.platform = Gem::Platform::RUBY
|
8
|
+
s.authors = ["Dirk Eisenberg"]
|
9
|
+
s.email = ["dirk.eisenberg@gmail.com"]
|
10
|
+
s.homepage = "https://github.com/dei79/jquery-modal-rails"
|
11
|
+
s.summary = "The simplest possible modal for jQuery for the Rails 3.1+ asset pipeline"
|
12
|
+
s.description = "The simplest possible modal for jQuery for the Rails 3.1+ asset pipeline based on https://github.com/kylefox/jquery-modal."
|
13
|
+
|
14
|
+
s.required_rubygems_version = ">= 1.3.6"
|
15
|
+
|
16
|
+
s.add_dependency "railties", ">= 3.2.0", "< 5.0"
|
17
|
+
s.add_dependency "thor", "~> 0.14"
|
18
|
+
s.add_dependency "jquery-ui-rails"
|
19
|
+
s.add_dependency "uuidtools"
|
20
|
+
|
21
|
+
s.files = `git ls-files`.split("\n")
|
22
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
23
|
+
s.require_path = 'lib'
|
24
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Jquery
|
2
|
+
module Filters
|
3
|
+
|
4
|
+
def self.included(base)
|
5
|
+
|
6
|
+
#
|
7
|
+
# This filter disables the layout for all AJAX requests so a formular in the dialog
|
8
|
+
# can be presentend in the layout of the master form
|
9
|
+
#
|
10
|
+
base.send :before_filter do |controller|
|
11
|
+
(controller.action_has_layout = false) if controller.request.xhr?
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Jquery
|
2
|
+
module Helpers
|
3
|
+
|
4
|
+
# Creates a link tag to a given url or path and ensures that the linke will be rendered
|
5
|
+
# as jquery modal dialog
|
6
|
+
#
|
7
|
+
# ==== Signatures
|
8
|
+
#
|
9
|
+
# link_to(body, url, html_options = {})
|
10
|
+
# link_to(body, url)
|
11
|
+
#
|
12
|
+
def link_to_modal(body, url, html_options = {})
|
13
|
+
# extend the html_options
|
14
|
+
html_options[:rel] = "modal:open"
|
15
|
+
if (html_options.has_key?(:remote))
|
16
|
+
if (html_options[:remote] == true)
|
17
|
+
html_options[:rel] = "modal:open:ajaxpost"
|
18
|
+
end
|
19
|
+
|
20
|
+
# remove the remote tag
|
21
|
+
html_options.delete(:remote)
|
22
|
+
end
|
23
|
+
# check if we have an id
|
24
|
+
html_options[:id] = UUIDTools::UUID.random_create().to_s unless html_options.has_key?(:id)
|
25
|
+
|
26
|
+
# perform the normal link_to operation
|
27
|
+
html_link = link_to(body, url, html_options)
|
28
|
+
|
29
|
+
# emit both
|
30
|
+
html_link.html_safe
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
Binary file
|
Binary file
|
@@ -0,0 +1,265 @@
|
|
1
|
+
/*
|
2
|
+
A simple jQuery modal (http://github.com/kylefox/jquery-modal)
|
3
|
+
Version 0.5
|
4
|
+
*/
|
5
|
+
(function($) {
|
6
|
+
|
7
|
+
var current = null;
|
8
|
+
|
9
|
+
$.modal = function(el, options) {
|
10
|
+
var remove, target;
|
11
|
+
this.$body = $('body');
|
12
|
+
this.options = $.extend({}, $.modal.defaults, options);
|
13
|
+
if (el.is('a')) {
|
14
|
+
target = el.attr('href');
|
15
|
+
//Select element by id from href
|
16
|
+
if (/^#/.test(target)) {
|
17
|
+
this.$elm = $(target);
|
18
|
+
if (this.$elm.length !== 1) return null;
|
19
|
+
this.open();
|
20
|
+
//AJAX
|
21
|
+
} else {
|
22
|
+
this.$elm = $('<div>');
|
23
|
+
this.$body.append(this.$elm);
|
24
|
+
remove = function(event, modal) { modal.elm.remove(); };
|
25
|
+
this.showSpinner();
|
26
|
+
el.trigger($.modal.AJAX_SEND);
|
27
|
+
$.get(target).done(function(html) {
|
28
|
+
if (!current) return;
|
29
|
+
el.trigger($.modal.AJAX_SUCCESS);
|
30
|
+
current.$elm.empty().append(html).on($.modal.CLOSE, remove);
|
31
|
+
current.hideSpinner();
|
32
|
+
current.open();
|
33
|
+
el.trigger($.modal.AJAX_COMPLETE);
|
34
|
+
}).fail(function() {
|
35
|
+
el.trigger($.modal.AJAX_FAIL);
|
36
|
+
current.hideSpinner();
|
37
|
+
el.trigger($.modal.AJAX_COMPLETE);
|
38
|
+
});
|
39
|
+
}
|
40
|
+
} else {
|
41
|
+
this.$elm = el;
|
42
|
+
this.open();
|
43
|
+
}
|
44
|
+
};
|
45
|
+
|
46
|
+
$.modal.prototype = {
|
47
|
+
constructor: $.modal,
|
48
|
+
|
49
|
+
open: function() {
|
50
|
+
this.block();
|
51
|
+
this.show();
|
52
|
+
if (this.options.escapeClose) {
|
53
|
+
$(document).on('keydown.modal', function(event) {
|
54
|
+
if (event.which == 27) $.modal.close();
|
55
|
+
});
|
56
|
+
}
|
57
|
+
if (this.options.clickClose) this.blocker.click($.modal.close);
|
58
|
+
},
|
59
|
+
|
60
|
+
close: function() {
|
61
|
+
this.unblock();
|
62
|
+
this.hide();
|
63
|
+
$(document).off('keydown.modal');
|
64
|
+
},
|
65
|
+
|
66
|
+
block: function() {
|
67
|
+
this.$elm.trigger($.modal.BEFORE_BLOCK, [this._ctx()]);
|
68
|
+
this.blocker = $('<div class="jquery-modal blocker"></div>').css({
|
69
|
+
top: 0, right: 0, bottom: 0, left: 0,
|
70
|
+
width: "100%", height: "100%",
|
71
|
+
position: "fixed",
|
72
|
+
zIndex: this.options.zIndex,
|
73
|
+
background: this.options.overlay,
|
74
|
+
opacity: this.options.opacity
|
75
|
+
});
|
76
|
+
this.$body.append(this.blocker);
|
77
|
+
this.$elm.trigger($.modal.BLOCK, [this._ctx()]);
|
78
|
+
},
|
79
|
+
|
80
|
+
unblock: function() {
|
81
|
+
this.blocker.remove();
|
82
|
+
},
|
83
|
+
|
84
|
+
show: function() {
|
85
|
+
this.$elm.trigger($.modal.BEFORE_OPEN, [this._ctx()]);
|
86
|
+
if (this.options.showClose) {
|
87
|
+
this.closeButton = $('<a href="#close-modal" rel="modal:close" class="close-modal">' + this.options.closeText + '</a>');
|
88
|
+
this.$elm.append(this.closeButton);
|
89
|
+
}
|
90
|
+
this.$elm.addClass(this.options.modalClass + ' current');
|
91
|
+
this.center();
|
92
|
+
this.$elm.show().trigger($.modal.OPEN, [this._ctx()]);
|
93
|
+
},
|
94
|
+
|
95
|
+
hide: function() {
|
96
|
+
this.$elm.trigger($.modal.BEFORE_CLOSE, [this._ctx()]);
|
97
|
+
if (this.closeButton) this.closeButton.remove();
|
98
|
+
this.$elm.removeClass('current').hide();
|
99
|
+
this.$elm.trigger($.modal.CLOSE, [this._ctx()]);
|
100
|
+
},
|
101
|
+
|
102
|
+
showSpinner: function() {
|
103
|
+
if (!this.options.showSpinner) return;
|
104
|
+
this.spinner = this.spinner || $('<div class="' + this.options.modalClass + '-spinner"></div>')
|
105
|
+
.append(this.options.spinnerHtml);
|
106
|
+
this.$body.append(this.spinner);
|
107
|
+
this.spinner.show();
|
108
|
+
},
|
109
|
+
|
110
|
+
hideSpinner: function() {
|
111
|
+
if (this.spinner) this.spinner.remove();
|
112
|
+
},
|
113
|
+
|
114
|
+
center: function() {
|
115
|
+
this.$elm.css({
|
116
|
+
position: 'fixed',
|
117
|
+
top: "50%",
|
118
|
+
left: "50%",
|
119
|
+
marginTop: - (this.$elm.outerHeight() / 2),
|
120
|
+
marginLeft: - (this.$elm.outerWidth() / 2),
|
121
|
+
zIndex: this.options.zIndex + 1
|
122
|
+
});
|
123
|
+
},
|
124
|
+
|
125
|
+
//Return context for custom events
|
126
|
+
_ctx: function() {
|
127
|
+
return { elm: this.$elm, blocker: this.blocker, options: this.options };
|
128
|
+
}
|
129
|
+
};
|
130
|
+
|
131
|
+
//resize is alias for center for now
|
132
|
+
$.modal.prototype.resize = $.modal.prototype.center;
|
133
|
+
|
134
|
+
$.modal.close = function(event) {
|
135
|
+
if (!current) return;
|
136
|
+
if (event) event.preventDefault();
|
137
|
+
current.close();
|
138
|
+
current = null;
|
139
|
+
};
|
140
|
+
|
141
|
+
$.modal.showSpinner = function(event) {
|
142
|
+
if (!current) return;
|
143
|
+
if (event) event.preventDefault();
|
144
|
+
current.showSpinner();
|
145
|
+
}
|
146
|
+
|
147
|
+
$.modal.hideSpinner = function(event) {
|
148
|
+
if (!current) return;
|
149
|
+
if (event) event.preventDefault();
|
150
|
+
current.hideSpinner();
|
151
|
+
}
|
152
|
+
|
153
|
+
$.modal.getWidget = function() {
|
154
|
+
if (!current)
|
155
|
+
return null;
|
156
|
+
else
|
157
|
+
return current.$elm;
|
158
|
+
}
|
159
|
+
|
160
|
+
$.modal.resize = function() {
|
161
|
+
if (!current) return;
|
162
|
+
current.resize();
|
163
|
+
};
|
164
|
+
|
165
|
+
$.modal.defaults = {
|
166
|
+
overlay: "#000",
|
167
|
+
opacity: 0.75,
|
168
|
+
zIndex: 1,
|
169
|
+
escapeClose: true,
|
170
|
+
clickClose: true,
|
171
|
+
closeText: 'Close',
|
172
|
+
modalClass: "modal",
|
173
|
+
spinnerHtml: null,
|
174
|
+
showSpinner: true,
|
175
|
+
showClose: true
|
176
|
+
};
|
177
|
+
|
178
|
+
// Event constants
|
179
|
+
$.modal.BEFORE_BLOCK = 'modal:before-block';
|
180
|
+
$.modal.BLOCK = 'modal:block';
|
181
|
+
$.modal.BEFORE_OPEN = 'modal:before-open';
|
182
|
+
$.modal.OPEN = 'modal:open';
|
183
|
+
$.modal.BEFORE_CLOSE = 'modal:before-close';
|
184
|
+
$.modal.CLOSE = 'modal:close';
|
185
|
+
$.modal.AJAX_SEND = 'modal:ajax:send';
|
186
|
+
$.modal.AJAX_SUCCESS = 'modal:ajax:success';
|
187
|
+
$.modal.AJAX_FAIL = 'modal:ajax:fail';
|
188
|
+
$.modal.AJAX_COMPLETE = 'modal:ajax:complete';
|
189
|
+
|
190
|
+
$.fn.modal = function(options){
|
191
|
+
if (this.length === 1) {
|
192
|
+
current = new $.modal(this, options);
|
193
|
+
}
|
194
|
+
return this;
|
195
|
+
};
|
196
|
+
|
197
|
+
// Automatically bind links with rel="modal:close" to, well, close the modal.
|
198
|
+
$(document).on('click', 'a[rel="modal:close"]', $.modal.close);
|
199
|
+
$(document).on('click', 'a[rel="modal:open"]', function(event) {
|
200
|
+
event.preventDefault();
|
201
|
+
$(this).modal();
|
202
|
+
});
|
203
|
+
|
204
|
+
// Automatically bind links with rel="modal:open:ajaxpost" to
|
205
|
+
$(document).on('click', 'a[rel="modal:open:ajaxpost"]', function(event)
|
206
|
+
{
|
207
|
+
//ensure that our custom events will be received
|
208
|
+
event.preventDefault();
|
209
|
+
|
210
|
+
// show the dialog
|
211
|
+
$(this).modal();
|
212
|
+
|
213
|
+
// bind the event when the ajax call is completed
|
214
|
+
$(this).bind($.modal.AJAX_COMPLETE, function() {
|
215
|
+
// configure the submit handler
|
216
|
+
$('form').submit(function(){
|
217
|
+
|
218
|
+
// save the current form
|
219
|
+
current_form = $(this);
|
220
|
+
|
221
|
+
// show the spinner again
|
222
|
+
$.modal.showSpinner();
|
223
|
+
|
224
|
+
// send the ajax call
|
225
|
+
$.ajax({
|
226
|
+
type: this.method,
|
227
|
+
url: this.action + '.json',
|
228
|
+
data: $(this).serialize(),
|
229
|
+
dataType: 'html',
|
230
|
+
success: function(data)
|
231
|
+
{
|
232
|
+
// hide the sinner
|
233
|
+
$.modal.hideSpinner();
|
234
|
+
|
235
|
+
// close the dialog
|
236
|
+
$.modal.close();
|
237
|
+
},
|
238
|
+
error: function(data)
|
239
|
+
{
|
240
|
+
// hide the sinner
|
241
|
+
$.modal.hideSpinner();
|
242
|
+
|
243
|
+
// remove the older error message
|
244
|
+
current_form.find(".error").remove()
|
245
|
+
|
246
|
+
// parse the result
|
247
|
+
var obj = jQuery.parseJSON(data.responseText);
|
248
|
+
|
249
|
+
$.each(obj.errors, function(key, value)
|
250
|
+
{
|
251
|
+
|
252
|
+
current_form.find("#"+ current_form.attr("id").split('_').pop()+ "_" + key).after('<span class="error">'+ value[0] + '</span>');
|
253
|
+
});
|
254
|
+
}
|
255
|
+
});
|
256
|
+
return false;
|
257
|
+
});
|
258
|
+
});
|
259
|
+
|
260
|
+
|
261
|
+
// return false to prevent normal anchor action
|
262
|
+
return false;
|
263
|
+
});
|
264
|
+
|
265
|
+
})(jQuery);
|
@@ -0,0 +1,45 @@
|
|
1
|
+
.modal {
|
2
|
+
display: none;
|
3
|
+
width: 400px;
|
4
|
+
background: #fff;
|
5
|
+
padding: 15px 30px;
|
6
|
+
-webkit-border-radius: 8px;
|
7
|
+
-moz-border-radius: 8px;
|
8
|
+
-o-border-radius: 8px;
|
9
|
+
-ms-border-radius: 8px;
|
10
|
+
border-radius: 8px;
|
11
|
+
-webkit-box-shadow: 0 0 10px #000;
|
12
|
+
-moz-box-shadow: 0 0 10px #000;
|
13
|
+
-o-box-shadow: 0 0 10px #000;
|
14
|
+
-ms-box-shadow: 0 0 10px #000;
|
15
|
+
box-shadow: 0 0 10px #000;
|
16
|
+
}
|
17
|
+
|
18
|
+
.modal a.close-modal {
|
19
|
+
position: absolute;
|
20
|
+
top: -12.5px;
|
21
|
+
right: -12.5px;
|
22
|
+
display: block;
|
23
|
+
width: 30px;
|
24
|
+
height: 30px;
|
25
|
+
text-indent: -9999px;
|
26
|
+
background: url(close.png) no-repeat 0 0;
|
27
|
+
}
|
28
|
+
|
29
|
+
.modal-spinner {
|
30
|
+
display: none;
|
31
|
+
width: 64px;
|
32
|
+
height: 64px;
|
33
|
+
position: fixed;
|
34
|
+
top: 50%;
|
35
|
+
left: 50%;
|
36
|
+
margin-right: -32px;
|
37
|
+
margin-top: -32px;
|
38
|
+
background: url(spinner.gif) #111 no-repeat center center;
|
39
|
+
-webkit-border-radius: 8px;
|
40
|
+
-moz-border-radius: 8px;
|
41
|
+
-o-border-radius: 8px;
|
42
|
+
-ms-border-radius: 8px;
|
43
|
+
border-radius: 8px;
|
44
|
+
z-index: 9999;
|
45
|
+
}
|