@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.
Files changed (143) hide show
  1. package/.eslintrc.js +10 -10
  2. package/.prettierrc.json +1 -1
  3. package/LICENSE +21 -21
  4. package/README.md +24 -24
  5. package/cypress.config.js +13 -13
  6. package/dist/js/app.js +1 -1
  7. package/dist/js/app.js.map +1 -1
  8. package/dist/js/chunk-vendors.js +1 -1
  9. package/dist/js/chunk-vendors.js.map +1 -1
  10. package/jest.config.js +4 -4
  11. package/package.json +66 -66
  12. package/src/api.js +82 -82
  13. package/src/assets/images/AcceptedCheckMark.vue +8 -8
  14. package/src/assets/images/AcceptedUser.vue +8 -8
  15. package/src/assets/images/ActionIcon.vue +60 -60
  16. package/src/assets/images/ArrowDownKey.vue +11 -11
  17. package/src/assets/images/ArrowUpKey.vue +11 -11
  18. package/src/assets/images/CategoryIconImg.vue +13 -13
  19. package/src/assets/images/CheckMark.vue +8 -8
  20. package/src/assets/images/DraggableIcon.vue +14 -14
  21. package/src/assets/images/EditDocIcon.vue +12 -12
  22. package/src/assets/images/EmptyStateImg.vue +129 -129
  23. package/src/assets/images/ErrorIcon.vue +28 -28
  24. package/src/assets/images/EyeIcon.vue +11 -11
  25. package/src/assets/images/FileNameNotSavedImage.vue +26 -26
  26. package/src/assets/images/FileNameSavedImage.vue +14 -14
  27. package/src/assets/images/FitZoomIcon.vue +16 -16
  28. package/src/assets/images/GridIcon.vue +16 -16
  29. package/src/assets/images/KeyboardIcon.vue +16 -16
  30. package/src/assets/images/MagicWandIcon.vue +16 -16
  31. package/src/assets/images/MinusIcon.vue +13 -13
  32. package/src/assets/images/NotFoundIcon.vue +16 -16
  33. package/src/assets/images/NotOptimizedIllustration.vue +651 -651
  34. package/src/assets/images/PlusIcon.vue +13 -13
  35. package/src/assets/images/QuestionMark.vue +12 -12
  36. package/src/assets/images/ServerImage.vue +73 -73
  37. package/src/assets/images/SettingsIcon.vue +14 -14
  38. package/src/assets/images/SplitLines.vue +18 -18
  39. package/src/assets/images/SplitZigZag.vue +49 -49
  40. package/src/assets/images/StarIcon.vue +16 -16
  41. package/src/assets/images/StatusImg.vue +14 -14
  42. package/src/assets/images/TranslateArrows.vue +33 -33
  43. package/src/assets/scss/ann_set_table_options.scss +26 -26
  44. package/src/assets/scss/annotation_details.scss +141 -141
  45. package/src/assets/scss/choose_label_set_modal.scss +65 -65
  46. package/src/assets/scss/document_action_bar.scss +37 -37
  47. package/src/assets/scss/document_annotations.scss +558 -558
  48. package/src/assets/scss/document_category.scss +85 -85
  49. package/src/assets/scss/document_dashboard.scss +52 -52
  50. package/src/assets/scss/document_edit.scss +410 -410
  51. package/src/assets/scss/document_error.scss +81 -81
  52. package/src/assets/scss/document_name.scss +60 -60
  53. package/src/assets/scss/document_page.scss +12 -12
  54. package/src/assets/scss/document_thumbnails.scss +41 -41
  55. package/src/assets/scss/document_toolbar.scss +111 -111
  56. package/src/assets/scss/document_top_bar.scss +171 -171
  57. package/src/assets/scss/document_viewport_modal.scss +25 -25
  58. package/src/assets/scss/documents_list.scss +141 -141
  59. package/src/assets/scss/edit_page_thumbnail.scss +53 -53
  60. package/src/assets/scss/empty_state.scss +34 -34
  61. package/src/assets/scss/extracting_data.scss +35 -35
  62. package/src/assets/scss/imports.scss +1 -1
  63. package/src/assets/scss/multi_ann_table_overlay.scss +38 -38
  64. package/src/assets/scss/multi_ann_table_popup.scss +12 -12
  65. package/src/assets/scss/new_annotation.scss +102 -102
  66. package/src/assets/scss/scrolling_document.scss +19 -19
  67. package/src/assets/scss/theme.scss +801 -801
  68. package/src/assets/scss/variables.scss +66 -66
  69. package/src/components/App.cy.js +7 -7
  70. package/src/components/App.vue +187 -187
  71. package/src/components/DocumentAnnotations/AnnotationActionButtons.vue +152 -152
  72. package/src/components/DocumentAnnotations/AnnotationContent.vue +210 -210
  73. package/src/components/DocumentAnnotations/AnnotationDetails.vue +251 -251
  74. package/src/components/DocumentAnnotations/AnnotationRow.vue +752 -752
  75. package/src/components/DocumentAnnotations/AnnotationSetActionButtons.vue +89 -89
  76. package/src/components/DocumentAnnotations/ChooseLabelSetModal.vue +186 -186
  77. package/src/components/DocumentAnnotations/DocumentAnnotations.cy.js +441 -441
  78. package/src/components/DocumentAnnotations/DocumentAnnotations.vue +534 -534
  79. package/src/components/DocumentAnnotations/DocumentLabel.vue +189 -189
  80. package/src/components/DocumentAnnotations/EmptyAnnotation.vue +193 -193
  81. package/src/components/DocumentAnnotations/EmptyState.vue +21 -21
  82. package/src/components/DocumentAnnotations/ExtractingData.vue +41 -41
  83. package/src/components/DocumentAnnotations/LoadingAnnotations.vue +43 -43
  84. package/src/components/DocumentAnnotations/LoadingLabels.vue +43 -43
  85. package/src/components/DocumentAnnotations/MultiAnnotationTableOverlay.vue +338 -338
  86. package/src/components/DocumentAnnotations/index.js +8 -8
  87. package/src/components/DocumentCategory.vue +281 -281
  88. package/src/components/DocumentDashboard.vue +170 -170
  89. package/src/components/DocumentEdit/DocumentEdit.cy.js +541 -541
  90. package/src/components/DocumentEdit/DocumentEdit.vue +503 -503
  91. package/src/components/DocumentEdit/EditConfirmationModal.vue +55 -55
  92. package/src/components/DocumentEdit/EditPageThumbnail.vue +114 -114
  93. package/src/components/DocumentEdit/EditPages.vue +161 -161
  94. package/src/components/DocumentEdit/EditSidebar.vue +154 -154
  95. package/src/components/DocumentEdit/RenameAndCategorize.vue +184 -184
  96. package/src/components/DocumentEdit/SidebarButtons.vue +53 -53
  97. package/src/components/DocumentEdit/SplitInfoBar.vue +21 -21
  98. package/src/components/DocumentEdit/index.js +4 -4
  99. package/src/components/DocumentModals/DocumentErrorModal.vue +58 -58
  100. package/src/components/DocumentModals/NotOptimizedViewportModal.vue +51 -51
  101. package/src/components/DocumentPage/ActionBar.vue +48 -48
  102. package/src/components/DocumentPage/AnnSetTableOptions.vue +111 -111
  103. package/src/components/DocumentPage/BoxSelection.vue +152 -152
  104. package/src/components/DocumentPage/DocumentPage.cy.js +92 -92
  105. package/src/components/DocumentPage/DocumentPage.vue +568 -568
  106. package/src/components/DocumentPage/DocumentToolbar.cy.js +215 -215
  107. package/src/components/DocumentPage/DocumentToolbar.vue +228 -228
  108. package/src/components/DocumentPage/DummyPage.vue +55 -55
  109. package/src/components/DocumentPage/MultiAnnSelection.vue +371 -371
  110. package/src/components/DocumentPage/NewAnnotation.vue +308 -308
  111. package/src/components/DocumentPage/ScrollingDocument.vue +149 -149
  112. package/src/components/DocumentPage/ScrollingPage.vue +179 -179
  113. package/src/components/DocumentPage/index.js +5 -5
  114. package/src/components/DocumentThumbnails/DocumentThumbnails.cy.js +67 -67
  115. package/src/components/DocumentThumbnails/DocumentThumbnails.vue +132 -132
  116. package/src/components/DocumentThumbnails/LoadingThumbnail.vue +25 -25
  117. package/src/components/DocumentThumbnails/index.js +1 -1
  118. package/src/components/DocumentTopBar/DocumentName.vue +236 -236
  119. package/src/components/DocumentTopBar/DocumentTopBar.cy.js +222 -222
  120. package/src/components/DocumentTopBar/DocumentTopBar.vue +202 -202
  121. package/src/components/DocumentTopBar/DocumentTopBarButtons.vue +183 -183
  122. package/src/components/DocumentTopBar/KeyboardActionsDescription.vue +74 -74
  123. package/src/components/DocumentTopBar/index.js +3 -3
  124. package/src/components/DocumentsList/DocumentsList.vue +121 -121
  125. package/src/components/DocumentsList/index.js +1 -1
  126. package/src/components/ErrorMessage.vue +40 -40
  127. package/src/components/index.js +1 -1
  128. package/src/constants.js +5 -5
  129. package/src/directives/scroll.js +28 -28
  130. package/src/i18n.js +22 -22
  131. package/src/icons.js +45 -45
  132. package/src/locales/de.json +148 -148
  133. package/src/locales/en.json +148 -148
  134. package/src/main.js +26 -26
  135. package/src/store/category.js +191 -191
  136. package/src/store/display.js +311 -311
  137. package/src/store/document.js +1438 -1438
  138. package/src/store/edit.js +316 -316
  139. package/src/store/index.js +21 -21
  140. package/src/store/project.js +143 -143
  141. package/src/store/selection.js +210 -210
  142. package/src/utils/utils.js +54 -54
  143. 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
+ });
@@ -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
+ };