index.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import Vue from 'vue';
  2. import VanDialog from './Dialog';
  3. import { isServer, isInDocument } from '../utils';
  4. let instance;
  5. function initInstance() {
  6. if (instance) {
  7. instance.$destroy();
  8. }
  9. instance = new (Vue.extend(VanDialog))({
  10. el: document.createElement('div'),
  11. // avoid missing animation when first rendered
  12. propsData: {
  13. lazyRender: false
  14. }
  15. });
  16. instance.$on('input', value => {
  17. instance.value = value;
  18. });
  19. }
  20. function Dialog(options) {
  21. /* istanbul ignore if */
  22. if (isServer) {
  23. return Promise.resolve();
  24. }
  25. return new Promise((resolve, reject) => {
  26. if (!instance || !isInDocument(instance.$el)) {
  27. initInstance();
  28. }
  29. Object.assign(instance, Dialog.currentOptions, options, {
  30. resolve,
  31. reject
  32. });
  33. });
  34. }
  35. Dialog.defaultOptions = {
  36. value: true,
  37. title: '',
  38. message: '',
  39. overlay: true,
  40. className: '',
  41. lockScroll: true,
  42. beforeClose: null,
  43. messageAlign: '',
  44. getContainer: 'body',
  45. cancelButtonText: '',
  46. cancelButtonColor: null,
  47. confirmButtonText: '',
  48. confirmButtonColor: null,
  49. showConfirmButton: true,
  50. showCancelButton: false,
  51. closeOnClickOverlay: false,
  52. callback: action => {
  53. instance[action === 'confirm' ? 'resolve' : 'reject'](action);
  54. }
  55. };
  56. Dialog.alert = Dialog;
  57. Dialog.confirm = options => Dialog({
  58. showCancelButton: true,
  59. ...options
  60. });
  61. Dialog.close = () => {
  62. if (instance) {
  63. instance.value = false;
  64. }
  65. };
  66. Dialog.setDefaultOptions = options => {
  67. Object.assign(Dialog.currentOptions, options);
  68. };
  69. Dialog.resetDefaultOptions = () => {
  70. Dialog.currentOptions = { ...Dialog.defaultOptions };
  71. };
  72. Dialog.resetDefaultOptions();
  73. Dialog.install = () => {
  74. Vue.use(VanDialog);
  75. };
  76. Vue.prototype.$dialog = Dialog;
  77. export default Dialog;