@konfuzio/document-validation-ui 0.1.8-pre-release-1 → 0.1.8-pre-release-3
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/css/chunk-vendors.css +5 -0
- package/dist/index.html +1 -1
- package/dist/js/app.js +1 -1
- package/dist/js/app.js.map +1 -1
- package/dist/js/chunk-vendors.js +1 -1
- package/package.json +1 -1
- package/src/.DS_Store +0 -0
- package/src/api.js +0 -10
- package/src/assets/scss/categorize_modal.scss +1 -1
- package/src/assets/scss/choose_label_set_modal.scss +1 -1
- package/src/assets/scss/document_category.scss +11 -6
- package/src/assets/scss/document_edit.scss +1 -1
- package/src/assets/scss/{theme.scss → main.scss} +28 -30
- package/src/assets/scss/variables.scss +11 -1
- package/src/components/App.vue +2 -55
- package/src/components/DocumentAnnotations/AnnotationActionButtons.vue +9 -12
- package/src/components/DocumentAnnotations/AnnotationContent.vue +5 -5
- package/src/components/DocumentAnnotations/AnnotationRow.vue +2 -2
- package/src/components/DocumentAnnotations/AnnotationSetActionButtons.vue +7 -4
- package/src/components/DocumentAnnotations/CategorizeModal.vue +5 -3
- package/src/components/DocumentAnnotations/DocumentAnnotations.vue +4 -4
- package/src/components/DocumentAnnotations/EmptyAnnotation.vue +5 -5
- package/src/components/DocumentAnnotations/MultiAnnotationTableOverlay.vue +42 -10
- package/src/components/DocumentCategory.vue +5 -1
- package/src/components/DocumentEdit/DocumentEdit.vue +4 -10
- package/src/components/DocumentModals/SplittingSuggestionsModal.vue +15 -3
- package/src/components/DocumentPage/DocumentPage.vue +6 -6
- package/src/components/DocumentPage/DocumentToolbar.vue +16 -14
- package/src/components/DocumentPage/MultiAnnSelection.vue +4 -2
- package/src/components/DocumentTopBar/DocumentName.vue +3 -3
- package/src/components/DocumentTopBar/DocumentTopBar.vue +8 -8
- package/src/components/DocumentTopBar/DocumentTopBarButtons.vue +10 -25
- package/src/components/DocumentTopBar/KeyboardActionsDescription.vue +4 -7
- package/src/main.js +1 -0
- package/src/store/document.js +6 -26
package/package.json
CHANGED
package/src/.DS_Store
ADDED
|
Binary file
|
package/src/api.js
CHANGED
|
@@ -21,14 +21,6 @@ const setAuthToken = (token) => {
|
|
|
21
21
|
authToken = token;
|
|
22
22
|
};
|
|
23
23
|
|
|
24
|
-
const setApiUrl = (url) => {
|
|
25
|
-
HTTP.defaults.baseURL = url;
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
const setImageUrl = (url) => {
|
|
29
|
-
IMG_REQUEST.defaults.baseURL = url;
|
|
30
|
-
};
|
|
31
|
-
|
|
32
24
|
const getInterceptorConfig = (config) => {
|
|
33
25
|
if (authToken) {
|
|
34
26
|
config.headers["Authorization"] = `Token ${authToken}`;
|
|
@@ -62,8 +54,6 @@ const makeImageRequest = (imageURL) => {
|
|
|
62
54
|
|
|
63
55
|
export default {
|
|
64
56
|
HTTP,
|
|
65
|
-
setApiUrl,
|
|
66
|
-
setImageUrl,
|
|
67
57
|
makeImageRequest,
|
|
68
58
|
setAuthToken,
|
|
69
59
|
};
|
|
@@ -4,25 +4,30 @@
|
|
|
4
4
|
cursor: pointer;
|
|
5
5
|
|
|
6
6
|
&.split-mode {
|
|
7
|
-
border: 1px solid $grey-
|
|
7
|
+
border: 1px solid $grey-outline;
|
|
8
8
|
border-radius: 4px;
|
|
9
9
|
background-color: $white;
|
|
10
|
+
|
|
11
|
+
&:hover {
|
|
12
|
+
border-color: $grey-outline-dark;
|
|
13
|
+
background-color: transparent;
|
|
14
|
+
}
|
|
10
15
|
}
|
|
11
16
|
|
|
12
17
|
&.disabled {
|
|
13
18
|
cursor: not-allowed;
|
|
14
19
|
}
|
|
15
20
|
|
|
21
|
+
&:not(.split-mode) {
|
|
22
|
+
.category-drop-down {
|
|
23
|
+
border-right: $component-border;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
16
26
|
.category-drop-down {
|
|
17
27
|
display: flex;
|
|
18
28
|
height: 100%;
|
|
19
29
|
align-items: center;
|
|
20
30
|
padding: 0 8px 0 14px;
|
|
21
|
-
border-right: $component-border;
|
|
22
|
-
|
|
23
|
-
&:hover {
|
|
24
|
-
background-color: $background;
|
|
25
|
-
}
|
|
26
31
|
|
|
27
32
|
.caret-section {
|
|
28
33
|
padding-top: 5px;
|
|
@@ -1,21 +1,9 @@
|
|
|
1
|
-
@use "sass:meta";
|
|
2
1
|
@import url("https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap");
|
|
3
2
|
@import "./imports.scss";
|
|
4
3
|
|
|
5
|
-
|
|
6
|
-
--konfuzio-green: #41af85;
|
|
7
|
-
--white: #fff;
|
|
8
|
-
--primary-color: var(--konfuzio-green);
|
|
9
|
-
--primary-button: 4px;
|
|
10
|
-
--top-bar-background: var(--white);
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
.dv-ui-app-container {
|
|
14
|
-
@include meta.load-css("../../../node_modules/buefy/dist/buefy.css");
|
|
15
|
-
display: flex;
|
|
16
|
-
height: 100%;
|
|
17
|
-
flex-direction: column;
|
|
4
|
+
body {
|
|
18
5
|
margin: 0;
|
|
6
|
+
font-family: $font-family;
|
|
19
7
|
|
|
20
8
|
.overlay {
|
|
21
9
|
height: 100%;
|
|
@@ -28,17 +16,13 @@
|
|
|
28
16
|
overflow-x: hidden;
|
|
29
17
|
}
|
|
30
18
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
-
|
|
35
|
-
|
|
36
|
-
-webkit-text-size-adjust: 100%;
|
|
37
|
-
-moz-text-size-adjust: 100%;
|
|
38
|
-
-ms-text-size-adjust: 100%;
|
|
39
|
-
text-size-adjust: 100%;
|
|
40
|
-
box-sizing: border-box;
|
|
19
|
+
.dv-ui-app-container {
|
|
20
|
+
display: flex;
|
|
21
|
+
height: 100%;
|
|
22
|
+
flex-direction: column;
|
|
23
|
+
}
|
|
41
24
|
|
|
25
|
+
.dv-ui-theme {
|
|
42
26
|
button {
|
|
43
27
|
&.is-primary {
|
|
44
28
|
background-color: $primary !important;
|
|
@@ -261,14 +245,19 @@
|
|
|
261
245
|
|
|
262
246
|
.dropdown-menu {
|
|
263
247
|
padding-top: 0px;
|
|
248
|
+
min-width: 40px;
|
|
264
249
|
}
|
|
265
250
|
|
|
266
|
-
a.dropdown-item
|
|
267
|
-
|
|
268
|
-
}
|
|
251
|
+
a.dropdown-item {
|
|
252
|
+
padding-right: 16px;
|
|
269
253
|
|
|
270
|
-
|
|
271
|
-
|
|
254
|
+
&.is-active {
|
|
255
|
+
background-color: $primary;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
&.is-disabled {
|
|
259
|
+
color: $grey-blue !important;
|
|
260
|
+
}
|
|
272
261
|
}
|
|
273
262
|
|
|
274
263
|
&.dropdown-menu-animation {
|
|
@@ -291,7 +280,7 @@
|
|
|
291
280
|
}
|
|
292
281
|
|
|
293
282
|
.b-checkbox.checkbox {
|
|
294
|
-
|
|
283
|
+
.check {
|
|
295
284
|
background-color: $white;
|
|
296
285
|
}
|
|
297
286
|
&:hover input[type="checkbox"]:not(:disabled) + .check {
|
|
@@ -312,6 +301,8 @@
|
|
|
312
301
|
}
|
|
313
302
|
|
|
314
303
|
&.modal-400 {
|
|
304
|
+
position: absolute !important;
|
|
305
|
+
|
|
315
306
|
.modal-content {
|
|
316
307
|
max-width: 400px !important;
|
|
317
308
|
|
|
@@ -544,6 +535,12 @@
|
|
|
544
535
|
}
|
|
545
536
|
}
|
|
546
537
|
|
|
538
|
+
&.full-height-tooltip {
|
|
539
|
+
.tooltip-trigger {
|
|
540
|
+
height: 100%;
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
|
|
547
544
|
&.width-184 {
|
|
548
545
|
.tooltip-content {
|
|
549
546
|
width: 184px !important;
|
|
@@ -635,6 +632,7 @@
|
|
|
635
632
|
&.split-mode {
|
|
636
633
|
.dropdown-trigger {
|
|
637
634
|
font-size: 14px;
|
|
635
|
+
height: 38px;
|
|
638
636
|
}
|
|
639
637
|
}
|
|
640
638
|
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
/* Theme */
|
|
2
|
+
|
|
3
|
+
$konfuzio-green: #41af85;
|
|
1
4
|
$green: #4bb543;
|
|
2
5
|
$green-low-opacity: rgba(75, 181, 67, 0.11);
|
|
3
6
|
$green-border: #67d19f;
|
|
@@ -16,6 +19,7 @@ $grey-low-opacity: rgba(133, 140, 154, 0.4);
|
|
|
16
19
|
$grey-lighter-low-opacity: rgba(223, 224, 228, 0.5);
|
|
17
20
|
$grey-lightest: #f0f0f0;
|
|
18
21
|
$grey-outline: #d0d5dd;
|
|
22
|
+
$grey-outline-dark: #b5b5b5;
|
|
19
23
|
$grey-detail: #e1e1e1;
|
|
20
24
|
$subtle-grey: #f2f4f7;
|
|
21
25
|
$subtlest-grey: #e3e4e5;
|
|
@@ -27,7 +31,7 @@ $detail: #e2e3e4;
|
|
|
27
31
|
$dark: #2f3032;
|
|
28
32
|
$full-black: #000;
|
|
29
33
|
|
|
30
|
-
$white:
|
|
34
|
+
$white: #fff;
|
|
31
35
|
$low-opacity-white: rgba(255, 255, 255, 0.1);
|
|
32
36
|
|
|
33
37
|
$yellow: #ffd600;
|
|
@@ -38,6 +42,12 @@ $purple: #7b61ff;
|
|
|
38
42
|
$purple-low-opacity: rgba(123, 97, 255, 0.08);
|
|
39
43
|
$text-color: #1a1a1a;
|
|
40
44
|
|
|
45
|
+
:root {
|
|
46
|
+
--primary-color: #{$konfuzio-green};
|
|
47
|
+
--primary-button: 4px;
|
|
48
|
+
--top-bar-background: #{$white};
|
|
49
|
+
}
|
|
50
|
+
|
|
41
51
|
$primary: var(--primary-color);
|
|
42
52
|
$hover-style: brightness(0.8) contrast(160%) grayscale(0.4);
|
|
43
53
|
$font-family: "Inter", sans-serif;
|
package/src/components/App.vue
CHANGED
|
@@ -5,8 +5,6 @@
|
|
|
5
5
|
</div>
|
|
6
6
|
</template>
|
|
7
7
|
<script>
|
|
8
|
-
import Vue from "vue";
|
|
9
|
-
import * as Sentry from "@sentry/vue";
|
|
10
8
|
import DocumentDashboard from "./DocumentDashboard";
|
|
11
9
|
import { DocumentsList } from "./DocumentsList";
|
|
12
10
|
import { getURLQueryParam, getURLPath } from "../utils/utils";
|
|
@@ -41,30 +39,6 @@ export default {
|
|
|
41
39
|
required: false,
|
|
42
40
|
default: "false",
|
|
43
41
|
},
|
|
44
|
-
// eslint-disable-next-line vue/prop-name-casing
|
|
45
|
-
sentry_dsn: {
|
|
46
|
-
type: String,
|
|
47
|
-
required: false,
|
|
48
|
-
default: "",
|
|
49
|
-
},
|
|
50
|
-
// eslint-disable-next-line vue/prop-name-casing
|
|
51
|
-
sentry_env: {
|
|
52
|
-
type: String,
|
|
53
|
-
required: false,
|
|
54
|
-
default: "",
|
|
55
|
-
},
|
|
56
|
-
// eslint-disable-next-line vue/prop-name-casing
|
|
57
|
-
api_url: {
|
|
58
|
-
type: String,
|
|
59
|
-
required: false,
|
|
60
|
-
default: "",
|
|
61
|
-
},
|
|
62
|
-
// eslint-disable-next-line vue/prop-name-casing
|
|
63
|
-
image_url: {
|
|
64
|
-
type: String,
|
|
65
|
-
required: false,
|
|
66
|
-
default: "",
|
|
67
|
-
},
|
|
68
42
|
locale: {
|
|
69
43
|
type: String,
|
|
70
44
|
required: false,
|
|
@@ -119,40 +93,13 @@ export default {
|
|
|
119
93
|
},
|
|
120
94
|
},
|
|
121
95
|
created() {
|
|
122
|
-
// Sentry config
|
|
123
|
-
if (process.env.NODE_ENV != "development") {
|
|
124
|
-
Sentry.init({
|
|
125
|
-
Vue,
|
|
126
|
-
dsn: process.env.VUE_APP_SENTRY_DSN,
|
|
127
|
-
integrations: [new Integrations.BrowserTracing()],
|
|
128
|
-
environment: process.env.VUE_APP_SENTRY_ENVIRONMENT,
|
|
129
|
-
|
|
130
|
-
// We recommend adjusting this value in production, or using tracesSampler
|
|
131
|
-
// for finer control
|
|
132
|
-
tracesSampleRate: 1.0,
|
|
133
|
-
|
|
134
|
-
// If false, errors won't show up in devtools
|
|
135
|
-
logErrors: true,
|
|
136
|
-
|
|
137
|
-
tracingOptions: {
|
|
138
|
-
trackComponents: true,
|
|
139
|
-
},
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
|
|
143
96
|
// locale config
|
|
144
97
|
if (this.locale && this.locale !== "") {
|
|
145
98
|
this.$i18n.locale = this.locale;
|
|
146
99
|
}
|
|
147
100
|
|
|
148
|
-
//
|
|
101
|
+
// user token config
|
|
149
102
|
API.setAuthToken(this.userToken);
|
|
150
|
-
if (this.api_url !== "") {
|
|
151
|
-
API.setApiUrl(this.api_url);
|
|
152
|
-
}
|
|
153
|
-
if (this.image_url !== "") {
|
|
154
|
-
API.setImageUrl(this.image_url);
|
|
155
|
-
}
|
|
156
103
|
|
|
157
104
|
// document and project config
|
|
158
105
|
Promise.all([
|
|
@@ -181,4 +128,4 @@ export default {
|
|
|
181
128
|
};
|
|
182
129
|
</script>
|
|
183
130
|
|
|
184
|
-
<style lang="scss" src="../assets/scss/
|
|
131
|
+
<style lang="scss" src="../assets/scss/main.scss"></style>
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
<!-- save button -->
|
|
13
13
|
<b-button
|
|
14
|
-
v-if="saveBtn && !isLoading && !publicView && !
|
|
14
|
+
v-if="saveBtn && !isLoading && !publicView && !isDocumentReviewed"
|
|
15
15
|
:class="[
|
|
16
16
|
'annotation-save-btn text-btn',
|
|
17
17
|
actionBar && 'action-bar-save-btn',
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
|
|
26
26
|
<!-- cancel button -->
|
|
27
27
|
<b-button
|
|
28
|
-
v-if="cancelBtn && !isLoading && !
|
|
28
|
+
v-if="cancelBtn && !isLoading && !isDocumentReviewed"
|
|
29
29
|
class="is-small annotation-cancel-btn"
|
|
30
30
|
icon-left="xmark"
|
|
31
31
|
@click.stop="cancel"
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
!saveBtn &&
|
|
40
40
|
!cancelBtn &&
|
|
41
41
|
!publicView &&
|
|
42
|
-
!
|
|
42
|
+
!isDocumentReviewed
|
|
43
43
|
"
|
|
44
44
|
class="missing-decline-button-container"
|
|
45
45
|
>
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
!saveBtn &&
|
|
61
61
|
!cancelBtn &&
|
|
62
62
|
!publicView &&
|
|
63
|
-
!
|
|
63
|
+
!isDocumentReviewed
|
|
64
64
|
"
|
|
65
65
|
class="annotation-accept-btn primary-button"
|
|
66
66
|
type="is-primary"
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
!cancelBtn &&
|
|
78
78
|
!saveBtn &&
|
|
79
79
|
!publicView &&
|
|
80
|
-
!
|
|
80
|
+
!isDocumentReviewed
|
|
81
81
|
"
|
|
82
82
|
class="missing-decline-button-container"
|
|
83
83
|
>
|
|
@@ -92,7 +92,7 @@
|
|
|
92
92
|
|
|
93
93
|
<!-- Restore not found annotations -->
|
|
94
94
|
<b-button
|
|
95
|
-
v-if="restoreBtn && !isLoading && !publicView && !
|
|
95
|
+
v-if="restoreBtn && !isLoading && !publicView && !isDocumentReviewed"
|
|
96
96
|
class="restore-btn"
|
|
97
97
|
type="is-primary"
|
|
98
98
|
@click.stop="restore"
|
|
@@ -103,7 +103,7 @@
|
|
|
103
103
|
</template>
|
|
104
104
|
<script>
|
|
105
105
|
/* Component for showing actions for each annotation row */
|
|
106
|
-
import { mapState } from "vuex";
|
|
106
|
+
import { mapGetters, mapState } from "vuex";
|
|
107
107
|
export default {
|
|
108
108
|
name: "AnnotationActionButtons",
|
|
109
109
|
props: {
|
|
@@ -135,11 +135,8 @@ export default {
|
|
|
135
135
|
},
|
|
136
136
|
},
|
|
137
137
|
computed: {
|
|
138
|
-
...mapState("document", [
|
|
139
|
-
|
|
140
|
-
"missingAnnotations",
|
|
141
|
-
"documentIsReviewed",
|
|
142
|
-
]),
|
|
138
|
+
...mapState("document", ["publicView", "missingAnnotations"]),
|
|
139
|
+
...mapGetters("document", ["isDocumentReviewed"]),
|
|
143
140
|
},
|
|
144
141
|
methods: {
|
|
145
142
|
save() {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div :id="annotation.id" ref="annotation" class="annotation">
|
|
3
3
|
<span
|
|
4
|
-
v-if="!publicView || !
|
|
4
|
+
v-if="!publicView || !isDocumentReviewed"
|
|
5
5
|
:id="annotation.id"
|
|
6
6
|
ref="contentEditable"
|
|
7
7
|
:class="[
|
|
@@ -71,6 +71,7 @@ export default {
|
|
|
71
71
|
"isAnnotationInEditMode",
|
|
72
72
|
"pageAtIndex",
|
|
73
73
|
"getTextFromEntities",
|
|
74
|
+
"isDocumentReviewed",
|
|
74
75
|
]),
|
|
75
76
|
...mapGetters("display", ["bboxToRect"]),
|
|
76
77
|
...mapGetters("selection", ["isValueArray"]),
|
|
@@ -82,7 +83,6 @@ export default {
|
|
|
82
83
|
"newAcceptedAnnotations",
|
|
83
84
|
"selectedEntities",
|
|
84
85
|
"showActionError",
|
|
85
|
-
"documentIsReviewed",
|
|
86
86
|
]),
|
|
87
87
|
annotationText() {
|
|
88
88
|
if (this.isAnnotationBeingEdited) {
|
|
@@ -156,7 +156,7 @@ export default {
|
|
|
156
156
|
this.$refs.contentEditable.textContent = text;
|
|
157
157
|
},
|
|
158
158
|
handleEditAnnotation(event) {
|
|
159
|
-
if (this.publicView || this.
|
|
159
|
+
if (this.publicView || this.isDocumentReviewed) return;
|
|
160
160
|
|
|
161
161
|
if (event) {
|
|
162
162
|
event.preventDefault();
|
|
@@ -164,7 +164,7 @@ export default {
|
|
|
164
164
|
|
|
165
165
|
if (
|
|
166
166
|
!this.publicView &&
|
|
167
|
-
!this.
|
|
167
|
+
!this.isDocumentReviewed &&
|
|
168
168
|
!this.isAnnotationBeingEdited &&
|
|
169
169
|
!this.isLoading
|
|
170
170
|
) {
|
|
@@ -228,7 +228,7 @@ export default {
|
|
|
228
228
|
event.preventDefault();
|
|
229
229
|
},
|
|
230
230
|
saveAnnotationChanges(event) {
|
|
231
|
-
if (this.publicView || this.
|
|
231
|
+
if (this.publicView || this.isDocumentReviewed) return;
|
|
232
232
|
|
|
233
233
|
if (event) {
|
|
234
234
|
event.preventDefault();
|
|
@@ -168,12 +168,12 @@ export default {
|
|
|
168
168
|
"documentId",
|
|
169
169
|
"showActionError",
|
|
170
170
|
"missingAnnotations",
|
|
171
|
-
"documentIsReviewed",
|
|
172
171
|
]),
|
|
173
172
|
...mapState("selection", ["spanSelection", "elementSelected"]),
|
|
174
173
|
...mapGetters("document", [
|
|
175
174
|
"isAnnotationInEditMode",
|
|
176
175
|
"annotationIsNotFound",
|
|
176
|
+
"isDocumentReviewed",
|
|
177
177
|
]),
|
|
178
178
|
...mapGetters("selection", ["isValueArray"]),
|
|
179
179
|
defaultSpan() {
|
|
@@ -426,7 +426,7 @@ export default {
|
|
|
426
426
|
);
|
|
427
427
|
},
|
|
428
428
|
handleSaveChanges(decline) {
|
|
429
|
-
if (this.publicView || this.
|
|
429
|
+
if (this.publicView || this.isDocumentReviewed) return;
|
|
430
430
|
|
|
431
431
|
if (
|
|
432
432
|
this.showAcceptButton() ||
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
<div class="action-buttons">
|
|
3
3
|
<!-- mark all empty labels as missing -->
|
|
4
4
|
<div
|
|
5
|
-
v-if="!publicView && !
|
|
5
|
+
v-if="!publicView && !isDocumentReviewed"
|
|
6
6
|
class="missing-decline-button-container all-missing"
|
|
7
7
|
@mouseenter="mouseenterAnnotationSet('missing')"
|
|
8
8
|
@mouseleave="mouseleaveAnnotationSet"
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
<!-- accept all pending annotations -->
|
|
21
21
|
<div
|
|
22
|
-
v-if="!publicView && !
|
|
22
|
+
v-if="!publicView && !isDocumentReviewed"
|
|
23
23
|
class="accept-all"
|
|
24
24
|
@mouseenter="mouseenterAnnotationSet('accept')"
|
|
25
25
|
@mouseleave="mouseleaveAnnotationSet"
|
|
@@ -40,20 +40,23 @@
|
|
|
40
40
|
<script>
|
|
41
41
|
/* Component for showing actions for each Annotation Set */
|
|
42
42
|
|
|
43
|
-
import { mapState } from "vuex";
|
|
43
|
+
import { mapGetters, mapState } from "vuex";
|
|
44
44
|
|
|
45
45
|
export default {
|
|
46
46
|
name: "AnnotationSetActionButtons",
|
|
47
47
|
props: {
|
|
48
48
|
numberOfEmptyLabelsInAnnotationSet: {
|
|
49
49
|
type: Number,
|
|
50
|
+
default: 0,
|
|
50
51
|
},
|
|
51
52
|
numberOfPendingAnnotationsInAnnotationSet: {
|
|
52
53
|
type: Number,
|
|
54
|
+
default: 0,
|
|
53
55
|
},
|
|
54
56
|
},
|
|
55
57
|
computed: {
|
|
56
|
-
...mapState("document", ["publicView"
|
|
58
|
+
...mapState("document", ["publicView"]),
|
|
59
|
+
...mapGetters("document", ["isDocumentReviewed"]),
|
|
57
60
|
},
|
|
58
61
|
methods: {
|
|
59
62
|
mouseenterAnnotationSet(type) {
|
|
@@ -110,10 +110,12 @@ export default {
|
|
|
110
110
|
"categorizeModalIsActive",
|
|
111
111
|
"splittingSuggestions",
|
|
112
112
|
"publicView",
|
|
113
|
-
"documentIsReviewed",
|
|
114
113
|
]),
|
|
115
114
|
...mapGetters("category", ["category", "projectHasSingleCategory"]),
|
|
116
|
-
...mapGetters("document", [
|
|
115
|
+
...mapGetters("document", [
|
|
116
|
+
"categorizationIsConfirmed",
|
|
117
|
+
"isDocumentReviewed",
|
|
118
|
+
]),
|
|
117
119
|
|
|
118
120
|
singleCategoryInProject() {
|
|
119
121
|
// if only 1 category in the project, we don't enable the dropdown
|
|
@@ -185,7 +187,7 @@ export default {
|
|
|
185
187
|
(!category || (category && !this.splittingSuggestions)) &&
|
|
186
188
|
!this.categorizationIsConfirmed &&
|
|
187
189
|
!this.publicView &&
|
|
188
|
-
!this.
|
|
190
|
+
!this.isDocumentReviewed;
|
|
189
191
|
}
|
|
190
192
|
},
|
|
191
193
|
canCloseModal() {
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
<CategorizeModal
|
|
18
18
|
v-if="
|
|
19
19
|
!publicView &&
|
|
20
|
-
!
|
|
20
|
+
!isDocumentReviewed &&
|
|
21
21
|
!waitingForSplittingConfirmation(selectedDocument)
|
|
22
22
|
"
|
|
23
23
|
/>
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
</div>
|
|
26
26
|
|
|
27
27
|
<div v-else :class="['annotation-set-list']">
|
|
28
|
-
<CategorizeModal v-if="!publicView || !
|
|
28
|
+
<CategorizeModal v-if="!publicView || !isDocumentReviewed" />
|
|
29
29
|
<div
|
|
30
30
|
v-if="Object.entries(annotationSetsInTable()).length > 0"
|
|
31
31
|
class="annotation-set-group"
|
|
@@ -148,7 +148,6 @@ export default {
|
|
|
148
148
|
"labels",
|
|
149
149
|
"selectedDocument",
|
|
150
150
|
"splittingSuggestions",
|
|
151
|
-
"documentIsReviewed",
|
|
152
151
|
]),
|
|
153
152
|
...mapGetters("category", ["category"]),
|
|
154
153
|
...mapGetters("document", [
|
|
@@ -158,6 +157,7 @@ export default {
|
|
|
158
157
|
"waitingForSplittingConfirmation",
|
|
159
158
|
"annotationSetsToShowInList",
|
|
160
159
|
"annotationSetsInTable",
|
|
160
|
+
"isDocumentReviewed",
|
|
161
161
|
]),
|
|
162
162
|
isAnnotationBeingEdited() {
|
|
163
163
|
return this.editAnnotation && this.editAnnotation.id;
|
|
@@ -231,7 +231,7 @@ export default {
|
|
|
231
231
|
|
|
232
232
|
keyDownHandler(event) {
|
|
233
233
|
// only allow keyboard navigation if we are not in public view mode
|
|
234
|
-
if (this.publicView || this.
|
|
234
|
+
if (this.publicView || this.isDocumentReviewed) return;
|
|
235
235
|
|
|
236
236
|
// get out of edit mode and navigation
|
|
237
237
|
if (event.key === "Escape") {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div class="empty-annotation">
|
|
3
3
|
<span
|
|
4
|
-
v-if="!publicView && !
|
|
4
|
+
v-if="!publicView && !isDocumentReviewed"
|
|
5
5
|
:id="emptyAnnotationId()"
|
|
6
6
|
ref="emptyAnnotation"
|
|
7
7
|
:class="[
|
|
@@ -76,6 +76,7 @@ export default {
|
|
|
76
76
|
"isAnnotationInEditMode",
|
|
77
77
|
"getTextFromEntities",
|
|
78
78
|
"annotationIsNotFound",
|
|
79
|
+
"isDocumentReviewed",
|
|
79
80
|
]),
|
|
80
81
|
...mapGetters("selection", ["isValueArray"]),
|
|
81
82
|
...mapState("selection", ["spanSelection", "elementSelected"]),
|
|
@@ -84,7 +85,6 @@ export default {
|
|
|
84
85
|
"publicView",
|
|
85
86
|
"selectedEntities",
|
|
86
87
|
"showActionError",
|
|
87
|
-
"documentIsReviewed",
|
|
88
88
|
]),
|
|
89
89
|
},
|
|
90
90
|
watch: {
|
|
@@ -159,14 +159,14 @@ export default {
|
|
|
159
159
|
handleEditEmptyAnnotation() {
|
|
160
160
|
if (
|
|
161
161
|
this.publicView ||
|
|
162
|
-
this.
|
|
162
|
+
this.isDocumentReviewed ||
|
|
163
163
|
this.annotationIsNotFound(this.annotationSet, this.label)
|
|
164
164
|
)
|
|
165
165
|
return;
|
|
166
166
|
|
|
167
167
|
if (
|
|
168
168
|
!this.publicView &&
|
|
169
|
-
!this.
|
|
169
|
+
!this.isDocumentReviewed &&
|
|
170
170
|
!this.isLoading &&
|
|
171
171
|
this.elementSelected !== this.emptyAnnotationId()
|
|
172
172
|
) {
|
|
@@ -221,7 +221,7 @@ export default {
|
|
|
221
221
|
}
|
|
222
222
|
},
|
|
223
223
|
saveEmptyAnnotationChanges(event) {
|
|
224
|
-
if (this.publicView || this.
|
|
224
|
+
if (this.publicView || this.isDocumentReviewed) return;
|
|
225
225
|
|
|
226
226
|
if (event) {
|
|
227
227
|
event.preventDefault();
|