/// /// document ready functions /// let ready = false; $(function() { ready = true; }); var r$ = function(callback) { if (ready) { callback(); } else { $(function() { callback(); }); } } /// /// dom observer /// checks for elements on the DOM now and added later /// function observe(containerSelector, elementSelector, callback) { r$(() => { $(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]; if (!target) { console.warn('[observe] didnt find container: ', containerSelector); return; } var config = { childList: true, subtree: true }; var MutationObserver = window.MutationObserver; var observer = new MutationObserver(onMutationsObserved); observer.observe(target, config); }); } /// /// 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); });