arch-8.x-1.x-dev/modules/product/modules/group/assets/js/product-matrix-ajax.js
modules/product/modules/group/assets/js/product-matrix-ajax.js
(function ($, Drupal, drupalSettings, window) {
'use strict';
function getCurrentState() {
return {
state: {
url: location.href,
documentTitle: document.title,
pageTitle: $('h1.page-title').text(),
selector: '.product--full',
content: $('<div>').append($('.product--full').clone()).html()
},
title: document.title,
href: location.href
};
}
function createDocumentTitle(siteName, title) {
var oldTitle = document.title;
var escapedSiteName = siteName.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
var re = new RegExp('.+ (.) ' + escapedSiteName);
return oldTitle.replace(re, title + ' $1 ' + siteName);
}
function getNewState(response) {
var newTitle = createDocumentTitle(response.siteName, response.title);
return {
state: {
url: location.href,
documentTitle: document.title,
pageTitle: $('h1.page-title').text(),
selector: response.selector,
content: $('<div>').append($('.product--full').clone()).html()
},
title: newTitle,
href: response.url
};
}
function replaceContent(documentTitle, pageTitle, selector, content) {
document.title = documentTitle;
$('h1.page-title').text(pageTitle);
var $wrapper = $(selector);
var method = 'replaceWith';
var effect = {
showEffect: 'show',
hideEffect: 'hide',
showSpeed: ''
};
var settings = drupalSettings;
var $newContent = $($.parseHTML(content, document, true));
Drupal.detachBehaviors($wrapper.get(0), settings);
$wrapper[method]($newContent);
var $ajaxNewContent = $newContent.find('.ajax-new-content');
if ($ajaxNewContent.length) {
$ajaxNewContent.hide();
$newContent.show();
$ajaxNewContent[effect.showEffect](effect.showSpeed);
}
else if (effect.showEffect !== 'show') {
$newContent[effect.showEffect](effect.showSpeed);
}
if ($newContent.parents('html').length) {
$newContent.each(function (index, element) {
if (element.nodeType === Node.ELEMENT_NODE) {
Drupal.attachBehaviors(element, settings);
}
});
}
}
Drupal.AjaxCommands.prototype.productReplaceUrlTitle = function (ajax, response, status) {
var newState = getNewState(response);
if (window.history && window.history.pushState) {
window.history.pushState(newState.state, newState.title, newState.href);
}
replaceContent(newState.title, response.title, response.selector, response.content);
};
Drupal.behaviors.arch_product_matrix_ajax = {
attach: function attach(context) {
var processedClass = 'arch-product-matrix-navigation-processed';
var $body = $('body');
if ($body.hasClass(processedClass)) {
return;
}
var currentState = getCurrentState();
window.history.replaceState(currentState.state, currentState.title, currentState.href);
}
};
window.onpopstate = function (event) {
replaceContent(event.state.documentTitle, event.state.pageTitle, event.state.selector, event.state.content);
};
})(jQuery, Drupal, drupalSettings, window);
