You've already forked DataMate
fix(annotation): 解决空标注结果的状态处理问题
- 在构建标注快照时增加空标注检查,避免空对象被处理 - 修改状态判断逻辑,当标注为空且当前状态为 NO_ANNOTATION 或 NOT_APPLICABLE 时保持原状态 - 移除冗余的 hasExistingAnnotation 变量检查 - 确保空标注情况下状态流转的正确性,防止误标为已标注状态
This commit is contained in:
@@ -192,6 +192,7 @@ const stableStringify = (value: unknown) => {
|
||||
|
||||
const buildAnnotationSnapshot = (annotation?: Record<string, unknown>) => {
|
||||
if (!annotation) return "";
|
||||
if (isAnnotationResultEmpty(annotation)) return "";
|
||||
const cleaned: Record<string, unknown> = { ...annotation };
|
||||
delete cleaned.updated_at;
|
||||
delete cleaned.updatedAt;
|
||||
@@ -717,11 +718,13 @@ export default function LabelStudioTextEditor() {
|
||||
const annotationRecord = annotation as Record<string, unknown>;
|
||||
const currentTask = tasks.find((item) => item.fileId === String(fileId));
|
||||
const currentStatus = currentTask?.annotationStatus;
|
||||
const hasExistingAnnotation = !!currentTask?.hasAnnotation;
|
||||
let resolvedStatus: AnnotationResultStatus;
|
||||
if (isAnnotationResultEmpty(annotationRecord)) {
|
||||
if (currentStatus === AnnotationResultStatus.ANNOTATED || (hasExistingAnnotation && !currentStatus)) {
|
||||
resolvedStatus = AnnotationResultStatus.ANNOTATED;
|
||||
if (
|
||||
currentStatus === AnnotationResultStatus.NO_ANNOTATION ||
|
||||
currentStatus === AnnotationResultStatus.NOT_APPLICABLE
|
||||
) {
|
||||
resolvedStatus = currentStatus;
|
||||
} else {
|
||||
const selectedStatus = await confirmEmptyAnnotationStatus();
|
||||
if (!selectedStatus) return false;
|
||||
@@ -1033,6 +1036,15 @@ export default function LabelStudioTextEditor() {
|
||||
[segmentTreeData]
|
||||
);
|
||||
|
||||
const inProgressSegmentedCount = useMemo(() => {
|
||||
if (tasks.length === 0) return 0;
|
||||
return tasks.reduce((count, item) => {
|
||||
const summary = resolveSegmentSummary(item);
|
||||
if (!summary) return count;
|
||||
return summary.done < summary.total ? count + 1 : count;
|
||||
}, 0);
|
||||
}, [tasks]);
|
||||
|
||||
const handleSegmentSelect = useCallback((keys: Array<string | number>) => {
|
||||
const [first] = keys;
|
||||
if (first === undefined || first === null) return;
|
||||
@@ -1214,8 +1226,13 @@ export default function LabelStudioTextEditor() {
|
||||
className="border-r border-gray-200 bg-gray-50 flex flex-col transition-all duration-200 min-h-0"
|
||||
style={{ width: sidebarCollapsed ? 0 : 240, overflow: "hidden" }}
|
||||
>
|
||||
<div className="px-3 py-2 border-b border-gray-200 bg-white font-medium text-sm">
|
||||
文件列表
|
||||
<div className="px-3 py-2 border-b border-gray-200 bg-white font-medium text-sm flex items-center justify-between gap-2">
|
||||
<span>文件列表</span>
|
||||
{segmented && (
|
||||
<Tag color="orange" style={{ margin: 0 }}>
|
||||
标注中 {inProgressSegmentedCount}
|
||||
</Tag>
|
||||
)}
|
||||
</div>
|
||||
<div className="flex-1 min-h-0 overflow-auto">
|
||||
<List
|
||||
|
||||
Reference in New Issue
Block a user