SaveButton.vue 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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. type: { type: String, default: "save" } // enum: ["save", "save-and-close"]
  18. },
  19. data() {
  20. return {
  21. status: "default" // enum: ["default", "disabled", "save-failure", "save-success"],
  22. };
  23. },
  24. computed: {
  25. message() {
  26. switch (this.status) {
  27. case "save-success":
  28. return `<i class="material-icons icon-with-button">done</i>Saved Changes`;
  29. case "save-failure":
  30. return `<i class="material-icons icon-with-button">error_outline</i>Failed to save`;
  31. case "disabled":
  32. return "Saving...";
  33. default:
  34. return this.type === "save-and-close"
  35. ? "Save and Close"
  36. : "Save changes";
  37. }
  38. },
  39. style() {
  40. switch (this.status) {
  41. case "save-success":
  42. return "is-success";
  43. case "save-failure":
  44. return `is-danger`;
  45. default:
  46. return "is-primary";
  47. }
  48. }
  49. },
  50. methods: {
  51. handleSuccessfulSave() {
  52. if (this.status !== "save-success") {
  53. this.status = "save-success";
  54. setTimeout(() => {
  55. this.status = "default";
  56. }, 2000);
  57. }
  58. },
  59. handleFailedSave() {
  60. if (this.status !== "save-failure") {
  61. this.status = "save-failure";
  62. setTimeout(() => {
  63. this.status = "default";
  64. }, 2000);
  65. }
  66. }
  67. }
  68. };
  69. </script>