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.

143 lines
4.3 KiB

3 years ago
3 years ago
3 years ago
3 years ago
  1. <template>
  2. <layout-text v-if="example.id">
  3. <template #header>
  4. <toolbar-laptop
  5. :doc-id="example.id"
  6. :enable-auto-labeling.sync="enableAutoLabeling"
  7. :guideline-text="project.guideline"
  8. :is-reviewd="example.isConfirmed"
  9. :total="totalExample"
  10. class="d-none d-sm-block"
  11. @click:clear-label="clearTeacherList(project.id, example.id)"
  12. @click:review="confirm(project.id)"
  13. >
  14. <button-label-switch
  15. class="ms-2"
  16. @change="labelComponent=$event"
  17. />
  18. </toolbar-laptop>
  19. <toolbar-mobile
  20. :total="totalExample"
  21. class="d-flex d-sm-none"
  22. />
  23. </template>
  24. <template #content>
  25. <v-card
  26. v-shortkey="shortKeys"
  27. @shortkey="annotateOrRemoveLabel(project.id, example.id, $event.srcKey)"
  28. >
  29. <v-card-title>
  30. <component
  31. :is="labelComponent"
  32. :labels="labels"
  33. :annotations="teacherList"
  34. :single-label="project.singleClassClassification"
  35. @add="annotateLabel(project.id, example.id, $event)"
  36. @remove="removeTeacher(project.id, example.id, $event)"
  37. />
  38. </v-card-title>
  39. <v-divider />
  40. <v-card-text
  41. class="title highlight"
  42. style="white-space: pre-wrap;"
  43. v-text="example.text"
  44. />
  45. </v-card>
  46. </template>
  47. <template #sidebar>
  48. <annotation-progress :progress="progress" />
  49. <list-metadata :metadata="example.meta" class="mt-4" />
  50. </template>
  51. </layout-text>
  52. </template>
  53. <script>
  54. import { toRefs, useContext, useFetch, ref, watch } from '@nuxtjs/composition-api'
  55. import LabelGroup from '@/components/tasks/textClassification/LabelGroup'
  56. import LabelSelect from '@/components/tasks/textClassification/LabelSelect'
  57. import LayoutText from '@/components/tasks/layout/LayoutText'
  58. import ListMetadata from '@/components/tasks/metadata/ListMetadata'
  59. import ToolbarLaptop from '@/components/tasks/toolbar/ToolbarLaptop'
  60. import ToolbarMobile from '@/components/tasks/toolbar/ToolbarMobile'
  61. import ButtonLabelSwitch from '@/components/tasks/toolbar/buttons/ButtonLabelSwitch'
  62. import { useExampleItem } from '@/composables/useExampleItem'
  63. import { useLabelList } from '@/composables/useLabelList'
  64. import { useProjectItem } from '@/composables/useProjectItem'
  65. import { useTeacherList } from '@/composables/useTeacherList'
  66. import AnnotationProgress from '@/components/tasks/sidebar/AnnotationProgress.vue'
  67. export default {
  68. components: {
  69. AnnotationProgress,
  70. ButtonLabelSwitch,
  71. LabelGroup,
  72. LabelSelect,
  73. LayoutText,
  74. ListMetadata,
  75. ToolbarLaptop,
  76. ToolbarMobile
  77. },
  78. layout: 'workspace',
  79. validate({ params, query }) {
  80. return /^\d+$/.test(params.id) && /^\d+$/.test(query.page)
  81. },
  82. setup() {
  83. const { app, params, query } = useContext()
  84. const projectId = params.value.id
  85. const { state: projectState, getProjectById } = useProjectItem()
  86. const { state: exampleState, confirm, getExample, updateProgress } = useExampleItem()
  87. const {
  88. state: teacherState,
  89. annotateLabel,
  90. annotateOrRemoveLabel,
  91. autoLabel,
  92. clearTeacherList,
  93. getTeacherList,
  94. removeTeacher
  95. } = useTeacherList(app.$services.textClassification)
  96. const enableAutoLabeling = ref(false)
  97. const { state: labelState, getLabelList, shortKeys } = useLabelList(app.$services.categoryType)
  98. const labelComponent = ref('label-group')
  99. getLabelList(projectId)
  100. getProjectById(projectId)
  101. updateProgress(projectId)
  102. const { fetch } = useFetch(async() => {
  103. await getExample(
  104. projectId,
  105. query.value
  106. )
  107. if (enableAutoLabeling.value) {
  108. try {
  109. await autoLabel(projectId, exampleState.example.id)
  110. } catch(e) {
  111. enableAutoLabeling.value = false
  112. alert(e.response.data.detail)
  113. }
  114. } else {
  115. await getTeacherList(projectId, exampleState.example.id)
  116. }
  117. })
  118. watch(query, fetch)
  119. return {
  120. ...toRefs(labelState),
  121. ...toRefs(projectState),
  122. ...toRefs(teacherState),
  123. ...toRefs(exampleState),
  124. confirm,
  125. annotateLabel,
  126. annotateOrRemoveLabel,
  127. clearTeacherList,
  128. enableAutoLabeling,
  129. labelComponent,
  130. removeTeacher,
  131. shortKeys,
  132. }
  133. }
  134. }
  135. </script>