ajax_pagination 0.6.0 → 0.6.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 +1 -1
- data/CHANGELOG.md +6 -0
- data/Rakefile +6 -5
- data/lib/ajax_pagination/controller_additions.rb +11 -14
- data/lib/ajax_pagination/helper_additions.rb +7 -10
- data/lib/ajax_pagination/version.rb +1 -1
- data/lib/assets/javascripts/ajax_pagination.js.erb +83 -90
- data/spec/ajax_pagination/controller_additions_spec.rb +31 -29
- data/spec/ajax_pagination/helper_additions_spec.rb +2 -2
- data/spec/ajax_pagination/integration/warnings_spec.rb +0 -8
- data/spec/rails30_app/Gemfile.lock +96 -0
- data/spec/rails30_app/public/javascripts/ajax_pagination.js +84 -91
- data/spec/rails_app/Gemfile.lock +107 -0
- data/spec/rails_app/app/views/pages/warnings.html.erb +0 -7
- metadata +131 -86
@@ -4,11 +4,13 @@ module SetAjaxSection
|
|
4
4
|
def ajax_section= (name)
|
5
5
|
@_ajax_section = name
|
6
6
|
end
|
7
|
+
def controller_path
|
8
|
+
"dummycontroller"
|
9
|
+
end
|
7
10
|
end
|
8
11
|
|
9
12
|
describe AjaxPagination::ControllerAdditions do
|
10
|
-
def
|
11
|
-
@controller.stub!(:params).and_return({:pagination => name, :controller => "dummycontroller"})
|
13
|
+
def stub_ajax_section(name)
|
12
14
|
@controller.ajax_section = name
|
13
15
|
end
|
14
16
|
def stub_request_format_html(bool)
|
@@ -33,40 +35,40 @@ describe AjaxPagination::ControllerAdditions do
|
|
33
35
|
end
|
34
36
|
|
35
37
|
describe 'ajax_respond' do
|
36
|
-
it 'should not render when
|
38
|
+
it 'should not render when section_id parameter not defined' do
|
37
39
|
@controller.ajax_respond(@formatter).should be_false
|
38
|
-
@controller.ajax_respond(@formatter, :
|
39
|
-
@controller.ajax_respond(@formatter, :
|
40
|
-
@controller.ajax_respond(@formatter, :
|
40
|
+
@controller.ajax_respond(@formatter, :section_id => :page).should be_false
|
41
|
+
@controller.ajax_respond(@formatter, :section_id => 'page').should be_false
|
42
|
+
@controller.ajax_respond(@formatter, :section_id => 'page2').should be_false
|
41
43
|
@formatter.html.should == 0
|
42
44
|
end
|
43
|
-
it 'should render when
|
44
|
-
|
45
|
+
it 'should render when section_id parameter matches' do
|
46
|
+
stub_ajax_section('global')
|
45
47
|
@controller.ajax_respond(@formatter).should be_true
|
46
48
|
@formatter.html.should == 1 # detects html function was called once (but checking also calls the function) ...
|
47
|
-
|
48
|
-
@controller.ajax_respond(@formatter, :
|
49
|
+
stub_ajax_section('page')
|
50
|
+
@controller.ajax_respond(@formatter, :section_id => :page).should be_true
|
49
51
|
@formatter.html.should == 3 # ... which is why the next check should be 2 more html function calls
|
50
|
-
@controller.ajax_respond(@formatter, :
|
52
|
+
@controller.ajax_respond(@formatter, :section_id => 'page').should be_true
|
51
53
|
@formatter.html.should == 5
|
52
|
-
|
53
|
-
@controller.ajax_respond(@formatter, :
|
54
|
+
stub_ajax_section('pageX')
|
55
|
+
@controller.ajax_respond(@formatter, :section_id => 'pageX').should be_true
|
54
56
|
@formatter.html.should == 7
|
55
57
|
stub_lookup_context(['matching_partial_found'])
|
56
|
-
@controller.ajax_respond(@formatter, :
|
58
|
+
@controller.ajax_respond(@formatter, :section_id => 'pageX').should be_true
|
57
59
|
@formatter.html.should == 9
|
58
|
-
|
60
|
+
stub_ajax_section('global')
|
59
61
|
@controller.ajax_respond(@formatter).should be_true
|
60
62
|
@formatter.html.should == 11
|
61
63
|
|
62
64
|
end
|
63
|
-
it 'should not render when
|
64
|
-
|
65
|
+
it 'should not render when section_id parameter does not match' do
|
66
|
+
stub_ajax_section('notpage')
|
65
67
|
@controller.ajax_respond(@formatter).should be_false
|
66
|
-
@controller.ajax_respond(@formatter, :
|
67
|
-
@controller.ajax_respond(@formatter, :
|
68
|
-
|
69
|
-
@controller.ajax_respond(@formatter, :
|
68
|
+
@controller.ajax_respond(@formatter, :section_id => :page).should be_false
|
69
|
+
@controller.ajax_respond(@formatter, :section_id => 'page').should be_false
|
70
|
+
stub_ajax_section('notpageX')
|
71
|
+
@controller.ajax_respond(@formatter, :section_id => 'pageX').should be_false
|
70
72
|
@formatter.html.should == 0
|
71
73
|
end
|
72
74
|
end
|
@@ -75,26 +77,26 @@ describe AjaxPagination::ControllerAdditions do
|
|
75
77
|
it 'should display partial when format is not html' do
|
76
78
|
@controller.ajax_section_displayed?.should be_true
|
77
79
|
end
|
78
|
-
it 'should display partial when format is html but
|
80
|
+
it 'should display partial when format is html but section_id is not defined' do
|
79
81
|
stub_request_format_html(true)
|
80
82
|
@controller.ajax_section_displayed?.should be_true
|
81
83
|
end
|
82
|
-
it 'should display partial when .html?
|
84
|
+
it 'should display partial when .html?section_id=pagename' do
|
83
85
|
stub_request_format_html(true)
|
84
|
-
|
86
|
+
stub_ajax_section('global')
|
85
87
|
@controller.ajax_section_displayed?.should be_true
|
86
|
-
|
88
|
+
stub_ajax_section('page2')
|
87
89
|
@controller.ajax_section_displayed?('page2').should be_true
|
88
|
-
|
90
|
+
stub_ajax_section('page3')
|
89
91
|
@controller.ajax_section_displayed?(:page3).should be_true
|
90
92
|
end
|
91
93
|
it 'should not display partial when .html?pagination!=pagename' do
|
92
94
|
stub_request_format_html(true)
|
93
|
-
|
95
|
+
stub_ajax_section('notpage')
|
94
96
|
@controller.ajax_section_displayed?.should be_false
|
95
|
-
|
97
|
+
stub_ajax_section('notpage2')
|
96
98
|
@controller.ajax_section_displayed?('page2').should be_false
|
97
|
-
|
99
|
+
stub_ajax_section('notpage3')
|
98
100
|
@controller.ajax_section_displayed?(:page3).should be_false
|
99
101
|
end
|
100
102
|
end
|
@@ -18,11 +18,11 @@ describe AjaxPagination::HelperAdditions do
|
|
18
18
|
@view.should_receive(:render).with('global')
|
19
19
|
@view.ajax_section
|
20
20
|
@view.should_receive(:render).with('page2')
|
21
|
-
@view.ajax_section :
|
21
|
+
@view.ajax_section :id => 'page2' # renders the partial named :id if :partial not defined
|
22
22
|
@view.should_receive(:render).with('page3')
|
23
23
|
@view.ajax_section :render => 'page3' # if partial defined, renders partial
|
24
24
|
@view.should_receive(:render).with('pageX')
|
25
|
-
@view.ajax_section :
|
25
|
+
@view.ajax_section :id => 'page10', :render => 'pageX' # even if id also defined as different value
|
26
26
|
end
|
27
27
|
end
|
28
28
|
describe 'ajax_loadzone' do
|
@@ -21,14 +21,6 @@ describe 'javascript warnings', :js => true do
|
|
21
21
|
page.should have_content("Disabled")
|
22
22
|
end
|
23
23
|
|
24
|
-
it 'warns about missing reference' do
|
25
|
-
visit("http://localhost:#{SERVERPORT}/pages/warnings")
|
26
|
-
find("#missingreferencelink").click
|
27
|
-
alertmsg = page.driver.browser.switch_to.alert.text
|
28
|
-
alertmsg.should include("MISSING_REFERENCE")
|
29
|
-
page.driver.browser.switch_to.alert.accept
|
30
|
-
end
|
31
|
-
|
32
24
|
it 'warns about reference to more than one section of same id' do
|
33
25
|
visit("http://localhost:#{SERVERPORT}/pages/warnings")
|
34
26
|
find("#doublesectionlink").click
|
@@ -0,0 +1,96 @@
|
|
1
|
+
PATH
|
2
|
+
remote: ../..
|
3
|
+
specs:
|
4
|
+
ajax_pagination (0.6.1.alpha)
|
5
|
+
jquery-historyjs
|
6
|
+
jquery-rails (>= 1.0.17)
|
7
|
+
rails (>= 3.0)
|
8
|
+
|
9
|
+
GEM
|
10
|
+
remote: https://rubygems.org/
|
11
|
+
specs:
|
12
|
+
abstract (1.0.0)
|
13
|
+
actionmailer (3.0.12)
|
14
|
+
actionpack (= 3.0.12)
|
15
|
+
mail (~> 2.2.19)
|
16
|
+
actionpack (3.0.12)
|
17
|
+
activemodel (= 3.0.12)
|
18
|
+
activesupport (= 3.0.12)
|
19
|
+
builder (~> 2.1.2)
|
20
|
+
erubis (~> 2.6.6)
|
21
|
+
i18n (~> 0.5.0)
|
22
|
+
rack (~> 1.2.5)
|
23
|
+
rack-mount (~> 0.6.14)
|
24
|
+
rack-test (~> 0.5.7)
|
25
|
+
tzinfo (~> 0.3.23)
|
26
|
+
activemodel (3.0.12)
|
27
|
+
activesupport (= 3.0.12)
|
28
|
+
builder (~> 2.1.2)
|
29
|
+
i18n (~> 0.5.0)
|
30
|
+
activerecord (3.0.12)
|
31
|
+
activemodel (= 3.0.12)
|
32
|
+
activesupport (= 3.0.12)
|
33
|
+
arel (~> 2.0.10)
|
34
|
+
tzinfo (~> 0.3.23)
|
35
|
+
activeresource (3.0.12)
|
36
|
+
activemodel (= 3.0.12)
|
37
|
+
activesupport (= 3.0.12)
|
38
|
+
activesupport (3.0.12)
|
39
|
+
arel (2.0.10)
|
40
|
+
builder (2.1.2)
|
41
|
+
erubis (2.6.6)
|
42
|
+
abstract (>= 1.0.0)
|
43
|
+
i18n (0.5.0)
|
44
|
+
jquery-historyjs (0.2.3)
|
45
|
+
railties (>= 3.0)
|
46
|
+
thor (>= 0.14)
|
47
|
+
jquery-rails (1.0.19)
|
48
|
+
railties (~> 3.0)
|
49
|
+
thor (~> 0.14)
|
50
|
+
json (1.6.5)
|
51
|
+
mail (2.2.19)
|
52
|
+
activesupport (>= 2.3.6)
|
53
|
+
i18n (>= 0.4.0)
|
54
|
+
mime-types (~> 1.16)
|
55
|
+
treetop (~> 1.4.8)
|
56
|
+
mime-types (1.17.2)
|
57
|
+
polyglot (0.3.3)
|
58
|
+
rack (1.2.5)
|
59
|
+
rack-mount (0.6.14)
|
60
|
+
rack (>= 1.0.0)
|
61
|
+
rack-test (0.5.7)
|
62
|
+
rack (>= 1.0)
|
63
|
+
rails (3.0.12)
|
64
|
+
actionmailer (= 3.0.12)
|
65
|
+
actionpack (= 3.0.12)
|
66
|
+
activerecord (= 3.0.12)
|
67
|
+
activeresource (= 3.0.12)
|
68
|
+
activesupport (= 3.0.12)
|
69
|
+
bundler (~> 1.0)
|
70
|
+
railties (= 3.0.12)
|
71
|
+
railties (3.0.12)
|
72
|
+
actionpack (= 3.0.12)
|
73
|
+
activesupport (= 3.0.12)
|
74
|
+
rake (>= 0.8.7)
|
75
|
+
rdoc (~> 3.4)
|
76
|
+
thor (~> 0.14.4)
|
77
|
+
rake (0.9.2.2)
|
78
|
+
rdoc (3.12)
|
79
|
+
json (~> 1.4)
|
80
|
+
thor (0.14.6)
|
81
|
+
treetop (1.4.10)
|
82
|
+
polyglot
|
83
|
+
polyglot (>= 0.3.1)
|
84
|
+
tzinfo (0.3.32)
|
85
|
+
will_paginate (3.0.3)
|
86
|
+
|
87
|
+
PLATFORMS
|
88
|
+
ruby
|
89
|
+
|
90
|
+
DEPENDENCIES
|
91
|
+
ajax_pagination!
|
92
|
+
jquery-historyjs
|
93
|
+
jquery-rails
|
94
|
+
json
|
95
|
+
rails (~> 3.0.0)
|
96
|
+
will_paginate
|
@@ -2,7 +2,7 @@
|
|
2
2
|
//= require jquery.url
|
3
3
|
|
4
4
|
/*
|
5
|
-
* AJAX Pagination: Ajaxifying your navigation
|
5
|
+
* AJAX Pagination v0.6.1.alpha: Ajaxifying your navigation
|
6
6
|
* https://github.com/ronalchn/ajax_pagination
|
7
7
|
*
|
8
8
|
* Copyright (c) 2012 Ronald Ping Man Chan
|
@@ -44,19 +44,19 @@ jQuery(document).ready(function () {
|
|
44
44
|
////// $.ajax_pagination API //////
|
45
45
|
///////////////////////////////////
|
46
46
|
// selector function for pagination object
|
47
|
-
$.ajax_pagination = function (
|
48
|
-
return new
|
47
|
+
$.ajax_pagination = function (section_id) {
|
48
|
+
return new ajax_section_object(section_id);
|
49
49
|
};
|
50
|
-
$.ajax_pagination.version = '0.6.
|
50
|
+
$.ajax_pagination.version = '0.6.1.alpha';
|
51
51
|
$.ajax_pagination.enabled = true;
|
52
|
-
function
|
52
|
+
function ajax_section_object(section_id) {
|
53
53
|
this.get = function(url,options) {
|
54
54
|
if (options === undefined) options = {};
|
55
55
|
if (options.history === undefined) options.history = true;
|
56
|
-
swapPage(
|
56
|
+
swapPage(section_id,url,options.history);
|
57
57
|
}
|
58
58
|
this.exists = function() {
|
59
|
-
return $('#' +
|
59
|
+
return $('#' + section_id).length == 1;
|
60
60
|
}
|
61
61
|
}
|
62
62
|
/////////////////////////////
|
@@ -66,42 +66,44 @@ jQuery(document).ready(function () {
|
|
66
66
|
var pagination_url = location.href; // url we came from, so we can see transitions of the url
|
67
67
|
var history_state = {ajax_pagination_set:true}; // current history state
|
68
68
|
|
69
|
-
function display_pagination_loader(
|
70
|
-
var
|
71
|
-
if (pagination_loader_state[
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
69
|
+
function display_pagination_loader(section_id) {
|
70
|
+
var ajax_section = getSection(section_id);
|
71
|
+
if (pagination_loader_state[section_id] === undefined) { // show loader if not already shown
|
72
|
+
// get the ajax_loadzone DOM element
|
73
|
+
var ajax_loadzone;
|
74
|
+
if (ajax_section.hasClass("ajax_loadzone")) ajax_loadzone = ajax_section; // if the whole section is a loading zone
|
75
|
+
else ajax_loadzone = ajax_section.children(".ajax_loadzone").first(); // don't want to support multiple loader images
|
76
|
+
|
77
|
+
if ($.rails.fire(getSection(section_id),"ajaxp:loading",[ajax_loadzone.get(0)])) {
|
78
|
+
var height = ajax_loadzone.height();
|
77
79
|
// setup loading look
|
78
80
|
var img = document.createElement("IMG");
|
79
|
-
if (
|
81
|
+
if (ajax_section.data("pagination") !== undefined && ajax_section.data("pagination").image !== undefined) img.src = ajax_section.data("pagination").image;
|
80
82
|
else img.src = "/images/ajax-loader.gif";
|
81
83
|
var margin = Math.round(height>400?50:(height/8));
|
82
84
|
$(img).addClass('ajaxpagination-loader');
|
83
85
|
var div = document.createElement("DIV");
|
84
86
|
$(div).addClass('ajaxpagination-loadzone');
|
85
87
|
$(div).append("<div class=\"margin-top\" />").append(img);
|
86
|
-
|
87
|
-
|
88
|
+
ajax_loadzone.wrapInner("<div class=\"ajaxpagination-oldcontent\" />");
|
89
|
+
ajax_loadzone.append(div);
|
88
90
|
}
|
89
91
|
}
|
90
|
-
if ($.rails.fire(getSection(
|
91
|
-
// scroll to top of
|
92
|
-
if ($(document).scrollTop() >
|
93
|
-
$(document).scrollTop(
|
92
|
+
if ($.rails.fire(getSection(section_id),"ajaxp:focus")) {
|
93
|
+
// scroll to top of ajax_section if it is not visible
|
94
|
+
if ($(document).scrollTop() > ajax_section.offset().top - 20) {
|
95
|
+
$(document).scrollTop(ajax_section.offset().top - 20);
|
94
96
|
}
|
95
97
|
}
|
96
98
|
}
|
97
|
-
function getSection(
|
98
|
-
var id = "#" +
|
99
|
+
function getSection(section_id) {
|
100
|
+
var id = "#" + section_id; // element id we are looking for
|
99
101
|
return $(id);
|
100
102
|
}
|
101
103
|
function getSectionName(section) {
|
102
104
|
var id = section.attr("id");
|
103
105
|
if (id === undefined) return undefined; // no name
|
104
|
-
return id; // id =
|
106
|
+
return id; // id = section_id
|
105
107
|
}
|
106
108
|
function getSectionNames(sections) {
|
107
109
|
var names = new Array();
|
@@ -120,9 +122,9 @@ jQuery(document).ready(function () {
|
|
120
122
|
return false; // doesn't intersect
|
121
123
|
}
|
122
124
|
// whether change of state is a reload
|
123
|
-
function isReload(
|
125
|
+
function isReload(section_id,from,to) {
|
124
126
|
if (from == to) return true; // same url - always a reload
|
125
|
-
var section = getSection(
|
127
|
+
var section = getSection(section_id);
|
126
128
|
if (section.length == 0) return false;
|
127
129
|
|
128
130
|
// if data-pagination is not defined, then no reload can be detected
|
@@ -154,25 +156,25 @@ jQuery(document).ready(function () {
|
|
154
156
|
}
|
155
157
|
// when this function is used beforeSend of an AJAX request, will use the resulting content in a section of the page
|
156
158
|
// this event handler has the same arguments as for jquery and jquery-ujs, except it also takes the name of the section to put the content into as first argument
|
157
|
-
// adapter functions will be used to reconcile the differences in arguments, this is required because jquery and jquery-ujs has different ways to get the
|
158
|
-
function beforeSendHandler(
|
159
|
-
var id = "#" +
|
159
|
+
// adapter functions will be used to reconcile the differences in arguments, this is required because jquery and jquery-ujs has different ways to get the section_id argument
|
160
|
+
function beforeSendHandler(section_id,jqXHR,settings) {
|
161
|
+
var id = "#" + section_id; // element id we are looking for
|
160
162
|
var requesturl = settings.url;
|
161
|
-
var countid = $('[id="' +
|
163
|
+
var countid = $('[id="' + section_id + '"]').length;
|
162
164
|
if (countid != 1) { // something wrong, cannot find unique section to load page into
|
163
165
|
|
164
|
-
alert("AJAX Pagination UNIQUE_SECTION_NOT_FOUND:\nExpected one
|
166
|
+
alert("AJAX Pagination UNIQUE_SECTION_NOT_FOUND:\nExpected one section with id of " + section_id + ", found " + countid);
|
165
167
|
|
166
168
|
return false; // continue AJAX normally
|
167
169
|
}
|
168
|
-
if (!$.rails.fire(getSection(
|
169
|
-
display_pagination_loader(
|
170
|
+
if (!$.rails.fire(getSection(section_id),"ajaxp:beforeSend",[jqXHR,settings])) return false;
|
171
|
+
display_pagination_loader(section_id);
|
170
172
|
// register callbacks for other events
|
171
173
|
jqXHR.done(function(data, textStatus, jqXHR) {
|
172
|
-
if (requesturl != pagination_loader_state[
|
174
|
+
if (requesturl != pagination_loader_state[section_id]) return; // ignore stale content
|
173
175
|
if (jqXHR.status == 200 && jqXHR.getResponseHeader('Location') !== null) { // special AJAX redirect
|
174
176
|
var redirecturl = jqXHR.getResponseHeader('Location');
|
175
|
-
swapPage(
|
177
|
+
swapPage(section_id,redirecturl);
|
176
178
|
pagination_url = redirecturl;
|
177
179
|
History.replaceState(history_state,document.title,redirecturl); // state not changed
|
178
180
|
return;
|
@@ -190,7 +192,7 @@ jQuery(document).ready(function () {
|
|
190
192
|
if (content.length>0) {
|
191
193
|
content = content.html();
|
192
194
|
|
193
|
-
alert("AJAX Pagination EXTRA_CONTENT_DISCARDED:\nExtra content returned by AJAX request ignored. Only a portion of the page content returned by the server was required. To fix this, explicitly call ajax_respond :
|
195
|
+
alert("AJAX Pagination EXTRA_CONTENT_DISCARDED:\nExtra content returned by AJAX request ignored. Only a portion of the page content returned by the server was required. To fix this, explicitly call ajax_respond :section_id => \"" + section_id + "\" to render only the partial view required. This warning can be turned off in the ajax_pagination initializer file.");
|
194
196
|
|
195
197
|
}
|
196
198
|
else { // otherwise use all the content, including any scripts - we consider scripts specifically returned in the partial probably should be re-run
|
@@ -199,76 +201,67 @@ jQuery(document).ready(function () {
|
|
199
201
|
else content = page.html(); // otherwise include the whole html snippet
|
200
202
|
}
|
201
203
|
|
202
|
-
if ($.rails.fire(getSection(
|
204
|
+
if ($.rails.fire(getSection(section_id),"ajaxp:done",[content])) $(id).html(content);
|
203
205
|
|
204
|
-
delete pagination_loader_state[
|
206
|
+
delete pagination_loader_state[section_id]; // not waiting for page anymore
|
205
207
|
|
206
|
-
$.rails.fire(getSection(
|
208
|
+
$.rails.fire(getSection(section_id),"ajaxp:loaded");
|
207
209
|
});
|
208
210
|
jqXHR.fail(function(jqXHR, textStatus, errorThrown) {
|
209
|
-
if (requesturl != pagination_loader_state[
|
210
|
-
if ($.rails.fire(getSection(
|
211
|
+
if (requesturl != pagination_loader_state[section_id]) return; // ignore stale content
|
212
|
+
if ($.rails.fire(getSection(section_id),"ajaxp:fail",[jqXHR.responseText])) $(id).html(jqXHR.responseText);
|
211
213
|
|
212
|
-
delete pagination_loader_state[
|
214
|
+
delete pagination_loader_state[section_id]; // not waiting for page anymore
|
213
215
|
|
214
|
-
$.rails.fire(getSection(
|
216
|
+
$.rails.fire(getSection(section_id),"ajaxp:loaded");
|
215
217
|
});
|
216
218
|
return true;
|
217
219
|
}
|
218
|
-
function swapPage(
|
220
|
+
function swapPage(section_id, requesturl, history) { // swaps the page at section_id to that from requesturl (used by History.popState, therefore no remote link has been clicked)
|
219
221
|
if (history === undefined) history = false;
|
220
222
|
// send our own ajax request, and tie it into the beforeSendHandler used for jquery-ujs as well
|
221
|
-
if (!$.rails.fire(getSection(
|
222
|
-
$.ajax({url: requesturl, data: {
|
223
|
+
if (!$.rails.fire(getSection(section_id),"ajaxp:before",[requesturl,undefined])) return false;
|
224
|
+
$.ajax({url: requesturl, data: {ajax_section:section_id},
|
223
225
|
dataType: 'html',
|
224
226
|
beforeSend: function (jqXHR,settings) {
|
225
|
-
var result = beforeSendHandler(
|
227
|
+
var result = beforeSendHandler(section_id,jqXHR,settings);
|
226
228
|
if (result) {
|
227
|
-
if (history) pushHistory(
|
228
|
-
pagination_loader_state[
|
229
|
+
if (history) pushHistory(section_id,settings.url);
|
230
|
+
pagination_loader_state[section_id] = settings.url; // remember which page number we are waiting for
|
229
231
|
}
|
230
232
|
return result;
|
231
233
|
}
|
232
234
|
});
|
233
235
|
}
|
234
|
-
function pushHistory(
|
235
|
-
var data = $("#" +
|
236
|
+
function pushHistory(section_id,url) {
|
237
|
+
var data = $("#" + section_id).data("pagination");
|
236
238
|
if (data === undefined || data.history === undefined || data.history) { // check that history is not disabled
|
237
239
|
// construct visible url
|
238
240
|
var data = $.deparam.querystring($.url(url).attr('query'));
|
239
|
-
delete data['
|
241
|
+
delete data['ajax_section'];
|
240
242
|
pagination_url = $.param.querystring(url,data,2);
|
241
|
-
if (isReload(
|
243
|
+
if (isReload(section_id,url,location.href)) History.replaceState(history_state,document.title,pagination_url);
|
242
244
|
else { // not just a reload of current page, so do actual pushState
|
243
245
|
// change current history state, and push it on
|
244
246
|
if (history_state.ajax_pagination === undefined) history_state.ajax_pagination = new Array();
|
245
|
-
var fieldname = "_" +
|
247
|
+
var fieldname = "_" + section_id;
|
246
248
|
if (history_state.ajax_pagination[fieldname] === undefined) history_state.ajax_pagination[fieldname]=1;
|
247
249
|
else history_state.ajax_pagination[fieldname]++;
|
248
250
|
History.pushState(history_state,document.title,pagination_url); // push state
|
249
251
|
}
|
250
252
|
}
|
251
253
|
}
|
252
|
-
// these special containers are for convenience only, to apply the required data-remote, data-
|
254
|
+
// these special containers are for convenience only, to apply the required data-remote, data-ajax_section_id attributes to all links inside
|
253
255
|
$(document).on("click", ".ajaxpagination a", function(e) {
|
254
256
|
// ignore if already selected by jquery-ujs
|
255
257
|
if ($(this).filter($.rails.linkClickSelector).length>0) return true; // continue with jquery-ujs - this behaviour is necessary because we do not know if the jquery-ujs handler executes before or after this handler
|
256
|
-
// find out what data-
|
258
|
+
// find out what data-ajax_section_id should be set to
|
257
259
|
var pagination_container = $(this).closest(".ajaxpagination"); // container of links (use to check for data-pagination first)
|
258
|
-
var
|
259
|
-
if (pagination_name === undefined) {
|
260
|
-
pagination_name = $(this).closest(".paginated_section").attr("id"); // if data-pagination not present, search up the tree for a suitable section
|
261
|
-
if (pagination_name == null) {
|
262
|
-
|
263
|
-
alert("AJAX Pagination MISSING_REFERENCE:\nNo pagination section id given for link, and none could be implicitly assigned, AJAX cancelled for this request");
|
264
|
-
|
265
|
-
return true; // pagination not set up properly
|
266
|
-
}
|
267
|
-
}
|
260
|
+
var section_id = pagination_container.data('ajax_section_id');
|
268
261
|
|
269
|
-
// set data-remote, data-
|
262
|
+
// set data-remote, data-ajax_section_id
|
270
263
|
$(this).attr({'data-remote':'true'}); // needs to be set so that the jquery-ujs selectors work
|
271
|
-
$(this).data({'remote':'true','
|
264
|
+
$(this).data({'remote':'true','ajax_section_id':section_id}); // needs to be set because attributes only read into jquery's data memory once
|
272
265
|
if ($(this).data('type') === undefined) { // to be moved to ajax:before filter when https://github.com/rails/jquery-ujs/pull/241 is successful, and jquery-rails minimum version updated
|
273
266
|
$(this).data('type','html'); // AJAX Pagination requests return html be default
|
274
267
|
}
|
@@ -280,24 +273,24 @@ jQuery(document).ready(function () {
|
|
280
273
|
return false;
|
281
274
|
});
|
282
275
|
$(document).on("ajax:before","a, " + $.rails.inputChangeSelector, function() {
|
283
|
-
var
|
284
|
-
if (
|
285
|
-
$(this).data('params',$.extend($(this).data('params'),{'
|
286
|
-
return $.rails.fire(getSection(
|
276
|
+
var section_id = $(this).data('ajax_section_id');
|
277
|
+
if (section_id === undefined) return true; // this is not an AJAX Pagination AJAX request
|
278
|
+
$(this).data('params',$.extend($(this).data('params'),{'ajax_section':section_id})); // add data-pagination to the params data
|
279
|
+
return $.rails.fire(getSection(section_id),"ajaxp:before",[this.href,$(this).data('method')]);
|
287
280
|
});
|
288
281
|
$(document).on("ajax:before","form", function() {
|
289
|
-
var
|
290
|
-
if (
|
282
|
+
var section_id = $(this).data('ajax_section_id');
|
283
|
+
if (section_id === undefined) return true; // this is not an AJAX Pagination AJAX request
|
291
284
|
// alter action to include pagination parameter in the GET part of the action url
|
292
|
-
$(this).attr('action',$.param.querystring($(this).attr('action'),{
|
293
|
-
return $.rails.fire(getSection(
|
285
|
+
$(this).attr('action',$.param.querystring($(this).attr('action'),{ajax_section:section_id}));
|
286
|
+
return $.rails.fire(getSection(section_id),"ajaxp:before",[$(this).attr('action'),$(this).data('method')]);
|
294
287
|
});
|
295
288
|
$(document).on("ajax:beforeSend","a, form, " + $.rails.inputChangeSelector, function (e,jqXHR,settings) {
|
296
|
-
var
|
297
|
-
if (
|
298
|
-
if (beforeSendHandler(
|
299
|
-
pushHistory(
|
300
|
-
pagination_loader_state[
|
289
|
+
var section_id = $(this).data('ajax_section_id');
|
290
|
+
if (section_id === undefined) return true; // this is not an AJAX Pagination AJAX request
|
291
|
+
if (beforeSendHandler(section_id,jqXHR,settings)) {
|
292
|
+
pushHistory(section_id,settings.url);
|
293
|
+
pagination_loader_state[section_id] = settings.url;
|
301
294
|
}
|
302
295
|
return true;
|
303
296
|
});
|
@@ -332,11 +325,11 @@ jQuery(document).ready(function () {
|
|
332
325
|
}
|
333
326
|
history_state = state; // we can update our view of the state now
|
334
327
|
|
335
|
-
changedsections.sort(); // sort the
|
328
|
+
changedsections.sort(); // sort the section_ids stored in array
|
336
329
|
for (var i = 0; i < changedsections.length; i++) {
|
337
330
|
var section = getSection(changedsections[i]);
|
338
331
|
if (section.length == 0) continue; // no longer exists on page (meaning it does not need reloading)
|
339
|
-
var parentsections = getSectionNames(section.parents(".
|
332
|
+
var parentsections = getSectionNames(section.parents(".ajax_section"));
|
340
333
|
parentsections.sort();
|
341
334
|
// check for intersection
|
342
335
|
if (!intersects(changedsections,parentsections)) { // no intersection, load new content in this section
|
@@ -350,21 +343,21 @@ jQuery(document).ready(function () {
|
|
350
343
|
History.Adapter.trigger(window,"popstate"); // update stuff on page load
|
351
344
|
|
352
345
|
// trigger a loaded event on each section on initial page load
|
353
|
-
$.rails.fire($(".
|
346
|
+
$.rails.fire($(".ajax_section"),"ajaxp:loaded");
|
354
347
|
}
|
355
348
|
else {
|
356
349
|
// AJAX Pagination is disabled, we need to tidy up a few things to keep things working
|
357
350
|
|
358
351
|
// remove remote attribute globally
|
359
|
-
$("a[data-
|
360
|
-
$("a[data-
|
361
|
-
$("form[data-
|
362
|
-
$("form[data-
|
352
|
+
$("a[data-ajax_section_id]").removeData('remote');
|
353
|
+
$("a[data-ajax_section_id]").removeAttr('data-remote');
|
354
|
+
$("form[data-ajax_section_id]").removeData('remote');
|
355
|
+
$("form[data-ajax_section_id]").removeAttr('data-remote');
|
363
356
|
|
364
357
|
// set an event handler to remove the remote attribute if new content is loaded with AJAX Pagination
|
365
|
-
$(document).children().add(".
|
358
|
+
$(document).children().add(".ajax_section").delegate("a, input, form","click.rails change.rails submit.rails", function(event) {
|
366
359
|
var element = $(event.target);
|
367
|
-
if (element.data('
|
360
|
+
if (element.data('ajax_section_id') === undefined) return true;
|
368
361
|
else {
|
369
362
|
element.removeData('remote');
|
370
363
|
element.removeAttr('data-remote');
|