Dialog.vue 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. <template>
  2. <q-dialog v-model="active" no-route-dismiss @show="onShow" @hide="onHide">
  3. <div class="column bg-white no-wrap">
  4. <div class="header row">
  5. <div class="caption col row items-center q-ml-md">
  6. <slot name="header"></slot>
  7. </div>
  8. <div class="close-icon column justify-center items-center">
  9. <q-btn v-close-popup flat round dense>
  10. <q-icon name="la la-times" size="18px"></q-icon>
  11. </q-btn>
  12. </div>
  13. </div>
  14. <div class="col column q-mx-md">
  15. <slot></slot>
  16. </div>
  17. <div class="row justify-end q-pa-md">
  18. <slot name="footer"></slot>
  19. </div>
  20. </div>
  21. </q-dialog>
  22. </template>
  23. <script>
  24. //-----------------------------------------------------------------------------
  25. import vueComponent from '../vueComponent.js';
  26. import * as utils from '../../share/utils';
  27. class Dialog {
  28. _props = {
  29. modelValue: Boolean,
  30. };
  31. shown = false;
  32. get active() {
  33. return this.modelValue;
  34. }
  35. set active(value) {
  36. this.$emit('update:modelValue', value);
  37. }
  38. onShow() {
  39. this.shown = true;
  40. }
  41. onHide() {
  42. this.shown = false;
  43. }
  44. async waitShown() {
  45. let i = 100;
  46. while (!this.shown && i > 0) {
  47. await utils.sleep(10);
  48. i--;
  49. }
  50. }
  51. }
  52. export default vueComponent(Dialog);
  53. //-----------------------------------------------------------------------------
  54. </script>
  55. <style scoped>
  56. .header {
  57. min-height: 50px;
  58. }
  59. .caption {
  60. font-size: 110%;
  61. overflow: hidden;
  62. }
  63. .close-icon {
  64. width: 50px;
  65. }
  66. </style>