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.

183 lines
4.4 KiB

3 years ago
3 years ago
3 years ago
  1. <template>
  2. <v-card>
  3. <v-card-title v-if="isProjectAdmin">
  4. <action-menu
  5. @upload="$router.push('dataset/import')"
  6. @download="$router.push('dataset/export')"
  7. />
  8. <v-btn
  9. class="text-capitalize ms-2"
  10. :disabled="!canDelete"
  11. outlined
  12. @click.stop="dialogDelete=true"
  13. >
  14. {{ $t('generic.delete') }}
  15. </v-btn>
  16. <v-spacer />
  17. <v-btn
  18. :disabled="!item.count"
  19. class="text-capitalize"
  20. color="error"
  21. @click="dialogDeleteAll=true"
  22. >
  23. {{ $t('generic.deleteAll') }}
  24. </v-btn>
  25. <v-dialog v-model="dialogDelete">
  26. <form-delete
  27. :selected="selected"
  28. :item-key="itemKey"
  29. @cancel="dialogDelete=false"
  30. @remove="remove"
  31. />
  32. </v-dialog>
  33. <v-dialog v-model="dialogDeleteAll">
  34. <form-delete-bulk
  35. @cancel="dialogDeleteAll=false"
  36. @remove="removeAll"
  37. />
  38. </v-dialog>
  39. </v-card-title>
  40. <image-list
  41. v-if="isImageTask"
  42. v-model="selected"
  43. :items="item.items"
  44. :is-loading="isLoading"
  45. :total="item.count"
  46. @update:query="updateQuery"
  47. @click:labeling="movePage"
  48. />
  49. <audio-list
  50. v-else-if="isAudioTask"
  51. v-model="selected"
  52. :items="item.items"
  53. :is-loading="isLoading"
  54. :total="item.count"
  55. @update:query="updateQuery"
  56. @click:labeling="movePage"
  57. />
  58. <document-list
  59. v-else
  60. v-model="selected"
  61. :items="item.items"
  62. :is-loading="isLoading"
  63. :total="item.count"
  64. @update:query="updateQuery"
  65. @click:labeling="movePage"
  66. />
  67. </v-card>
  68. </template>
  69. <script lang="ts">
  70. import Vue from 'vue'
  71. import _ from 'lodash'
  72. import DocumentList from '@/components/example/DocumentList.vue'
  73. import FormDelete from '@/components/example/FormDelete.vue'
  74. import FormDeleteBulk from '@/components/example/FormDeleteBulk.vue'
  75. import ImageList from '~/components/example/ImageList.vue'
  76. import AudioList from '~/components/example/AudioList.vue'
  77. import { ExampleListDTO, ExampleDTO } from '~/services/application/example/exampleData'
  78. import ActionMenu from '~/components/example/ActionMenu.vue'
  79. import { ProjectDTO } from '~/services/application/project/projectData'
  80. export default Vue.extend({
  81. components: {
  82. ActionMenu,
  83. AudioList,
  84. DocumentList,
  85. ImageList,
  86. FormDelete,
  87. FormDeleteBulk,
  88. },
  89. layout: 'project',
  90. validate({ params, query }) {
  91. // @ts-ignore
  92. return /^\d+$/.test(params.id) && /^\d+|$/.test(query.limit) && /^\d+|$/.test(query.offset)
  93. },
  94. data() {
  95. return {
  96. dialogDelete: false,
  97. dialogDeleteAll: false,
  98. project: {} as ProjectDTO,
  99. item: {} as ExampleListDTO,
  100. selected: [] as ExampleDTO[],
  101. isLoading: false,
  102. isProjectAdmin: false
  103. }
  104. },
  105. async fetch() {
  106. this.isLoading = true
  107. this.item = await this.$services.example.list(this.projectId, this.$route.query)
  108. this.isLoading = false
  109. },
  110. computed: {
  111. canDelete(): boolean {
  112. return this.selected.length > 0
  113. },
  114. projectId(): string {
  115. return this.$route.params.id
  116. },
  117. isImageTask(): boolean {
  118. return this.project.projectType === 'ImageClassification'
  119. },
  120. isAudioTask(): boolean {
  121. return this.project.projectType === 'Speech2text'
  122. },
  123. itemKey(): string {
  124. if (this.isImageTask || this.isAudioTask) {
  125. return 'filename'
  126. } else {
  127. return 'text'
  128. }
  129. },
  130. },
  131. watch: {
  132. '$route.query': _.debounce(function() {
  133. // @ts-ignore
  134. this.$fetch()
  135. }, 1000
  136. ),
  137. },
  138. async created() {
  139. this.project = await this.$services.project.findById(this.projectId)
  140. this.isProjectAdmin = await this.$services.member.isProjectAdmin(this.projectId)
  141. },
  142. methods: {
  143. async remove() {
  144. await this.$services.example.bulkDelete(this.projectId, this.selected)
  145. this.$fetch()
  146. this.dialogDelete = false
  147. this.selected = []
  148. },
  149. async removeAll() {
  150. await this.$services.example.bulkDelete(this.projectId, [])
  151. this.$fetch()
  152. this.dialogDeleteAll = false
  153. this.selected = []
  154. },
  155. updateQuery(query: object) {
  156. this.$router.push(query)
  157. },
  158. movePage(query: object) {
  159. this.updateQuery({
  160. path: this.localePath(this.project.pageLink),
  161. query
  162. })
  163. }
  164. }
  165. })
  166. </script>
  167. <style scoped>
  168. ::v-deep .v-dialog {
  169. width: 800px;
  170. }
  171. </style>