aboutsummaryrefslogtreecommitdiff
path: root/assets/js/edit.js
blob: 13c227b12fb6d73fd8620faf7cdecad765568f5d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
let form;
let unsavedChanges = false;
const pageurl = basepath + pageid;
const myWorker = new Worker(jspath + 'worker.js');

window.onload = () => {
    form = document.getElementById('update');
    let inputs = form.elements;
    for (i = 0; i < inputs.length; i++) {
        inputs[i].onchange = changeHandler;
        inputs[i].oninput = changeHandler;
    }

    form.addEventListener("submit", function (event) {
        event.preventDefault();
        submitHandler(this);
      });
    window.onkeydown = keyboardHandler;
    window.onbeforeunload = confirmExit;

    myWorker.postMessage({
        type: 'init',
        pageurl: pageurl,
    });
    myWorker.postMessage({ type: 'stillEditing' });
};

/**
 * Manage a keyboardEvent
 * @param {KeyboardEvent} e
 */
function keyboardHandler(e) {
    if (e.composed) {
        if (e.ctrlKey) {
            // console.log(e.key);
            switch (e.key) {
                case 's':
                    e.preventDefault();
                    unsavedChanges = false;
                    form.submit();
                    return false;
            }
        }
    }
}

/**
 * Manage change event
 * @param {Event} e
 */
function changeHandler(e) {
    unsavedChanges = true;
}

/**
 * Manage submit event
 * @param {HTMLFormElement} form
 */
function submitHandler(form) {
    unsavedChanges = false;

    var xhr = new XMLHttpRequest();
    var fd = new FormData(form);

    xhr.addEventListener("load", function(event) {
        alert(event.target.responseText);
    });
    xhr.addEventListener("error", function(event) {
        alert('Oups! Quelque chose s\'est mal passé.');
    });
    xhr.open(form.method, form.action);
    xhr.send(fd);
}

/**
 * Manage a beforeUnloadEvent
 * @param {BeforeUnloadEvent} e
 */
function confirmExit(e) {
    if (unsavedChanges) {
        const url = pageurl + '/removeeditby';
        console.log('send quit editing')
        fetch(url, { method: 'POST' })
            .then(handleErrors)
            .then((response) => {
                console.log(response);
                setTimeout(() => {
                    myWorker.postMessage({ type: 'stillEditing' });
                }, 1500);
            });
        return 'You have unsaved changes, do you really want to leave this page?';
    } else {
        myWorker.postMessage({ type: 'quitEditing' });
    }
}

async function handleErrors(response) {
    if (!response.ok) {
        const data = await response.json();
        throw Error(`${response.statusText}. ${data.message}`);
    }
    return response.json();
}