UNPKG

uikit

Version:

UIkit is a lightweight and modular front-end framework for developing fast and powerful web interfaces.

161 lines (117 loc) 4.68 kB
import Modal from '../mixin/modal'; import {$, addClass, assign, css, hasClass, height, html, isString, on, Promise, removeClass} from 'uikit-util'; export default { install, mixins: [Modal], data: { clsPage: 'uk-modal-page', selPanel: '.uk-modal-dialog', selClose: '.uk-modal-close, .uk-modal-close-default, .uk-modal-close-outside, .uk-modal-close-full' }, events: [ { name: 'show', self: true, handler() { if (hasClass(this.panel, 'uk-margin-auto-vertical')) { addClass(this.$el, 'uk-flex'); } else { css(this.$el, 'display', 'block'); } height(this.$el); // force reflow } }, { name: 'hidden', self: true, handler() { css(this.$el, 'display', ''); removeClass(this.$el, 'uk-flex'); } } ] }; function install(UIkit) { UIkit.modal.dialog = function (content, options) { const dialog = UIkit.modal(` <div class="uk-modal"> <div class="uk-modal-dialog">${content}</div> </div> `, options); dialog.show(); on(dialog.$el, 'hidden', () => Promise.resolve(() => dialog.$destroy(true)), {self: true}); return dialog; }; UIkit.modal.alert = function (message, options) { options = assign({bgClose: false, escClose: false, labels: UIkit.modal.labels}, options); return new Promise( resolve => on(UIkit.modal.dialog(` <div class="uk-modal-body">${isString(message) ? message : html(message)}</div> <div class="uk-modal-footer uk-text-right"> <button class="uk-button uk-button-primary uk-modal-close" autofocus>${options.labels.ok}</button> </div> `, options).$el, 'hide', resolve) ); }; UIkit.modal.confirm = function (message, options) { options = assign({bgClose: false, escClose: true, labels: UIkit.modal.labels}, options); return new Promise((resolve, reject) => { const confirm = UIkit.modal.dialog(` <form> <div class="uk-modal-body">${isString(message) ? message : html(message)}</div> <div class="uk-modal-footer uk-text-right"> <button class="uk-button uk-button-default uk-modal-close" type="button">${options.labels.cancel}</button> <button class="uk-button uk-button-primary" autofocus>${options.labels.ok}</button> </div> </form> `, options); let resolved = false; on(confirm.$el, 'submit', 'form', e => { e.preventDefault(); resolve(); resolved = true; confirm.hide(); }); on(confirm.$el, 'hide', () => { if (!resolved) { reject(); } }); }); }; UIkit.modal.prompt = function (message, value, options) { options = assign({bgClose: false, escClose: true, labels: UIkit.modal.labels}, options); return new Promise(resolve => { const prompt = UIkit.modal.dialog(` <form class="uk-form-stacked"> <div class="uk-modal-body"> <label>${isString(message) ? message : html(message)}</label> <input class="uk-input" autofocus> </div> <div class="uk-modal-footer uk-text-right"> <button class="uk-button uk-button-default uk-modal-close" type="button">${options.labels.cancel}</button> <button class="uk-button uk-button-primary">${options.labels.ok}</button> </div> </form> `, options), input = $('input', prompt.$el); input.value = value; let resolved = false; on(prompt.$el, 'submit', 'form', e => { e.preventDefault(); resolve(input.value); resolved = true; prompt.hide(); }); on(prompt.$el, 'hide', () => { if (!resolved) { resolve(null); } }); }); }; UIkit.modal.labels = { ok: 'Ok', cancel: 'Cancel' }; }