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
JavaScript
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'
};
}