zhangjie před 1 rokem
rodič
revize
6a1d69051f

+ 32 - 0
src/features/check/CommonMarkBody.vue

@@ -35,6 +35,7 @@
             :sliceImageWidth="item.originalImageWidth"
             :dx="item.dx"
             :dy="item.dy"
+            @deleteSpecialtag="(tag) => deleteSpecialtag(item, tag)"
           />
           <hr class="image-seperator" />
         </div>
@@ -77,6 +78,36 @@ const {
 
 const emit = defineEmits(["error"]);
 
+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);
+};
+
+const clearEmptySpecialTag = (item) => {
+  item.tagList
+    .filter((item) => !item.tagName.trim().replace("\n", ""))
+    .forEach((tag) => {
+      deleteSpecialtag(item, tag);
+    });
+};
+
 //#region : 图片拖动。在轨迹模式下,仅当没有选择分数时可用。
 const { dragContainer } = dragImage();
 //#endregion : 图片拖动
@@ -346,6 +377,7 @@ if (hasMarkResultToRender) {
 
 //#region : 评分
 const innerMakeTrack = (event: MouseEvent, item: SliceImage) => {
+  clearEmptySpecialTag(item);
   makeTrack(event, item, maxImageWidth, theFinalHeight);
 };
 //#endregion : 评分

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

@@ -453,6 +453,14 @@ const deleteSpecialtag = (item, tag) => {
   store.currentTaskEnsured.markResult.specialTagList.splice(tagIndex, 1);
 };
 
+const clearEmptySpecialTag = (item) => {
+  item.tagList
+    .filter((item) => !item.tagName.trim().replace("\n", ""))
+    .forEach((tag) => {
+      deleteSpecialtag(item, tag);
+    });
+};
+
 // should not render twice at the same time
 let renderLock = false;
 const renderPaperAndMark = async () => {
@@ -594,6 +602,7 @@ if (hasMarkResultToRender) {
 
 //#region : 评分
 const innerMakeTrack = (event: MouseEvent, item: SliceImage) => {
+  clearEmptySpecialTag(item);
   makeTrack(event, item, maxSliceWidth, theFinalHeight);
 };
 //#endregion : 评分

+ 1 - 0
src/features/mark/MarkBoardKeyBoard.vue

@@ -174,6 +174,7 @@ const questionScore = $computed(
 
 function numberKeyListener(event: KeyboardEvent) {
   // console.log(event);
+  if (event.target.tagName !== "BODY") return;
   if (!store.currentQuestion || !store.currentTask) return;
   if (store.globalMask) return;
 

+ 2 - 0
src/features/mark/MarkBoardTrack.vue

@@ -326,6 +326,7 @@ function chooseScore(score: number) {
 let keyPressTimestamp = 0;
 let keys: string[] = [];
 function numberKeyListener(event: KeyboardEvent) {
+  if (event.target.tagName !== "BODY") return;
   if (!store.currentQuestion) return;
   if (questionScoreDisabled) return;
   if (" jiklc".includes(event.key)) return;
@@ -378,6 +379,7 @@ function numberKeyListener(event: KeyboardEvent) {
 }
 
 function submitListener(e: KeyboardEvent) {
+  if (event.target.tagName !== "BODY") return;
   // if (import.meta.env.DEV && e.ctrlKey && e.key === "Enter") {
   if (e.ctrlKey && e.key === "Enter") {
     submit();

+ 18 - 7
src/features/mark/MarkDrawTrack.vue

@@ -17,7 +17,10 @@
       </div>
     </template>
   </transition-group>
-  <template v-for="(tag, index) in specialTagList" :key="index">
+  <template
+    v-for="tag in specialTagList"
+    :key="`${tag.offsetX}_${tag.offsetY}`"
+  >
     <div
       v-if="tag.tagType === 'TEXT'"
       class="score-container special-container"
@@ -28,8 +31,13 @@
       @mouseup.stop
     >
       <a-textarea
+        :key="`${tag.offsetX}_${tag.offsetY}`"
         v-model:value="tag.tagName"
-        class="tag-textarea tw-m-auto"
+        :class="[
+          'tag-textarea',
+          'tw-m-auto',
+          { 'is-empty': checkTagContentIsEmpty(tag.tagName) },
+        ]"
         :autosize="{ minRows: 1, maxRows: 6 }"
         :maxlength="32"
         @blur="specialTagBlur(tag)"
@@ -112,10 +120,12 @@ const hasMember = (track: any) => {
 const focusedTrack = (track: Track) => {
   return store.focusTracks.includes(track) || hasMember(track);
 };
+const checkTagContentIsEmpty = (cont) => {
+  return !cont.trim().replace("\n", "");
+};
 const specialTagBlur = (tag) => {
-  const tagName = tag.tagName.trim().replace("\n", "");
-  if (tagName) return;
-  console.log(tagName);
+  const contIsEmpty = checkTagContentIsEmpty(tag.tagName);
+  if (!contIsEmpty) return;
   emit("delete-specialtag", tag);
 };
 
@@ -178,8 +188,8 @@ watch(
 .score-container.special-container {
   width: auto;
   height: auto;
-  margin-top: none;
-  margin-left: none;
+  margin-top: 0;
+  margin-left: 0;
   max-width: 200px;
   max-height: 200px;
   transform: translate(-50%, -50%);
@@ -200,6 +210,7 @@ watch(
   border-color: transparent;
   outline: none;
 }
+.score-container .tag-textarea.is-empty,
 .score-container .tag-textarea:hover,
 .score-container .tag-textarea:focus {
   background-color: rgba(255, 255, 255, 0.8);

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

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

+ 1 - 0
src/features/mark/SpecialTagModal.vue

@@ -125,6 +125,7 @@ function chooseSpecialTag(tagName: string, tagType: string) {
 
 const close = () => {
   store.currentSpecialTag = undefined;
+  store.currentSpecialTagType = undefined;
   store.setting.uiSetting["specialTag.modal"] = false;
 };
 </script>

+ 11 - 4
src/styles/page.less

@@ -386,12 +386,19 @@
         background: #f0f0f0;
         border-radius: 0px 3px 3px 0px;
         border: 1px solid #d9d9d9;
-        width: 132px;
+        width: auto;
+        padding-right: 20px;
         input {
-          padding: 0 12px;
           border: 0;
-          width: 66px;
-          border-right: 1px solid #d9d9d9;
+          margin: 0;
+          padding: 0;
+          background: #f0f0f0;
+          text-align: right;
+          outline: none;
+          pointer-events: none;
+          &:focus {
+            box-shadow: none;
+          }
         }
         .ant-pagination-slash {
           margin: 0;