diff --git a/app/db.sqlite3 b/app/db.sqlite3
index 3faaab4c..efebae87 100644
Binary files a/app/db.sqlite3 and b/app/db.sqlite3 differ
diff --git a/app/server/package.json b/app/server/package.json
index c4986a15..98a37948 100644
--- a/app/server/package.json
+++ b/app/server/package.json
@@ -1,7 +1,6 @@
{
"name": "server",
"version": "1.0.0",
- "description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
@@ -16,5 +15,9 @@
"devDependencies": {
"webpack": "^4.12.0",
"webpack-cli": "^3.0.8"
- }
+ },
+ "directories": {
+ "test": "tests"
+ },
+ "description": ""
}
diff --git a/app/server/static/bundle/sequence_labeling.js b/app/server/static/bundle/sequence_labeling.js
index fdc96682..b01b3346 100644
--- a/app/server/static/bundle/sequence_labeling.js
+++ b/app/server/static/bundle/sequence_labeling.js
@@ -185,7 +185,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _htt
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var _mixin_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mixin.js */ \"./static/js/mixin.js\");\n/* harmony import */ var _http_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./http.js */ \"./static/js/http.js\");\n\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(__webpack_require__(/*! vue-shortkey */ \"./node_modules/vue-shortkey/dist/index.js\"), { prevent: ['input', 'textarea'] });\n\n\n\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].component('annotator', {\n template: '
\\\n {{ r.word }}\\\n
',\n props: {\n 'labels': Array, // [{id: Integer, color: String, text: String}]\n 'text': String,\n 'entityPositions': Array, //[{'startOffset': 10, 'endOffset': 15, 'label_id': 1}]\n },\n data() {\n return {\n startOffset: 0,\n endOffset: 0,\n }\n },\n methods: {\n setSelectedRange: function (e) {\n if (window.getSelection) {\n var range = window.getSelection().getRangeAt(0);\n var preSelectionRange = range.cloneRange();\n preSelectionRange.selectNodeContents(this.$el);\n preSelectionRange.setEnd(range.startContainer, range.startOffset);\n var start = preSelectionRange.toString().length;\n var end = start + range.toString().length;\n } else if (document.selection && document.selection.type != 'Control') {\n var selectedTextRange = document.selection.createRange();\n var preSelectionTextRange = document.body.createTextRange();\n preSelectionTextRange.moveToElementText(this.$el);\n preSelectionTextRange.setEndPoint('EndToStart', selectedTextRange);\n var start = preSelectionTextRange.text.length;\n var end = start + selectedTextRange.text.length;\n }\n this.startOffset = start;\n this.endOffset = end;\n console.log(start, end);\n },\n validRange: function () {\n if (this.startOffset == this.endOffset) {\n return false\n } else if (this.startOffset > this.text.length || this.endOffset > this.text.length) {\n return false\n } else if (this.startOffset < 0 || this.endOffset < 0) {\n return false\n } else {\n return true\n }\n },\n resetRange: function () {\n this.startOffset = 0;\n this.endOffset = 0\n },\n addLabel: function (label_id) {\n if (this.validRange()) {\n var label = {\n start_offset: this.startOffset,\n end_offset: this.endOffset,\n label_id: label_id\n };\n this.entityPositions.push(label);\n return label\n }\n },\n deleteLabel: function (index) {\n this.$emit('delete-label', index);\n this.entityPositions.splice(index, 1)\n },\n getBackgroundColor: function (label_id) {\n for (var item of this.labels) {\n if (item.id == label_id) {\n return item.background_color\n }\n }\n },\n getTextColor: function (label_id) {\n for (var item of this.labels) {\n if (item.id == label_id) {\n return item.text_color\n }\n }\n }\n },\n watch: {\n entityPositions: function () {\n this.resetRange()\n }\n },\n computed: {\n sortedEntityPositions: function () {\n return this.entityPositions.sort((a, b) => a.start_offset - b.start_offset)\n },\n chunks: function () {\n var res = [];\n var left = 0;\n var i = 0;\n for (let i in this.sortedEntityPositions) {\n var e = this.sortedEntityPositions[i];\n var text = this.text.slice(left, e['start_offset']);\n res.push({\n 'word': text,\n 'color': '',\n 'background': ''\n });\n var text = this.text.slice(e['start_offset'], e['end_offset']);\n res.push({\n 'word': text,\n 'color': this.getTextColor(e.label.id),\n 'background': this.getBackgroundColor(e.label.id),\n 'index': i\n });\n left = e['end_offset'];\n }\n var text = this.text.slice(left, this.text.length);\n res.push({\n 'word': text,\n 'color': '',\n 'background': ''\n });\n console.log(res);\n console.log(this.labels);\n console.log(this.entityPositions);\n\n return res\n }\n }\n})\n\nvar vm = new vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"]({\n el: '#mail-app',\n delimiters: ['[[', ']]'],\n mixins: [_mixin_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]],\n methods: {\n annotate: function (label_id) {\n var payload = this.$refs.annotator.addLabel(label_id);\n var doc_id = this.items[this.cur].id;\n _http_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].post(`docs/${doc_id}/annotations/`, payload).then(response => {\n this.items[this.cur]['labels'].push(response.data);\n });\n this.updateProgress()\n }\n }\n});\n\n//# sourceURL=webpack:///./static/js/sequence_labeling.js?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var _mixin_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mixin.js */ \"./static/js/mixin.js\");\n/* harmony import */ var _http_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./http.js */ \"./static/js/http.js\");\n\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(__webpack_require__(/*! vue-shortkey */ \"./node_modules/vue-shortkey/dist/index.js\"), { prevent: ['input', 'textarea'] });\n\n\n\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].component('annotator', {\n template: '\\\n {{ r.word }}\\\n
',\n props: {\n 'labels': Array, // [{id: Integer, color: String, text: String}]\n 'text': String,\n 'entityPositions': Array, //[{'startOffset': 10, 'endOffset': 15, 'label_id': 1}]\n },\n data() {\n return {\n startOffset: 0,\n endOffset: 0,\n }\n },\n methods: {\n setSelectedRange: function (e) {\n if (window.getSelection) {\n var range = window.getSelection().getRangeAt(0);\n var preSelectionRange = range.cloneRange();\n preSelectionRange.selectNodeContents(this.$el);\n preSelectionRange.setEnd(range.startContainer, range.startOffset);\n var start = preSelectionRange.toString().length;\n var end = start + range.toString().length;\n } else if (document.selection && document.selection.type != 'Control') {\n var selectedTextRange = document.selection.createRange();\n var preSelectionTextRange = document.body.createTextRange();\n preSelectionTextRange.moveToElementText(this.$el);\n preSelectionTextRange.setEndPoint('EndToStart', selectedTextRange);\n var start = preSelectionTextRange.text.length;\n var end = start + selectedTextRange.text.length;\n }\n this.startOffset = start;\n this.endOffset = end;\n console.log(start, end);\n },\n validRange: function () {\n if (this.startOffset == this.endOffset) {\n return false\n } else if (this.startOffset > this.text.length || this.endOffset > this.text.length) {\n return false\n } else if (this.startOffset < 0 || this.endOffset < 0) {\n return false\n } else {\n return true\n }\n },\n resetRange: function () {\n this.startOffset = 0;\n this.endOffset = 0\n },\n addLabel: function (label_id) {\n if (this.validRange()) {\n var label = {\n start_offset: this.startOffset,\n end_offset: this.endOffset,\n label_id: label_id\n };\n this.entityPositions.push(label);\n return label\n }\n },\n deleteLabel: function (index) {\n this.$emit('delete-label', index);\n this.entityPositions.splice(index, 1)\n },\n getBackgroundColor: function (label_id) {\n for (var item of this.labels) {\n if (item.id == label_id) {\n return item.background_color\n }\n }\n },\n getTextColor: function (label_id) {\n for (var item of this.labels) {\n if (item.id == label_id) {\n return item.text_color\n }\n }\n }\n },\n watch: {\n entityPositions: function () {\n this.resetRange()\n }\n },\n computed: {\n sortedEntityPositions: function () {\n this.entityPositions = this.entityPositions.sort((a, b) => a.start_offset - b.start_offset);\n return this.entityPositions\n },\n chunks: function () {\n var res = [];\n var left = 0;\n var i = 0;\n for (let i in this.sortedEntityPositions) {\n var e = this.sortedEntityPositions[i];\n var text = this.text.slice(left, e['start_offset']);\n res.push({\n 'word': text,\n 'color': '',\n 'background': ''\n });\n var text = this.text.slice(e['start_offset'], e['end_offset']);\n res.push({\n 'word': text,\n 'color': this.getTextColor(e.label.id),\n 'background': this.getBackgroundColor(e.label.id),\n 'index': i\n });\n left = e['end_offset'];\n }\n var text = this.text.slice(left, this.text.length);\n res.push({\n 'word': text,\n 'color': '',\n 'background': ''\n });\n console.log(res);\n console.log(this.labels);\n console.log(this.entityPositions);\n\n return res\n }\n }\n})\n\nvar vm = new vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"]({\n el: '#mail-app',\n delimiters: ['[[', ']]'],\n mixins: [_mixin_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]],\n methods: {\n annotate: function (label_id) {\n var payload = this.$refs.annotator.addLabel(label_id);\n var doc_id = this.items[this.cur].id;\n _http_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].post(`docs/${doc_id}/annotations/`, payload).then(response => {\n this.items[this.cur]['labels'].push(response.data);\n });\n this.updateProgress()\n }\n }\n});\n\n//# sourceURL=webpack:///./static/js/sequence_labeling.js?");
/***/ })
diff --git a/app/server/static/js/sequence_labeling.js b/app/server/static/js/sequence_labeling.js
index 779fa5b2..3e399358 100644
--- a/app/server/static/js/sequence_labeling.js
+++ b/app/server/static/js/sequence_labeling.js
@@ -91,7 +91,8 @@ Vue.component('annotator', {
},
computed: {
sortedEntityPositions: function () {
- return this.entityPositions.sort((a, b) => a.start_offset - b.start_offset)
+ this.entityPositions = this.entityPositions.sort((a, b) => a.start_offset - b.start_offset);
+ return this.entityPositions
},
chunks: function () {
var res = [];