UNPKG

b-components-js

Version:

Generate Bootstrap components through JavaScript

397 lines (387 loc) 13.5 kB
/*! * Name: b-components-js * Version: 0.0.2 * Description: Generate Bootstrap components through JavaScript * Copyright (c) 2020 - 2022 ZhangChengLin * Licenses: MIT * GitHub: https://github.com/ZhangChengLin/b-components */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(require('bootstrap')) : typeof define === 'function' && define.amd ? define(['bootstrap'], factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.bootstrap)); })(this, (function (bootstrap) { 'use strict'; const isNull = (value) => value === null; const isEmpty = (value) => typeof value === 'string' && value === ''; const bsDismissBtn = (dismissType, whiteVariant = false) => { const btn = document.createElement('button'); btn.className = whiteVariant ? 'btn-close btn-close-white' : 'btn-close'; btn.type = 'button'; btn.dataset.bsDismiss = dismissType; btn.ariaLabel = 'Close'; return btn }; const getTimeString = () => Date.now().toString(); const modalEvents = (_modal, eventsType, eventsFun) => { switch (eventsType) { case 'show': _modal.addEventListener('show.bs.modal', () => eventsFun()); break case 'shown': _modal.addEventListener('shown.bs.modal', () => eventsFun()); break case 'hide': _modal.addEventListener('hide.bs.modal', () => eventsFun()); break case 'hidden': _modal.addEventListener('hidden.bs.modal', () => eventsFun()); break case 'hidePrevented': _modal.addEventListener('hidePrevented.bs.modal', () => eventsFun()); break } }; const removeModal = (_modal) => { _modal.addEventListener('hidden.bs.modal', () => { const x = bootstrap.Modal.getInstance(_modal); x.dispose(); setTimeout(() => { _modal.remove(); }, 2e3); }); }; const modal = (modalId) => { const _modal = document.createElement('div'); _modal.className = 'modal fade'; _modal.id = modalId; _modal.tabIndex = -1; _modal.role = 'dialog'; _modal.setAttribute('aria-labelledby', 'modalTitleLabel'); return _modal }; const dialog = (ModalSizes = '', VerticallyCentered = false, ScrollingLongContent = false) => { const _dialog = document.createElement('div'); _dialog.className = 'modal-dialog'; switch (ModalSizes) { case 'sm': _dialog.classList.add('modal-sm'); break case 'lg': _dialog.classList.add('modal-lg'); break case 'xl': _dialog.classList.add('modal-xl'); break case 'full': _dialog.classList.add('modal-fullscreen'); break case 'full-sm': _dialog.classList.add('modal-fullscreen-sm-down'); break case 'full-md': _dialog.classList.add('modal-fullscreen-md-down'); break case 'full-lg': _dialog.classList.add('modal-fullscreen-lg-down'); break case 'full-xl': _dialog.classList.add('modal-fullscreen-xl-down'); break case '': case 'default': break default: _dialog.classList.add(ModalSizes); break } switch (VerticallyCentered) { case true: _dialog.classList.add('modal-dialog-centered'); break } switch (ScrollingLongContent) { case true: _dialog.classList.add('modal-dialog-scrollable'); break } return _dialog }; const content = () => { const _content = document.createElement('div'); _content.className = 'modal-content'; return _content }; const header$2 = (headerNodeElement) => { if (isNull(headerNodeElement) || isEmpty(headerNodeElement)) { return '' } const _header = document.createElement('div'); const _title = document.createElement('h5'); _header.className = 'modal-header'; _title.className = 'modal-title'; _title.id = 'modalTitleLabel'; headerNodeElement instanceof Function ? _title.append(headerNodeElement()) : (headerNodeElement instanceof HTMLElement ? _title.append(headerNodeElement) : _title.innerHTML = headerNodeElement); _header.append(_title, bsDismissBtn('modal')); return _header }; const body$2 = (bodyNodeElement) => { const _body = document.createElement('div'); _body.className = 'modal-body'; bodyNodeElement instanceof Function ? _body.append(bodyNodeElement()) : (bodyNodeElement instanceof HTMLElement ? _body.append(bodyNodeElement) : _body.innerHTML = bodyNodeElement); return _body }; const footer = (footerNodeElement) => { if (isNull(footerNodeElement) || isEmpty(footerNodeElement)) { return '' } const _footer = document.createElement('div'); _footer.className = 'modal-footer'; footerNodeElement instanceof Function ? _footer.append(footerNodeElement()) : (footerNodeElement instanceof HTMLElement ? _footer.append(footerNodeElement) : _footer.innerHTML = footerNodeElement); return _footer }; const bModal = (headerNodeElement, bodyNodeElement, footerNodeElement, ModalSizes, VerticallyCentered, ScrollingLongContent, Options, EventsType, EventsFunction) => { const modalId = 'modalId_' + getTimeString(); const _modal = modal(modalId); const _dialog = dialog(ModalSizes, VerticallyCentered, ScrollingLongContent); const _content = content(); const _header = header$2(headerNodeElement); const _body = body$2(bodyNodeElement); const _footer = footer(footerNodeElement); _content.append(_header, _body, _footer); _dialog.append(_content); _modal.append(_dialog); document.body.append(_modal); EventsType && EventsFunction ? modalEvents(_modal, EventsType, EventsFunction) : ''; const xxx = Options ? new bootstrap.Modal(_modal, Options) : new bootstrap.Modal(_modal); xxx.show(); removeModal(_modal); return modalId }; const offcanvasEvents = (_offcanvas, eventsType, eventsFun) => { switch (eventsType) { case 'show': _offcanvas.addEventListener('show.bs.offcanvas', () => eventsFun()); break case 'shown': _offcanvas.addEventListener('shown.bs.offcanvas', () => eventsFun()); break case 'hide': _offcanvas.addEventListener('hide.bs.offcanvas', () => eventsFun()); break case 'hidden': _offcanvas.addEventListener('hidden.bs.offcanvas', () => eventsFun()); break default: throw 'eventsType error' } }; const removeOffcanvas = (_offcanvas) => { _offcanvas.addEventListener('hidden.bs.offcanvas', () => { const x = bootstrap.Offcanvas.getInstance(_offcanvas); x.dispose(); setTimeout(() => { _offcanvas.remove(); }, 3e3); }); }; const offcanvas = (Placement, offcanvasId) => { const _offcanvas = document.createElement('div'); Placement = Placement ?? 'start'; switch (Placement) { case 'start': case 'top': case 'end': case 'bottom': break default: throw 'Placement error' } _offcanvas.className = `offcanvas offcanvas-${Placement}`; _offcanvas.id = offcanvasId; _offcanvas.tabIndex = -1; _offcanvas.role = 'dialog'; _offcanvas.setAttribute('aria-labelledby', 'offcanvasTitleLabel'); return _offcanvas }; const header$1 = (headerNodeElement) => { if (isNull(headerNodeElement) || isEmpty(headerNodeElement)) { return '' } const _header = document.createElement('div'); const _title = document.createElement('h5'); _header.className = 'offcanvas-header'; _title.className = 'offcanvas-title'; _title.id = 'offcanvasTitleLabel'; headerNodeElement instanceof Function ? _title.append(headerNodeElement()) : (headerNodeElement instanceof HTMLElement ? _title.append(headerNodeElement) : _title.innerHTML = headerNodeElement); _header.append(_title, bsDismissBtn('offcanvas')); return _header }; const body$1 = (bodyNodeElement) => { const _body = document.createElement('div'); _body.className = 'offcanvas-body'; bodyNodeElement instanceof Function ? _body.append(bodyNodeElement()) : (bodyNodeElement instanceof HTMLElement ? _body.append(bodyNodeElement) : _body.innerHTML = bodyNodeElement); return _body }; const bOffcanvas = (headerNodeElement, bodyNodeElement, Placement, Options, EventsType, EventsFunction) => { const offcanvasId = 'offcanvasId_' + getTimeString(); const _offcanvas = offcanvas(Placement, offcanvasId); const _header = header$1(headerNodeElement); const _body = body$1(bodyNodeElement); _offcanvas.append(_header, _body); document.body.append(_offcanvas); EventsType && EventsFunction ? offcanvasEvents(_offcanvas, EventsType, EventsFunction) : ''; const xxx = Options ? new bootstrap.Offcanvas(_offcanvas, Options) : new bootstrap.Offcanvas(_offcanvas); xxx.show(); removeOffcanvas(_offcanvas); return offcanvasId }; const toastEvents = (_toast, eventsType, eventsFun) => { switch (eventsType) { case 'show': _toast.addEventListener('show.bs.toast', () => eventsFun()); break case 'shown': _toast.addEventListener('shown.bs.toast', () => eventsFun()); break case 'hide': _toast.addEventListener('hide.bs.toast', () => eventsFun()); break case 'hidden': _toast.addEventListener('hidden.bs.toast', () => eventsFun()); break default: throw 'eventsType error' } }; const removeToast = (_toast) => { _toast.addEventListener('hidden.bs.toast', () => { const x = bootstrap.Toast.getInstance(_toast); x.dispose(); setTimeout(() => { _toast.remove(); }, 3e3); }); }; const toast = (toastId) => { const _toast = document.createElement('div'); _toast.className = 'toast'; _toast.id = toastId; _toast.role = 'alert'; _toast.ariaLive = 'assertive'; _toast.ariaAtomic = 'true'; return _toast }; const containerOutside = (ariaLive) => { const containerOutside = document.createElement('div'); containerOutside.className = 'position-relative'; containerOutside.ariaLive = ariaLive ?? 'polite'; containerOutside.ariaAtomic = 'true'; return containerOutside }; const container = (Placement) => { const container = document.createElement('div'); Placement = Placement ?? 'be'; switch (Placement) { case 'ts': Placement = 'top-0 start-0'; break case 'tc': Placement = 'top-0 start-50 translate-middle-x'; break case 'te': Placement = 'top-0 end-0'; break case 'ms': Placement = 'top-50 start-0 translate-middle-y'; break case 'mc': Placement = 'top-50 start-50 translate-middle'; break case 'me': Placement = 'top-50 end-0 translate-middle-y'; break case 'bs': Placement = 'bottom-0 start-0'; break case 'bc': Placement = 'bottom-0 start-50 translate-middle-x'; break case 'be': Placement = 'bottom-0 end-0'; break default: throw 'Placement error' } container.className = `toast-container position-fixed ${Placement}`; return container }; const header = (headerNodeElement) => { if (isNull(headerNodeElement) || isEmpty(headerNodeElement)) { return '' } const _header = document.createElement('div'); const _title = document.createElement('strong'); _header.className = 'toast-header'; _title.className = 'toast-title me-auto'; headerNodeElement instanceof Function ? _title.append(headerNodeElement()) : (headerNodeElement instanceof HTMLElement ? _title.append(headerNodeElement) : _title.innerHTML = headerNodeElement); _header.append(_title, bsDismissBtn('toast')); return _header }; const body = (bodyNodeElement) => { const _body = document.createElement('div'); _body.className = 'toast-body'; bodyNodeElement instanceof Function ? _body.append(bodyNodeElement()) : (bodyNodeElement instanceof HTMLElement ? _body.append(bodyNodeElement) : _body.innerHTML = bodyNodeElement); return _body }; const bToast = (headerNodeElement, bodyNodeElement, Placement, Options, EventsType, EventsFunction) => { const toastId = 'toastId_' + getTimeString(); const _containerOutsize = containerOutside(); const _container = document.querySelector('.toast-container') ?? container(Placement); const _toast = toast(toastId); const _header = header(headerNodeElement); const _body = body(bodyNodeElement); _toast.append(_header, _body); _container.append(_toast); _containerOutsize.append(_container); document.body.append(_containerOutsize); EventsType && EventsFunction ? toastEvents(_toast, EventsType, EventsFunction) : ''; const xxx = Options ? new bootstrap.Toast(_toast, Options) : new bootstrap.Toast(_toast); xxx.show(); removeToast(_toast); return toastId }; Object.assign(window, { bModal, bOffcanvas, bToast }); })); //# sourceMappingURL=b.bundle.js.map