@konfuzio/document-validation-ui 0.1.19-dev.2 → 0.1.19

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
@@ -1,311 +1,311 @@
1
- import BigNumber from "bignumber.js";
2
- import {
3
- PIXEL_RATIO,
4
- VIEWPORT_RATIO,
5
- MINIMUM_APP_WIDTH,
6
- MINIMUM_OPTIMIZED_APP_WIDTH,
7
- } from "../constants";
8
- const debounce = (cb, duration) => {
9
- let timer;
10
- return (...args) => {
11
- clearTimeout(timer);
12
- timer = setTimeout(() => {
13
- cb(...args);
14
- }, duration);
15
- };
16
- };
17
-
18
- const floor = (value, precision) => {
19
- const multiplier = Math.pow(10, precision || 0);
20
- return Math.floor(value * multiplier) / multiplier;
21
- };
22
-
23
- const state = {
24
- scale: undefined,
25
- fit: "width",
26
- currentPage: 1,
27
- optimalResolution: true,
28
- interactionBlocked: false,
29
- documentActionBar: null, // document action bar properties
30
- categorizeModalIsActive: false,
31
- pageChangedFromThumbnail: false,
32
- showAnnSetTable: null,
33
- showChooseLabelSetModal: null,
34
- };
35
-
36
- const getters = {
37
- isMinimumWidth: (state) => (width) => {
38
- return width >= MINIMUM_APP_WIDTH;
39
- },
40
- pageWidthScale: (state) => (elementsWidth, clientWidth, viewportWidth) => {
41
- return (
42
- ((clientWidth - elementsWidth) * PIXEL_RATIO * VIEWPORT_RATIO) /
43
- viewportWidth
44
- );
45
- },
46
- pageHeightScale: (state) => (clientHeight, viewportHeight) => {
47
- return (clientHeight * PIXEL_RATIO * VIEWPORT_RATIO) / viewportHeight;
48
- },
49
- visiblePageRange: (state, getters, rootState, rootGetters) => {
50
- const pageCount = rootGetters.pageCount;
51
- const previousPage = state.currentPage - 1 < 1 ? 1 : state.currentPage - 1;
52
- const nextPage =
53
- state.currentPage + 1 > pageCount ? pageCount : state.currentPage + 1;
54
- return [previousPage, state.currentPage, nextPage];
55
- },
56
-
57
- /**
58
- * The proportion between the original size of the page and the
59
- * image rendering.
60
- */
61
- imageScale: (state) => (page) => {
62
- return new BigNumber(page.size[0]).div(page.original_size[0]).toNumber();
63
- },
64
- bboxToPoint:
65
- (state, getters) =>
66
- (page, point, hasOffset = false) => {
67
- const imageScale = getters.imageScale(page);
68
- const { x, y } = point;
69
- const pageHeight = new BigNumber(page.original_size[1]);
70
- const newPoint = {
71
- // left
72
- x: new BigNumber(x)
73
- .minus(hasOffset ? 1 : 0)
74
- .times(state.scale)
75
- .times(imageScale)
76
- .div(PIXEL_RATIO)
77
- .toNumber(),
78
- // top
79
- y: pageHeight
80
- .minus(new BigNumber(y))
81
- .minus(hasOffset ? 17.1 : 0)
82
- .times(state.scale)
83
- .times(imageScale)
84
- .div(PIXEL_RATIO)
85
- .toNumber(),
86
- };
87
- return newPoint;
88
- },
89
- bboxToRect:
90
- (state, getters) =>
91
- (page, bbox, hasOffset = false) => {
92
- const imageScale = getters.imageScale(page);
93
- const { x0, x1, y0, y1 } = bbox;
94
- const pageHeight = new BigNumber(page.original_size[1]);
95
- const rect = {
96
- // left
97
- x: new BigNumber(x0)
98
- .minus(hasOffset ? 1 : 0)
99
- .times(state.scale)
100
- .times(imageScale)
101
- .div(PIXEL_RATIO)
102
- .toNumber(),
103
- // top
104
- y: pageHeight
105
- .minus(new BigNumber(y1))
106
- .minus(hasOffset ? 17.1 : 0)
107
- .times(state.scale)
108
- .times(imageScale)
109
- .div(PIXEL_RATIO)
110
- .toNumber(),
111
- width: new BigNumber(x1)
112
- .minus(x0)
113
- .abs()
114
- .times(state.scale)
115
- .times(imageScale)
116
- .div(PIXEL_RATIO)
117
- .toNumber(),
118
- height: new BigNumber(y1)
119
- .minus(y0)
120
- .times(state.scale)
121
- .times(imageScale)
122
- .div(PIXEL_RATIO)
123
- .toNumber(),
124
- };
125
- return rect;
126
- },
127
- clientToBbox: (state, getters) => (page, start, end) => {
128
- /**
129
- * The backend bbox's `y0` and `y1` attributes depend on knowing the
130
- * page's height.
131
- */
132
- const pageHeight = new BigNumber(page.original_size[1]);
133
- const imageScale = getters.imageScale(page);
134
-
135
- /**
136
- * We use `Math.min` and `Math.max` because depending on how the area
137
- * selection is made the `start` and `end` attributes might be reversed.
138
- */
139
- const x0 = new BigNumber(Math.min(start.x, end.x))
140
- .div(state.scale)
141
- .div(imageScale)
142
- .times(PIXEL_RATIO)
143
- .dp(3, BigNumber.ROUND_DOWN)
144
- .toNumber();
145
- const x1 = new BigNumber(Math.max(start.x, end.x))
146
- .div(state.scale)
147
- .div(imageScale)
148
- .times(PIXEL_RATIO)
149
- .dp(3, BigNumber.ROUND_UP)
150
- .toNumber();
151
- const top = new BigNumber(Math.min(start.y, end.y))
152
- .div(state.scale)
153
- .div(imageScale)
154
- .times(PIXEL_RATIO)
155
- .dp(3)
156
- .toNumber();
157
- const bottom = new BigNumber(Math.max(start.y, end.y))
158
- .div(state.scale)
159
- .div(imageScale)
160
- .times(PIXEL_RATIO)
161
- .dp(3)
162
- .toNumber();
163
- const y0 = pageHeight.minus(bottom).dp(3, BigNumber.ROUND_DOWN).toNumber();
164
- const y1 = pageHeight.minus(top).dp(3, BigNumber.ROUND_UP).toNumber();
165
-
166
- const bbox = {
167
- x0,
168
- x1,
169
- y0,
170
- y1,
171
- page_index: page.number - 1,
172
- };
173
-
174
- return bbox;
175
- },
176
- };
177
-
178
- const actions = {
179
- updateScale({ commit, getters }, { elementsWidth, client, viewport, scale }) {
180
- /**
181
- * Determine an ideal scale using viewport of document's first page, the pixel ratio
182
- * from the browser and a subjective scale factor based on the screen size.
183
- */
184
- switch (state.fit) {
185
- case "width":
186
- commit(
187
- "SET_SCALE",
188
- getters.pageWidthScale(elementsWidth, client.width, viewport.width)
189
- );
190
- break;
191
- case "auto":
192
- const pageWidthScale = getters.pageWidthScale(
193
- elementsWidth,
194
- client.width,
195
- viewport.width
196
- );
197
- const pageHeightScale = getters.pageWidthScale(
198
- client.height,
199
- viewport.height
200
- );
201
- const autoScale = Math.min(pageWidthScale, pageHeightScale);
202
- commit("SET_SCALE", autoScale);
203
- break;
204
- case "all": {
205
- commit(
206
- "SET_SCALE",
207
- getters.pageWidthScale(elementsWidth, client.width, viewport.width) -
208
- 0.5
209
- );
210
- break;
211
- }
212
- case "custom": {
213
- if (scale) {
214
- commit("SET_SCALE", scale);
215
- }
216
- break;
217
- }
218
- default:
219
- console.log("No fit defined");
220
- break;
221
- }
222
- },
223
-
224
- updateFit({ commit }, fit) {
225
- commit("SET_FIT", fit);
226
- },
227
-
228
- debounceUpdateCurrentPage: debounce(({ commit, dispatch }, pageNumber) => {
229
- dispatch("updateCurrentPage", pageNumber);
230
- }, 300),
231
-
232
- updateCurrentPage({ commit }, pageNumber) {
233
- commit("SET_CURRENT_PAGE", pageNumber);
234
- },
235
- updateOptimalResolution({ commit }, width) {
236
- commit("SET_OPTIMAL_RESOLUTION", width >= MINIMUM_OPTIMIZED_APP_WIDTH);
237
- },
238
- showDocumentActionBar({ commit }, { icon, text, action, show, loading }) {
239
- commit(
240
- "SET_DOCUMENT_ACTION_BAR",
241
- show ? { icon, text, action, loading } : null
242
- );
243
- },
244
- showAnnSetTable({ commit }, tableSet) {
245
- commit("SET_ANN_SET_TABLE", tableSet);
246
- },
247
- showChooseLabelSetModal({ commit }, options) {
248
- commit("SET_SHOW_CHOOSE_LABEL_SET_MODAL", options);
249
- },
250
- toggleAnnSetTable({ commit }, tableSet) {
251
- commit("TOGGLE_ANN_SET_TABLE", tableSet);
252
- },
253
- setCategorizeModalIsActive: ({ commit }, value) => {
254
- commit("SET_CATEGORIZE_MODAL_IS_ACTIVE", value);
255
- },
256
- setPageChangedFromThumbnail: ({ commit }, value) => {
257
- commit("SET_PAGE_CHANGED_FROM_THUMBNAIL", value);
258
- },
259
- };
260
-
261
- const mutations = {
262
- SET_SCALE: (state, scale) => {
263
- state.scale = floor(scale, 2);
264
- },
265
-
266
- SET_FIT: (state, fit) => {
267
- state.fit = fit;
268
- },
269
-
270
- SET_OPTIMAL_RESOLUTION: (state, isOptimal) => {
271
- state.optimalResolution = isOptimal;
272
- },
273
-
274
- SET_CURRENT_PAGE: (state, currentPage) => {
275
- state.currentPage = currentPage;
276
- },
277
-
278
- SET_DOCUMENT_ACTION_BAR: (state, actionBar) => {
279
- state.documentActionBar = actionBar;
280
- },
281
-
282
- SET_ANN_SET_TABLE: (state, tableSet) => {
283
- state.showAnnSetTable = tableSet;
284
- },
285
-
286
- TOGGLE_ANN_SET_TABLE: (state, tableSet) => {
287
- if (state.showAnnSetTable) {
288
- state.showAnnSetTable = null;
289
- } else {
290
- state.showAnnSetTable = tableSet;
291
- }
292
- },
293
-
294
- SET_CATEGORIZE_MODAL_IS_ACTIVE: (state, value) => {
295
- state.categorizeModalIsActive = value;
296
- },
297
- SET_PAGE_CHANGED_FROM_THUMBNAIL: (state, value) => {
298
- state.pageChangedFromThumbnail = value;
299
- },
300
- SET_SHOW_CHOOSE_LABEL_SET_MODAL: (state, options) => {
301
- state.showChooseLabelSetModal = options;
302
- },
303
- };
304
-
305
- export default {
306
- namespaced: true,
307
- state,
308
- getters,
309
- actions,
310
- mutations,
311
- };
1
+ import BigNumber from "bignumber.js";
2
+ import {
3
+ PIXEL_RATIO,
4
+ VIEWPORT_RATIO,
5
+ MINIMUM_APP_WIDTH,
6
+ MINIMUM_OPTIMIZED_APP_WIDTH,
7
+ } from "../constants";
8
+ const debounce = (cb, duration) => {
9
+ let timer;
10
+ return (...args) => {
11
+ clearTimeout(timer);
12
+ timer = setTimeout(() => {
13
+ cb(...args);
14
+ }, duration);
15
+ };
16
+ };
17
+
18
+ const floor = (value, precision) => {
19
+ const multiplier = Math.pow(10, precision || 0);
20
+ return Math.floor(value * multiplier) / multiplier;
21
+ };
22
+
23
+ const state = {
24
+ scale: undefined,
25
+ fit: "width",
26
+ currentPage: 1,
27
+ optimalResolution: true,
28
+ interactionBlocked: false,
29
+ documentActionBar: null, // document action bar properties
30
+ categorizeModalIsActive: false,
31
+ pageChangedFromThumbnail: false,
32
+ showAnnSetTable: null,
33
+ showChooseLabelSetModal: null,
34
+ };
35
+
36
+ const getters = {
37
+ isMinimumWidth: (state) => (width) => {
38
+ return width >= MINIMUM_APP_WIDTH;
39
+ },
40
+ pageWidthScale: (state) => (elementsWidth, clientWidth, viewportWidth) => {
41
+ return (
42
+ ((clientWidth - elementsWidth) * PIXEL_RATIO * VIEWPORT_RATIO) /
43
+ viewportWidth
44
+ );
45
+ },
46
+ pageHeightScale: (state) => (clientHeight, viewportHeight) => {
47
+ return (clientHeight * PIXEL_RATIO * VIEWPORT_RATIO) / viewportHeight;
48
+ },
49
+ visiblePageRange: (state, getters, rootState, rootGetters) => {
50
+ const pageCount = rootGetters.pageCount;
51
+ const previousPage = state.currentPage - 1 < 1 ? 1 : state.currentPage - 1;
52
+ const nextPage =
53
+ state.currentPage + 1 > pageCount ? pageCount : state.currentPage + 1;
54
+ return [previousPage, state.currentPage, nextPage];
55
+ },
56
+
57
+ /**
58
+ * The proportion between the original size of the page and the
59
+ * image rendering.
60
+ */
61
+ imageScale: (state) => (page) => {
62
+ return new BigNumber(page.size[0]).div(page.original_size[0]).toNumber();
63
+ },
64
+ bboxToPoint:
65
+ (state, getters) =>
66
+ (page, point, hasOffset = false) => {
67
+ const imageScale = getters.imageScale(page);
68
+ const { x, y } = point;
69
+ const pageHeight = new BigNumber(page.original_size[1]);
70
+ const newPoint = {
71
+ // left
72
+ x: new BigNumber(x)
73
+ .minus(hasOffset ? 1 : 0)
74
+ .times(state.scale)
75
+ .times(imageScale)
76
+ .div(PIXEL_RATIO)
77
+ .toNumber(),
78
+ // top
79
+ y: pageHeight
80
+ .minus(new BigNumber(y))
81
+ .minus(hasOffset ? 17.1 : 0)
82
+ .times(state.scale)
83
+ .times(imageScale)
84
+ .div(PIXEL_RATIO)
85
+ .toNumber(),
86
+ };
87
+ return newPoint;
88
+ },
89
+ bboxToRect:
90
+ (state, getters) =>
91
+ (page, bbox, hasOffset = false) => {
92
+ const imageScale = getters.imageScale(page);
93
+ const { x0, x1, y0, y1 } = bbox;
94
+ const pageHeight = new BigNumber(page.original_size[1]);
95
+ const rect = {
96
+ // left
97
+ x: new BigNumber(x0)
98
+ .minus(hasOffset ? 1 : 0)
99
+ .times(state.scale)
100
+ .times(imageScale)
101
+ .div(PIXEL_RATIO)
102
+ .toNumber(),
103
+ // top
104
+ y: pageHeight
105
+ .minus(new BigNumber(y1))
106
+ .minus(hasOffset ? 17.1 : 0)
107
+ .times(state.scale)
108
+ .times(imageScale)
109
+ .div(PIXEL_RATIO)
110
+ .toNumber(),
111
+ width: new BigNumber(x1)
112
+ .minus(x0)
113
+ .abs()
114
+ .times(state.scale)
115
+ .times(imageScale)
116
+ .div(PIXEL_RATIO)
117
+ .toNumber(),
118
+ height: new BigNumber(y1)
119
+ .minus(y0)
120
+ .times(state.scale)
121
+ .times(imageScale)
122
+ .div(PIXEL_RATIO)
123
+ .toNumber(),
124
+ };
125
+ return rect;
126
+ },
127
+ clientToBbox: (state, getters) => (page, start, end) => {
128
+ /**
129
+ * The backend bbox's `y0` and `y1` attributes depend on knowing the
130
+ * page's height.
131
+ */
132
+ const pageHeight = new BigNumber(page.original_size[1]);
133
+ const imageScale = getters.imageScale(page);
134
+
135
+ /**
136
+ * We use `Math.min` and `Math.max` because depending on how the area
137
+ * selection is made the `start` and `end` attributes might be reversed.
138
+ */
139
+ const x0 = new BigNumber(Math.min(start.x, end.x))
140
+ .div(state.scale)
141
+ .div(imageScale)
142
+ .times(PIXEL_RATIO)
143
+ .dp(3, BigNumber.ROUND_DOWN)
144
+ .toNumber();
145
+ const x1 = new BigNumber(Math.max(start.x, end.x))
146
+ .div(state.scale)
147
+ .div(imageScale)
148
+ .times(PIXEL_RATIO)
149
+ .dp(3, BigNumber.ROUND_UP)
150
+ .toNumber();
151
+ const top = new BigNumber(Math.min(start.y, end.y))
152
+ .div(state.scale)
153
+ .div(imageScale)
154
+ .times(PIXEL_RATIO)
155
+ .dp(3)
156
+ .toNumber();
157
+ const bottom = new BigNumber(Math.max(start.y, end.y))
158
+ .div(state.scale)
159
+ .div(imageScale)
160
+ .times(PIXEL_RATIO)
161
+ .dp(3)
162
+ .toNumber();
163
+ const y0 = pageHeight.minus(bottom).dp(3, BigNumber.ROUND_DOWN).toNumber();
164
+ const y1 = pageHeight.minus(top).dp(3, BigNumber.ROUND_UP).toNumber();
165
+
166
+ const bbox = {
167
+ x0,
168
+ x1,
169
+ y0,
170
+ y1,
171
+ page_index: page.number - 1,
172
+ };
173
+
174
+ return bbox;
175
+ },
176
+ };
177
+
178
+ const actions = {
179
+ updateScale({ commit, getters }, { elementsWidth, client, viewport, scale }) {
180
+ /**
181
+ * Determine an ideal scale using viewport of document's first page, the pixel ratio
182
+ * from the browser and a subjective scale factor based on the screen size.
183
+ */
184
+ switch (state.fit) {
185
+ case "width":
186
+ commit(
187
+ "SET_SCALE",
188
+ getters.pageWidthScale(elementsWidth, client.width, viewport.width)
189
+ );
190
+ break;
191
+ case "auto":
192
+ const pageWidthScale = getters.pageWidthScale(
193
+ elementsWidth,
194
+ client.width,
195
+ viewport.width
196
+ );
197
+ const pageHeightScale = getters.pageWidthScale(
198
+ client.height,
199
+ viewport.height
200
+ );
201
+ const autoScale = Math.min(pageWidthScale, pageHeightScale);
202
+ commit("SET_SCALE", autoScale);
203
+ break;
204
+ case "all": {
205
+ commit(
206
+ "SET_SCALE",
207
+ getters.pageWidthScale(elementsWidth, client.width, viewport.width) -
208
+ 0.5
209
+ );
210
+ break;
211
+ }
212
+ case "custom": {
213
+ if (scale) {
214
+ commit("SET_SCALE", scale);
215
+ }
216
+ break;
217
+ }
218
+ default:
219
+ console.log("No fit defined");
220
+ break;
221
+ }
222
+ },
223
+
224
+ updateFit({ commit }, fit) {
225
+ commit("SET_FIT", fit);
226
+ },
227
+
228
+ debounceUpdateCurrentPage: debounce(({ commit, dispatch }, pageNumber) => {
229
+ dispatch("updateCurrentPage", pageNumber);
230
+ }, 300),
231
+
232
+ updateCurrentPage({ commit }, pageNumber) {
233
+ commit("SET_CURRENT_PAGE", pageNumber);
234
+ },
235
+ updateOptimalResolution({ commit }, width) {
236
+ commit("SET_OPTIMAL_RESOLUTION", width >= MINIMUM_OPTIMIZED_APP_WIDTH);
237
+ },
238
+ showDocumentActionBar({ commit }, { icon, text, action, show, loading }) {
239
+ commit(
240
+ "SET_DOCUMENT_ACTION_BAR",
241
+ show ? { icon, text, action, loading } : null
242
+ );
243
+ },
244
+ showAnnSetTable({ commit }, tableSet) {
245
+ commit("SET_ANN_SET_TABLE", tableSet);
246
+ },
247
+ showChooseLabelSetModal({ commit }, options) {
248
+ commit("SET_SHOW_CHOOSE_LABEL_SET_MODAL", options);
249
+ },
250
+ toggleAnnSetTable({ commit }, tableSet) {
251
+ commit("TOGGLE_ANN_SET_TABLE", tableSet);
252
+ },
253
+ setCategorizeModalIsActive: ({ commit }, value) => {
254
+ commit("SET_CATEGORIZE_MODAL_IS_ACTIVE", value);
255
+ },
256
+ setPageChangedFromThumbnail: ({ commit }, value) => {
257
+ commit("SET_PAGE_CHANGED_FROM_THUMBNAIL", value);
258
+ },
259
+ };
260
+
261
+ const mutations = {
262
+ SET_SCALE: (state, scale) => {
263
+ state.scale = floor(scale, 2);
264
+ },
265
+
266
+ SET_FIT: (state, fit) => {
267
+ state.fit = fit;
268
+ },
269
+
270
+ SET_OPTIMAL_RESOLUTION: (state, isOptimal) => {
271
+ state.optimalResolution = isOptimal;
272
+ },
273
+
274
+ SET_CURRENT_PAGE: (state, currentPage) => {
275
+ state.currentPage = currentPage;
276
+ },
277
+
278
+ SET_DOCUMENT_ACTION_BAR: (state, actionBar) => {
279
+ state.documentActionBar = actionBar;
280
+ },
281
+
282
+ SET_ANN_SET_TABLE: (state, tableSet) => {
283
+ state.showAnnSetTable = tableSet;
284
+ },
285
+
286
+ TOGGLE_ANN_SET_TABLE: (state, tableSet) => {
287
+ if (state.showAnnSetTable) {
288
+ state.showAnnSetTable = null;
289
+ } else {
290
+ state.showAnnSetTable = tableSet;
291
+ }
292
+ },
293
+
294
+ SET_CATEGORIZE_MODAL_IS_ACTIVE: (state, value) => {
295
+ state.categorizeModalIsActive = value;
296
+ },
297
+ SET_PAGE_CHANGED_FROM_THUMBNAIL: (state, value) => {
298
+ state.pageChangedFromThumbnail = value;
299
+ },
300
+ SET_SHOW_CHOOSE_LABEL_SET_MODAL: (state, options) => {
301
+ state.showChooseLabelSetModal = options;
302
+ },
303
+ };
304
+
305
+ export default {
306
+ namespaced: true,
307
+ state,
308
+ getters,
309
+ actions,
310
+ mutations,
311
+ };