ajax_pagination 0.6.0 → 0.6.1
Sign up to get free protection for your applications and to get access to all the features.
- 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');
|