SaveButton.vue 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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. return "Saving...";
  34. default:
  35. return this.defaultMessage
  36. ? this.defaultMessage
  37. : "Save Changes";
  38. }
  39. },
  40. style() {
  41. switch (this.status) {
  42. case "save-success":
  43. return "is-success";
  44. case "save-failure":
  45. return `is-danger`;
  46. case "disabled":
  47. return "is-default";
  48. default:
  49. return "is-primary";
  50. }
  51. }
  52. },
  53. methods: {
  54. handleSuccessfulSave() {
  55. if (this.status !== "save-success") {
  56. this.status = "save-success";
  57. setTimeout(() => {
  58. this.status = "default";
  59. }, 2000);
  60. }
  61. },
  62. handleFailedSave() {
  63. if (this.status !== "save-failure") {
  64. this.status = "save-failure";
  65. setTimeout(() => {
  66. this.status = "default";
  67. }, 2000);
  68. }
  69. }
  70. }
  71. };
  72. </script>