xssbook2/web/public/js/lib.js

106 lines
1.9 KiB
JavaScript

///
/// dom observer
/// checks for elements on the DOM now and added later
///
var $$ = (selector) => {
// add jquery functions that
// are used and needed to be used for
// $$()
const functions = [
'on',
'click',
'submit',
'each'
];
let vtable = {};
for (const name of functions) {
vtable[name] = (...params) => {
const onCreate = (me) => {
me[name](...params);
};
const onMutate = (mutations) => {
mutations.forEach((mutation) => {
if (!mutation.addedNodes.length) {
return;
}
let elements = $(mutation.addedNodes).find(selector);
for (let i = 0, len = elements.length; i < len; i++) {
let me = $(elements[i]);
onCreate(me);
}
});
};
$(function() {
$(selector).each(function (_ , me) {
onCreate($(me));
});
let config = { childList: true, subtree: true };
let MutationObserver = window.MutationObserver;
let observer = new MutationObserver(onMutate);
observer.observe(document.body, config);
});
};
}
return vtable;
}
///
/// 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);
})
}
$$('.action-close-toast').on('click', function() {
$(this).parent().remove();
});
$$('.action-close-toast').each(function() {
let me = $(this);
setTimeout(function() {
me.parent().remove();
}, 5000);
});
///
/// ajax setup
///
$.ajaxSetup({
headers: (() => {
let ajaxHeaders = {};
ajaxHeaders['Content-Type'] = 'application/json';
if (jwtStr) {
ajaxHeaders['Authorization'] = 'Bearer ' + jwtStr
}
return ajaxHeaders;
})(),
error: errorToast
})