2024-03-30 02:29:56 +00:00
|
|
|
|
2024-03-30 16:14:42 +00:00
|
|
|
///
|
|
|
|
/// document ready functions
|
|
|
|
///
|
|
|
|
|
2024-03-30 02:29:56 +00:00
|
|
|
let ready = false;
|
|
|
|
|
|
|
|
$(function() {
|
|
|
|
ready = true;
|
|
|
|
});
|
|
|
|
|
|
|
|
var r$ = function(callback) {
|
|
|
|
if (ready) {
|
|
|
|
callback();
|
|
|
|
} else {
|
|
|
|
$(function() {
|
|
|
|
callback();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-03-30 16:14:42 +00:00
|
|
|
///
|
|
|
|
/// dom observer
|
|
|
|
/// checks for elements on the DOM now and added later
|
|
|
|
///
|
|
|
|
|
2024-03-30 02:29:56 +00:00
|
|
|
function observe(containerSelector, elementSelector, callback) {
|
|
|
|
|
2024-03-30 16:14:42 +00:00
|
|
|
r$(() => {
|
2024-03-30 02:29:56 +00:00
|
|
|
$(containerSelector + ' ' + elementSelector).each(function (_, e) {
|
|
|
|
let me = $(e);
|
|
|
|
callback(me);
|
|
|
|
});
|
|
|
|
|
|
|
|
var onMutationsObserved = function(mutations) {
|
|
|
|
mutations.forEach(function(mutation) {
|
|
|
|
if (mutation.addedNodes.length) {
|
|
|
|
var elements = $(mutation.addedNodes).find(elementSelector);
|
|
|
|
for (var i = 0, len = elements.length; i < len; i++) {
|
|
|
|
let me = elements[i];
|
|
|
|
me = $(me);
|
|
|
|
callback(me);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
var target = $(containerSelector)[0];
|
2024-03-30 16:14:42 +00:00
|
|
|
|
|
|
|
if (!target) {
|
|
|
|
console.warn('[observe] didnt find container: ', containerSelector);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2024-03-30 02:29:56 +00:00
|
|
|
var config = { childList: true, subtree: true };
|
|
|
|
var MutationObserver = window.MutationObserver;
|
|
|
|
var observer = new MutationObserver(onMutationsObserved);
|
|
|
|
observer.observe(target, config);
|
|
|
|
});
|
|
|
|
}
|
2024-03-30 16:14:42 +00:00
|
|
|
|
|
|
|
///
|
|
|
|
/// ajax setup
|
|
|
|
///
|
|
|
|
|
|
|
|
let ajaxHeaders = {};
|
|
|
|
ajaxHeaders['Content-Type'] = 'application/json';
|
|
|
|
if (jwtStr) {
|
|
|
|
ajaxHeaders['Authorization'] = 'Bearer ' + jwtStr
|
|
|
|
}
|
|
|
|
|
|
|
|
$.ajaxSetup({
|
|
|
|
headers: ajaxHeaders
|
|
|
|
})
|
|
|
|
|
|
|
|
///
|
|
|
|
/// ajax error handle
|
|
|
|
///
|
|
|
|
|
|
|
|
var errorToast = (xhr) => {
|
|
|
|
let data = xhr.responseJSON;
|
|
|
|
let msg = data.message;
|
|
|
|
let detail = data.details;
|
|
|
|
let hint = data.hint;
|
|
|
|
|
|
|
|
let query = '?msg=' + msg;
|
|
|
|
if (detail) {
|
|
|
|
query += '&detail=' + detail;
|
|
|
|
}
|
|
|
|
if (hint) {
|
|
|
|
query += '&hint=' + hint;
|
|
|
|
}
|
|
|
|
let url = '/template/toast' + query;
|
|
|
|
$.get(url, function (data) {
|
|
|
|
$('#toast-container').prepend(data);
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
observe('#toast-container', '.action-close-toast', function(el) {
|
|
|
|
el.on('click', function() {
|
|
|
|
el.parent().remove();
|
|
|
|
});
|
|
|
|
|
|
|
|
setTimeout(function() {
|
|
|
|
el.parent().remove();
|
|
|
|
}, 5000);
|
|
|
|
});
|
|
|
|
|
|
|
|
|