Attendee.vue 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. <template>
  2. <md-list-item class="attendee-list-item" :key="attendee._id">
  3. <md-icon>person</md-icon>
  4. <span v-if="!edit">{{attendee.name}}</span>
  5. <md-input-container md-inline v-if="edit">
  6. <md-input @keyup.enter.native="updateAttendee()" v-model="attendee.name" ref="updateAttendeeName" />
  7. </md-input-container>
  8. <md-menu v-if="isAuthorized(attendee.created_by)" md-align-trigger>
  9. <md-button class="md-icon-button" md-menu-trigger>
  10. <md-icon>more_vert</md-icon>
  11. </md-button>
  12. <md-menu-content>
  13. <md-menu-item @click="editAttendee()">
  14. <span>edit</span>
  15. <md-icon>edit</md-icon>
  16. </md-menu-item>
  17. <md-menu-item @click="deleteAttendee()">
  18. <span>delete</span>
  19. <md-icon>cancel</md-icon>
  20. </md-menu-item>
  21. </md-menu-content>
  22. </md-menu>
  23. <ibt-dialog ref="dialogObj" />
  24. </md-list-item>
  25. </template>
  26. <script>
  27. import IbtDialog from './IbtDialog.vue';
  28. export default {
  29. props: {attendee: {default: {}}},
  30. data: function () {
  31. return {
  32. edit: false
  33. }
  34. },
  35. computed: {
  36. loggedInUser() {
  37. return this.$store.state.loggedInUser;
  38. }
  39. },
  40. beforeCreate: function() {
  41. this.attendeesUrl = this.$resource('attendees{/id}');
  42. },
  43. methods: {
  44. isAuthorized(ownerID) {
  45. return !ownerID || this.$store.state.loggedInUser.isAdmin || (this.$store.state.loggedInUser._id && this.$store.state.loggedInUser._id == ownerID);
  46. },
  47. editAttendee() {
  48. this.edit = true;
  49. // FIXME: it's so wrong it hurts, but any other attempt to set the focus
  50. // failed, being called too early. Also, I don't know how I can access
  51. // Vue.nextTick from here.
  52. var that = this;
  53. setTimeout(function() { that.$refs.updateAttendeeName.$el.focus(); }, 400);
  54. },
  55. updateAttendee() {
  56. this.attendeesUrl.update({id: this.attendee._id}, this.attendee).then((response) => {
  57. return response.json();
  58. }, (response) => {
  59. this.$refs.dialogObj.show({text: 'unable to update the attendee'});
  60. }).then((json) => {
  61. this.edit = false;
  62. this.$emit('updated');
  63. });
  64. },
  65. deleteAttendee() {
  66. this.attendeesUrl.delete({id: this.attendee._id}).then((response) => {
  67. return response.json();
  68. }, (response) => {
  69. this.$refs.dialogObj.show({text: 'unable to delete the attendee'});
  70. }).then((json) => {
  71. this.$emit('updated');
  72. });
  73. }
  74. },
  75. components: {IbtDialog}
  76. };
  77. </script>
  78. <style>
  79. .md-list-item .md-list-item-holder>.md-icon:first-child {
  80. margin-right: 16px;
  81. }
  82. .attendee-list-item {
  83. min-width: 250px;
  84. }
  85. </style>