QuickConfirm.vue 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <template>
  2. <tippy
  3. :interactive="true"
  4. :touch="true"
  5. :placement="placement"
  6. theme="quickConfirm"
  7. ref="quickConfirm"
  8. trigger="click"
  9. :append-to="body"
  10. @hide="delayedHide()"
  11. >
  12. <div
  13. @click.shift.stop="shiftClick($event)"
  14. @click.exact="click($event)"
  15. >
  16. <slot ref="trigger" />
  17. </div>
  18. <template #content>
  19. <a @click="confirm($event)"> Click to Confirm </a>
  20. </template>
  21. </tippy>
  22. </template>
  23. <script>
  24. export default {
  25. props: {
  26. placement: {
  27. type: String,
  28. default: "top"
  29. }
  30. },
  31. emits: ["confirm"],
  32. data() {
  33. return {
  34. clickedOnce: false,
  35. body: document.body
  36. };
  37. },
  38. methods: {
  39. // eslint-disable-next-line no-unused-vars
  40. confirm(event) {
  41. if (
  42. !event ||
  43. event.type !== "click" ||
  44. event.altKey ||
  45. event.ctrlKey ||
  46. event.metaKey
  47. )
  48. return;
  49. this.clickedOnce = false;
  50. this.$emit("confirm");
  51. setTimeout(() => {
  52. this.$refs.confirm.tippy.hide();
  53. }, 25);
  54. },
  55. click(event) {
  56. if (!this.clickedOnce) this.clickedOnce = true;
  57. else this.confirm(event);
  58. },
  59. shiftClick(event) {
  60. this.confirm(event);
  61. },
  62. delayedHide() {
  63. setTimeout(() => {
  64. this.clickedOnce = false;
  65. }, 25);
  66. }
  67. }
  68. };
  69. </script>