Skip to content

Commit e2c3d2d

Browse files
authored
Merge pull request #13 from kaplanPRO/development
version 0.5.7
2 parents c71add7 + cce4289 commit e2c3d2d

File tree

7 files changed

+359
-208
lines changed

7 files changed

+359
-208
lines changed

app/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "kaplan-desktop",
33
"productName": "Kaplan Desktop",
4-
"version": "0.5.6",
4+
"version": "0.5.7",
55
"description": "An open-source CAT tool.",
66
"homepage": "https://kaplan.pro",
77
"main": "src/main.js",

app/src/editor.js

+133-8
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ function fireOnReady() {
3030
document.getElementById("btn-tm-hits").classList.remove("active");
3131
document.getElementById("tm-hits").style.display = "none";
3232
}
33+
document.getElementById("btn-save-progress").onclick = function() {
34+
save();
35+
}
3336
}
3437

3538
window.selectedTU = null;
@@ -316,7 +319,108 @@ function resolveLQI(closeSpan) {
316319
xhttp.open("POST", queryURL, true);
317320
xhttp.send(lQIFormData);
318321
}
319-
function submitSegment(target_cell, segment_state) {
322+
function save() {
323+
document.getElementById("btn-save-progress").disabled = true;
324+
325+
326+
let segments = [];
327+
328+
[...document.getElementById("editor-view").getElementsByClassName("target")].forEach((targetCell, i) => {
329+
let target = targetCell.innerHTML.replace(/&nbsp;/g, " ").replace(/<ph draggable="true" contenteditable="false">\\n<\/ph>/g, "\n");
330+
if (target == "")
331+
{
332+
target = "<target/>";
333+
}
334+
else
335+
{
336+
target = "<target>" + target + "</target>";
337+
}
338+
339+
let state = targetCell.parentNode.classList;
340+
if (state.contains("draft"))
341+
{
342+
state = "draft";
343+
}
344+
else if (state.contains("translated"))
345+
{
346+
state = "translated";
347+
}
348+
else if (state.contains("reviewed"))
349+
{
350+
state = "reviewed";
351+
}
352+
else if (target != "<target/>")
353+
{
354+
state = "draft";
355+
}
356+
else
357+
{
358+
state = "blank";
359+
}
360+
segment = {
361+
"tu-i": targetCell.parentNode.getAttribute("p-id"),
362+
"s-i": targetCell.parentNode.getAttribute("id"),
363+
"source": "<source>" + targetCell.parentNode.getElementsByClassName("source")[0].innerHTML.replace(/&nbsp;/g, " ").replace(/<ph draggable="true" contenteditable="false">\\n<\/ph>/g, "\n") + "</source>",
364+
"target": target,
365+
"state": state
366+
}
367+
368+
segments.push(segment);
369+
});
370+
371+
let xhttp = new XMLHttpRequest();
372+
let queryURL = "http://127.0.0.1:8000/project/"
373+
+ filesView.getAttribute("cur-p-id")
374+
+ "/file/"
375+
+ editorView.getAttribute("cur-f-id");
376+
377+
let segmentsForm = new FormData();
378+
segmentsForm.append("task", "save_progress");
379+
segmentsForm.append("editor_mode", editorMode);
380+
segmentsForm.append("segments", JSON.stringify(segments));
381+
segmentsForm.append("author_id", window.username);
382+
383+
xhttp.onreadystatechange = function() {
384+
if (this.readyState == 4 && this.status == 200) {
385+
console.log("Segments submitted succesfully!");
386+
[...document.getElementById("editor-view").getElementsByClassName("target")].forEach((targetCell, i) => {
387+
targetCell.parentNode.classList.remove("error");
388+
});
389+
390+
} else if (this.readyState == 4 && this.status != 200) {
391+
console.error("Segments not submitted succesfully!");
392+
document.getElementById("btn-save-progress").disabled = false;
393+
}
394+
}
395+
396+
xhttp.open("POST", queryURL, true);
397+
xhttp.send(segmentsForm);
398+
399+
}
400+
function submitSegment(target_cell, segment_state, nextSegment=null) {
401+
if (segment_state == null)
402+
{
403+
if (target_cell.parentNode.className == "translated" || target_cell.parentNode.className == "reviewed")
404+
{
405+
return;
406+
}
407+
else if (target_cell.parentNode.classList.contains("blank"))
408+
{
409+
segment_state = "blank";
410+
}
411+
else if (target_cell.parentNode.classList.contains("draft"))
412+
{
413+
segment_state = "draft";
414+
}
415+
else if (target_cell.parentNode.classList.contains("translated"))
416+
{
417+
segment_state = "translated";
418+
}
419+
else
420+
{
421+
segment_state = "draft";
422+
}
423+
}
320424
paragraph_no = target_cell.parentNode.getAttribute("p-id");
321425
segment_no = target_cell.parentNode.getAttribute("id");
322426
source_segment = "<source>" + target_cell.parentNode.getElementsByClassName("source")[0].innerHTML.replace(/&nbsp;/g, " ").replace(/<ph draggable="true" contenteditable="false">\\n<\/ph>/g, "\n") + "</source>";
@@ -329,9 +433,9 @@ function submitSegment(target_cell, segment_state) {
329433
target_segment = "<target>" + target_segment + "</target>";
330434
}
331435

332-
if (segment_state == "draft" && !target_cell.parentNode.classList.contains("draft")) {
333-
return false;
334-
}
436+
//if (segment_state == "draft" && !target_cell.parentNode.classList.contains("draft")) {
437+
// return false;
438+
//}
335439

336440
let xhttp = new XMLHttpRequest();
337441
let queryURL = "http://127.0.0.1:8000/project/"
@@ -353,6 +457,10 @@ function submitSegment(target_cell, segment_state) {
353457
if (this.readyState == 4 && this.status == 200) {
354458
console.log("Segment #" + segment_no + " submitted succesfully!");
355459
target_cell.parentNode.className = segment_state;
460+
if (nextSegment)
461+
{
462+
nextSegment.focus();
463+
}
356464
} else if (this.readyState == 4 && this.status != 200) {
357465
console.error("Segment #" + segment_no + " not submitted succesfully!");
358466
target_cell.parentNode.className = 'error';
@@ -477,44 +585,61 @@ function segmentSelect(segmentRow) {
477585
function tagClickHandler(tag) {
478586
tag.parentNode.parentNode.getElementsByClassName("target")[0].
479587
innerHTML += tag.outerHTML;
480-
tag.parentNode.parentNode.classList.remove("translated");
588+
tag.parentNode.parentNode.classList.remove(("translated", "reviewed", "blank"));
481589
tag.parentNode.parentNode.classList.add("draft");
590+
tag.parentNode.parentNode.getElementsByClassName("target")[0].focus();
591+
document.execCommand('selectAll', false, null);
592+
document.getSelection().collapseToEnd();
482593
}
483594
function targetKeydownHandler(e, target_cell) {
484595
if (e.key == "Enter") {
485596
e.preventDefault();
486597
if (e.ctrlKey) {
487598
target_cell.parentNode.classList.remove("draft");
488-
submitSegment(target_cell, "translated");
489599
jumpToNextConfirmedSegment = !e.shiftKey;
490600
targetList = [...document.getElementsByClassName("target")].slice(1);
491601
currentId = targetList.findIndex(function(element){return element==target_cell})
602+
nextSegment = null;
492603
for (i = currentId+1; i < targetList.length; i++) {
493604
target = targetList[i];
494605
if (!target.parentNode.classList.contains("translated") && jumpToNextConfirmedSegment) {
495-
target.focus();
606+
nextSegment = target;
496607
break;
497608
}
498609
}
610+
if (editorMode == "review")
611+
{
612+
segmentState = "reviewed";
613+
}
614+
else
615+
{
616+
segmentState = "translated";
617+
}
618+
submitSegment(target_cell, segmentState, nextSegment);
499619
}
500620
}
501621
else if (e.ctrlKey) {
502622
if (e.key == "Insert") {
503623
target_cell.innerHTML = target_cell.parentNode.getElementsByClassName("source")[0].innerHTML;
504624
}
625+
else if (e.key == 's' || e.key == 'S')
626+
{
627+
save();
628+
}
505629
}
506630
else if (e.key == "Tab") {
507631
e.preventDefault();
508632
targetList = [...document.getElementsByClassName("target")].slice(1);
509633
currentId = targetList.findIndex(function(element){return element==target_cell})
510-
if (currentId < targetList.length) {
634+
if (currentId < targetList.length-1) {
511635
targetList[currentId+1].focus();
512636
}
513637
}
514638
else if ( e.shiftKey) {}
515639
else {
516640
target_cell.parentNode.classList.remove("translated");
517641
target_cell.parentNode.classList.add("draft");
642+
document.getElementById("btn-save-progress").disabled = false;
518643
}
519644
};
520645
if (document.readyState === "complete") {

app/src/index.css

+3
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,9 @@ tr.error th {
305305
tr.translated th {
306306
background-color: teal;
307307
}
308+
tr.reviewed th {
309+
background-color: forestgreen;
310+
}
308311
tr.selected th {
309312
background-color: orangered;
310313
color: white;

app/src/index.html

+1
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969
</main>
7070
<header id="editor-header">
7171
<button id="btn-segment-merge" disabled>Merge</button>
72+
<button id="btn-save-progress" disabled>Save</button>
7273
<span class="hidden">Review Mode</span>
7374
</header>
7475
<main id="editor-view">

app/src/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,7 @@ function fireOnReady() {
395395
window.activeSegment = this.parentNode;
396396
lookupSegment(this.parentNode.children[1]);
397397
});
398-
target_td.addEventListener("focusout", function () { submitSegment(this, "draft") });
398+
target_td.addEventListener("focusout", function () { submitSegment(this, null) });
399399
segment_row.appendChild(target_td);
400400

401401
["sc", "ec", "ph", "g", "x"].forEach(function(tagName) {

0 commit comments

Comments
 (0)