@konfuzio/document-validation-ui 0.1.19 → 0.1.20-dev.0
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/.eslintrc.js +10 -10
- package/.prettierrc.json +1 -1
- package/LICENSE +21 -21
- package/README.md +24 -24
- package/cypress.config.js +13 -13
- package/dist/js/app.js +1 -1
- package/dist/js/app.js.map +1 -1
- package/dist/js/chunk-vendors.js +1 -1
- package/dist/js/chunk-vendors.js.map +1 -1
- package/jest.config.js +4 -4
- package/package.json +66 -66
- package/src/api.js +82 -82
- package/src/assets/images/AcceptedCheckMark.vue +8 -8
- package/src/assets/images/AcceptedUser.vue +8 -8
- package/src/assets/images/ActionIcon.vue +60 -60
- package/src/assets/images/ArrowDownKey.vue +11 -11
- package/src/assets/images/ArrowUpKey.vue +11 -11
- package/src/assets/images/CategoryIconImg.vue +13 -13
- package/src/assets/images/CheckMark.vue +8 -8
- package/src/assets/images/DraggableIcon.vue +14 -14
- package/src/assets/images/EditDocIcon.vue +12 -12
- package/src/assets/images/EmptyStateImg.vue +129 -129
- package/src/assets/images/ErrorIcon.vue +28 -28
- package/src/assets/images/EyeIcon.vue +11 -11
- package/src/assets/images/FileNameNotSavedImage.vue +26 -26
- package/src/assets/images/FileNameSavedImage.vue +14 -14
- package/src/assets/images/FitZoomIcon.vue +16 -16
- package/src/assets/images/GridIcon.vue +16 -16
- package/src/assets/images/KeyboardIcon.vue +16 -16
- package/src/assets/images/MagicWandIcon.vue +16 -16
- package/src/assets/images/MinusIcon.vue +13 -13
- package/src/assets/images/NotFoundIcon.vue +16 -16
- package/src/assets/images/NotOptimizedIllustration.vue +651 -651
- package/src/assets/images/PlusIcon.vue +13 -13
- package/src/assets/images/QuestionMark.vue +12 -12
- package/src/assets/images/ServerImage.vue +73 -73
- package/src/assets/images/SettingsIcon.vue +14 -14
- package/src/assets/images/SplitLines.vue +18 -18
- package/src/assets/images/SplitZigZag.vue +49 -49
- package/src/assets/images/StarIcon.vue +16 -16
- package/src/assets/images/StatusImg.vue +14 -14
- package/src/assets/images/TranslateArrows.vue +33 -33
- package/src/assets/scss/ann_set_table_options.scss +26 -26
- package/src/assets/scss/annotation_details.scss +141 -141
- package/src/assets/scss/choose_label_set_modal.scss +65 -65
- package/src/assets/scss/document_action_bar.scss +37 -37
- package/src/assets/scss/document_annotations.scss +558 -558
- package/src/assets/scss/document_category.scss +85 -85
- package/src/assets/scss/document_dashboard.scss +52 -52
- package/src/assets/scss/document_edit.scss +410 -410
- package/src/assets/scss/document_error.scss +81 -81
- package/src/assets/scss/document_name.scss +60 -60
- package/src/assets/scss/document_page.scss +12 -12
- package/src/assets/scss/document_thumbnails.scss +41 -41
- package/src/assets/scss/document_toolbar.scss +111 -111
- package/src/assets/scss/document_top_bar.scss +171 -171
- package/src/assets/scss/document_viewport_modal.scss +25 -25
- package/src/assets/scss/documents_list.scss +141 -141
- package/src/assets/scss/edit_page_thumbnail.scss +53 -53
- package/src/assets/scss/empty_state.scss +34 -34
- package/src/assets/scss/extracting_data.scss +35 -35
- package/src/assets/scss/imports.scss +1 -1
- package/src/assets/scss/multi_ann_table_overlay.scss +38 -38
- package/src/assets/scss/multi_ann_table_popup.scss +12 -12
- package/src/assets/scss/new_annotation.scss +102 -102
- package/src/assets/scss/scrolling_document.scss +19 -19
- package/src/assets/scss/theme.scss +801 -801
- package/src/assets/scss/variables.scss +66 -66
- package/src/components/App.cy.js +7 -7
- package/src/components/App.vue +187 -187
- package/src/components/DocumentAnnotations/AnnotationActionButtons.vue +152 -152
- package/src/components/DocumentAnnotations/AnnotationContent.vue +210 -210
- package/src/components/DocumentAnnotations/AnnotationDetails.vue +251 -251
- package/src/components/DocumentAnnotations/AnnotationRow.vue +752 -752
- package/src/components/DocumentAnnotations/AnnotationSetActionButtons.vue +89 -89
- package/src/components/DocumentAnnotations/ChooseLabelSetModal.vue +186 -186
- package/src/components/DocumentAnnotations/DocumentAnnotations.cy.js +441 -441
- package/src/components/DocumentAnnotations/DocumentAnnotations.vue +534 -534
- package/src/components/DocumentAnnotations/DocumentLabel.vue +189 -189
- package/src/components/DocumentAnnotations/EmptyAnnotation.vue +193 -193
- package/src/components/DocumentAnnotations/EmptyState.vue +21 -21
- package/src/components/DocumentAnnotations/ExtractingData.vue +41 -41
- package/src/components/DocumentAnnotations/LoadingAnnotations.vue +43 -43
- package/src/components/DocumentAnnotations/LoadingLabels.vue +43 -43
- package/src/components/DocumentAnnotations/MultiAnnotationTableOverlay.vue +338 -338
- package/src/components/DocumentAnnotations/index.js +8 -8
- package/src/components/DocumentCategory.vue +281 -281
- package/src/components/DocumentDashboard.vue +170 -170
- package/src/components/DocumentEdit/DocumentEdit.cy.js +541 -541
- package/src/components/DocumentEdit/DocumentEdit.vue +503 -503
- package/src/components/DocumentEdit/EditConfirmationModal.vue +55 -55
- package/src/components/DocumentEdit/EditPageThumbnail.vue +114 -114
- package/src/components/DocumentEdit/EditPages.vue +161 -161
- package/src/components/DocumentEdit/EditSidebar.vue +154 -154
- package/src/components/DocumentEdit/RenameAndCategorize.vue +184 -184
- package/src/components/DocumentEdit/SidebarButtons.vue +53 -53
- package/src/components/DocumentEdit/SplitInfoBar.vue +21 -21
- package/src/components/DocumentEdit/index.js +4 -4
- package/src/components/DocumentModals/DocumentErrorModal.vue +58 -58
- package/src/components/DocumentModals/NotOptimizedViewportModal.vue +51 -51
- package/src/components/DocumentPage/ActionBar.vue +48 -48
- package/src/components/DocumentPage/AnnSetTableOptions.vue +111 -111
- package/src/components/DocumentPage/BoxSelection.vue +152 -152
- package/src/components/DocumentPage/DocumentPage.cy.js +92 -92
- package/src/components/DocumentPage/DocumentPage.vue +568 -568
- package/src/components/DocumentPage/DocumentToolbar.cy.js +215 -215
- package/src/components/DocumentPage/DocumentToolbar.vue +228 -228
- package/src/components/DocumentPage/DummyPage.vue +55 -55
- package/src/components/DocumentPage/MultiAnnSelection.vue +371 -371
- package/src/components/DocumentPage/NewAnnotation.vue +308 -308
- package/src/components/DocumentPage/ScrollingDocument.vue +149 -149
- package/src/components/DocumentPage/ScrollingPage.vue +179 -179
- package/src/components/DocumentPage/index.js +5 -5
- package/src/components/DocumentThumbnails/DocumentThumbnails.cy.js +67 -67
- package/src/components/DocumentThumbnails/DocumentThumbnails.vue +132 -132
- package/src/components/DocumentThumbnails/LoadingThumbnail.vue +25 -25
- package/src/components/DocumentThumbnails/index.js +1 -1
- package/src/components/DocumentTopBar/DocumentName.vue +236 -236
- package/src/components/DocumentTopBar/DocumentTopBar.cy.js +222 -222
- package/src/components/DocumentTopBar/DocumentTopBar.vue +202 -202
- package/src/components/DocumentTopBar/DocumentTopBarButtons.vue +183 -183
- package/src/components/DocumentTopBar/KeyboardActionsDescription.vue +74 -74
- package/src/components/DocumentTopBar/index.js +3 -3
- package/src/components/DocumentsList/DocumentsList.vue +121 -121
- package/src/components/DocumentsList/index.js +1 -1
- package/src/components/ErrorMessage.vue +40 -40
- package/src/components/index.js +1 -1
- package/src/constants.js +5 -5
- package/src/directives/scroll.js +28 -28
- package/src/i18n.js +22 -22
- package/src/icons.js +45 -45
- package/src/locales/de.json +148 -148
- package/src/locales/en.json +148 -148
- package/src/main.js +26 -26
- package/src/store/category.js +191 -191
- package/src/store/display.js +311 -311
- package/src/store/document.js +1438 -1438
- package/src/store/edit.js +316 -316
- package/src/store/index.js +21 -21
- package/src/store/project.js +143 -143
- package/src/store/selection.js +210 -210
- package/src/utils/utils.js +54 -54
- package/vue.config.js +25 -25
package/src/main.js
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
import App from "./components/App";
|
|
2
|
-
import Vue from "vue";
|
|
3
|
-
import Buefy from "buefy";
|
|
4
|
-
import VueKonva from "vue-konva";
|
|
5
|
-
import i18n from "./i18n";
|
|
6
|
-
import store from "./store";
|
|
7
|
-
import VueObserveVisibility from "vue-observe-visibility";
|
|
8
|
-
import Icons from "./icons";
|
|
9
|
-
|
|
10
|
-
Vue.component("VueFontawesome", Icons);
|
|
11
|
-
Vue.component("App", App);
|
|
12
|
-
Vue.use(VueKonva);
|
|
13
|
-
Vue.use(Buefy, {
|
|
14
|
-
defaultIconPack: "fas",
|
|
15
|
-
defaultIconComponent: "vue-fontawesome",
|
|
16
|
-
});
|
|
17
|
-
Vue.use(VueObserveVisibility);
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Main entrypoint for the App
|
|
21
|
-
*/
|
|
22
|
-
new Vue({
|
|
23
|
-
i18n,
|
|
24
|
-
store,
|
|
25
|
-
el: "#app",
|
|
26
|
-
});
|
|
1
|
+
import App from "./components/App";
|
|
2
|
+
import Vue from "vue";
|
|
3
|
+
import Buefy from "buefy";
|
|
4
|
+
import VueKonva from "vue-konva";
|
|
5
|
+
import i18n from "./i18n";
|
|
6
|
+
import store from "./store";
|
|
7
|
+
import VueObserveVisibility from "vue-observe-visibility";
|
|
8
|
+
import Icons from "./icons";
|
|
9
|
+
|
|
10
|
+
Vue.component("VueFontawesome", Icons);
|
|
11
|
+
Vue.component("App", App);
|
|
12
|
+
Vue.use(VueKonva);
|
|
13
|
+
Vue.use(Buefy, {
|
|
14
|
+
defaultIconPack: "fas",
|
|
15
|
+
defaultIconComponent: "vue-fontawesome",
|
|
16
|
+
});
|
|
17
|
+
Vue.use(VueObserveVisibility);
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Main entrypoint for the App
|
|
21
|
+
*/
|
|
22
|
+
new Vue({
|
|
23
|
+
i18n,
|
|
24
|
+
store,
|
|
25
|
+
el: "#app",
|
|
26
|
+
});
|
package/src/store/category.js
CHANGED
|
@@ -1,191 +1,191 @@
|
|
|
1
|
-
import myImports from "../api";
|
|
2
|
-
|
|
3
|
-
const HTTP = myImports.HTTP;
|
|
4
|
-
|
|
5
|
-
const state = {
|
|
6
|
-
createAvailableListOfDocuments: false,
|
|
7
|
-
documentsAvailableToReview: [], // filtered by user
|
|
8
|
-
categories: null,
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
const getters = {
|
|
12
|
-
/**
|
|
13
|
-
* Get the category name for a given category ID
|
|
14
|
-
*/
|
|
15
|
-
categoryName: (state) => (categoryId) => {
|
|
16
|
-
if (categoryId && state.categories) {
|
|
17
|
-
return state.categories.find(
|
|
18
|
-
(tempCategory) => tempCategory.id == categoryId
|
|
19
|
-
).name;
|
|
20
|
-
}
|
|
21
|
-
return "";
|
|
22
|
-
},
|
|
23
|
-
|
|
24
|
-
categoryConfidence: () => (confidence) => {
|
|
25
|
-
if (!confidence) {
|
|
26
|
-
if (confidence === 0) return confidence.toFixed(2);
|
|
27
|
-
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
return (confidence * 100).toFixed(2);
|
|
32
|
-
},
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Get the category for a given category ID
|
|
36
|
-
*/
|
|
37
|
-
category: (state) => (categoryId) => {
|
|
38
|
-
if (categoryId && state.categories) {
|
|
39
|
-
return state.categories.find(
|
|
40
|
-
(tempCategory) => tempCategory.id == categoryId
|
|
41
|
-
);
|
|
42
|
-
}
|
|
43
|
-
return null;
|
|
44
|
-
},
|
|
45
|
-
|
|
46
|
-
projectHasSingleCategory: (state) => {
|
|
47
|
-
return state.categories && state.categories.length === 1;
|
|
48
|
-
},
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
const actions = {
|
|
52
|
-
setDocumentsAvailableToReview: ({ commit }, documentsAvailableToReview) => {
|
|
53
|
-
commit("SET_AVAILABLE_DOCUMENTS", documentsAvailableToReview);
|
|
54
|
-
},
|
|
55
|
-
setCategories: ({ commit }, categories) => {
|
|
56
|
-
commit("SET_CATEGORIES", categories);
|
|
57
|
-
},
|
|
58
|
-
|
|
59
|
-
createAvailableDocumentsList: (
|
|
60
|
-
{ commit, state, dispatch, rootState, rootGetters },
|
|
61
|
-
{ categoryId, user, poll }
|
|
62
|
-
) => {
|
|
63
|
-
if (!state.createAvailableListOfDocuments) return;
|
|
64
|
-
|
|
65
|
-
const parameters = `category=${categoryId}`;
|
|
66
|
-
|
|
67
|
-
const sleep = (duration) =>
|
|
68
|
-
new Promise((resolve) => setTimeout(resolve, duration));
|
|
69
|
-
|
|
70
|
-
// Poll document data until the status_data is 2
|
|
71
|
-
// and labeling is available (done)
|
|
72
|
-
let count = 0;
|
|
73
|
-
const pollUntilLabelingAvailable = (duration) => {
|
|
74
|
-
let errors = 0;
|
|
75
|
-
count += 1;
|
|
76
|
-
|
|
77
|
-
return dispatch("project/fetchDocumentList", parameters).then(() => {
|
|
78
|
-
for (let i = 0; i < rootState.project.documentsInProject.length; i++) {
|
|
79
|
-
const found = state.documentsAvailableToReview.find(
|
|
80
|
-
(doc) => doc.id === rootState.project.documentsInProject[i].id
|
|
81
|
-
);
|
|
82
|
-
|
|
83
|
-
if (found) {
|
|
84
|
-
// If the document is already in the available docs array
|
|
85
|
-
// we go to the next item
|
|
86
|
-
continue;
|
|
87
|
-
} else if (
|
|
88
|
-
rootGetters["document/isDocumentReadyToBeReviewed"](
|
|
89
|
-
rootState.project.documentsInProject[i]
|
|
90
|
-
)
|
|
91
|
-
) {
|
|
92
|
-
// add available doc to the end of the array
|
|
93
|
-
commit(
|
|
94
|
-
"ADD_AVAILABLE_DOCUMENT",
|
|
95
|
-
rootState.project.documentsInProject[i]
|
|
96
|
-
);
|
|
97
|
-
} else if (
|
|
98
|
-
rootGetters["document/documentHadErrorDuringExtraction"](
|
|
99
|
-
rootState.project.documentsInProject[i]
|
|
100
|
-
)
|
|
101
|
-
) {
|
|
102
|
-
dispatch("document/setDocumentError", null, { root: true });
|
|
103
|
-
// If error, add 1
|
|
104
|
-
// Then go to next item
|
|
105
|
-
errors += 1;
|
|
106
|
-
continue;
|
|
107
|
-
} else {
|
|
108
|
-
// Some other situation, such as labeling not yet available
|
|
109
|
-
// go to next item
|
|
110
|
-
// TODO: we should only poll the documents that are not yet available
|
|
111
|
-
continue;
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
// After looping, check if length of both arrays is different
|
|
115
|
-
// And if the difference is due to errors or to docs not ready
|
|
116
|
-
if (
|
|
117
|
-
poll &&
|
|
118
|
-
rootState.project.documentsInProject.length !==
|
|
119
|
-
state.documentsAvailableToReview.length &&
|
|
120
|
-
state.documentsAvailableToReview.length + errors !==
|
|
121
|
-
rootState.project.documentsInProject.length
|
|
122
|
-
) {
|
|
123
|
-
if (count >= 10) return true;
|
|
124
|
-
|
|
125
|
-
// We poll the endpoint again
|
|
126
|
-
return sleep(duration).then(() => {
|
|
127
|
-
pollUntilLabelingAvailable(duration);
|
|
128
|
-
});
|
|
129
|
-
} else {
|
|
130
|
-
return true;
|
|
131
|
-
}
|
|
132
|
-
});
|
|
133
|
-
};
|
|
134
|
-
|
|
135
|
-
// Poll as long as the lengths are different
|
|
136
|
-
if (
|
|
137
|
-
rootState.project.documentsInProject.length === 0 ||
|
|
138
|
-
rootState.project.documentsInProject.length !==
|
|
139
|
-
state.documentsAvailableToReview.length
|
|
140
|
-
) {
|
|
141
|
-
let duration;
|
|
142
|
-
if (count <= 5) {
|
|
143
|
-
duration = 5000;
|
|
144
|
-
} else if (count > 10) {
|
|
145
|
-
duration = 20000;
|
|
146
|
-
} else {
|
|
147
|
-
duration = 10000;
|
|
148
|
-
}
|
|
149
|
-
pollUntilLabelingAvailable(duration);
|
|
150
|
-
} else {
|
|
151
|
-
return;
|
|
152
|
-
}
|
|
153
|
-
},
|
|
154
|
-
|
|
155
|
-
fetchCategories: ({ commit }, projectId) => {
|
|
156
|
-
return HTTP.get(`categories/?limit=100&project=${projectId}`)
|
|
157
|
-
.then(async (response) => {
|
|
158
|
-
if (response.data && response.data.results) {
|
|
159
|
-
commit("SET_CATEGORIES", response.data.results);
|
|
160
|
-
}
|
|
161
|
-
})
|
|
162
|
-
.catch((error) => {
|
|
163
|
-
console.log(error, "Could not fetch categories from the backend");
|
|
164
|
-
});
|
|
165
|
-
},
|
|
166
|
-
};
|
|
167
|
-
|
|
168
|
-
const mutations = {
|
|
169
|
-
SET_AVAILABLE_DOCUMENTS: (state, documentsAvailableToReview) => {
|
|
170
|
-
state.documentsAvailableToReview = documentsAvailableToReview;
|
|
171
|
-
},
|
|
172
|
-
ADD_AVAILABLE_DOCUMENT: (state, availableDocument) => {
|
|
173
|
-
const docAlreadyExists = state.documentsAvailableToReview.find(
|
|
174
|
-
(document) => document.id === availableDocument.id
|
|
175
|
-
);
|
|
176
|
-
if (!docAlreadyExists) {
|
|
177
|
-
state.documentsAvailableToReview.push(availableDocument);
|
|
178
|
-
}
|
|
179
|
-
},
|
|
180
|
-
SET_CATEGORIES: (state, categories) => {
|
|
181
|
-
state.categories = categories;
|
|
182
|
-
},
|
|
183
|
-
};
|
|
184
|
-
|
|
185
|
-
export default {
|
|
186
|
-
namespaced: true,
|
|
187
|
-
state,
|
|
188
|
-
actions,
|
|
189
|
-
mutations,
|
|
190
|
-
getters,
|
|
191
|
-
};
|
|
1
|
+
import myImports from "../api";
|
|
2
|
+
|
|
3
|
+
const HTTP = myImports.HTTP;
|
|
4
|
+
|
|
5
|
+
const state = {
|
|
6
|
+
createAvailableListOfDocuments: false,
|
|
7
|
+
documentsAvailableToReview: [], // filtered by user
|
|
8
|
+
categories: null,
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
const getters = {
|
|
12
|
+
/**
|
|
13
|
+
* Get the category name for a given category ID
|
|
14
|
+
*/
|
|
15
|
+
categoryName: (state) => (categoryId) => {
|
|
16
|
+
if (categoryId && state.categories) {
|
|
17
|
+
return state.categories.find(
|
|
18
|
+
(tempCategory) => tempCategory.id == categoryId
|
|
19
|
+
).name;
|
|
20
|
+
}
|
|
21
|
+
return "";
|
|
22
|
+
},
|
|
23
|
+
|
|
24
|
+
categoryConfidence: () => (confidence) => {
|
|
25
|
+
if (!confidence) {
|
|
26
|
+
if (confidence === 0) return confidence.toFixed(2);
|
|
27
|
+
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return (confidence * 100).toFixed(2);
|
|
32
|
+
},
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Get the category for a given category ID
|
|
36
|
+
*/
|
|
37
|
+
category: (state) => (categoryId) => {
|
|
38
|
+
if (categoryId && state.categories) {
|
|
39
|
+
return state.categories.find(
|
|
40
|
+
(tempCategory) => tempCategory.id == categoryId
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
},
|
|
45
|
+
|
|
46
|
+
projectHasSingleCategory: (state) => {
|
|
47
|
+
return state.categories && state.categories.length === 1;
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
const actions = {
|
|
52
|
+
setDocumentsAvailableToReview: ({ commit }, documentsAvailableToReview) => {
|
|
53
|
+
commit("SET_AVAILABLE_DOCUMENTS", documentsAvailableToReview);
|
|
54
|
+
},
|
|
55
|
+
setCategories: ({ commit }, categories) => {
|
|
56
|
+
commit("SET_CATEGORIES", categories);
|
|
57
|
+
},
|
|
58
|
+
|
|
59
|
+
createAvailableDocumentsList: (
|
|
60
|
+
{ commit, state, dispatch, rootState, rootGetters },
|
|
61
|
+
{ categoryId, user, poll }
|
|
62
|
+
) => {
|
|
63
|
+
if (!state.createAvailableListOfDocuments) return;
|
|
64
|
+
|
|
65
|
+
const parameters = `category=${categoryId}`;
|
|
66
|
+
|
|
67
|
+
const sleep = (duration) =>
|
|
68
|
+
new Promise((resolve) => setTimeout(resolve, duration));
|
|
69
|
+
|
|
70
|
+
// Poll document data until the status_data is 2
|
|
71
|
+
// and labeling is available (done)
|
|
72
|
+
let count = 0;
|
|
73
|
+
const pollUntilLabelingAvailable = (duration) => {
|
|
74
|
+
let errors = 0;
|
|
75
|
+
count += 1;
|
|
76
|
+
|
|
77
|
+
return dispatch("project/fetchDocumentList", parameters).then(() => {
|
|
78
|
+
for (let i = 0; i < rootState.project.documentsInProject.length; i++) {
|
|
79
|
+
const found = state.documentsAvailableToReview.find(
|
|
80
|
+
(doc) => doc.id === rootState.project.documentsInProject[i].id
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
if (found) {
|
|
84
|
+
// If the document is already in the available docs array
|
|
85
|
+
// we go to the next item
|
|
86
|
+
continue;
|
|
87
|
+
} else if (
|
|
88
|
+
rootGetters["document/isDocumentReadyToBeReviewed"](
|
|
89
|
+
rootState.project.documentsInProject[i]
|
|
90
|
+
)
|
|
91
|
+
) {
|
|
92
|
+
// add available doc to the end of the array
|
|
93
|
+
commit(
|
|
94
|
+
"ADD_AVAILABLE_DOCUMENT",
|
|
95
|
+
rootState.project.documentsInProject[i]
|
|
96
|
+
);
|
|
97
|
+
} else if (
|
|
98
|
+
rootGetters["document/documentHadErrorDuringExtraction"](
|
|
99
|
+
rootState.project.documentsInProject[i]
|
|
100
|
+
)
|
|
101
|
+
) {
|
|
102
|
+
dispatch("document/setDocumentError", null, { root: true });
|
|
103
|
+
// If error, add 1
|
|
104
|
+
// Then go to next item
|
|
105
|
+
errors += 1;
|
|
106
|
+
continue;
|
|
107
|
+
} else {
|
|
108
|
+
// Some other situation, such as labeling not yet available
|
|
109
|
+
// go to next item
|
|
110
|
+
// TODO: we should only poll the documents that are not yet available
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// After looping, check if length of both arrays is different
|
|
115
|
+
// And if the difference is due to errors or to docs not ready
|
|
116
|
+
if (
|
|
117
|
+
poll &&
|
|
118
|
+
rootState.project.documentsInProject.length !==
|
|
119
|
+
state.documentsAvailableToReview.length &&
|
|
120
|
+
state.documentsAvailableToReview.length + errors !==
|
|
121
|
+
rootState.project.documentsInProject.length
|
|
122
|
+
) {
|
|
123
|
+
if (count >= 10) return true;
|
|
124
|
+
|
|
125
|
+
// We poll the endpoint again
|
|
126
|
+
return sleep(duration).then(() => {
|
|
127
|
+
pollUntilLabelingAvailable(duration);
|
|
128
|
+
});
|
|
129
|
+
} else {
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
// Poll as long as the lengths are different
|
|
136
|
+
if (
|
|
137
|
+
rootState.project.documentsInProject.length === 0 ||
|
|
138
|
+
rootState.project.documentsInProject.length !==
|
|
139
|
+
state.documentsAvailableToReview.length
|
|
140
|
+
) {
|
|
141
|
+
let duration;
|
|
142
|
+
if (count <= 5) {
|
|
143
|
+
duration = 5000;
|
|
144
|
+
} else if (count > 10) {
|
|
145
|
+
duration = 20000;
|
|
146
|
+
} else {
|
|
147
|
+
duration = 10000;
|
|
148
|
+
}
|
|
149
|
+
pollUntilLabelingAvailable(duration);
|
|
150
|
+
} else {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
|
|
155
|
+
fetchCategories: ({ commit }, projectId) => {
|
|
156
|
+
return HTTP.get(`categories/?limit=100&project=${projectId}`)
|
|
157
|
+
.then(async (response) => {
|
|
158
|
+
if (response.data && response.data.results) {
|
|
159
|
+
commit("SET_CATEGORIES", response.data.results);
|
|
160
|
+
}
|
|
161
|
+
})
|
|
162
|
+
.catch((error) => {
|
|
163
|
+
console.log(error, "Could not fetch categories from the backend");
|
|
164
|
+
});
|
|
165
|
+
},
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
const mutations = {
|
|
169
|
+
SET_AVAILABLE_DOCUMENTS: (state, documentsAvailableToReview) => {
|
|
170
|
+
state.documentsAvailableToReview = documentsAvailableToReview;
|
|
171
|
+
},
|
|
172
|
+
ADD_AVAILABLE_DOCUMENT: (state, availableDocument) => {
|
|
173
|
+
const docAlreadyExists = state.documentsAvailableToReview.find(
|
|
174
|
+
(document) => document.id === availableDocument.id
|
|
175
|
+
);
|
|
176
|
+
if (!docAlreadyExists) {
|
|
177
|
+
state.documentsAvailableToReview.push(availableDocument);
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
SET_CATEGORIES: (state, categories) => {
|
|
181
|
+
state.categories = categories;
|
|
182
|
+
},
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
export default {
|
|
186
|
+
namespaced: true,
|
|
187
|
+
state,
|
|
188
|
+
actions,
|
|
189
|
+
mutations,
|
|
190
|
+
getters,
|
|
191
|
+
};
|