zhangjie 1 tahun lalu
induk
melakukan
fbba7d63eb

+ 4 - 12
src/features/arbitrate/MarkBody.vue

@@ -37,12 +37,8 @@ const makeScoreTrack = (
     score: store.currentScore,
     unanswered: Object.is(store.currentScore, -0),
     offsetIndex: item.indexInSliceUrls,
-    offsetX: Math.round(
-      event.offsetX * (target.naturalWidth / target.width) + item.dx
-    ),
-    offsetY: Math.round(
-      event.offsetY * (target.naturalHeight / target.height) + item.dy
-    ),
+    offsetX: event.offsetX * (target.naturalWidth / target.width) + item.dx,
+    offsetY: event.offsetY * (target.naturalHeight / target.height) + item.dy,
     positionX: -1,
     positionY: -1,
     number: -1,
@@ -137,12 +133,8 @@ const makeSpecialTagTrack = (
   const track: SpecialTag = {
     tagName: store.currentSpecialTag,
     offsetIndex: item.indexInSliceUrls,
-    offsetX: Math.round(
-      event.offsetX * (target.naturalWidth / target.width) + item.dx
-    ),
-    offsetY: Math.round(
-      event.offsetY * (target.naturalHeight / target.height) + item.dy
-    ),
+    offsetX: event.offsetX * (target.naturalWidth / target.width) + item.dx,
+    offsetY: event.offsetY * (target.naturalHeight / target.height) + item.dy,
     positionX: -1,
     positionY: -1,
   };

+ 4 - 12
src/features/check/MarkBody.vue

@@ -51,12 +51,8 @@ const makeScoreTrack = (
     score: store.currentScore,
     unanswered: Object.is(store.currentScore, -0),
     offsetIndex: item.indexInSliceUrls,
-    offsetX: Math.round(
-      event.offsetX * (target.naturalWidth / target.width) + item.dx
-    ),
-    offsetY: Math.round(
-      event.offsetY * (target.naturalHeight / target.height) + item.dy
-    ),
+    offsetX: event.offsetX * (target.naturalWidth / target.width) + item.dx,
+    offsetY: event.offsetY * (target.naturalHeight / target.height) + item.dy,
     positionX: -1,
     positionY: -1,
     number: -1,
@@ -154,12 +150,8 @@ const makeSpecialTagTrack = (
     tagName: store.currentSpecialTag,
     tagType: store.currentSpecialTagType,
     offsetIndex: item.indexInSliceUrls,
-    offsetX: Math.round(
-      event.offsetX * (target.naturalWidth / target.width) + item.dx
-    ),
-    offsetY: Math.round(
-      event.offsetY * (target.naturalHeight / target.height) + item.dy
-    ),
+    offsetX: event.offsetX * (target.naturalWidth / target.width) + item.dx,
+    offsetY: event.offsetY * (target.naturalHeight / target.height) + item.dy,
     positionX: -1,
     positionY: -1,
     groupNumber: store.currentQuestion.groupNumber,

+ 23 - 0
src/features/mark/CommonMarkBody.vue

@@ -35,6 +35,7 @@
             :sliceImageHeight="item.sliceImageHeight"
             :dx="item.dx"
             :dy="item.dy"
+            @deleteSpecialtag="(tag) => deleteSpecialtag(item, tag)"
           />
           <hr class="image-seperator" />
         </div>
@@ -429,6 +430,28 @@ async function processSplitConfig() {
   }, 300);
 }
 
+const deleteSpecialtag = (item, tag) => {
+  const findInd = (tagList, curTag) => {
+    return tagList.findIndex(
+      (itemTag) =>
+        itemTag.tagName === curTag.tagName &&
+        itemTag.offsetX === curTag.offsetX &&
+        itemTag.offsetY === curTag.offsetY
+    );
+  };
+
+  const tagIndex = findInd(item.tagList, tag);
+  if (tagIndex === -1) return;
+  item.tagList.splice(tagIndex, 1);
+
+  const stagIndex = findInd(
+    store.currentTaskEnsured.markResult.specialTagList,
+    tag
+  );
+  if (stagIndex === -1) return;
+  store.currentTaskEnsured.markResult.specialTagList.splice(tagIndex, 1);
+};
+
 // should not render twice at the same time
 let renderLock = false;
 const renderPaperAndMark = async () => {

+ 1 - 1
src/features/mark/MarkBoardTrackDialog.vue

@@ -11,7 +11,7 @@
   >
     <mark-board-track
       modal
-      isCheckAnswer
+      :isCheckAnswer="isCheckAnswer"
       @submit="$emit('submit')"
       @allZeroSubmit="$emit('allZeroSubmit')"
       @unselectiveSubmit="$emit('unselectiveSubmit')"

+ 4 - 12
src/features/mark/MarkBody.vue

@@ -51,12 +51,8 @@ const makeScoreTrack = (
     score: store.currentScore,
     unanswered: Object.is(store.currentScore, -0),
     offsetIndex: item.indexInSliceUrls,
-    offsetX: Math.round(
-      event.offsetX * (target.naturalWidth / target.width) + item.dx
-    ),
-    offsetY: Math.round(
-      event.offsetY * (target.naturalHeight / target.height) + item.dy
-    ),
+    offsetX: event.offsetX * (target.naturalWidth / target.width) + item.dx,
+    offsetY: event.offsetY * (target.naturalHeight / target.height) + item.dy,
     positionX: -1,
     positionY: -1,
     number: -1,
@@ -153,12 +149,8 @@ const makeSpecialTagTrack = (
     tagName: store.currentSpecialTag,
     tagType: store.currentSpecialTagType,
     offsetIndex: item.indexInSliceUrls,
-    offsetX: Math.round(
-      event.offsetX * (target.naturalWidth / target.width) + item.dx
-    ),
-    offsetY: Math.round(
-      event.offsetY * (target.naturalHeight / target.height) + item.dy
-    ),
+    offsetX: event.offsetX * (target.naturalWidth / target.width) + item.dx,
+    offsetY: event.offsetY * (target.naturalHeight / target.height) + item.dy,
     positionX: -1,
     positionY: -1,
   };

+ 11 - 2
src/features/mark/MarkDrawTrack.vue

@@ -32,6 +32,7 @@
         class="tag-textarea tw-m-auto"
         :autosize="{ minRows: 2, maxRows: 6 }"
         :maxlength="32"
+        @blur="specialTagBlur(tag)"
       />
     </div>
     <div
@@ -66,6 +67,8 @@ const props = defineProps<{
   dx: number;
   dy: number;
 }>();
+const emit = defineEmits(["delete-specialtag"]);
+
 const { trackList } = toRefs(props);
 
 const computeTopAndLeft = (track: Track | SpecialTag) => {
@@ -109,6 +112,12 @@ const hasMember = (track: any) => {
 const focusedTrack = (track: Track) => {
   return store.focusTracks.includes(track) || hasMember(track);
 };
+const specialTagBlur = (tag) => {
+  const tagName = tag.tagName.trim().replace("\n", "");
+  if (tagName) return;
+  console.log(tagName);
+  emit("delete-specialtag", tag);
+};
 
 watch(
   () => store.focusTracks,
@@ -175,7 +184,7 @@ watch(
 }
 .score-container .tag-textarea {
   background-color: transparent;
-  color: red;
+  color: #38985f;
   font-size: inherit;
   resize: none;
   line-height: 1.1;
@@ -185,7 +194,7 @@ watch(
 .score-container .tag-textarea:hover,
 .score-container .tag-textarea:focus {
   background-color: rgba(255, 255, 255, 0.8);
-  border-color: #f53f3f;
+  border-color: #38985f;
 }
 
 @keyframes change_size {

+ 2 - 1
src/features/mark/MarkHistory.vue

@@ -58,12 +58,13 @@
         </div>
       </a-spin>
     </div>
-    <div class="mark-history-table-page">
+    <div class="mark-history-table-page" @keypress.stop="" @keydown.stop="">
       <div>共{{ total }}项数据</div>
       <a-pagination
         v-model:current="currentPage"
         simple
         :total="total"
+        :pageSize="limitPageSize"
         @change="pageChange"
       />
     </div>

+ 1 - 1
src/features/mark/MinimapModal.vue

@@ -3,7 +3,7 @@
     v-if="store.setting.uiSetting['minimap.modal']"
     top="10%"
     width="312px"
-    height="700px"
+    height="400px"
     title="缩略图"
     @close="close"
   >

+ 15 - 13
src/features/student/studentInspect/MarkBody.vue

@@ -71,7 +71,7 @@ let maxImageWidth = 0;
 
 function addTrackColorAttr(tList: Track[]): Track[] {
   let markerIds: (number | undefined)[] = tList
-    .map((v) => v.markerId)
+    .map((v) => v.userId)
     .filter((x) => !!x);
   markerIds = Array.from(new Set(markerIds));
   // markerIds.sort();
@@ -90,7 +90,7 @@ function addTrackColorAttr(tList: Track[]): Track[] {
     emit("getIsMultComments", true);
   }
   tList = tList.map((item: Track) => {
-    item.color = colorMap[item.markerId + ""] || "red";
+    item.color = colorMap[item.userId + ""] || "red";
     item.isByMultMark = markerIds.length > 1;
     return item;
   });
@@ -99,7 +99,7 @@ function addTrackColorAttr(tList: Track[]): Track[] {
 
 function addTagColorAttr(tList: SpecialTag[]): SpecialTag[] {
   let markerIds: (number | undefined)[] = tList
-    .map((v) => v.markerId)
+    .map((v) => v.userId)
     .filter((x) => !!x);
   markerIds = Array.from(new Set(markerIds));
   // markerIds.sort();
@@ -115,7 +115,7 @@ function addTagColorAttr(tList: SpecialTag[]): SpecialTag[] {
     }
   }
   tList = tList.map((item: SpecialTag) => {
-    item.color = colorMap[item.markerId + ""] || "red";
+    item.color = colorMap[item.userId + ""] || "red";
     item.isByMultMark = markerIds.length > 1;
     return item;
   });
@@ -134,19 +134,21 @@ async function processImage() {
 
   maxImageWidth = Math.max(...images.map((i) => i.naturalWidth));
 
+  const trackLists = (store.currentTask.questionList || [])
+    // .map((q) => q.trackList)
+    .map((q) => {
+      let tList = q.trackList;
+      return q.headerTrack?.length
+        ? addHeaderTrackColorAttr(q.headerTrack)
+        : addTrackColorAttr(tList);
+    })
+    .flat();
+  store.setting.doubleTrack = trackLists.some((item) => item.isByMultMark);
+
   for (const url of urls) {
     const indexInSliceUrls = urls.indexOf(url) + 1;
     const image = images[indexInSliceUrls - 1];
 
-    const trackLists = (store.currentTask.questionList || [])
-      // .map((q) => q.trackList)
-      .map((q) => {
-        let tList = q.trackList;
-        return q.headerTrack?.length
-          ? addHeaderTrackColorAttr(q.headerTrack)
-          : addTrackColorAttr(tList);
-      })
-      .flat();
     const thisImageTrackList = trackLists.filter(
       (t) => t.offsetIndex === indexInSliceUrls
     );

+ 16 - 5
src/styles/page.less

@@ -65,7 +65,8 @@
     padding: 18px 15px;
     text-align: center;
     cursor: pointer;
-    .header-menu-left {
+
+    &.header-menu-left {
       min-width: 79px;
     }
 
@@ -1217,14 +1218,24 @@
   border: 1px solid #d9d9d9;
   display: flex;
   flex-direction: column;
+  overflow: hidden;
 
   .resize-handler {
     position: absolute;
-    bottom: -10px;
-    right: -10px;
-    width: 20px;
-    height: 20px;
+    bottom: -6px;
+    right: -6px;
+    width: 16px;
+    height: 16px;
     cursor: nwse-resize;
+    border-left: 1px solid #666;
+    padding: 3px;
+    transform: rotate(45deg);
+    &::before {
+      content: "";
+      display: block;
+      height: 100%;
+      border-left: 1px solid #666;
+    }
   }
 
   .qm-dialog-header {