import { $t } from 'element-ui/src/locale'; const CONFIRM_TEXT = $t('el.messagebox.confirm'); const CANCEL_TEXT = $t('el.messagebox.cancel'); const defaults = { title: '提示', message: '', type: '', showInput: false, showClose: true, modalFade: true, lockScroll: true, closeOnClickModal: true, inputValue: null, inputPlaceholder: '', inputPattern: null, inputValidator: null, inputErrorMessage: '', showConfirmButton: true, showCancelButton: false, confirmButtonPosition: 'right', confirmButtonHighlight: false, cancelButtonHighlight: false, confirmButtonText: CONFIRM_TEXT, cancelButtonText: CANCEL_TEXT, confirmButtonClass: '', cancelButtonClass: '' }; import Vue from 'vue'; import msgboxVue from './main.vue'; const merge = function(target) { for (let i = 1, j = arguments.length; i < j; i++) { let source = arguments[i]; for (let prop in source) { if (source.hasOwnProperty(prop)) { let value = source[prop]; if (value !== undefined) { target[prop] = value; } } } } return target; }; const MessageBoxConstructor = Vue.extend(msgboxVue); let currentMsg, instance; let msgQueue = []; const defaultCallback = action => { if (currentMsg) { let callback = currentMsg.callback; if (typeof callback === 'function') { if (instance.showInput) { callback(instance.inputValue, action); } else { callback(action); } } if (currentMsg.resolve) { let $type = currentMsg.options.$type; if ($type === 'confirm' || $type === 'prompt') { if (action === 'confirm') { if (instance.showInput) { currentMsg.resolve({ value: instance.inputValue, action }); } else { currentMsg.resolve(action); } } else if (action === 'cancel' && currentMsg.reject) { currentMsg.reject(action); } } else { currentMsg.resolve(action); } } } }; const initInstance = () => { instance = new MessageBoxConstructor({ el: document.createElement('div') }); instance.callback = defaultCallback; }; const showNextMsg = () => { if (!instance) { initInstance(); } if (!instance.value || instance.closeTimer) { if (msgQueue.length > 0) { currentMsg = msgQueue.shift(); let options = currentMsg.options; for (let prop in options) { if (options.hasOwnProperty(prop)) { instance[prop] = options[prop]; } } if (options.callback === undefined) { instance.callback = defaultCallback; } ['modal', 'showClose', 'closeOnClickModal', 'closeOnPressEscape'].forEach(prop => { if (instance[prop] === undefined) { instance[prop] = true; } }); document.body.appendChild(instance.$el); Vue.nextTick(() => { instance.value = true; }); } } }; const MessageBox = function(options, callback) { if (typeof options === 'string') { options = { title: options }; if (arguments[1]) { options.message = arguments[1]; } if (arguments[2]) { options.type = arguments[2]; } } else if (options.callback && !callback) { callback = options.callback; } if (typeof Promise !== 'undefined') { return new Promise((resolve, reject) => { // eslint-disable-line msgQueue.push({ options: merge({}, defaults, MessageBox.defaults || {}, options), callback: callback, resolve: resolve, reject: reject }); showNextMsg(); }); } else { msgQueue.push({ options: merge({}, defaults, MessageBox.defaults || {}, options), callback: callback }); showNextMsg(); } }; MessageBox.setDefaults = defaults => { MessageBox.defaults = defaults; }; MessageBox.alert = (message, title, options) => { if (typeof title === 'object') { options = title; title = ''; } return MessageBox(merge({ title: title, message: message, $type: 'alert', closeOnPressEscape: false, closeOnClickModal: false }, options)); }; MessageBox.confirm = (message, title, options) => { if (typeof title === 'object') { options = title; title = ''; } return MessageBox(merge({ title: title, message: message, $type: 'confirm', showCancelButton: true }, options)); }; MessageBox.prompt = (message, title, options) => { if (typeof title === 'object') { options = title; title = ''; } return MessageBox(merge({ title: title, message: message, showCancelButton: true, showInput: true, $type: 'prompt' }, options)); }; MessageBox.close = () => { instance.value = false; msgQueue = []; currentMsg = null; }; export default MessageBox; export { MessageBox };