@konfuzio/document-validation-ui 0.1.8 → 0.1.9-pre-release-2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/css/app.css +1 -1
- package/dist/index.html +1 -1
- package/dist/js/app.js +1 -1
- package/dist/js/app.js.map +1 -1
- package/package.json +1 -1
- package/src/.DS_Store +0 -0
- package/src/components/DocumentAnnotations/AnnotationContent.vue +18 -47
- package/src/components/DocumentAnnotations/AnnotationDetails.vue +7 -5
- package/src/components/DocumentAnnotations/AnnotationRow.vue +82 -106
- package/src/components/DocumentAnnotations/DocumentAnnotations.vue +15 -8
- package/src/components/DocumentAnnotations/EmptyAnnotation.vue +41 -88
- package/src/components/DocumentDashboard.vue +5 -2
- package/src/components/DocumentEdit/DocumentEdit.vue +5 -5
- package/src/components/DocumentPage/BoxSelection.vue +4 -1
- package/src/components/DocumentPage/DocumentPage.vue +28 -22
- package/src/components/DocumentPage/DocumentToolbar.vue +14 -0
- package/src/components/DocumentPage/NewAnnotation.vue +22 -11
- package/src/locales/de.json +15 -14
- package/src/locales/en.json +1 -2
- package/src/locales/es.json +4 -2
- package/src/store/category.js +1 -1
- package/src/store/document.js +24 -29
- package/src/store/edit.js +13 -1
- package/src/store/selection.js +32 -7
- package/src/utils/utils.js +4 -0
|
@@ -10,32 +10,38 @@
|
|
|
10
10
|
editAnnotation &&
|
|
11
11
|
editAnnotation.id === emptyAnnotationId() &&
|
|
12
12
|
'error-editing',
|
|
13
|
-
isEmptyAnnotationEditable()
|
|
13
|
+
!isEmptyAnnotationEditable() && !isMissingAnnotation && 'label-empty',
|
|
14
14
|
isAnnotationBeingEdited() && 'clicked',
|
|
15
|
-
|
|
15
|
+
isMissingAnnotation && 'missing-annotation',
|
|
16
16
|
]"
|
|
17
17
|
:contenteditable="isEmptyAnnotationEditable()"
|
|
18
18
|
@keypress.enter="saveEmptyAnnotationChanges"
|
|
19
19
|
@click="handleEditEmptyAnnotation"
|
|
20
20
|
@focus="handleEditEmptyAnnotation"
|
|
21
|
-
|
|
22
|
-
<span v-if="span && span.offset_string && isEmptyAnnotationEditable()">
|
|
23
|
-
{{ span.offset_string }}
|
|
24
|
-
</span>
|
|
21
|
+
><!-- eslint-disable vue/no-v-html -->
|
|
25
22
|
<span
|
|
26
|
-
v-
|
|
27
|
-
|
|
23
|
+
v-if="isFindingAnnotation"
|
|
24
|
+
v-html="$t('draw_box_document', { label_name: label.name })"
|
|
28
25
|
>
|
|
26
|
+
</span>
|
|
27
|
+
<span v-else-if="isMissingAnnotation" class="not-found-text">
|
|
29
28
|
{{ $t("missing_from_document") }}
|
|
30
29
|
</span>
|
|
30
|
+
<span
|
|
31
|
+
v-else-if="span && span.offset_string && isEmptyAnnotationEditable()"
|
|
32
|
+
>
|
|
33
|
+
{{ span.offset_string }}
|
|
34
|
+
</span>
|
|
31
35
|
<span v-else>
|
|
32
36
|
{{ $t("no_data_found") }}
|
|
33
37
|
</span>
|
|
38
|
+
<!--eslint-enable-->
|
|
34
39
|
</span>
|
|
35
40
|
</div>
|
|
36
41
|
</template>
|
|
37
42
|
<script>
|
|
38
43
|
import { mapState, mapGetters } from "vuex";
|
|
44
|
+
import { isElementArray } from "../../utils/utils";
|
|
39
45
|
|
|
40
46
|
/**
|
|
41
47
|
* This component is responsible for managing empty annotations (labels with no annotations).
|
|
@@ -65,80 +71,50 @@ export default {
|
|
|
65
71
|
type: Boolean,
|
|
66
72
|
required: false,
|
|
67
73
|
},
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
}
|
|
74
|
+
isMissingAnnotation: {
|
|
75
|
+
type: Boolean,
|
|
76
|
+
required: true,
|
|
77
|
+
default: false,
|
|
78
|
+
},
|
|
73
79
|
},
|
|
74
80
|
computed: {
|
|
75
|
-
...mapGetters("document", [
|
|
76
|
-
"isAnnotationInEditMode",
|
|
77
|
-
"getTextFromEntities",
|
|
78
|
-
"annotationIsNotFound",
|
|
79
|
-
"isDocumentReviewed",
|
|
80
|
-
]),
|
|
81
|
-
...mapGetters("selection", ["isValueArray"]),
|
|
81
|
+
...mapGetters("document", ["isAnnotationInEditMode", "isDocumentReviewed"]),
|
|
82
82
|
...mapState("selection", ["spanSelection", "elementSelected"]),
|
|
83
83
|
...mapState("document", [
|
|
84
84
|
"editAnnotation",
|
|
85
85
|
"publicView",
|
|
86
|
-
"selectedEntities",
|
|
87
86
|
"showActionError",
|
|
88
87
|
]),
|
|
88
|
+
isFindingAnnotation() {
|
|
89
|
+
return (
|
|
90
|
+
this.editAnnotation &&
|
|
91
|
+
this.editAnnotation.id === this.emptyAnnotationId() &&
|
|
92
|
+
(!this.span || !this.span.offset_string)
|
|
93
|
+
);
|
|
94
|
+
},
|
|
89
95
|
},
|
|
96
|
+
|
|
90
97
|
watch: {
|
|
91
98
|
span(newValue) {
|
|
92
99
|
if (this.elementSelected === this.emptyAnnotationId() && newValue) {
|
|
93
|
-
if (
|
|
100
|
+
if (isElementArray(newValue))
|
|
94
101
|
newValue.map((span) => {
|
|
95
102
|
if (span.offset_string) {
|
|
96
103
|
span.offset_string =
|
|
97
104
|
this.$refs.emptyAnnotation.textContent.trim();
|
|
98
105
|
span.offset_string_original =
|
|
99
106
|
this.$refs.emptyAnnotation.textContent.trim();
|
|
100
|
-
|
|
101
|
-
this.setText(span.offset_string);
|
|
102
107
|
}
|
|
103
108
|
});
|
|
104
109
|
}
|
|
105
110
|
},
|
|
106
|
-
editAnnotation(newAnnotation, oldAnnotation) {
|
|
107
|
-
// verify if new annotation in edit mode is not this one and if this
|
|
108
|
-
// one was selected before so we set the state to the previous one (like a cancel)
|
|
109
|
-
if (oldAnnotation && oldAnnotation.id === this.emptyAnnotationId()) {
|
|
110
|
-
this.cancelEmptyAnnotation(true);
|
|
111
|
-
}
|
|
112
|
-
},
|
|
113
|
-
selectedEntities(newValue) {
|
|
114
|
-
if (!newValue && this.isAnnotationBeingEdited(this.emptyAnnotationId())) {
|
|
115
|
-
this.setText(
|
|
116
|
-
this.$t("draw_box_document", { label_name: this.label.name })
|
|
117
|
-
);
|
|
118
|
-
return;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
if (
|
|
122
|
-
newValue &&
|
|
123
|
-
this.editAnnotation &&
|
|
124
|
-
this.emptyAnnotationId() === this.editAnnotation.id
|
|
125
|
-
) {
|
|
126
|
-
const text = this.getTextFromEntities();
|
|
127
|
-
this.setText(text);
|
|
128
|
-
}
|
|
129
|
-
},
|
|
130
111
|
spanSelection(newValue) {
|
|
131
|
-
if (
|
|
132
|
-
const isSpanArray = Array.isArray(newValue);
|
|
112
|
+
if (!newValue) return;
|
|
133
113
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
) {
|
|
139
|
-
this.$store.dispatch("document/resetEditAnnotation");
|
|
140
|
-
this.$store.dispatch("selection/disableSelection");
|
|
141
|
-
}
|
|
114
|
+
// // Check if the bbox has no string
|
|
115
|
+
if (newValue[0] && !newValue[0].offset_string) {
|
|
116
|
+
this.$store.dispatch("document/resetEditAnnotation");
|
|
117
|
+
this.$store.dispatch("selection/disableSelection");
|
|
142
118
|
}
|
|
143
119
|
},
|
|
144
120
|
},
|
|
@@ -160,23 +136,22 @@ export default {
|
|
|
160
136
|
if (
|
|
161
137
|
this.publicView ||
|
|
162
138
|
this.isDocumentReviewed ||
|
|
163
|
-
this.
|
|
139
|
+
this.isMissingAnnotation
|
|
164
140
|
)
|
|
165
141
|
return;
|
|
166
142
|
|
|
167
143
|
if (
|
|
168
144
|
!this.publicView &&
|
|
169
145
|
!this.isDocumentReviewed &&
|
|
170
|
-
!this.isLoading &&
|
|
171
146
|
this.elementSelected !== this.emptyAnnotationId()
|
|
172
147
|
) {
|
|
173
|
-
this.
|
|
174
|
-
|
|
175
|
-
);
|
|
148
|
+
this.$store.dispatch("selection/disableSelection");
|
|
149
|
+
this.$store.dispatch("selection/setSelectedEntities", null);
|
|
176
150
|
this.$store.dispatch(
|
|
177
151
|
"selection/selectElement",
|
|
178
152
|
this.emptyAnnotationId()
|
|
179
153
|
);
|
|
154
|
+
|
|
180
155
|
this.$store.dispatch("document/setEditAnnotation", {
|
|
181
156
|
id: this.emptyAnnotationId(),
|
|
182
157
|
index: this.spanIndex,
|
|
@@ -186,28 +161,10 @@ export default {
|
|
|
186
161
|
});
|
|
187
162
|
}
|
|
188
163
|
},
|
|
189
|
-
cancelEmptyAnnotation(wasOutsideClick = false) {
|
|
190
|
-
if (wasOutsideClick) {
|
|
191
|
-
this.setText(this.$t("no_data_found"));
|
|
192
|
-
} else {
|
|
193
|
-
this.$store.dispatch("selection/disableSelection");
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
this.isLoading = false;
|
|
197
|
-
this.$store.dispatch("document/setSelectedEntities", null);
|
|
198
|
-
|
|
199
|
-
if (this.$refs.emptyAnnotation) {
|
|
200
|
-
this.$refs.emptyAnnotation.blur();
|
|
201
|
-
}
|
|
202
|
-
},
|
|
203
164
|
isEmptyAnnotationEditable() {
|
|
204
|
-
if (
|
|
205
|
-
return (
|
|
206
|
-
this.elementSelected === this.emptyAnnotationId() && !this.isLoading
|
|
207
|
-
);
|
|
208
|
-
} else if (
|
|
165
|
+
if (
|
|
209
166
|
(this.spanSelection && this.spanSelection[this.spanIndex] === 0) ||
|
|
210
|
-
this.
|
|
167
|
+
this.isMissingAnnotation
|
|
211
168
|
) {
|
|
212
169
|
return false;
|
|
213
170
|
} else {
|
|
@@ -215,8 +172,7 @@ export default {
|
|
|
215
172
|
this.elementSelected === this.emptyAnnotationId() &&
|
|
216
173
|
this.spanSelection &&
|
|
217
174
|
this.spanSelection[this.spanIndex] &&
|
|
218
|
-
this.spanSelection[this.spanIndex].offset_string != null
|
|
219
|
-
!this.isLoading
|
|
175
|
+
this.spanSelection[this.spanIndex].offset_string != null
|
|
220
176
|
);
|
|
221
177
|
}
|
|
222
178
|
},
|
|
@@ -230,9 +186,6 @@ export default {
|
|
|
230
186
|
// API call handled in parent component - AnnotationRow
|
|
231
187
|
this.$emit("save-empty-annotation-changes");
|
|
232
188
|
},
|
|
233
|
-
setText(text) {
|
|
234
|
-
this.$refs.emptyAnnotation.innerHTML = text;
|
|
235
|
-
},
|
|
236
189
|
},
|
|
237
190
|
};
|
|
238
191
|
</script>
|
|
@@ -36,7 +36,9 @@
|
|
|
36
36
|
</div>
|
|
37
37
|
<div
|
|
38
38
|
v-if="
|
|
39
|
-
selectedDocument &&
|
|
39
|
+
selectedDocument &&
|
|
40
|
+
waitingForSplittingConfirmation(selectedDocument) &&
|
|
41
|
+
!documentBeingSplit
|
|
40
42
|
"
|
|
41
43
|
>
|
|
42
44
|
<SplittingSuggestionsModal />
|
|
@@ -101,10 +103,11 @@ export default {
|
|
|
101
103
|
"selectedDocument",
|
|
102
104
|
"splittingSuggestions",
|
|
103
105
|
]),
|
|
104
|
-
...mapState("edit", ["editMode", "splitOverview"]),
|
|
106
|
+
...mapState("edit", ["editMode", "splitOverview", "documentBeingSplit"]),
|
|
105
107
|
...mapGetters("display", ["isMinimumWidth"]),
|
|
106
108
|
...mapGetters("document", ["waitingForSplittingConfirmation"]),
|
|
107
109
|
},
|
|
110
|
+
|
|
108
111
|
watch: {
|
|
109
112
|
selectedDocument(newDocument, oldDocument) {
|
|
110
113
|
if (newDocument && !oldDocument) {
|
|
@@ -231,7 +231,11 @@ export default {
|
|
|
231
231
|
const newPage = { page: page, origin: origin };
|
|
232
232
|
const removedPage = { page: 0, origin: origin };
|
|
233
233
|
|
|
234
|
-
if (
|
|
234
|
+
if (this.splitSuggestionsEnabled && origin === "AI") {
|
|
235
|
+
// if manual suggestions were added but we enable automatic splitting,
|
|
236
|
+
// this last one takes over
|
|
237
|
+
this.splittingLines.splice(page - 1, 1, newPage);
|
|
238
|
+
} else if (
|
|
235
239
|
page === this.splittingLines.length ||
|
|
236
240
|
(!this.splitSuggestionsEnabled && !found && origin === "AI")
|
|
237
241
|
) {
|
|
@@ -239,10 +243,6 @@ export default {
|
|
|
239
243
|
// Or if splitting is switched off, but some of the suggestion lines
|
|
240
244
|
// were removed manually
|
|
241
245
|
return;
|
|
242
|
-
} else if (this.splitSuggestionsEnabled && origin === "AI") {
|
|
243
|
-
// if manual suggestions were added but we enable automatic splitting,
|
|
244
|
-
// this last one takes over
|
|
245
|
-
this.splittingLines.splice(page - 1, 1, newPage);
|
|
246
246
|
} else if (found) {
|
|
247
247
|
// If splitting is switched off and we have manual splits,
|
|
248
248
|
// those should stay unchanged
|
|
@@ -102,7 +102,10 @@ export default {
|
|
|
102
102
|
this.selection.start,
|
|
103
103
|
this.selection.end
|
|
104
104
|
);
|
|
105
|
-
this.$store.dispatch("selection/getTextFromBboxes",
|
|
105
|
+
this.$store.dispatch("selection/getTextFromBboxes", {
|
|
106
|
+
box,
|
|
107
|
+
entities: false,
|
|
108
|
+
});
|
|
106
109
|
},
|
|
107
110
|
|
|
108
111
|
/**
|
|
@@ -68,8 +68,8 @@
|
|
|
68
68
|
v-if="!isAnnotationInEditMode(annotation.id)"
|
|
69
69
|
:key="'ann' + annotation.id + '-' + index"
|
|
70
70
|
:config="annotationRect(bbox, annotation.id)"
|
|
71
|
-
@click="
|
|
72
|
-
@mouseenter="
|
|
71
|
+
@click="handleFocusedAnnotation(annotation, 'click')"
|
|
72
|
+
@mouseenter="handleFocusedAnnotation(annotation)"
|
|
73
73
|
@mouseleave="onElementLeave"
|
|
74
74
|
/>
|
|
75
75
|
</template>
|
|
@@ -221,7 +221,6 @@ export default {
|
|
|
221
221
|
scaled: {
|
|
222
222
|
...box,
|
|
223
223
|
},
|
|
224
|
-
clickSelected: false,
|
|
225
224
|
};
|
|
226
225
|
});
|
|
227
226
|
},
|
|
@@ -258,6 +257,7 @@ export default {
|
|
|
258
257
|
"isSelecting",
|
|
259
258
|
"selectionFromBbox",
|
|
260
259
|
"spanSelection",
|
|
260
|
+
"selectedEntities",
|
|
261
261
|
]),
|
|
262
262
|
...mapState("display", [
|
|
263
263
|
"scale",
|
|
@@ -271,7 +271,6 @@ export default {
|
|
|
271
271
|
"editAnnotation",
|
|
272
272
|
"selectedDocument",
|
|
273
273
|
"publicView",
|
|
274
|
-
"selectedEntities",
|
|
275
274
|
]),
|
|
276
275
|
...mapState("edit", ["editMode"]),
|
|
277
276
|
...mapGetters("display", ["visiblePageRange", "bboxToRect"]),
|
|
@@ -292,10 +291,13 @@ export default {
|
|
|
292
291
|
scale() {
|
|
293
292
|
this.closePopups(true);
|
|
294
293
|
},
|
|
295
|
-
selectedEntities(newValue) {
|
|
294
|
+
async selectedEntities(newValue) {
|
|
296
295
|
if (!newValue) {
|
|
296
|
+
this.$store.dispatch("selection/setSpanSelection", null);
|
|
297
297
|
this.closePopups(true);
|
|
298
298
|
}
|
|
299
|
+
|
|
300
|
+
await this.$store.dispatch("selection/getTextFromEntities", newValue);
|
|
299
301
|
},
|
|
300
302
|
page(newValue, oldValue) {
|
|
301
303
|
if (newValue.image_url !== oldValue.image_url) {
|
|
@@ -390,10 +392,16 @@ export default {
|
|
|
390
392
|
});
|
|
391
393
|
},
|
|
392
394
|
|
|
393
|
-
|
|
394
|
-
this.closePopups(true);
|
|
395
|
+
handleFocusedAnnotation(annotation, trigger) {
|
|
395
396
|
this.$store.dispatch("document/resetEditAnnotation");
|
|
396
|
-
this.$store.dispatch("document/setSidebarAnnotationSelected",
|
|
397
|
+
this.$store.dispatch("document/setSidebarAnnotationSelected", {
|
|
398
|
+
annotation,
|
|
399
|
+
trigger,
|
|
400
|
+
});
|
|
401
|
+
|
|
402
|
+
if (trigger && trigger === "click") {
|
|
403
|
+
this.closePopups(true);
|
|
404
|
+
}
|
|
397
405
|
},
|
|
398
406
|
|
|
399
407
|
handleClickedEntity(entity) {
|
|
@@ -406,24 +414,22 @@ export default {
|
|
|
406
414
|
return;
|
|
407
415
|
|
|
408
416
|
// Check if we are creating a new Annotation
|
|
409
|
-
// or if we are
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
content: entity.original.offset_string,
|
|
413
|
-
};
|
|
417
|
+
// or if we are removing a previously selected entity
|
|
418
|
+
// or editing empty one
|
|
419
|
+
const entityToAdd = entity;
|
|
414
420
|
|
|
415
421
|
const found = this.newAnnotation.find(
|
|
416
422
|
(ann) =>
|
|
417
|
-
ann.
|
|
418
|
-
ann.
|
|
423
|
+
ann.scaled.width === entityToAdd.scaled.width &&
|
|
424
|
+
ann.original.offset_string === entityToAdd.original.offset_string
|
|
419
425
|
);
|
|
420
426
|
|
|
421
427
|
if (found) {
|
|
422
428
|
this.newAnnotation = [
|
|
423
429
|
...this.newAnnotation.filter(
|
|
424
430
|
(ann) =>
|
|
425
|
-
ann.
|
|
426
|
-
ann.
|
|
431
|
+
ann.scaled.width !== entityToAdd.scaled.width &&
|
|
432
|
+
ann.original.offset_string !== entityToAdd.original.offset_string
|
|
427
433
|
),
|
|
428
434
|
];
|
|
429
435
|
} else {
|
|
@@ -432,11 +438,11 @@ export default {
|
|
|
432
438
|
|
|
433
439
|
if (this.newAnnotation.length > 0) {
|
|
434
440
|
this.$store.dispatch(
|
|
435
|
-
"
|
|
441
|
+
"selection/setSelectedEntities",
|
|
436
442
|
this.newAnnotation
|
|
437
443
|
);
|
|
438
444
|
} else {
|
|
439
|
-
this.$store.dispatch("
|
|
445
|
+
this.$store.dispatch("selection/setSelectedEntities", null);
|
|
440
446
|
}
|
|
441
447
|
},
|
|
442
448
|
|
|
@@ -492,10 +498,10 @@ export default {
|
|
|
492
498
|
if (this.newAnnotation && this.newAnnotation.length > 0) {
|
|
493
499
|
entityIsSelected = this.newAnnotation.find((selectedEntity) => {
|
|
494
500
|
return (
|
|
495
|
-
selectedEntity.
|
|
501
|
+
selectedEntity.original.offset_string ===
|
|
496
502
|
entity.original.offset_string &&
|
|
497
|
-
selectedEntity.
|
|
498
|
-
selectedEntity.
|
|
503
|
+
selectedEntity.original.x0 === entity.original.x0 &&
|
|
504
|
+
selectedEntity.original.y0 === entity.original.y0
|
|
499
505
|
);
|
|
500
506
|
});
|
|
501
507
|
}
|
|
@@ -124,6 +124,9 @@ export default {
|
|
|
124
124
|
zoomIn() {
|
|
125
125
|
if (this.currentPercentage === this.maxPercentage) return;
|
|
126
126
|
|
|
127
|
+
// exit edit mode of Annotation if changing zoom during editing
|
|
128
|
+
this.cancelAnnotationEditMode();
|
|
129
|
+
|
|
127
130
|
this.currentPercentage += this.defaultPercentage * 100;
|
|
128
131
|
this.updateScale((this.defaultScale * this.currentPercentage) / 100);
|
|
129
132
|
},
|
|
@@ -132,12 +135,18 @@ export default {
|
|
|
132
135
|
return;
|
|
133
136
|
}
|
|
134
137
|
|
|
138
|
+
// exit edit mode of Annotation if changing zoom during editing
|
|
139
|
+
this.cancelAnnotationEditMode();
|
|
140
|
+
|
|
135
141
|
this.currentPercentage -= this.defaultPercentage * 100;
|
|
136
142
|
this.updateScale((this.defaultScale * this.currentPercentage) / 100);
|
|
137
143
|
},
|
|
138
144
|
fitAuto() {
|
|
139
145
|
if (this.currentPercentage === 50 || !this.defaultScale) return;
|
|
140
146
|
|
|
147
|
+
// exit edit mode of Annotation if changing zoom during editing
|
|
148
|
+
this.cancelAnnotationEditMode();
|
|
149
|
+
|
|
141
150
|
// Always set to 50%
|
|
142
151
|
this.updateScale(this.defaultScale * this.fitPercentage);
|
|
143
152
|
|
|
@@ -148,6 +157,11 @@ export default {
|
|
|
148
157
|
this.$store.dispatch("display/updateScale", { scale });
|
|
149
158
|
});
|
|
150
159
|
},
|
|
160
|
+
cancelAnnotationEditMode() {
|
|
161
|
+
this.$store.dispatch("document/resetEditAnnotation");
|
|
162
|
+
this.$store.dispatch("selection/disableSelection");
|
|
163
|
+
this.$store.dispatch("selection/setSelectedEntities", null);
|
|
164
|
+
},
|
|
151
165
|
},
|
|
152
166
|
};
|
|
153
167
|
</script>
|
|
@@ -110,7 +110,7 @@
|
|
|
110
110
|
type="is-primary"
|
|
111
111
|
class="popup-button primary-button"
|
|
112
112
|
:label="$t('save')"
|
|
113
|
-
:disabled="loading || !
|
|
113
|
+
:disabled="loading || !spanSelection || !selectedLabel"
|
|
114
114
|
@click.prevent="save"
|
|
115
115
|
/>
|
|
116
116
|
</div>
|
|
@@ -158,22 +158,22 @@ export default {
|
|
|
158
158
|
...mapGetters("document", [
|
|
159
159
|
"numberOfAnnotationSetGroup",
|
|
160
160
|
"labelsFilteredForAnnotationCreation",
|
|
161
|
-
"getTextFromEntities",
|
|
162
161
|
]),
|
|
162
|
+
...mapState("selection", ["spanSelection"]),
|
|
163
163
|
top() {
|
|
164
|
-
const top = this.newAnnotation[0].
|
|
164
|
+
const top = this.newAnnotation[0].scaled.y - heightOfPopup; // subtract the height of the popup plus some margin
|
|
165
165
|
|
|
166
166
|
//check if the popup will not go off the container on the top
|
|
167
|
-
return this.newAnnotation[0].
|
|
167
|
+
return this.newAnnotation[0].scaled.y > heightOfPopup
|
|
168
168
|
? top
|
|
169
|
-
: this.newAnnotation[0].
|
|
170
|
-
this.newAnnotation[0].
|
|
169
|
+
: this.newAnnotation[0].scaled.y +
|
|
170
|
+
this.newAnnotation[0].scaled.height +
|
|
171
171
|
margin;
|
|
172
172
|
},
|
|
173
173
|
left() {
|
|
174
174
|
const left =
|
|
175
|
-
this.newAnnotation[0].
|
|
176
|
-
this.newAnnotation[0].
|
|
175
|
+
this.newAnnotation[0].scaled.x +
|
|
176
|
+
this.newAnnotation[0].scaled.width / 2 -
|
|
177
177
|
widthOfPopup / 2; // add the entity half width to be centered and then subtract half the width of the popup
|
|
178
178
|
|
|
179
179
|
//check if the popup will not go off the container
|
|
@@ -186,7 +186,15 @@ export default {
|
|
|
186
186
|
}
|
|
187
187
|
},
|
|
188
188
|
textFromEntities() {
|
|
189
|
-
|
|
189
|
+
if (!this.spanSelection) return;
|
|
190
|
+
|
|
191
|
+
// get array of all offset strings
|
|
192
|
+
let text = this.spanSelection.map((span) => {
|
|
193
|
+
return span.offset_string;
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
// join all the strings to become a single string of text
|
|
197
|
+
return text.join().split(",").join(" ");
|
|
190
198
|
},
|
|
191
199
|
},
|
|
192
200
|
watch: {
|
|
@@ -210,13 +218,16 @@ export default {
|
|
|
210
218
|
},
|
|
211
219
|
methods: {
|
|
212
220
|
close() {
|
|
213
|
-
this.$store.dispatch("
|
|
221
|
+
this.$store.dispatch("selection/setSelectedEntities", null);
|
|
214
222
|
this.$emit("close");
|
|
215
223
|
},
|
|
216
224
|
save() {
|
|
217
225
|
this.loading = true;
|
|
218
226
|
const span = this.newAnnotation.flatMap((ann) => {
|
|
219
|
-
return {
|
|
227
|
+
return {
|
|
228
|
+
...ann.original,
|
|
229
|
+
offset_string: ann.original.offset_string,
|
|
230
|
+
};
|
|
220
231
|
});
|
|
221
232
|
|
|
222
233
|
const annotationToCreate = {
|
package/src/locales/de.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"no_label_sets_found_description": "In diesem Dokument sind keine Label Sets vorhanden.",
|
|
4
4
|
"no_labels_found": "Keine Labels vorhanden",
|
|
5
5
|
"no_labels_description": "In diesem Label Set sind keine Labels vorhanden.",
|
|
6
|
-
"resolution_not_supported": "Die
|
|
6
|
+
"resolution_not_supported": "Die aktuelle Auflösung wird nicht unterstützt",
|
|
7
7
|
"upload_documents": "Laden Sie Ihre Dokumente hoch",
|
|
8
8
|
"request_trial": "Fordern Sie Ihren Probezugang an",
|
|
9
9
|
"warning_message": "Die KI kann nicht trainiert werden, wenn Sie den Text manuell ändern.",
|
|
@@ -26,11 +26,11 @@
|
|
|
26
26
|
"invalid_email": "Bitte geben Sie eine gültige E-Mail-Adresse ein.",
|
|
27
27
|
"members": "Mitglieder",
|
|
28
28
|
"select": "Auswählen",
|
|
29
|
-
"document_successfully_handed": "Dokument erfolgreich
|
|
30
|
-
"handover_not_possible": "Eine
|
|
31
|
-
"small_viewport_title": "Kleine
|
|
32
|
-
"small_viewport_info": "Es tut uns leid, aber Konfuzio ist nicht für diese
|
|
33
|
-
"ok": "Ok
|
|
29
|
+
"document_successfully_handed": "Dokument erfolgreich zugewiesen an",
|
|
30
|
+
"handover_not_possible": "Eine Zuweisung war nicht möglich. Bitte versuchen Sie es später erneut.",
|
|
31
|
+
"small_viewport_title": "Kleine Fenstergröße",
|
|
32
|
+
"small_viewport_info": "Es tut uns leid, aber Konfuzio ist nicht für diese Fenstergröße optimiert. Für eine bessere Bedienbarkeit öffnen Sie es bitte in einem größeren Ansichtsfenster.",
|
|
33
|
+
"ok": "Ok",
|
|
34
34
|
"no_data_found": "Zum Bearbeiten anklicken...",
|
|
35
35
|
"draw_box_document": "Find <i>{label_name}</i> in the document",
|
|
36
36
|
"confidence": "Konfidenz",
|
|
@@ -52,9 +52,10 @@
|
|
|
52
52
|
"missing_annotation": "Als fehlend markieren",
|
|
53
53
|
"ann_exists": "Eine Annotation für dieses Label und Label-Set existiert bereits.",
|
|
54
54
|
"lite_mode": "Schreibgeschützt",
|
|
55
|
-
"limited_functionalities": "Sie verwenden die schreibgeschützte Version mit
|
|
55
|
+
"limited_functionalities": "Sie verwenden die schreibgeschützte Version mit begrenzte Funktionalität.",
|
|
56
56
|
"split": "Aufteilen",
|
|
57
|
-
"reorder": "
|
|
57
|
+
"reorder": "Sortieren",
|
|
58
|
+
"rotate": "Rotieren",
|
|
58
59
|
"edit_error": "Die Änderungen konnten nicht gespeichert werden. Bitte versuchen Sie es später erneut.",
|
|
59
60
|
"overview": "Übersicht",
|
|
60
61
|
"select_pages": "Sie können nun Seiten drehen, neu sortieren und Dokumente splitten.",
|
|
@@ -116,7 +117,7 @@
|
|
|
116
117
|
"split_modal_title": "Dokument aufteilen",
|
|
117
118
|
"split_modal_body": "Wir haben Ihre Datei gescannt und <strong>{number_of_split_documents}</strong> verschiedene Dokumente gefunde. <strong>Wir empfehlen dringend,</strong> sie zu diesem Zeitpunkt aufzuteilen, da sonst alle Fortschritte, die Sie gemacht haben, aufgrund der erneuten Extraktion der Dokumentdaten verloren gehen.",
|
|
118
119
|
"do_it_later": "Ich werde es später machen",
|
|
119
|
-
"review_now": "Jetzt
|
|
120
|
+
"review_now": "Jetzt überprüfen",
|
|
120
121
|
"recommended": "Empfohlen",
|
|
121
122
|
"smart_split": "Smart Split",
|
|
122
123
|
"smart_split_suggestions": "Unsere Smart Split-Vorschläge sind grün hervorgehoben",
|
|
@@ -125,10 +126,10 @@
|
|
|
125
126
|
"splitting_warning": "Beachten Sie bitte, dass alle Annotationen, die Sie in diesem Dokument gemacht haben, nicht gespeichert werden, wenn Sie fortfahren.",
|
|
126
127
|
"no": "Nein",
|
|
127
128
|
"yes": "Ja",
|
|
128
|
-
"split_modal_no_suggestions": "
|
|
129
|
+
"split_modal_no_suggestions": "Soll das Dokument geteilt werden? Wir <strong>empfehlen</strong> das Dokument jetzt zuteilen, da sonst alle Fortschritte, die in der Zwischenzeit gemacht werden,verloren gehen.",
|
|
129
130
|
"missing_from_document": "Fehlt im Dokument",
|
|
130
|
-
"edit_label": "
|
|
131
|
-
"delete_label": "
|
|
132
|
-
"table": "
|
|
133
|
-
"
|
|
131
|
+
"edit_label": "Label editieren",
|
|
132
|
+
"delete_label": "Label löschen",
|
|
133
|
+
"table": "Tabelle",
|
|
134
|
+
"prepare_document": "Dokument vorbereiten"
|
|
134
135
|
}
|
package/src/locales/en.json
CHANGED
package/src/locales/es.json
CHANGED
|
@@ -124,10 +124,12 @@
|
|
|
124
124
|
"splitting_warning": "Ten en cuenta que se perderán las anotaciones que hayas confirmado en el documento.",
|
|
125
125
|
"no": "No",
|
|
126
126
|
"yes": "Sí",
|
|
127
|
-
"split_modal_no_suggestions": "
|
|
127
|
+
"split_modal_no_suggestions": "¿Necesitas dividir el documento? <strong>Te recomendamos</strong> hacerlo en este momento, o de lo contrario se perderán los cambios realizados.",
|
|
128
128
|
"missing_from_document": "Falta en el documento",
|
|
129
129
|
"edit_label": "Edit label",
|
|
130
130
|
"delete_label": "Delete label",
|
|
131
131
|
"table": "Table",
|
|
132
|
-
"
|
|
132
|
+
"new_multi_ann_description": "Selecciona un modelo de datos de los existentes, luego deselecciona las etiquetas que no existen en este documento.",
|
|
133
|
+
"new_multi_ann_title": "Crear múltiples anotaciones",
|
|
134
|
+
"prepare_document": "Prepara el documento"
|
|
133
135
|
}
|
package/src/store/category.js
CHANGED