$container.append(spinner);
$container.attr('data-infinite-serial', serial);
- // Combine infiniteContentParams from multiple sources. This
- // mechanism allows each of several components to set and
- // update its own set of filters, without having to worry
- // about stomping on some other component's filters.
- //
- // For example, filterable.js writes filters in
- // infiniteContentParamsFilterable ("search for text foo")
- // without worrying about clobbering the filters set up by the
- // tab pane ("only show jobs and pipelines in this tab").
- params = {};
- $.each($container.data(), function(datakey, datavalue) {
- // Note: We attach these data to DOM elements using
- // <element data-foo-bar="baz">. We store/retrieve them
- // using $('element').data('foo-bar'), although
- // .data('fooBar') would also work. The "all data" hash
- // returned by $('element').data(), however, always has
- // keys like 'fooBar'. In other words, where we have a
- // choice, we stick with the 'foo-bar' style to be
- // consistent with HTML. Here, our only option is
- // 'fooBar'.
- if (/^infiniteContentParams/.exec(datakey)) {
- if (datavalue instanceof Object) {
- $.each(datavalue, function(hkey, hvalue) {
- if (hvalue instanceof Array) {
- params[hkey] = (params[hkey] || []).concat(hvalue);
- } else if (hvalue instanceof Object) {
- $.extend(params[hkey], hvalue);
- } else {
- params[hkey] = hvalue;
- }
- });
+ if (src == $container.attr('data-infinite-content-href0')) {
+ // If we're loading the first page, collect filters from
+ // various sources.
+ params = mergeInfiniteContentParams($container);
+ $.each(params, function(k,v) {
+ if (v instanceof Object) {
+ params[k] = JSON.stringify(v);
}
- }
- });
- $.each(params, function(k,v) {
- if (v instanceof Object) {
- params[k] = JSON.stringify(v);
- }
- });
+ });
+ } else {
+ // If we're loading page >1, ignore other filtering
+ // mechanisms and just use the "next page" URI from the
+ // previous page's response. Aside from avoiding race
+ // conditions (where page 2 could have different filters
+ // than page 1), this allows the server to use filters in
+ // the "next page" URI to achieve paging. (To apply any
+ // new filters effectively, we need to load page 1 again
+ // anyway.)
+ params = {};
+ }
$.ajax(src,
{dataType: 'json',
$('.infinite-scroller').add(window).trigger('scroll');
}
+ function mergeInfiniteContentParams($container) {
+ var params = {};
+ // Combine infiniteContentParams from multiple sources. This
+ // mechanism allows each of several components to set and
+ // update its own set of filters, without having to worry
+ // about stomping on some other component's filters.
+ //
+ // For example, filterable.js writes filters in
+ // infiniteContentParamsFilterable ("search for text foo")
+ // without worrying about clobbering the filters set up by the
+ // tab pane ("only show jobs and pipelines in this tab").
+ $.each($container.data(), function(datakey, datavalue) {
+ // Note: We attach these data to DOM elements using
+ // <element data-foo-bar="baz">. We store/retrieve them
+ // using $('element').data('foo-bar'), although
+ // .data('fooBar') would also work. The "all data" hash
+ // returned by $('element').data(), however, always has
+ // keys like 'fooBar'. In other words, where we have a
+ // choice, we stick with the 'foo-bar' style to be
+ // consistent with HTML. Here, our only option is
+ // 'fooBar'.
+ if (/^infiniteContentParams/.exec(datakey)) {
+ if (datavalue instanceof Object) {
+ $.each(datavalue, function(hkey, hvalue) {
+ if (hvalue instanceof Array) {
+ params[hkey] = (params[hkey] || []).
+ concat(hvalue);
+ } else if (hvalue instanceof Object) {
+ $.extend(params[hkey], hvalue);
+ } else {
+ params[hkey] = hvalue;
+ }
+ });
+ }
+ }
+ });
+ return params;
+ }
+
$(document).
on('click', 'div.infinite-retry button', function() {
var $retry_div = $(this).closest('.infinite-retry');
on('scroll resize', { container: this }, maybe_load_more_content).
trigger('scroll');
});
+ }).
+ on('click', 'th[data-sort-order]', function() {
+ var direction = $(this).data('sort-order-direction');
+ // reverse the current direction, or do ascending if none
+ if( typeof(direction) == 'undefined' || direction == 'desc' ) {
+ direction = 'asc';
+ } else {
+ direction = 'desc';
+ }
+ $(this).data('sort-order-direction', direction);
+ // change the ordering parameter and refresh the data display with the new order
+ var $target = $(this).closest('table').find('[data-infinite-content-params-attr]');
+ var params_attr = 'infinite-content-params-' + $target.data('infinite-content-params-attr');
+ var params = $target.data(params_attr) || {};
+ params.order = $(this).data('sort-order').split(",").join( ' ' + direction + ', ' ) + ' ' + direction;
+ $target.data(params_attr, params);
+ $target.trigger('refresh-content');
+ }).
+ on('ready arv:pane:loaded refresh-content', function() {
+ $('th[data-sort-order]').each(function() {
+ $(this).find('i').remove();
+ var direction = $(this).data('sort-order-direction');
+ if( typeof(direction) != 'undefined' ) {
+ $(this).append('<i class="fa fa-sort-' + direction + '"/>');
+ } else {
+ $(this).append('<i class="fa fa-sort"/>');
+ }
+ });
});