/// /// 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 })