Added infinite scrolling.
This commit is contained in:
parent
2baa0dc10b
commit
4e46fa1c6e
4 changed files with 709 additions and 32 deletions
|
@ -31,6 +31,7 @@ class Index extends App.Controller
|
||||||
|
|
||||||
fetch: ->
|
fetch: ->
|
||||||
|
|
||||||
|
|
||||||
# get data
|
# get data
|
||||||
@ajax = new App.Ajax
|
@ajax = new App.Ajax
|
||||||
@ajax.ajax(
|
@ajax.ajax(
|
||||||
|
@ -68,7 +69,7 @@ class Index extends App.Controller
|
||||||
@loadCollection( type: 'Ticket', data: data.tickets )
|
@loadCollection( type: 'Ticket', data: data.tickets )
|
||||||
|
|
||||||
# remember ticket order
|
# remember ticket order
|
||||||
@tickets = data.tickets
|
@tickets = @tickets.concat( data.tickets )
|
||||||
|
|
||||||
# remember ticket count
|
# remember ticket count
|
||||||
@tickets_count = data.tickets_count
|
@tickets_count = data.tickets_count
|
||||||
|
@ -87,6 +88,7 @@ class Index extends App.Controller
|
||||||
|
|
||||||
render: ->
|
render: ->
|
||||||
|
|
||||||
|
# get total pages
|
||||||
pages_total = parseInt( ( @tickets_count / @overview.view[@view_mode].per_page ) + 0.99999 ) || 1
|
pages_total = parseInt( ( @tickets_count / @overview.view[@view_mode].per_page ) + 0.99999 ) || 1
|
||||||
|
|
||||||
# render init page
|
# render init page
|
||||||
|
@ -111,7 +113,7 @@ class Index extends App.Controller
|
||||||
)
|
)
|
||||||
html = $(html)
|
html = $(html)
|
||||||
# html.find('li').removeClass('active')
|
# html.find('li').removeClass('active')
|
||||||
html.find("[data-id=\"#{@start_page}\"]").parents('li').addClass('active')
|
# html.find("[data-id=\"#{@start_page}\"]").parents('li').addClass('active')
|
||||||
@html html
|
@html html
|
||||||
|
|
||||||
# create table/overview
|
# create table/overview
|
||||||
|
@ -159,6 +161,15 @@ class Index extends App.Controller
|
||||||
@el.find('.bulk-action').removeClass('hide')
|
@el.find('.bulk-action').removeClass('hide')
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# set waypoint if not already at the end
|
||||||
|
if @start_page < pages_total
|
||||||
|
a = =>
|
||||||
|
# alert('You have scrolled to an entry.')
|
||||||
|
@start_page = @start_page + 1
|
||||||
|
@fetch()
|
||||||
|
|
||||||
|
$('footer').waypoint( a, { offset: '120%', triggerOnce: true } )
|
||||||
|
|
||||||
page: (e) =>
|
page: (e) =>
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
id = $(e.target).data('id')
|
id = $(e.target).data('id')
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#= require ./lib/ba-linkify.js
|
#= require ./lib/ba-linkify.js
|
||||||
#= require ./lib/jquery.tagsinput.js
|
#= require ./lib/jquery.tagsinput.js
|
||||||
#= require ./lib/jquery.noty.js
|
#= require ./lib/jquery.noty.js
|
||||||
|
#= require ./lib/waypoints.js
|
||||||
#= require ./lib/fileuploader.js
|
#= require ./lib/fileuploader.js
|
||||||
|
|
||||||
#not_used= require_tree ./lib
|
#not_used= require_tree ./lib
|
||||||
|
@ -159,28 +160,18 @@ class App.Run extends Spine.Controller
|
||||||
# start content
|
# start content
|
||||||
new App.Content( el: @el.find('#content') );
|
new App.Content( el: @el.find('#content') );
|
||||||
|
|
||||||
#class App.Content extends Spine.Stack
|
|
||||||
class App.Content extends Spine.Controller
|
class App.Content extends Spine.Controller
|
||||||
className: 'container'
|
className: 'container'
|
||||||
|
|
||||||
constructor: ->
|
constructor: ->
|
||||||
# @controllers = {}
|
|
||||||
# @routes = {}
|
|
||||||
# @default = '/'
|
|
||||||
# for route, controller of Config.Routes
|
|
||||||
## @log 'route,controller', route, controller
|
|
||||||
# @controllers[route] = controller
|
|
||||||
# @routes[route] = route
|
|
||||||
|
|
||||||
super
|
super
|
||||||
@log 'RUN content'#, @
|
@log 'RUN content'#, @
|
||||||
|
|
||||||
for route, callback of Config.Routes
|
for route, callback of Config.Routes
|
||||||
# @log 'route,controller', route#, controller
|
|
||||||
do (route, callback) =>
|
do (route, callback) =>
|
||||||
@route(route, (params) ->
|
@route(route, (params) ->
|
||||||
# @log 'routing...', route
|
|
||||||
Config['ActiveController'] = route
|
Config['ActiveController'] = route
|
||||||
|
Spine.trigger( 'ws:send', JSON.stringify( { action: 'active_controller', controller: route, params: params } ) )
|
||||||
|
|
||||||
# unbind in controller area
|
# unbind in controller area
|
||||||
@el.unbind()
|
@el.unbind()
|
||||||
|
@ -194,11 +185,6 @@ class App.Content extends Spine.Controller
|
||||||
# window.scrollTo(0,0)
|
# window.scrollTo(0,0)
|
||||||
)
|
)
|
||||||
|
|
||||||
# for name, object of Config.Controller
|
|
||||||
## @log 'new', object, @el
|
|
||||||
# new object( el: @el, auth: @auth )
|
|
||||||
|
|
||||||
Spine.Route.setup()
|
Spine.Route.setup()
|
||||||
|
|
||||||
window.App = App
|
window.App = App
|
||||||
|
|
||||||
|
|
674
app/assets/javascripts/app/lib/waypoints.js
Normal file
674
app/assets/javascripts/app/lib/waypoints.js
Normal file
|
@ -0,0 +1,674 @@
|
||||||
|
/*!
|
||||||
|
jQuery Waypoints - v1.1.6
|
||||||
|
Copyright (c) 2011-2012 Caleb Troughton
|
||||||
|
Dual licensed under the MIT license and GPL license.
|
||||||
|
https://github.com/imakewebthings/jquery-waypoints/blob/master/MIT-license.txt
|
||||||
|
https://github.com/imakewebthings/jquery-waypoints/blob/master/GPL-license.txt
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Waypoints is a small jQuery plugin that makes it easy to execute a function
|
||||||
|
whenever you scroll to an element.
|
||||||
|
|
||||||
|
GitHub Repository: https://github.com/imakewebthings/jquery-waypoints
|
||||||
|
Documentation and Examples: http://imakewebthings.github.com/jquery-waypoints
|
||||||
|
|
||||||
|
Changelog:
|
||||||
|
v1.1.6
|
||||||
|
- Fix potential memory leak by unbinding events on empty context elements.
|
||||||
|
v1.1.5
|
||||||
|
- Make plugin compatible with Browserify/RequireJS. (Thanks @cjroebuck)
|
||||||
|
v1.1.4
|
||||||
|
- Add handler option to give alternate binding method. (Issue #34)
|
||||||
|
v1.1.3
|
||||||
|
- Fix cases where waypoints are added post-load and should be triggered
|
||||||
|
immediately. (Issue #28)
|
||||||
|
v1.1.2
|
||||||
|
- Fixed error thrown by waypoints with triggerOnce option that were
|
||||||
|
triggered via resize refresh.
|
||||||
|
v1.1.1
|
||||||
|
- Fixed bug in initialization where all offsets were being calculated
|
||||||
|
as if set to 0 initially, causing unwarranted triggers during the
|
||||||
|
subsequent refresh.
|
||||||
|
- Added onlyOnScroll, an option for individual waypoints that disables
|
||||||
|
triggers due to an offset refresh that crosses the current scroll
|
||||||
|
point. (All credit to @knuton on this one.)
|
||||||
|
v1.1
|
||||||
|
- Moved the continuous option out of global settings and into the options
|
||||||
|
object for individual waypoints.
|
||||||
|
- Added the context option, which allows for using waypoints within any
|
||||||
|
scrollable element, not just the window.
|
||||||
|
v1.0.2
|
||||||
|
- Moved scroll and resize handler bindings out of load. Should play nicer
|
||||||
|
with async loaders like Head JS and LABjs.
|
||||||
|
- Fixed a 1px off error when using certain % offsets.
|
||||||
|
- Added unit tests.
|
||||||
|
v1.0.1
|
||||||
|
- Added $.waypoints('viewportHeight').
|
||||||
|
- Fixed iOS bug (using the new viewportHeight method).
|
||||||
|
- Added offset function alias: 'bottom-in-view'.
|
||||||
|
v1.0
|
||||||
|
- Initial release.
|
||||||
|
|
||||||
|
Support:
|
||||||
|
- jQuery versions 1.4.3+
|
||||||
|
- IE6+, FF3+, Chrome 6+, Safari 4+, Opera 11
|
||||||
|
- Other versions and browsers may work, these are just the ones I've looked at.
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function($, wp, wps, window, undefined){
|
||||||
|
'$:nomunge';
|
||||||
|
|
||||||
|
var $w = $(window),
|
||||||
|
|
||||||
|
// Keeping common strings as variables = better minification
|
||||||
|
eventName = 'waypoint.reached',
|
||||||
|
|
||||||
|
/*
|
||||||
|
For the waypoint and direction passed in, trigger the waypoint.reached
|
||||||
|
event and deal with the triggerOnce option.
|
||||||
|
*/
|
||||||
|
triggerWaypoint = function(way, dir) {
|
||||||
|
way.element.trigger(eventName, dir);
|
||||||
|
if (way.options.triggerOnce) {
|
||||||
|
way.element[wp]('destroy');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
/*
|
||||||
|
Given a jQuery element and Context, returns the index of that element in the waypoints
|
||||||
|
array. Returns the index, or -1 if the element is not a waypoint.
|
||||||
|
*/
|
||||||
|
waypointIndex = function(el, context) {
|
||||||
|
if (!context) return -1;
|
||||||
|
var i = context.waypoints.length - 1;
|
||||||
|
while (i >= 0 && context.waypoints[i].element[0] !== el[0]) {
|
||||||
|
i -= 1;
|
||||||
|
}
|
||||||
|
return i;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Private list of all elements used as scrolling contexts for waypoints.
|
||||||
|
contexts = [],
|
||||||
|
|
||||||
|
/*
|
||||||
|
Context Class - represents a scrolling context. Properties include:
|
||||||
|
element: jQuery object containing a single HTML element.
|
||||||
|
waypoints: Array of waypoints operating under this scroll context.
|
||||||
|
oldScroll: Keeps the previous scroll position to determine scroll direction.
|
||||||
|
didScroll: Flag used in scrolling the context's scroll event.
|
||||||
|
didResize: Flag used in scrolling the context's resize event.
|
||||||
|
doScroll: Function that checks for crossed waypoints. Called from throttler.
|
||||||
|
*/
|
||||||
|
Context = function(context) {
|
||||||
|
$.extend(this, {
|
||||||
|
element: $(context),
|
||||||
|
oldScroll: 0,
|
||||||
|
|
||||||
|
/*
|
||||||
|
List of all elements that have been registered as waypoints.
|
||||||
|
Each object in the array contains:
|
||||||
|
element: jQuery object containing a single HTML element.
|
||||||
|
offset: The window scroll offset, in px, that triggers the waypoint event.
|
||||||
|
options: Options object that was passed to the waypoint fn function.
|
||||||
|
*/
|
||||||
|
'waypoints': [],
|
||||||
|
|
||||||
|
didScroll: false,
|
||||||
|
didResize: false,
|
||||||
|
|
||||||
|
doScroll: $.proxy(function() {
|
||||||
|
var newScroll = this.element.scrollTop(),
|
||||||
|
|
||||||
|
// Are we scrolling up or down? Used for direction argument in callback.
|
||||||
|
isDown = newScroll > this.oldScroll,
|
||||||
|
that = this,
|
||||||
|
|
||||||
|
// Get a list of all waypoints that were crossed since last scroll move.
|
||||||
|
pointsHit = $.grep(this.waypoints, function(el, i) {
|
||||||
|
return isDown ?
|
||||||
|
(el.offset > that.oldScroll && el.offset <= newScroll) :
|
||||||
|
(el.offset <= that.oldScroll && el.offset > newScroll);
|
||||||
|
}),
|
||||||
|
len = pointsHit.length;
|
||||||
|
|
||||||
|
// iOS adjustment
|
||||||
|
if (!this.oldScroll || !newScroll) {
|
||||||
|
$[wps]('refresh');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Done with scroll comparisons, store new scroll before ejection
|
||||||
|
this.oldScroll = newScroll;
|
||||||
|
|
||||||
|
// No waypoints crossed? Eject.
|
||||||
|
if (!len) return;
|
||||||
|
|
||||||
|
// If several waypoints triggered, need to do so in reverse order going up
|
||||||
|
if (!isDown) pointsHit.reverse();
|
||||||
|
|
||||||
|
/*
|
||||||
|
One scroll move may cross several waypoints. If the waypoint's continuous
|
||||||
|
option is true it should fire even if it isn't the last waypoint. If false,
|
||||||
|
it will only fire if it's the last one.
|
||||||
|
*/
|
||||||
|
$.each(pointsHit, function(i, point) {
|
||||||
|
if (point.options.continuous || i === len - 1) {
|
||||||
|
triggerWaypoint(point, [isDown ? 'down' : 'up']);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}, this)
|
||||||
|
});
|
||||||
|
|
||||||
|
// Setup scroll and resize handlers. Throttled at the settings-defined rate limits.
|
||||||
|
$(context).bind('scroll.waypoints', $.proxy(function() {
|
||||||
|
if (!this.didScroll) {
|
||||||
|
this.didScroll = true;
|
||||||
|
window.setTimeout($.proxy(function() {
|
||||||
|
this.doScroll();
|
||||||
|
this.didScroll = false;
|
||||||
|
}, this), $[wps].settings.scrollThrottle);
|
||||||
|
}
|
||||||
|
}, this)).bind('resize.waypoints', $.proxy(function() {
|
||||||
|
if (!this.didResize) {
|
||||||
|
this.didResize = true;
|
||||||
|
window.setTimeout($.proxy(function() {
|
||||||
|
$[wps]('refresh');
|
||||||
|
this.didResize = false;
|
||||||
|
}, this), $[wps].settings.resizeThrottle);
|
||||||
|
}
|
||||||
|
}, this));
|
||||||
|
|
||||||
|
$w.load($.proxy(function() {
|
||||||
|
/*
|
||||||
|
Fire a scroll check, should the page be loaded at a non-zero scroll value,
|
||||||
|
as with a fragment id link or a page refresh.
|
||||||
|
*/
|
||||||
|
this.doScroll();
|
||||||
|
}, this));
|
||||||
|
},
|
||||||
|
|
||||||
|
/* Returns a Context object from the contexts array, given the raw HTML element
|
||||||
|
for that context. */
|
||||||
|
getContextByElement = function(element) {
|
||||||
|
var found = null;
|
||||||
|
|
||||||
|
$.each(contexts, function(i, c) {
|
||||||
|
if (c.element[0] === element) {
|
||||||
|
found = c;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return found;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Methods exposed to the effin' object
|
||||||
|
methods = {
|
||||||
|
/*
|
||||||
|
jQuery.fn.waypoint([handler], [options])
|
||||||
|
|
||||||
|
handler
|
||||||
|
function, optional
|
||||||
|
A callback function called when the user scrolls past the element.
|
||||||
|
The function signature is function(event, direction) where event is
|
||||||
|
a standard jQuery Event Object and direction is a string, either 'down'
|
||||||
|
or 'up' indicating which direction the user is scrolling.
|
||||||
|
|
||||||
|
options
|
||||||
|
object, optional
|
||||||
|
A map of options to apply to this set of waypoints, including where on
|
||||||
|
the browser window the waypoint is triggered. For a full list of
|
||||||
|
options and their defaults, see $.fn.waypoint.defaults.
|
||||||
|
|
||||||
|
This is how you register an element as a waypoint. When the user scrolls past
|
||||||
|
that element it triggers waypoint.reached, a custom event. Since the
|
||||||
|
parameters for creating a waypoint are optional, we have a few different
|
||||||
|
possible signatures. Let’s look at each of them.
|
||||||
|
|
||||||
|
someElements.waypoint();
|
||||||
|
|
||||||
|
Calling .waypoint with no parameters will register the elements as waypoints
|
||||||
|
using the default options. The elements will fire the waypoint.reached event,
|
||||||
|
but calling it in this way does not bind any handler to the event. You can
|
||||||
|
bind to the event yourself, as with any other event, like so:
|
||||||
|
|
||||||
|
someElements.bind('waypoint.reached', function(event, direction) {
|
||||||
|
// make it rain
|
||||||
|
});
|
||||||
|
|
||||||
|
You will usually want to create a waypoint and immediately bind a function to
|
||||||
|
waypoint.reached, and can do so by passing a handler as the first argument to
|
||||||
|
.waypoint:
|
||||||
|
|
||||||
|
someElements.waypoint(function(event, direction) {
|
||||||
|
if (direction === 'down') {
|
||||||
|
// do this on the way down
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// do this on the way back up through the waypoint
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
This will still use the default options, which will trigger the waypoint when
|
||||||
|
the top of the element hits the top of the window. We can pass .waypoint an
|
||||||
|
options object to customize things:
|
||||||
|
|
||||||
|
someElements.waypoint(function(event, direction) {
|
||||||
|
// do something amazing
|
||||||
|
}, {
|
||||||
|
offset: '50%' // middle of the page
|
||||||
|
});
|
||||||
|
|
||||||
|
You can also pass just an options object.
|
||||||
|
|
||||||
|
someElements.waypoint({
|
||||||
|
offset: 100 // 100px from the top
|
||||||
|
});
|
||||||
|
|
||||||
|
This behaves like .waypoint(), in that it registers the elements as waypoints
|
||||||
|
but binds no event handlers.
|
||||||
|
|
||||||
|
Calling .waypoint on an existing waypoint will extend the previous options.
|
||||||
|
If the call includes a handler, it will be bound to waypoint.reached without
|
||||||
|
unbinding any other handlers.
|
||||||
|
*/
|
||||||
|
init: function(f, options) {
|
||||||
|
// Register each element as a waypoint, add to array.
|
||||||
|
this.each(function() {
|
||||||
|
var cElement = $.fn[wp].defaults.context,
|
||||||
|
context,
|
||||||
|
$this = $(this);
|
||||||
|
|
||||||
|
// Default window context or a specific element?
|
||||||
|
if (options && options.context) {
|
||||||
|
cElement = options.context;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find the closest element that matches the context
|
||||||
|
if (!$.isWindow(cElement)) {
|
||||||
|
cElement = $this.closest(cElement)[0];
|
||||||
|
}
|
||||||
|
context = getContextByElement(cElement);
|
||||||
|
|
||||||
|
// Not a context yet? Create and push.
|
||||||
|
if (!context) {
|
||||||
|
context = new Context(cElement);
|
||||||
|
contexts.push(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Extend default and preexisting options
|
||||||
|
var ndx = waypointIndex($this, context),
|
||||||
|
base = ndx < 0 ? $.fn[wp].defaults : context.waypoints[ndx].options,
|
||||||
|
opts = $.extend({}, base, options);
|
||||||
|
|
||||||
|
// Offset aliases
|
||||||
|
opts.offset = opts.offset === "bottom-in-view" ?
|
||||||
|
function() {
|
||||||
|
var cHeight = $.isWindow(cElement) ? $[wps]('viewportHeight')
|
||||||
|
: $(cElement).height();
|
||||||
|
return cHeight - $(this).outerHeight();
|
||||||
|
} : opts.offset;
|
||||||
|
|
||||||
|
// Update, or create new waypoint
|
||||||
|
if (ndx < 0) {
|
||||||
|
context.waypoints.push({
|
||||||
|
'element': $this,
|
||||||
|
'offset': null,
|
||||||
|
'options': opts
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
context.waypoints[ndx].options = opts;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bind the function if it was passed in.
|
||||||
|
if (f) {
|
||||||
|
$this.bind(eventName, f);
|
||||||
|
}
|
||||||
|
// Bind the function in the handler option if it exists.
|
||||||
|
if (options && options.handler) {
|
||||||
|
$this.bind(eventName, options.handler);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Need to re-sort+refresh the waypoints array after new elements are added.
|
||||||
|
$[wps]('refresh');
|
||||||
|
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
jQuery.fn.waypoint('remove')
|
||||||
|
|
||||||
|
Passing the string 'remove' to .waypoint unregisters the elements as waypoints
|
||||||
|
and wipes any custom options, but leaves the waypoint.reached events bound.
|
||||||
|
Calling .waypoint again in the future would reregister the waypoint and the old
|
||||||
|
handlers would continue to work.
|
||||||
|
*/
|
||||||
|
remove: function() {
|
||||||
|
return this.each(function(i, el) {
|
||||||
|
var $el = $(el);
|
||||||
|
|
||||||
|
$.each(contexts, function(i, c) {
|
||||||
|
var ndx = waypointIndex($el, c);
|
||||||
|
|
||||||
|
if (ndx >= 0) {
|
||||||
|
c.waypoints.splice(ndx, 1);
|
||||||
|
|
||||||
|
if (!c.waypoints.length) {
|
||||||
|
c.element.unbind('scroll.waypoints resize.waypoints');
|
||||||
|
contexts.splice(i, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
/*
|
||||||
|
jQuery.fn.waypoint('destroy')
|
||||||
|
|
||||||
|
Passing the string 'destroy' to .waypoint will unbind all waypoint.reached
|
||||||
|
event handlers on those elements and unregisters them as waypoints.
|
||||||
|
*/
|
||||||
|
destroy: function() {
|
||||||
|
return this.unbind(eventName)[wp]('remove');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
/*
|
||||||
|
Methods used by the jQuery object extension.
|
||||||
|
*/
|
||||||
|
jQMethods = {
|
||||||
|
|
||||||
|
/*
|
||||||
|
jQuery.waypoints('refresh')
|
||||||
|
|
||||||
|
This will force a recalculation of each waypoint’s trigger point based on
|
||||||
|
its offset option and context. This is called automatically whenever the window
|
||||||
|
(or other defined context) is resized, new waypoints are added, or a waypoint’s
|
||||||
|
options are modified. If your project is changing the DOM or page layout without
|
||||||
|
doing one of these things, you may want to manually call this refresh.
|
||||||
|
*/
|
||||||
|
refresh: function() {
|
||||||
|
$.each(contexts, function(i, c) {
|
||||||
|
var isWin = $.isWindow(c.element[0]),
|
||||||
|
contextOffset = isWin ? 0 : c.element.offset().top,
|
||||||
|
contextHeight = isWin ? $[wps]('viewportHeight') : c.element.height(),
|
||||||
|
contextScroll = isWin ? 0 : c.element.scrollTop();
|
||||||
|
|
||||||
|
$.each(c.waypoints, function(j, o) {
|
||||||
|
/* $.each isn't safe from element removal due to triggerOnce.
|
||||||
|
Should rewrite the loop but this is way easier. */
|
||||||
|
if (!o) return;
|
||||||
|
|
||||||
|
// Adjustment is just the offset if it's a px value
|
||||||
|
var adjustment = o.options.offset,
|
||||||
|
oldOffset = o.offset;
|
||||||
|
|
||||||
|
// Set adjustment to the return value if offset is a function.
|
||||||
|
if (typeof o.options.offset === "function") {
|
||||||
|
adjustment = o.options.offset.apply(o.element);
|
||||||
|
}
|
||||||
|
// Calculate the adjustment if offset is a percentage.
|
||||||
|
else if (typeof o.options.offset === "string") {
|
||||||
|
var amount = parseFloat(o.options.offset);
|
||||||
|
adjustment = o.options.offset.indexOf("%") ?
|
||||||
|
Math.ceil(contextHeight * (amount / 100)) : amount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Set the element offset to the window scroll offset, less
|
||||||
|
all our adjustments.
|
||||||
|
*/
|
||||||
|
o.offset = o.element.offset().top - contextOffset
|
||||||
|
+ contextScroll - adjustment;
|
||||||
|
|
||||||
|
/*
|
||||||
|
An element offset change across the current scroll point triggers
|
||||||
|
the event, just as if we scrolled past it unless prevented by an
|
||||||
|
optional flag.
|
||||||
|
*/
|
||||||
|
if (o.options.onlyOnScroll) return;
|
||||||
|
|
||||||
|
if (oldOffset !== null && c.oldScroll > oldOffset && c.oldScroll <= o.offset) {
|
||||||
|
triggerWaypoint(o, ['up']);
|
||||||
|
}
|
||||||
|
else if (oldOffset !== null && c.oldScroll < oldOffset && c.oldScroll >= o.offset) {
|
||||||
|
triggerWaypoint(o, ['down']);
|
||||||
|
}
|
||||||
|
/* For new waypoints added after load, check that down should have
|
||||||
|
already been triggered */
|
||||||
|
else if (!oldOffset && c.element.scrollTop() > o.offset) {
|
||||||
|
triggerWaypoint(o, ['down']);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Keep waypoints sorted by offset value.
|
||||||
|
c.waypoints.sort(function(a, b) {
|
||||||
|
return a.offset - b.offset;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
jQuery.waypoints('viewportHeight')
|
||||||
|
|
||||||
|
This will return the height of the viewport, adjusting for inconsistencies
|
||||||
|
that come with calling $(window).height() in iOS. Recommended for use
|
||||||
|
within any offset functions.
|
||||||
|
*/
|
||||||
|
viewportHeight: function() {
|
||||||
|
return (window.innerHeight ? window.innerHeight : $w.height());
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
jQuery.waypoints()
|
||||||
|
|
||||||
|
This will return a jQuery object with a collection of all registered waypoint
|
||||||
|
elements.
|
||||||
|
|
||||||
|
$('.post').waypoint();
|
||||||
|
$('.ad-unit').waypoint(function(event, direction) {
|
||||||
|
// Passed an ad unit
|
||||||
|
});
|
||||||
|
console.log($.waypoints());
|
||||||
|
|
||||||
|
The example above would log a jQuery object containing all .post and .ad-unit
|
||||||
|
elements.
|
||||||
|
*/
|
||||||
|
aggregate: function() {
|
||||||
|
var points = $();
|
||||||
|
$.each(contexts, function(i, c) {
|
||||||
|
$.each(c.waypoints, function(i, e) {
|
||||||
|
points = points.add(e.element);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return points;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
fn extension. Delegates to appropriate method.
|
||||||
|
*/
|
||||||
|
$.fn[wp] = function(method) {
|
||||||
|
|
||||||
|
if (methods[method]) {
|
||||||
|
return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
|
||||||
|
}
|
||||||
|
else if (typeof method === "function" || !method) {
|
||||||
|
return methods.init.apply(this, arguments);
|
||||||
|
}
|
||||||
|
else if (typeof method === "object") {
|
||||||
|
return methods.init.apply(this, [null, method]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$.error( 'Method ' + method + ' does not exist on jQuery ' + wp );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
The default options object that is extended when calling .waypoint. It has the
|
||||||
|
following properties:
|
||||||
|
|
||||||
|
context
|
||||||
|
string | element | jQuery*
|
||||||
|
default: window
|
||||||
|
The context defines which scrollable element the waypoint belongs to and acts
|
||||||
|
within. The default, window, means the waypoint offset is calculated with relation
|
||||||
|
to the whole viewport. You can set this to another element to use the waypoints
|
||||||
|
within that element. Accepts a selector string, *but if you use jQuery 1.6+ it
|
||||||
|
also accepts a raw HTML element or jQuery object.
|
||||||
|
|
||||||
|
continuous
|
||||||
|
boolean
|
||||||
|
default: true
|
||||||
|
If true, and multiple waypoints are triggered in one scroll, this waypoint will
|
||||||
|
trigger even if it is not the last waypoint reached. If false, it will only
|
||||||
|
trigger if it is the last waypoint.
|
||||||
|
|
||||||
|
handler
|
||||||
|
function
|
||||||
|
default: undefined
|
||||||
|
An alternative way to bind functions to the waypoint, without using the function
|
||||||
|
as the first argument to the waypoint function.
|
||||||
|
|
||||||
|
offset
|
||||||
|
number | string | function
|
||||||
|
default: 0
|
||||||
|
Determines how far the top of the element must be from the top of the browser
|
||||||
|
window to trigger a waypoint. It can be a number, which is taken as a number
|
||||||
|
of pixels, a string representing a percentage of the viewport height, or a
|
||||||
|
function that will return a number of pixels.
|
||||||
|
|
||||||
|
onlyOnScroll
|
||||||
|
boolean
|
||||||
|
default: false
|
||||||
|
If true, this waypoint will not trigger if an offset change during a refresh
|
||||||
|
causes it to pass the current scroll point.
|
||||||
|
|
||||||
|
triggerOnce
|
||||||
|
boolean
|
||||||
|
default: false
|
||||||
|
If true, the waypoint will be destroyed when triggered.
|
||||||
|
|
||||||
|
An offset of 250 would trigger the waypoint when the top of the element is 250px
|
||||||
|
from the top of the viewport. Negative values for any offset work as you might
|
||||||
|
expect. A value of -100 would trigger the waypoint when the element is 100px above
|
||||||
|
the top of the window.
|
||||||
|
|
||||||
|
offset: '100%'
|
||||||
|
|
||||||
|
A string percentage will determine the pixel offset based on the height of the
|
||||||
|
window. When resizing the window, this offset will automatically be recalculated
|
||||||
|
without needing to call $.waypoints('refresh').
|
||||||
|
|
||||||
|
// The bottom of the element is in view
|
||||||
|
offset: function() {
|
||||||
|
return $.waypoints('viewportHeight') - $(this).outerHeight();
|
||||||
|
}
|
||||||
|
|
||||||
|
Offset can take a function, which must return a number of pixels from the top of
|
||||||
|
the window. The this value will always refer to the raw HTML element of the
|
||||||
|
waypoint. As with % values, functions are recalculated automatically when the
|
||||||
|
window resizes. For more on recalculating offsets, see $.waypoints('refresh').
|
||||||
|
|
||||||
|
An offset value of 'bottom-in-view' will act as an alias for the function in the
|
||||||
|
example above, as this is a common usage.
|
||||||
|
|
||||||
|
offset: 'bottom-in-view'
|
||||||
|
|
||||||
|
You can see this alias in use on the Scroll Analytics example page.
|
||||||
|
|
||||||
|
The triggerOnce flag, if true, will destroy the waypoint after the first trigger.
|
||||||
|
This is just a shortcut for calling .waypoint('destroy') within the waypoint
|
||||||
|
handler. This is useful in situations such as scroll analytics, where you only
|
||||||
|
want to record an event once for each page visit.
|
||||||
|
|
||||||
|
The context option lets you use Waypoints within an element other than the window.
|
||||||
|
You can define the context with a selector string and the waypoint will act within
|
||||||
|
the nearest ancestor that matches this selector.
|
||||||
|
|
||||||
|
$('.something-scrollable .waypoint').waypoint({
|
||||||
|
context: '.something-scrollable'
|
||||||
|
});
|
||||||
|
|
||||||
|
You can see this in action on the Dial Controls example.
|
||||||
|
|
||||||
|
The handler option gives authors an alternative way to bind functions when
|
||||||
|
creating a waypoint. In place of:
|
||||||
|
|
||||||
|
$('.item').waypoint(function(event, direction) {
|
||||||
|
// make things happen
|
||||||
|
});
|
||||||
|
|
||||||
|
You may instead write:
|
||||||
|
|
||||||
|
$('.item').waypoint({
|
||||||
|
handler: function(event, direction) {
|
||||||
|
// make things happen
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
*/
|
||||||
|
$.fn[wp].defaults = {
|
||||||
|
continuous: true,
|
||||||
|
offset: 0,
|
||||||
|
triggerOnce: false,
|
||||||
|
context: window
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
jQuery object extension. Delegates to appropriate methods above.
|
||||||
|
*/
|
||||||
|
$[wps] = function(method) {
|
||||||
|
if (jQMethods[method]) {
|
||||||
|
return jQMethods[method].apply(this);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return jQMethods['aggregate']();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
$.waypoints.settings
|
||||||
|
|
||||||
|
Settings object that determines some of the plugin’s behavior.
|
||||||
|
|
||||||
|
resizeThrottle
|
||||||
|
number
|
||||||
|
default: 200
|
||||||
|
For performance reasons, the refresh performed during resizes is
|
||||||
|
throttled. This value is the rate-limit in milliseconds between resize
|
||||||
|
refreshes. For more information on throttling, check out Ben Alman’s
|
||||||
|
throttle / debounce plugin.
|
||||||
|
http://benalman.com/projects/jquery-throttle-debounce-plugin/
|
||||||
|
|
||||||
|
scrollThrottle
|
||||||
|
number
|
||||||
|
default: 100
|
||||||
|
For performance reasons, checking for any crossed waypoints during a
|
||||||
|
scroll event is throttled. This value is the rate-limit in milliseconds
|
||||||
|
between scroll checks. For more information on throttling, check out Ben
|
||||||
|
Alman’s throttle / debounce plugin.
|
||||||
|
http://benalman.com/projects/jquery-throttle-debounce-plugin/
|
||||||
|
*/
|
||||||
|
$[wps].settings = {
|
||||||
|
resizeThrottle: 200,
|
||||||
|
scrollThrottle: 100
|
||||||
|
};
|
||||||
|
|
||||||
|
$w.load(function() {
|
||||||
|
// Calculate everything once on load.
|
||||||
|
$[wps]('refresh');
|
||||||
|
});
|
||||||
|
})(jQuery, 'waypoint', 'waypoints', window);
|
|
@ -1,7 +1,22 @@
|
||||||
<div class="page-header">
|
<div class="page-header">
|
||||||
|
<div class="row">
|
||||||
|
<div class="span6">
|
||||||
<h1><%- @overview.meta.name %> <small><a href="#" data-type="settings" class="icon-edit"></a></small></h1>
|
<h1><%- @overview.meta.name %> <small><a href="#" data-type="settings" class="icon-edit"></a></small></h1>
|
||||||
|
</div>
|
||||||
|
<div class="span6">
|
||||||
|
<div class="pagination keepright">
|
||||||
|
<ul>
|
||||||
|
<% for item in @view_modes: %>
|
||||||
|
<li class="<%= item.class %>">
|
||||||
|
<a href="#" data-type="view-mode" data-mode="<%= item.type %>"><%= item.name %></a>
|
||||||
|
</li>
|
||||||
|
<% end %>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<!--
|
||||||
<div class="pagination keepleft">
|
<div class="pagination keepleft">
|
||||||
<ul>
|
<ul>
|
||||||
<% if @start_page != 1: %>
|
<% if @start_page != 1: %>
|
||||||
|
@ -17,16 +32,7 @@
|
||||||
<% end %>
|
<% end %>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
-->
|
||||||
<div class="pagination keepright">
|
|
||||||
<ul>
|
|
||||||
<% for item in @view_modes: %>
|
|
||||||
<li class="<%= item.class %>">
|
|
||||||
<a href="#" data-type="view-mode" data-mode="<%= item.type %>"><%= item.name %></a>
|
|
||||||
</li>
|
|
||||||
<% end %>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="span12 table-overview"></div>
|
<div class="span12 table-overview"></div>
|
||||||
|
|
Loading…
Reference in a new issue