X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/f413fc528a8136c2ad8d33a57b3615fa22e55e93..45d08604482ff811f1627f8dc489f14b455ea75c:/resources/js/services/dom.js diff --git a/resources/js/services/dom.js b/resources/js/services/dom.js index 966a4540e..eb5f6a853 100644 --- a/resources/js/services/dom.js +++ b/resources/js/services/dom.js @@ -25,17 +25,42 @@ export function onEvents(listenerElement, events, callback) { /** * Helper to run an action when an element is selected. * A "select" is made to be accessible, So can be a click, space-press or enter-press. - * @param listenerElement - * @param callback + * @param {HTMLElement|Array} elements + * @param {function} callback */ -export function onSelect(listenerElement, callback) { - listenerElement.addEventListener('click', callback); - listenerElement.addEventListener('keydown', (event) => { - if (event.key === 'Enter' || event.key === ' ') { - event.preventDefault(); +export function onSelect(elements, callback) { + if (!Array.isArray(elements)) { + elements = [elements]; + } + + for (const listenerElement of elements) { + listenerElement.addEventListener('click', callback); + listenerElement.addEventListener('keydown', (event) => { + if (event.key === 'Enter' || event.key === ' ') { + event.preventDefault(); + callback(event); + } + }); + } +} + +/** + * Listen to enter press on the given element(s). + * @param {HTMLElement|Array} elements + * @param {function} callback + */ +export function onEnterPress(elements, callback) { + if (!Array.isArray(elements)) { + elements = [elements]; + } + + const listener = event => { + if (event.key === 'Enter') { callback(event); } - }); + } + + elements.forEach(e => e.addEventListener('keypress', listener)); } /** @@ -72,4 +97,37 @@ export function findText(selector, text) { } } return null; +} + +/** + * Show a loading indicator in the given element. + * This will effectively clear the element. + * @param {Element} element + */ +export function showLoading(element) { + element.innerHTML = `
`; +} + +/** + * Remove any loading indicators within the given element. + * @param {Element} element + */ +export function removeLoading(element) { + const loadingEls = element.querySelectorAll('.loading-container'); + for (const el of loadingEls) { + el.remove(); + } +} + +/** + * Convert the given html data into a live DOM element. + * Initiates any components defined in the data. + * @param {String} html + * @returns {Element} + */ +export function htmlToDom(html) { + const wrap = document.createElement('div'); + wrap.innerHTML = html; + window.components.init(wrap); + return wrap.children[0]; } \ No newline at end of file