123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- /**
- * @file
- * Handles AJAX fetching of views, including filter submission and response.
- */
- (function ($) {
- /**
- * Attaches the AJAX behavior to exposed filter forms and key views links.
- */
- Drupal.behaviors.ViewsAjaxView = {};
- Drupal.behaviors.ViewsAjaxView.attach = function() {
- if (Drupal.settings && Drupal.settings.views && Drupal.settings.views.ajaxViews) {
- $.each(Drupal.settings.views.ajaxViews, function(i, settings) {
- Drupal.views.instances[i] = new Drupal.views.ajaxView(settings);
- });
- }
- };
- Drupal.views = {};
- Drupal.views.instances = {};
- /**
- * JavaScript object for a certain view.
- */
- Drupal.views.ajaxView = function(settings) {
- var selector = '.view-dom-id-' + settings.view_dom_id;
- this.$view = $(selector);
- // Retrieve the path to use for views' ajax.
- var ajax_path = Drupal.settings.views.ajax_path;
- // If there are multiple views this might've ended up showing up multiple
- // times.
- if (ajax_path.constructor.toString().indexOf("Array") != -1) {
- ajax_path = ajax_path[0];
- }
- // Check if there are any GET parameters to send to views.
- var queryString = window.location.search || '';
- if (queryString !== '') {
- // Remove the question mark and Drupal path component if any.
- var queryString = queryString.slice(1).replace(/q=[^&]+&?|&?render=[^&]+/, '');
- if (queryString !== '') {
- // If there is a '?' in ajax_path, clean url are on and & should be
- // used to add parameters.
- queryString = ((/\?/.test(ajax_path)) ? '&' : '?') + queryString;
- }
- }
- this.element_settings = {
- url: ajax_path + queryString,
- submit: settings,
- setClick: true,
- event: 'click',
- selector: selector,
- progress: {
- type: 'throbber'
- }
- };
- this.settings = settings;
- // Add the ajax to exposed forms.
- this.$exposed_form = $('#views-exposed-form-' + settings.view_name.replace(/_/g, '-') + '-' + settings.view_display_id.replace(/_/g, '-'));
- this.$exposed_form.once(jQuery.proxy(this.attachExposedFormAjax, this));
- // Store Drupal.ajax objects here for all pager links.
- this.links = [];
- // Add the ajax to pagers.
- this.$view
- .once(jQuery.proxy(this.attachPagerAjax, this));
- // Add a trigger to update this view specifically. In order to trigger a
- // refresh use the following code.
- //
- // @code
- // jQuery('.view-name').trigger('RefreshView');
- // @endcode
- // Add a trigger to update this view specifically.
- var self_settings = this.element_settings;
- self_settings.event = 'RefreshView';
- this.refreshViewAjax = new Drupal.ajax(this.selector, this.$view, self_settings);
- };
- Drupal.views.ajaxView.prototype.attachExposedFormAjax = function() {
- var button = $('input[type=submit], button[type=submit], input[type=image]', this.$exposed_form);
- button = button[0];
- // Call the autocomplete submit before doing AJAX.
- $(button).click(function () {
- if (Drupal.autocompleteSubmit) {
- Drupal.autocompleteSubmit();
- }
- });
- this.exposedFormAjax = new Drupal.ajax($(button).attr('id'), button, this.element_settings);
- };
- /**
- * Attach the ajax behavior to each link.
- */
- Drupal.views.ajaxView.prototype.attachPagerAjax = function() {
- this.$view.find('ul.pager > li > a, th.views-field a, .attachment .views-summary a')
- .each(jQuery.proxy(this.attachPagerLinkAjax, this));
- };
- /**
- * Attach the ajax behavior to a singe link.
- */
- Drupal.views.ajaxView.prototype.attachPagerLinkAjax = function(id, link) {
- var $link = $(link);
- // Don't attach to pagers inside nested views.
- if ($link.closest('.view')[0] !== this.$view[0]) {
- return;
- }
- var viewData = {};
- var href = $link.attr('href');
- // Provide a default page if none has been set. This must be done
- // prior to merging with settings to avoid accidentally using the
- // page landed on instead of page 1.
- if (typeof(viewData.page) === 'undefined') {
- viewData.page = 0;
- }
- // Construct an object using the settings defaults and then overriding
- // with data specific to the link.
- $.extend(
- viewData,
- this.settings,
- Drupal.Views.parseQueryString(href),
- // Extract argument data from the URL.
- Drupal.Views.parseViewArgs(href, this.settings.view_base_path)
- );
- // For anchor tags, these will go to the target of the anchor rather
- // than the usual location.
- $.extend(viewData, Drupal.Views.parseViewArgs(href, this.settings.view_base_path));
- this.element_settings.submit = viewData;
- this.pagerAjax = new Drupal.ajax(false, $link, this.element_settings);
- this.links.push(this.pagerAjax);
- };
- Drupal.ajax.prototype.commands.viewsScrollTop = function (ajax, response, status) {
- // Scroll to the top of the view. This will allow users
- // to browse newly loaded content after e.g. clicking a pager
- // link.
- var offset = $(response.selector).offset();
- // We can't guarantee that the scrollable object should be
- // the body, as the view could be embedded in something
- // more complex such as a modal popup. Recurse up the DOM
- // and scroll the first element that has a non-zero top.
- var scrollTarget = response.selector;
- while ($(scrollTarget).scrollTop() == 0 && $(scrollTarget).parent()) {
- scrollTarget = $(scrollTarget).parent();
- }
- // Only scroll upward.
- if (offset.top - 10 < $(scrollTarget).scrollTop()) {
- $(scrollTarget).animate({scrollTop: (offset.top - 10)}, 500);
- }
- };
- })(jQuery);
|