You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

166 lines
3.5 KiB

5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
  1. <template>
  2. <v-card>
  3. <v-card-title>
  4. <v-btn
  5. class="text-capitalize"
  6. color="primary"
  7. @click.stop="dialogCreate=true"
  8. >
  9. {{ $t('generic.add') }}
  10. </v-btn>
  11. <v-btn
  12. class="text-capitalize ms-2"
  13. :disabled="!canDelete"
  14. outlined
  15. @click.stop="dialogDelete=true"
  16. >
  17. {{ $t('generic.delete') }}
  18. </v-btn>
  19. <v-dialog v-model="dialogCreate">
  20. <form-create
  21. v-model="editedItem"
  22. :error-message="errorMessage"
  23. @cancel="close"
  24. @save="save"
  25. />
  26. </v-dialog>
  27. <v-dialog v-model="dialogDelete">
  28. <form-delete
  29. :selected="selected"
  30. @cancel="dialogDelete=false"
  31. @remove="remove"
  32. />
  33. </v-dialog>
  34. </v-card-title>
  35. <member-list
  36. v-model="selected"
  37. :items="items"
  38. :is-loading="isLoading"
  39. @edit="editItem"
  40. />
  41. </v-card>
  42. </template>
  43. <script lang="ts">
  44. import Vue from 'vue'
  45. import MemberList from '@/components/member/MemberList.vue'
  46. import FormDelete from '@/components/member/FormDelete.vue'
  47. import FormCreate from '~/components/member/FormCreate.vue'
  48. import { MemberDTO } from '~/services/application/member/memberData'
  49. export default Vue.extend({
  50. layout: 'project',
  51. components: {
  52. MemberList,
  53. FormCreate,
  54. FormDelete
  55. },
  56. async fetch() {
  57. this.isLoading = true
  58. try {
  59. this.items = await this.$services.member.list(this.projectId)
  60. } catch(e) {
  61. this.$router.push(`/projects/${this.projectId}`)
  62. } finally {
  63. this.isLoading = false
  64. }
  65. },
  66. data() {
  67. return {
  68. dialogCreate: false,
  69. dialogDelete: false,
  70. editedIndex: -1,
  71. editedItem: {
  72. user: -1,
  73. role: -1,
  74. username: '',
  75. rolename: ''
  76. } as MemberDTO,
  77. defaultItem: {
  78. user: -1,
  79. role: -1,
  80. username: '',
  81. rolename: ''
  82. } as MemberDTO,
  83. items: [] as MemberDTO[],
  84. selected: [] as MemberDTO[],
  85. isLoading: false,
  86. errorMessage: ''
  87. }
  88. },
  89. computed: {
  90. canDelete(): boolean {
  91. return this.selected.length > 0
  92. },
  93. projectId(): string {
  94. return this.$route.params.id
  95. }
  96. },
  97. methods: {
  98. async create() {
  99. try {
  100. await this.$services.member.create(this.projectId, this.editedItem)
  101. this.close()
  102. this.$fetch()
  103. } catch(e) {
  104. this.errorMessage = e.message
  105. }
  106. },
  107. async update() {
  108. try {
  109. await this.$services.member.update(this.projectId, this.editedItem)
  110. this.close()
  111. this.$fetch()
  112. } catch(e) {
  113. this.errorMessage = e.message
  114. }
  115. },
  116. save() {
  117. if (this.editedIndex > -1) {
  118. this.update()
  119. } else {
  120. this.create()
  121. }
  122. },
  123. close() {
  124. this.dialogCreate = false
  125. this.errorMessage = ''
  126. this.$nextTick(() => {
  127. this.editedItem = Object.assign({}, this.defaultItem)
  128. this.editedIndex = -1
  129. })
  130. },
  131. async remove() {
  132. await this.$services.member.bulkDelete(this.projectId, this.selected)
  133. this.$fetch()
  134. this.dialogDelete = false
  135. this.selected = []
  136. },
  137. editItem(item: MemberDTO) {
  138. this.editedIndex = this.items.indexOf(item)
  139. this.editedItem = Object.assign({}, item)
  140. this.dialogCreate = true
  141. }
  142. },
  143. validate({ params }) {
  144. return /^\d+$/.test(params.id)
  145. }
  146. })
  147. </script>
  148. <style scoped>
  149. ::v-deep .v-dialog {
  150. width: 800px;
  151. }
  152. </style>