MarkerImageView.vue 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. <template>
  2. <div class="marker-image-view">
  3. <image-view-contain
  4. ref="ImageViewContain"
  5. :image="image"
  6. @to-review="toReview"
  7. ></image-view-contain>
  8. <div class="image-view-footer">
  9. <slot>
  10. <div v-if="IS_LEVEL" class="image-info">
  11. <div v-if="image.level" class="image-level">{{ image.level }}</div>
  12. <div v-if="image.sample" class="image-sample">标</div>
  13. <div
  14. v-else
  15. :class="[
  16. 'image-checkbox',
  17. {
  18. 'image-selected': image.selected
  19. }
  20. ]"
  21. @click="toSelect"
  22. >
  23. <Icon v-if="image.selected" type="md-checkmark" />
  24. </div>
  25. </div>
  26. <div v-else class="image-info">
  27. <div v-if="image.level" class="image-level">{{ image.level }}</div>
  28. <div v-if="image.score" class="image-level">{{ image.score }}</div>
  29. </div>
  30. <div
  31. v-if="IS_LEVEL"
  32. class="image-title"
  33. :title="image.title"
  34. @click="toSelect"
  35. >
  36. {{ image.title }}
  37. </div>
  38. <div class="image-action">
  39. <div class="image-action-li" @click="toMark">
  40. <Icon :class="{ 'mark-act': image.mark }" type="md-bookmark" />
  41. </div>
  42. <div class="image-action-li" @click="toRotate">
  43. <Icon type="md-refresh-circle" />
  44. </div>
  45. </div>
  46. </slot>
  47. </div>
  48. </div>
  49. </template>
  50. <script>
  51. import ImageViewContain from "@/components/ImageViewContain";
  52. import { markTask } from "@/api";
  53. export default {
  54. name: "marker-image-view",
  55. components: { ImageViewContain },
  56. props: {
  57. data: {
  58. type: Object,
  59. default() {
  60. return {};
  61. }
  62. },
  63. stage: {
  64. type: String,
  65. default: "LEVEL"
  66. },
  67. canSelect: {
  68. type: Boolean,
  69. default: true
  70. }
  71. },
  72. computed: {
  73. IS_LEVEL() {
  74. return this.stage === "LEVEL";
  75. }
  76. },
  77. created() {
  78. this.initData();
  79. },
  80. watch: {
  81. "data.selected": {
  82. handler() {
  83. this.initData();
  84. }
  85. }
  86. },
  87. data() {
  88. return {
  89. initImage: {
  90. id: "",
  91. thumbSrc: "",
  92. title: "",
  93. level: "",
  94. score: "",
  95. deg: 0,
  96. mark: false,
  97. sample: false,
  98. selected: false
  99. },
  100. loading: false,
  101. image: {}
  102. };
  103. },
  104. methods: {
  105. initData() {
  106. this.image = this.$objAssign(this.initImage, this.data);
  107. },
  108. toReview() {
  109. this.$emit("to-review", this.data);
  110. },
  111. toRotate() {
  112. const image = this.image;
  113. image.deg += 90;
  114. if (image.deg === 360) image.deg = 0;
  115. this.$refs.ImageViewContain.resizeImage(image.deg);
  116. },
  117. async toMark() {
  118. if (this.loading) return;
  119. this.loading = true;
  120. const res = await markTask({
  121. markTaskId: this.image.id,
  122. isMark: !this.image.mark
  123. }).catch(() => {});
  124. this.loading = false;
  125. if (!res) return;
  126. this.image.mark = !this.image.mark;
  127. },
  128. toSelect() {
  129. if (this.image.sample || !this.IS_LEVEL) return;
  130. this.image.selected = !this.image.selected;
  131. this.$emit("to-select", this.image);
  132. },
  133. changeSelect(selected) {
  134. if (this.image.sample) return;
  135. this.image.selected = selected;
  136. this.$emit("to-select", this.image);
  137. }
  138. }
  139. };
  140. </script>