Group.vue 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. <template>
  2. <md-layout class="group-layout" md-col gutter="120" md-align="start">
  3. <md-card v-if="!addNewGroup" md-with-hover @mouseenter.native="focusToNewAttendee()">
  4. <md-card-header class="group-header">
  5. <md-layout md-row>
  6. <div class="md-title">
  7. <md-icon class="group-icon">folder_open</md-icon>&nbsp;Group: {{ group.group }}&nbsp;<span class="counter">{{ counter }}</span>
  8. </div>
  9. </md-layout>
  10. </md-card-header>
  11. <md-card-content>
  12. <md-list md-dense>
  13. <attendee v-for="attendee in group.attendees || []" :attendee="attendee" @updated="reload" />
  14. <md-list-item class="attendee-add">
  15. <md-icon>person_add</md-icon>
  16. <md-input-container class="new-attendee">
  17. <label>new attendee</label>
  18. <md-input ref="newAttendeeInput" @keyup.enter.native="addAttendee(group.group, newAttendee)" v-model="newAttendee" class="attendee-add-name" />
  19. </md-input-container>
  20. </md-list-item>
  21. </md-list>
  22. </md-card-content>
  23. </md-card>
  24. <md-card v-if="addNewGroup" md-with-hover @mouseenter.native="focusToNewGroup()" md-align="start">
  25. <md-card-header class="new-group-header">
  26. <div class="md-title">
  27. <md-input-container class="new-group" md-inline>
  28. <md-icon>create_new_folder</md-icon>&nbsp;&nbsp;<md-input ref="newGroup" v-model="newGroup" @keyup.enter.native="focusToNewAttendee()" class="group-add-name" placeholder="new group" />
  29. </md-input-container>
  30. </div>
  31. </md-card-header>
  32. <md-card-content>
  33. <md-list v-show="newGroup">
  34. <md-list-item class="attendee-add">
  35. <md-icon>person_add</md-icon>
  36. <md-input-container>
  37. <label>new attendee</label>
  38. <md-input ref="newAttendeeInput" @keyup.enter.native="addAttendee(newGroup, newAttendee)" v-model="newAttendee" class="attendee-add-name" />
  39. </md-input-container>
  40. </md-list-item>
  41. </md-list>
  42. </md-card-content>
  43. </md-card>
  44. <ibt-dialog ref="dialogObj" />
  45. </md-layout>
  46. </template>
  47. <script>
  48. import Attendee from './Attendee';
  49. import IbtDialog from './IbtDialog.vue';
  50. export default {
  51. props: {group: {}, day: {}, addNewGroup: {default: false}},
  52. data: function () {
  53. return { newAttendee: '', newGroup: '' }
  54. },
  55. computed: {
  56. counter: function() {
  57. return (this.group.attendees || []).length;
  58. }
  59. },
  60. beforeCreate: function() {
  61. this.attendeesUrl = this.$resource('attendees{/id}');
  62. },
  63. methods: {
  64. reset() {
  65. this.newAttendee = '';
  66. this.newGroup = '';
  67. },
  68. reload() {
  69. this.$emit('updated');
  70. this.focusToNewAttendee();
  71. },
  72. focusToNewGroup() {
  73. this.$refs.newGroup.$el.focus();
  74. },
  75. focusToNewAttendee() {
  76. this.$refs.newAttendeeInput.$el.focus();
  77. },
  78. addAttendee(group, newAttendee) {
  79. this.attendeesUrl.save({day: this.day, group: group, name: newAttendee}).then((response) => {
  80. return response.json();
  81. }, (response) => {
  82. this.$refs.dialogObj.show({text: 'unable to add the attendee'});
  83. }).then((json) => {
  84. this.reset();
  85. this.$emit('updated');
  86. });
  87. }
  88. },
  89. components: { Attendee, IbtDialog }
  90. };
  91. </script>
  92. <style>
  93. .group-layout {
  94. padding: 10px;
  95. }
  96. .new-group-header {
  97. background-color: lightsteelblue;
  98. padding-top: 0px !important;
  99. padding-bottom: 0px !important;
  100. }
  101. .new-group-header .md-title {
  102. margin-top: 0px !important;
  103. }
  104. .group-header {
  105. background-color: lightblue;
  106. }
  107. .group-icon {
  108. vertical-align: text-top;
  109. }
  110. .new-attendee {
  111. width: 50px;
  112. }
  113. .new-group {
  114. min-width: 250px;
  115. }
  116. .new-group-header i:after {
  117. background-color: initial !important;
  118. }
  119. .counter {
  120. margin-left: 4px;
  121. position: relative;
  122. bottom: 12px;
  123. background-color: #eee;
  124. color: #666;
  125. padding: 2px 5px;
  126. border-radius: 20px;
  127. font-size: 12px;
  128. font-weight: 200;
  129. line-height: 1;
  130. }
  131. </style>