SaveButton.vue 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. <template>
  2. <div>
  3. <transition name="save-button-transition" mode="out-in">
  4. <button
  5. :class="['button', 'save-button-mixin', style]"
  6. :key="status"
  7. :disabled="status === 'disabled'"
  8. v-html="message"
  9. @click="$emit('clicked')"
  10. />
  11. </transition>
  12. </div>
  13. </template>
  14. <script>
  15. export default {
  16. props: {
  17. defaultMessage: { type: String, default: "Save Changes" }
  18. },
  19. emits: ["clicked"],
  20. data() {
  21. return {
  22. status: "default" // enum: ["default", "disabled", "save-failure", "save-success"],
  23. };
  24. },
  25. computed: {
  26. message() {
  27. switch (this.status) {
  28. case "save-success":
  29. return `<i class="material-icons icon-with-button">done</i>Saved Changes`;
  30. case "save-failure":
  31. return `<i class="material-icons icon-with-button">error_outline</i>Failed to save`;
  32. case "disabled":
  33. case "saving":
  34. return "Saving...";
  35. case "verifying":
  36. return "Verifying...";
  37. default:
  38. return this.defaultMessage
  39. ? this.defaultMessage
  40. : "Save Changes";
  41. }
  42. },
  43. style() {
  44. switch (this.status) {
  45. case "save-success":
  46. return "is-success";
  47. case "save-failure":
  48. return `is-danger`;
  49. case "saving":
  50. case "verifying":
  51. case "disabled":
  52. return "is-default";
  53. default:
  54. return "is-primary";
  55. }
  56. }
  57. },
  58. methods: {
  59. handleSuccessfulSave() {
  60. if (this.status !== "save-success") {
  61. this.status = "save-success";
  62. setTimeout(() => {
  63. this.status = "default";
  64. }, 2000);
  65. }
  66. },
  67. handleFailedSave() {
  68. if (this.status !== "save-failure") {
  69. this.status = "save-failure";
  70. setTimeout(() => {
  71. this.status = "default";
  72. }, 2000);
  73. }
  74. }
  75. }
  76. };
  77. </script>