editable-headline.vue 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. <template>
  2. <h2>
  3. <template v-if="!edit">
  4. {{ value }}
  5. <img alt="edit" class="edit"
  6. src="@/assets/icons/pencil.svg"
  7. @click="edit = true">
  8. </template>
  9. <template v-else>
  10. <input-group>
  11. <text-input placeholder="name" v-model="input"
  12. @change="change" @enter="change"/>
  13. <button-input @click="change" type="primary">confirm</button-input>
  14. <button-input @click="edit = false">cancel</button-input>
  15. <button-input @click="remove" type="error">delete</button-input>
  16. </input-group>
  17. </template>
  18. </h2>
  19. </template>
  20. <script>
  21. import TextInput from "@/components/base/text-input";
  22. import ButtonInput from "@/components/base/button-input";
  23. import InputGroup from "@/components/base/input-group";
  24. export default {
  25. name: "editable-headline",
  26. components: {InputGroup, ButtonInput, TextInput},
  27. props: ['value'],
  28. data: function () {
  29. return {
  30. input: this.value,
  31. edit: false
  32. }
  33. },
  34. methods: {
  35. change: function () {
  36. this.$emit('change', this.input);
  37. this.edit = false;
  38. },
  39. remove: function (event) {
  40. this.$emit('remove', event);
  41. }
  42. }
  43. }
  44. </script>
  45. <style scoped>
  46. h2 {
  47. display: flex;
  48. align-items: center;
  49. margin: 0;
  50. }
  51. img {
  52. width: 1.5rem;
  53. }
  54. .delete {
  55. margin-right: 1.5rem;
  56. }
  57. .edit,
  58. .button-row {
  59. margin-left: 0.75rem;
  60. }
  61. .text-input {
  62. flex-grow: 1;
  63. }
  64. </style>