@konfuzio/document-validation-ui 0.1.19 → 0.1.20
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
|
@@ -1,236 +1,236 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div
|
|
3
|
-
:class="['document-name-component', editMode && 'document-name-edit-mode']"
|
|
4
|
-
>
|
|
5
|
-
<div class="document-icon">
|
|
6
|
-
<ServerImage
|
|
7
|
-
:height="'22px'"
|
|
8
|
-
:image-url="`${selectedDocument.thumbnail_url}?${selectedDocument.downloaded_at}`"
|
|
9
|
-
>
|
|
10
|
-
<b-skeleton width="15px" height="22px" :rounded="false" />
|
|
11
|
-
</ServerImage>
|
|
12
|
-
</div>
|
|
13
|
-
<span class="file-name-section">
|
|
14
|
-
<span
|
|
15
|
-
:class="['document-name', isEditable && 'is-editable']"
|
|
16
|
-
:contenteditable="isEditable"
|
|
17
|
-
@input="handleInput"
|
|
18
|
-
@paste="handlePaste"
|
|
19
|
-
@keydown.enter="handleSave"
|
|
20
|
-
@blur="handleSave"
|
|
21
|
-
>{{ textContent }}</span
|
|
22
|
-
>
|
|
23
|
-
</span>
|
|
24
|
-
<div
|
|
25
|
-
v-if="
|
|
26
|
-
!publicView &&
|
|
27
|
-
!isDocumentReviewed &&
|
|
28
|
-
showEditBtn &&
|
|
29
|
-
!editMode &&
|
|
30
|
-
!recalculatingAnnotations
|
|
31
|
-
"
|
|
32
|
-
class="edit-btn btn"
|
|
33
|
-
@click="handleEdit"
|
|
34
|
-
>
|
|
35
|
-
{{ $t("edit") }}
|
|
36
|
-
</div>
|
|
37
|
-
<div
|
|
38
|
-
v-if="showSaveBtn && !editMode"
|
|
39
|
-
class="save-btn btn"
|
|
40
|
-
@click="handleSave"
|
|
41
|
-
>
|
|
42
|
-
{{ $t("save") }}
|
|
43
|
-
</div>
|
|
44
|
-
<div v-if="saving" class="message-container">
|
|
45
|
-
<span class="loading-container">
|
|
46
|
-
<b-notification :closable="false" class="loading-background">
|
|
47
|
-
<b-loading v-model="saving" :is-full-page="isFullPage">
|
|
48
|
-
<b-icon icon="spinner" class="fa-spin loading-icon-size spinner" />
|
|
49
|
-
</b-loading>
|
|
50
|
-
</b-notification>
|
|
51
|
-
</span>
|
|
52
|
-
<span>{{ $t("autosaving") }}</span>
|
|
53
|
-
</div>
|
|
54
|
-
<div v-if="changed" class="message-container">
|
|
55
|
-
<span v-if="saved" class="cloud-icon"><FileNameSaved /></span>
|
|
56
|
-
<span v-else class="cloud-icon"><FileNameNotSaved /></span>
|
|
57
|
-
<span>{{ saved ? $t("saved") : $t("not_saved") }}</span>
|
|
58
|
-
</div>
|
|
59
|
-
</div>
|
|
60
|
-
</template>
|
|
61
|
-
|
|
62
|
-
<script>
|
|
63
|
-
import ServerImage from "../../assets/images/ServerImage";
|
|
64
|
-
import FileNameSaved from "../../assets/images/FileNameSavedImage";
|
|
65
|
-
import FileNameNotSaved from "../../assets/images/FileNameNotSavedImage";
|
|
66
|
-
import { mapGetters, mapState } from "vuex";
|
|
67
|
-
|
|
68
|
-
export default {
|
|
69
|
-
name: "DocumentName",
|
|
70
|
-
components: {
|
|
71
|
-
ServerImage,
|
|
72
|
-
FileNameSaved,
|
|
73
|
-
FileNameNotSaved,
|
|
74
|
-
},
|
|
75
|
-
props: {
|
|
76
|
-
dataFileName: {
|
|
77
|
-
type: String,
|
|
78
|
-
default: "",
|
|
79
|
-
},
|
|
80
|
-
},
|
|
81
|
-
data() {
|
|
82
|
-
return {
|
|
83
|
-
isEditable: false,
|
|
84
|
-
showEditBtn: true,
|
|
85
|
-
showSaveBtn: false,
|
|
86
|
-
fileExtension: null,
|
|
87
|
-
fileName: null,
|
|
88
|
-
oldFileName: null,
|
|
89
|
-
saving: false,
|
|
90
|
-
isFullPage: false,
|
|
91
|
-
changed: false,
|
|
92
|
-
saved: false,
|
|
93
|
-
};
|
|
94
|
-
},
|
|
95
|
-
computed: {
|
|
96
|
-
...mapState("document", [
|
|
97
|
-
"selectedDocument",
|
|
98
|
-
"publicView",
|
|
99
|
-
"recalculatingAnnotations",
|
|
100
|
-
]),
|
|
101
|
-
...mapState("display", ["optimalResolution"]),
|
|
102
|
-
...mapState("edit", ["editMode"]),
|
|
103
|
-
...mapGetters("document", ["isDocumentReviewed"]),
|
|
104
|
-
textContent() {
|
|
105
|
-
if (this.isEditable) {
|
|
106
|
-
return this.oldFileName;
|
|
107
|
-
} else if (this.fileName) {
|
|
108
|
-
return this.shortFilenameIfNeeded(
|
|
109
|
-
`${this.fileName}.${this.fileExtension}`
|
|
110
|
-
);
|
|
111
|
-
} else {
|
|
112
|
-
return this.shortFilenameIfNeeded(this.dataFileName);
|
|
113
|
-
}
|
|
114
|
-
},
|
|
115
|
-
},
|
|
116
|
-
updated() {
|
|
117
|
-
const contentEditable = document.querySelector(".document-name");
|
|
118
|
-
if (this.isEditable && contentEditable) {
|
|
119
|
-
contentEditable.focus();
|
|
120
|
-
this.handleCaretPlacing(contentEditable);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
if (this.changed) {
|
|
124
|
-
const that = this;
|
|
125
|
-
setTimeout(function () {
|
|
126
|
-
that.saved = false;
|
|
127
|
-
that.changed = false;
|
|
128
|
-
that.showEditBtn = true;
|
|
129
|
-
this.showSaveBtn = false;
|
|
130
|
-
}, 4000);
|
|
131
|
-
}
|
|
132
|
-
},
|
|
133
|
-
methods: {
|
|
134
|
-
shortFilenameIfNeeded(filename) {
|
|
135
|
-
if (
|
|
136
|
-
filename &&
|
|
137
|
-
(filename.length >= 70 ||
|
|
138
|
-
(filename.length >= 25 && !this.optimalResolution))
|
|
139
|
-
) {
|
|
140
|
-
return (
|
|
141
|
-
filename.substr(0, 20) +
|
|
142
|
-
"..." +
|
|
143
|
-
filename.substr(filename.length - 10, filename.length)
|
|
144
|
-
);
|
|
145
|
-
}
|
|
146
|
-
return filename;
|
|
147
|
-
},
|
|
148
|
-
handleFileName() {
|
|
149
|
-
// Save the file name and the extension in different variables
|
|
150
|
-
this.fileName = this.dataFileName.split(".").slice(0, -1).join(".");
|
|
151
|
-
|
|
152
|
-
this.fileExtension = this.dataFileName.split(".").at(-1);
|
|
153
|
-
},
|
|
154
|
-
handleEdit() {
|
|
155
|
-
// Split file name and extension to only edit name
|
|
156
|
-
this.handleFileName();
|
|
157
|
-
|
|
158
|
-
this.isEditable = true;
|
|
159
|
-
this.showEditBtn = false;
|
|
160
|
-
this.showSaveBtn = true;
|
|
161
|
-
this.oldFileName = this.fileName;
|
|
162
|
-
},
|
|
163
|
-
handleCaretPlacing(contentEditable) {
|
|
164
|
-
let range, selection;
|
|
165
|
-
if (document.createRange) {
|
|
166
|
-
range = document.createRange(); //Create a range (a range is a like the selection but invisible)
|
|
167
|
-
range.selectNodeContents(contentEditable); //Select the entire contents of the element with the range
|
|
168
|
-
range.collapse(false); //collapse the range to the end point. false means collapse to end rather than the start
|
|
169
|
-
selection = window.getSelection(); //get the selection object (allows you to change selection)
|
|
170
|
-
selection.removeAllRanges(); //remove any selections already made
|
|
171
|
-
selection.addRange(range); //make the range you have just created the visible selection
|
|
172
|
-
} else if (document.selection) {
|
|
173
|
-
range = document.body.createTextRange(); //Create a range (a range is a like the selection but invisible)
|
|
174
|
-
range.moveToElementText(contentEditable); //Select the entire contents of the element with the range
|
|
175
|
-
range.collapse(false); //collapse the range to the end point. false means collapse to end rather than the start
|
|
176
|
-
range.select(); //Select the range (make it the visible selection
|
|
177
|
-
}
|
|
178
|
-
},
|
|
179
|
-
handlePaste(event) {
|
|
180
|
-
// TODO: modify to only paste plain text
|
|
181
|
-
event.preventDefault();
|
|
182
|
-
},
|
|
183
|
-
handleInput(event) {
|
|
184
|
-
const input = event.target.textContent;
|
|
185
|
-
|
|
186
|
-
// Set the new file name to the new input value
|
|
187
|
-
if (input === "") {
|
|
188
|
-
// If the user deletes the name:
|
|
189
|
-
this.fileName = "untitled";
|
|
190
|
-
} else {
|
|
191
|
-
this.fileName = input.trim();
|
|
192
|
-
}
|
|
193
|
-
},
|
|
194
|
-
handleSave(event) {
|
|
195
|
-
this.isEditable = false;
|
|
196
|
-
|
|
197
|
-
event.target.textContent = this.fileName;
|
|
198
|
-
|
|
199
|
-
const updatedFileName = {
|
|
200
|
-
data_file_name: `${this.fileName}.${this.fileExtension}`,
|
|
201
|
-
};
|
|
202
|
-
|
|
203
|
-
this.showSaveBtn = false;
|
|
204
|
-
this.saving = true;
|
|
205
|
-
|
|
206
|
-
this.$store
|
|
207
|
-
.dispatch("document/updateDocument", updatedFileName)
|
|
208
|
-
.then((response) => {
|
|
209
|
-
// Check if the response is successful or not
|
|
210
|
-
if (response) {
|
|
211
|
-
// if successful, set the old name to be the new name
|
|
212
|
-
this.changed = true;
|
|
213
|
-
this.oldFileName = this.fileName;
|
|
214
|
-
this.saved = true;
|
|
215
|
-
}
|
|
216
|
-
})
|
|
217
|
-
.catch((error) => {
|
|
218
|
-
this.changed = true;
|
|
219
|
-
event.target.textContent = this.oldFileName;
|
|
220
|
-
this.fileName = this.oldFileName;
|
|
221
|
-
})
|
|
222
|
-
.finally(() => {
|
|
223
|
-
this.saving = false;
|
|
224
|
-
});
|
|
225
|
-
|
|
226
|
-
// Remove focus from contenteditable
|
|
227
|
-
const contentNotEditable = document.querySelector(".document-name");
|
|
228
|
-
if (contentNotEditable) {
|
|
229
|
-
contentNotEditable.blur();
|
|
230
|
-
}
|
|
231
|
-
},
|
|
232
|
-
},
|
|
233
|
-
};
|
|
234
|
-
</script>
|
|
235
|
-
|
|
236
|
-
<style scoped lang="scss" src="../../assets/scss/document_name.scss"></style>
|
|
1
|
+
<template>
|
|
2
|
+
<div
|
|
3
|
+
:class="['document-name-component', editMode && 'document-name-edit-mode']"
|
|
4
|
+
>
|
|
5
|
+
<div class="document-icon">
|
|
6
|
+
<ServerImage
|
|
7
|
+
:height="'22px'"
|
|
8
|
+
:image-url="`${selectedDocument.thumbnail_url}?${selectedDocument.downloaded_at}`"
|
|
9
|
+
>
|
|
10
|
+
<b-skeleton width="15px" height="22px" :rounded="false" />
|
|
11
|
+
</ServerImage>
|
|
12
|
+
</div>
|
|
13
|
+
<span class="file-name-section">
|
|
14
|
+
<span
|
|
15
|
+
:class="['document-name', isEditable && 'is-editable']"
|
|
16
|
+
:contenteditable="isEditable"
|
|
17
|
+
@input="handleInput"
|
|
18
|
+
@paste="handlePaste"
|
|
19
|
+
@keydown.enter="handleSave"
|
|
20
|
+
@blur="handleSave"
|
|
21
|
+
>{{ textContent }}</span
|
|
22
|
+
>
|
|
23
|
+
</span>
|
|
24
|
+
<div
|
|
25
|
+
v-if="
|
|
26
|
+
!publicView &&
|
|
27
|
+
!isDocumentReviewed &&
|
|
28
|
+
showEditBtn &&
|
|
29
|
+
!editMode &&
|
|
30
|
+
!recalculatingAnnotations
|
|
31
|
+
"
|
|
32
|
+
class="edit-btn btn"
|
|
33
|
+
@click="handleEdit"
|
|
34
|
+
>
|
|
35
|
+
{{ $t("edit") }}
|
|
36
|
+
</div>
|
|
37
|
+
<div
|
|
38
|
+
v-if="showSaveBtn && !editMode"
|
|
39
|
+
class="save-btn btn"
|
|
40
|
+
@click="handleSave"
|
|
41
|
+
>
|
|
42
|
+
{{ $t("save") }}
|
|
43
|
+
</div>
|
|
44
|
+
<div v-if="saving" class="message-container">
|
|
45
|
+
<span class="loading-container">
|
|
46
|
+
<b-notification :closable="false" class="loading-background">
|
|
47
|
+
<b-loading v-model="saving" :is-full-page="isFullPage">
|
|
48
|
+
<b-icon icon="spinner" class="fa-spin loading-icon-size spinner" />
|
|
49
|
+
</b-loading>
|
|
50
|
+
</b-notification>
|
|
51
|
+
</span>
|
|
52
|
+
<span>{{ $t("autosaving") }}</span>
|
|
53
|
+
</div>
|
|
54
|
+
<div v-if="changed" class="message-container">
|
|
55
|
+
<span v-if="saved" class="cloud-icon"><FileNameSaved /></span>
|
|
56
|
+
<span v-else class="cloud-icon"><FileNameNotSaved /></span>
|
|
57
|
+
<span>{{ saved ? $t("saved") : $t("not_saved") }}</span>
|
|
58
|
+
</div>
|
|
59
|
+
</div>
|
|
60
|
+
</template>
|
|
61
|
+
|
|
62
|
+
<script>
|
|
63
|
+
import ServerImage from "../../assets/images/ServerImage";
|
|
64
|
+
import FileNameSaved from "../../assets/images/FileNameSavedImage";
|
|
65
|
+
import FileNameNotSaved from "../../assets/images/FileNameNotSavedImage";
|
|
66
|
+
import { mapGetters, mapState } from "vuex";
|
|
67
|
+
|
|
68
|
+
export default {
|
|
69
|
+
name: "DocumentName",
|
|
70
|
+
components: {
|
|
71
|
+
ServerImage,
|
|
72
|
+
FileNameSaved,
|
|
73
|
+
FileNameNotSaved,
|
|
74
|
+
},
|
|
75
|
+
props: {
|
|
76
|
+
dataFileName: {
|
|
77
|
+
type: String,
|
|
78
|
+
default: "",
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
data() {
|
|
82
|
+
return {
|
|
83
|
+
isEditable: false,
|
|
84
|
+
showEditBtn: true,
|
|
85
|
+
showSaveBtn: false,
|
|
86
|
+
fileExtension: null,
|
|
87
|
+
fileName: null,
|
|
88
|
+
oldFileName: null,
|
|
89
|
+
saving: false,
|
|
90
|
+
isFullPage: false,
|
|
91
|
+
changed: false,
|
|
92
|
+
saved: false,
|
|
93
|
+
};
|
|
94
|
+
},
|
|
95
|
+
computed: {
|
|
96
|
+
...mapState("document", [
|
|
97
|
+
"selectedDocument",
|
|
98
|
+
"publicView",
|
|
99
|
+
"recalculatingAnnotations",
|
|
100
|
+
]),
|
|
101
|
+
...mapState("display", ["optimalResolution"]),
|
|
102
|
+
...mapState("edit", ["editMode"]),
|
|
103
|
+
...mapGetters("document", ["isDocumentReviewed"]),
|
|
104
|
+
textContent() {
|
|
105
|
+
if (this.isEditable) {
|
|
106
|
+
return this.oldFileName;
|
|
107
|
+
} else if (this.fileName) {
|
|
108
|
+
return this.shortFilenameIfNeeded(
|
|
109
|
+
`${this.fileName}.${this.fileExtension}`
|
|
110
|
+
);
|
|
111
|
+
} else {
|
|
112
|
+
return this.shortFilenameIfNeeded(this.dataFileName);
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
updated() {
|
|
117
|
+
const contentEditable = document.querySelector(".document-name");
|
|
118
|
+
if (this.isEditable && contentEditable) {
|
|
119
|
+
contentEditable.focus();
|
|
120
|
+
this.handleCaretPlacing(contentEditable);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (this.changed) {
|
|
124
|
+
const that = this;
|
|
125
|
+
setTimeout(function () {
|
|
126
|
+
that.saved = false;
|
|
127
|
+
that.changed = false;
|
|
128
|
+
that.showEditBtn = true;
|
|
129
|
+
this.showSaveBtn = false;
|
|
130
|
+
}, 4000);
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
methods: {
|
|
134
|
+
shortFilenameIfNeeded(filename) {
|
|
135
|
+
if (
|
|
136
|
+
filename &&
|
|
137
|
+
(filename.length >= 70 ||
|
|
138
|
+
(filename.length >= 25 && !this.optimalResolution))
|
|
139
|
+
) {
|
|
140
|
+
return (
|
|
141
|
+
filename.substr(0, 20) +
|
|
142
|
+
"..." +
|
|
143
|
+
filename.substr(filename.length - 10, filename.length)
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
return filename;
|
|
147
|
+
},
|
|
148
|
+
handleFileName() {
|
|
149
|
+
// Save the file name and the extension in different variables
|
|
150
|
+
this.fileName = this.dataFileName.split(".").slice(0, -1).join(".");
|
|
151
|
+
|
|
152
|
+
this.fileExtension = this.dataFileName.split(".").at(-1);
|
|
153
|
+
},
|
|
154
|
+
handleEdit() {
|
|
155
|
+
// Split file name and extension to only edit name
|
|
156
|
+
this.handleFileName();
|
|
157
|
+
|
|
158
|
+
this.isEditable = true;
|
|
159
|
+
this.showEditBtn = false;
|
|
160
|
+
this.showSaveBtn = true;
|
|
161
|
+
this.oldFileName = this.fileName;
|
|
162
|
+
},
|
|
163
|
+
handleCaretPlacing(contentEditable) {
|
|
164
|
+
let range, selection;
|
|
165
|
+
if (document.createRange) {
|
|
166
|
+
range = document.createRange(); //Create a range (a range is a like the selection but invisible)
|
|
167
|
+
range.selectNodeContents(contentEditable); //Select the entire contents of the element with the range
|
|
168
|
+
range.collapse(false); //collapse the range to the end point. false means collapse to end rather than the start
|
|
169
|
+
selection = window.getSelection(); //get the selection object (allows you to change selection)
|
|
170
|
+
selection.removeAllRanges(); //remove any selections already made
|
|
171
|
+
selection.addRange(range); //make the range you have just created the visible selection
|
|
172
|
+
} else if (document.selection) {
|
|
173
|
+
range = document.body.createTextRange(); //Create a range (a range is a like the selection but invisible)
|
|
174
|
+
range.moveToElementText(contentEditable); //Select the entire contents of the element with the range
|
|
175
|
+
range.collapse(false); //collapse the range to the end point. false means collapse to end rather than the start
|
|
176
|
+
range.select(); //Select the range (make it the visible selection
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
handlePaste(event) {
|
|
180
|
+
// TODO: modify to only paste plain text
|
|
181
|
+
event.preventDefault();
|
|
182
|
+
},
|
|
183
|
+
handleInput(event) {
|
|
184
|
+
const input = event.target.textContent;
|
|
185
|
+
|
|
186
|
+
// Set the new file name to the new input value
|
|
187
|
+
if (input === "") {
|
|
188
|
+
// If the user deletes the name:
|
|
189
|
+
this.fileName = "untitled";
|
|
190
|
+
} else {
|
|
191
|
+
this.fileName = input.trim();
|
|
192
|
+
}
|
|
193
|
+
},
|
|
194
|
+
handleSave(event) {
|
|
195
|
+
this.isEditable = false;
|
|
196
|
+
|
|
197
|
+
event.target.textContent = this.fileName;
|
|
198
|
+
|
|
199
|
+
const updatedFileName = {
|
|
200
|
+
data_file_name: `${this.fileName}.${this.fileExtension}`,
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
this.showSaveBtn = false;
|
|
204
|
+
this.saving = true;
|
|
205
|
+
|
|
206
|
+
this.$store
|
|
207
|
+
.dispatch("document/updateDocument", updatedFileName)
|
|
208
|
+
.then((response) => {
|
|
209
|
+
// Check if the response is successful or not
|
|
210
|
+
if (response) {
|
|
211
|
+
// if successful, set the old name to be the new name
|
|
212
|
+
this.changed = true;
|
|
213
|
+
this.oldFileName = this.fileName;
|
|
214
|
+
this.saved = true;
|
|
215
|
+
}
|
|
216
|
+
})
|
|
217
|
+
.catch((error) => {
|
|
218
|
+
this.changed = true;
|
|
219
|
+
event.target.textContent = this.oldFileName;
|
|
220
|
+
this.fileName = this.oldFileName;
|
|
221
|
+
})
|
|
222
|
+
.finally(() => {
|
|
223
|
+
this.saving = false;
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
// Remove focus from contenteditable
|
|
227
|
+
const contentNotEditable = document.querySelector(".document-name");
|
|
228
|
+
if (contentNotEditable) {
|
|
229
|
+
contentNotEditable.blur();
|
|
230
|
+
}
|
|
231
|
+
},
|
|
232
|
+
},
|
|
233
|
+
};
|
|
234
|
+
</script>
|
|
235
|
+
|
|
236
|
+
<style scoped lang="scss" src="../../assets/scss/document_name.scss"></style>
|