jqlmodule
Version:
A JQuery alike es20xx module
89 lines (81 loc) • 3.8 kB
JavaScript
import { popupStyling } from "./EmbedResources.js";
import { randomString } from "./Utilities.js";
export default newPopupFactory;
function newPopupFactory($) {
const editRule = $.createStyle(`JQLPopupCSS`);
popupStyling.forEach( rule => editRule(rule) );
let callbackOnClose = {};
let isModal, modalWarning, timeout;
const warnTemplate = $.virtual(`<div class="popup-warn">`);
const popupContainer = $(`<div class="popupContainer">`)
.append( $(`<span class="closeHandleIcon">`) )
.append( $(`<div class="content">`) );
const [closer, txtBox] = [$(`.popupContainer > .closeHandleIcon`), $( `.popupContainer > .content` )];
const positionCloser = () => {
if ( closer.hasClass(`popup-active`) ) {
const {x, y, width} = txtBox.dimensions;
closer.style({top: `${y - 12}px`, left: `${x + width - 12}px`});
} };
const warn = () => {
modalWarning && $(`.popup-warn`).clear().append($(`<div>${modalWarning}</div>`));
txtBox.addClass(`popup-warn-active`); };
const removeModal = () => { isModal = false; remove(closer.first()); };
const timed = (seconds, callback) => timeout = setTimeout( () => remove(closer[0]), +seconds * 1000 );
$.delegate(`click`, `.popupContainer, .closeHandleIcon`, evt => remove(evt.target));
$.delegate(`click`, `.popupContainer .content`, (_, self) => isModal && self.removeClass(`popup-warn-active`));
$.delegate(`resize`, positionCloser);
return {
show: createAndShowPupup,
create: (message, isModalOrCallback, modalCallback, modalWarning) => { /*legacy*/
const isModal = $.IS(isModalOrCallback, Boolean) ? isModalOrCallback : false;
createAndShowPupup({
content: message, modal: isModal,
callback: isModal ? modalCallback : isModalOrCallback, warnMessage: modalWarning, }); },
createTimed: (message, closeAfter, callback) => /*legacy*/
createAndShowPupup({content: message, closeAfter, callback}),
removeModal,
};
function createAndShowPupup( { content, modal, closeAfter, callback, warnMessage } ) {
if (content) {
content = $.IS(content, Node) ? content[Symbol.jqlvirtual] : content;
clearTimeout(timeout);
isModal = modal ?? false;
modalWarning = $.IS(warnMessage, String) && `${warnMessage?.trim()}`.length || warnMessage?.isJQL
? warnMessage : undefined;
txtBox.clear().append(content.isJQL ? content : $(`<div>${content}</div>`));
isModal && warnMessage && txtBox.append(warnTemplate.duplicate());
popupContainer.addClass(`popup-active`);
if ($.IS(callback, Function)) {
const tmpId = randomString();
popupContainer.data.set( {callbackId: tmpId} );
callbackOnClose[tmpId] = callback;
}
if (!isModal) {
if ($.IS(+closeAfter, Number)) {
const callbackId = popupContainer.data.get(`callbackId`);
const callback = callbackId && callbackOnClose[callbackId];
timed(closeAfter, callback);
}
closer.addClass(`popup-active`);
positionCloser();
}
return true;
}
return console.error(`Popup creation needs at least some text to show`);
}
function remove(origin) {
if (!isModal && !origin.closest(`.content`)) {
clearTimeout(timeout);
txtBox.clear();
const callbackId = popupContainer.data.get(`callbackId`);
popupContainer.data.remove(`callbackId`);
$(`.popup-active`).removeClass(`popup-active`);
const cb = callbackId && callbackOnClose[callbackId];
if ($.IS(cb, Function)) { cb(); }
if (callbackId) { delete callbackOnClose[callbackId]; }
modalWarning = ``;
return;
}
return isModal && warn();
}
}