combo/combo/public/static/js/combo.public.js

104 lines
3.3 KiB
JavaScript

function combo_load_cell(elem, url) {
$.ajax({url: url + window.location.search,
xhrFields: { withCredentials: true },
async: true,
dataType: 'html',
crossDomain: true,
success: function(data) {
var parent = $(elem).parent();
$(elem).parent().parent().addClass('ajax-loaded');
$(elem).parent().nextAll().remove();
if (data == '') {
$(elem).remove();
} else {
$(elem).replaceWith(data);
}
$(document).trigger('combo:cell-loaded', parent);
},
error: function(error) {
$(elem).addClass('error-loading');
window.console && console.log(':(', error);
}
});
}
function combo_modify_query_string(name, value) {
var search = window.location.search.substring(1);
var parts = search.split('&');
var newparts = [];
var modified = 0;
value = encodeURIComponent(value);
for (var i = 0; i < parts.length; i++) {
if (! parts[i]) {
continue;
}
var pair = parts[i].split('=');
if (pair[0] == name) {
if (value) {
newparts.push(name + '=' + value);
}
modified = 1;
} else {
newparts.push(parts[i]);
}
}
if (! modified && value) {
newparts.push(name + '=' + value);
}
if (newparts) {
search = '?' + newparts.join('&');
} else {
search = '';
}
return search;
}
$(function() {
$('[data-ajax-cell-refresh]').each(function(idx, elem) {
var $elem = $(elem);
function refresh() {
combo_load_cell($elem.find('> div'), $elem.data('ajax-cell-url'));
}
$elem.timeout_id = setInterval(refresh, $elem.data('ajax-cell-refresh')*1000);
});
$('[data-ajax-cell-must-load]').each(function(idx, elem) {
var $elem = $(elem);
combo_load_cell($elem, $elem.parents('div.cell').data('ajax-cell-url'));
});
/* utility functions and events, for themes */
$('.togglable').on('click', function() {
$(this).toggleClass('toggled');
});
/* reload cells when parameters changes */
function combo_refresh_ajax_cells() {
$('[data-ajax-cell-url]').each(function(idx, elem) {
var $elem = $(elem);
var msg = $(elem).data('ajax-cell-loading-message');
$elem.prepend('<div><div class="loading"><span class="loading-message">' + msg + '</span></div></div>');
combo_load_cell($elem.find('div.loading'), $elem.data('ajax-cell-url'));
});
}
if (window.history.pushState && $('.parameterscell').length > 0) {
/* set initial state */
window.history.replaceState("reload", "", window.location.href);
$(window).on('popstate', function (event) {
if (event.originalEvent.state == "reload") {
combo_refresh_ajax_cells();
}
});
}
$(document).on('change', '.combo-parameters-cell-form select', function (e) {
var $target = $(e.target);
var value = $target.val();
var name = $target[0].name;
var new_qs = combo_modify_query_string(name, value);
if (window.history.pushState) {
window.history.pushState("reload", "", window.location.pathname + new_qs);
combo_refresh_ajax_cells();
} else {
window.location.search = new_qs;
}
});
});