Zobjektizování (v JS) strany
This commit is contained in:
parent
b3ac4c4801
commit
c4679fe261
5 changed files with 95 additions and 84 deletions
korektury/templates/korektury/korekturovatko/moduly
|
@ -38,8 +38,9 @@ Nemusíš mačkat, pokud ti stačí, že se korektury aktualizují samy každé
|
|||
|
||||
function dalsi_nebo_predchozi_korektura(dalsi=true, stav=null) {
|
||||
let predchozi = null;
|
||||
for (let [_, korektury] of Object.entries(korektury_na_strankach)) {
|
||||
for (const korektura of korektury) {
|
||||
for (const strana of setrizene_strany) {
|
||||
// strana.setrid_korektury(); // Nemělo by být potřeba, protože se volá vždy, když se renderují korektury.
|
||||
for (const korektura of strana.korektury) {
|
||||
if (stav == null || korektura.stav === stav) {
|
||||
const y = korektura.htmlElement.getBoundingClientRect().y;
|
||||
if (y >= -1) {
|
||||
|
|
|
@ -48,26 +48,25 @@
|
|||
schovej() { this.div.style.display = 'none'; }
|
||||
|
||||
// zobrazí korekturovací formulář
|
||||
_zobraz(img_id, x, y) {
|
||||
_zobraz(strana, x, y) {
|
||||
this.odesilaci_button.disabled = false;
|
||||
this.div.style.display = 'block';
|
||||
this.div.style.left = x;
|
||||
this.div.style.top = y;
|
||||
|
||||
const img = document.getElementById("img-" + img_id);
|
||||
img.parentNode.appendChild(korekturovaci_formular.div);
|
||||
strana.htmlElement_div.appendChild(korekturovaci_formular.div);
|
||||
|
||||
this.text.focus();
|
||||
}
|
||||
|
||||
// fill up comment form and show him
|
||||
zobraz(img_id, x, y, text, korektura_id=-1, komentar_id=-1) {
|
||||
zobraz(strana, x, y, text, korektura_id=-1, komentar_id=-1) {
|
||||
if (this.div.style.display !== 'none' && this.text.value !== "" && !confirm("Zavřít předchozí okénko přidávání korektury / editace komentáře?")) return;
|
||||
|
||||
// set hidden values
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.imgID = img_id;
|
||||
this.strana = strana;
|
||||
this.korektura_id = korektura_id;
|
||||
this.komentar_id = komentar_id;
|
||||
this.text.value = text;
|
||||
|
@ -83,7 +82,7 @@
|
|||
tag.dataset.vybran = String(korektura.tagy.has(parseInt(tag.value)));
|
||||
}
|
||||
|
||||
this._zobraz(img_id, x, y);
|
||||
this._zobraz(strana, x, y);
|
||||
}
|
||||
|
||||
odesli_formular() {
|
||||
|
@ -91,7 +90,7 @@
|
|||
const data = new FormData(CSRF_FORM);
|
||||
data.append('x', this.x);
|
||||
data.append('y', this.y);
|
||||
data.append('img_id', this.imgID);
|
||||
data.append('img_id', this.strana.id);
|
||||
data.append('oprava_id', this.korektura_id);
|
||||
data.append('komentar_id', this.komentar_id);
|
||||
|
||||
|
|
|
@ -81,7 +81,7 @@
|
|||
|
||||
// Ukaž formulář na editaci komentáře (když je zmáčknuto „uprav-komentar“)
|
||||
#uprav_komentar() {
|
||||
return korekturovaci_formular.zobraz(this.korektura.img_id, this.korektura.x, this.korektura.y, this.#text.textContent, this.korektura.id, this.id);
|
||||
return korekturovaci_formular.zobraz(this.korektura.strana, this.korektura.x, this.korektura.y, this.#text.textContent, this.korektura.id, this.id);
|
||||
}
|
||||
|
||||
// Smaž komentář (když je zmáčknuto „smaz-komentar“)
|
||||
|
|
|
@ -71,7 +71,7 @@
|
|||
|
||||
#komentare; #tagy;
|
||||
htmlElement; pointer;
|
||||
id; x; y; img_id; stav; sbalena = false; {# korektura_data; #}
|
||||
id; x; y; strana; stav; sbalena = false; {# korektura_data; #}
|
||||
tagy;
|
||||
|
||||
constructor(korektura_data) {
|
||||
|
@ -86,7 +86,6 @@
|
|||
|
||||
this.x = korektura_data['x'];
|
||||
this.y = korektura_data['y'];
|
||||
this.img_id = korektura_data['strana'];
|
||||
|
||||
this.aktualizuj(korektura_data);
|
||||
|
||||
|
@ -102,8 +101,12 @@
|
|||
this.htmlElement.addEventListener('mouseover', _ => this.pointer.dataset.hover = 'true');
|
||||
this.htmlElement.addEventListener('mouseout', _ => this.pointer.dataset.hover = 'false');
|
||||
|
||||
const cislo_strany = korektura_data['strana'];
|
||||
if (cislo_strany in strany) {
|
||||
this.strana = strany[cislo_strany];
|
||||
this.strana.korektury.push(this);
|
||||
} else alert("Někdo korekturoval stranu, která neexistuje. Dejte vědět webařům :)");
|
||||
korektury[this.id] = this;
|
||||
if (this.img_id in korektury_na_strankach) korektury_na_strankach[this.img_id].push(this); else alert("Někdo korekturoval stranu, která neexistuje. Dejte vědět webařům :)");
|
||||
}
|
||||
|
||||
aktualizuj(korektura_data) {
|
||||
|
@ -143,7 +146,7 @@
|
|||
}
|
||||
|
||||
// Ukaž komentovací formulář (když je zmáčknuto komentovat)
|
||||
#komentuj() { korekturovaci_formular.zobraz(this.img_id, this.x, this.y, "", this.id); }
|
||||
#komentuj() { korekturovaci_formular.zobraz(this.strana, this.x, this.y, "", this.id); }
|
||||
|
||||
#zmen_stav_korektury(event) {
|
||||
const data = new FormData(CSRF_FORM);
|
||||
|
@ -178,57 +181,11 @@
|
|||
}
|
||||
|
||||
#smaz_pouze_na_strance() {
|
||||
korektury_na_strankach[this.img_id].splice(korektury_na_strankach[this.img_id].indexOf(this), 1);
|
||||
this.strana.korektury.splice(this.strana.korektury.indexOf(this), 1);
|
||||
delete korektury[this.id];
|
||||
for (const komentar of Object.values(komentare)) if (komentar.korektura === this) komentar.smaz_pouze_na_strance();
|
||||
this.htmlElement.remove();
|
||||
this.pointer.remove();
|
||||
}
|
||||
}
|
||||
|
||||
// Umisťování korektur
|
||||
const HORIZONTALNI_MEZERA = 10;
|
||||
const VERTIKALNI_MEZERA = 5;
|
||||
const MINIMALNI_VYSKA_POINTERU = 30;
|
||||
|
||||
function umisti_korektury_na_jedne_strance(strana, korektury)
|
||||
{
|
||||
const strana_img = document.getElementById("img-"+strana);
|
||||
if( strana_img == null ) return;
|
||||
const setridene_korektury = korektury.sort((a, b) => a.y - b.y);
|
||||
|
||||
const img_div = strana_img.parentNode;
|
||||
const w = strana_img.clientWidth;
|
||||
|
||||
let spodek_posledni_korektury = 0;
|
||||
for (const korektura of setridene_korektury) {
|
||||
const x = korektura.x;
|
||||
const y = korektura.y;
|
||||
const htmlElement = korektura.htmlElement;
|
||||
const pointer = korektura.pointer;
|
||||
|
||||
img_div.appendChild(pointer);
|
||||
img_div.appendChild(htmlElement);
|
||||
|
||||
const delta_y = (y > spodek_posledni_korektury) ? 0: spodek_posledni_korektury - y + VERTIKALNI_MEZERA;
|
||||
|
||||
pointer.style.left = x;
|
||||
pointer.style.top = y;
|
||||
pointer.style.width = w - x + HORIZONTALNI_MEZERA;
|
||||
pointer.style.height = MINIMALNI_VYSKA_POINTERU + delta_y;
|
||||
|
||||
htmlElement.style.left = w + HORIZONTALNI_MEZERA;
|
||||
htmlElement.style.top = y + delta_y;
|
||||
|
||||
spodek_posledni_korektury = Math.max(spodek_posledni_korektury, htmlElement.offsetTop + htmlElement.offsetHeight + VERTIKALNI_MEZERA); // FIXME nemám páru, proč +H_SKIP funguje, ale opravuje to bug, že nově vytvořené korektury za sebou neměly mezeru
|
||||
}
|
||||
|
||||
if (img_div.offsetHeight < spodek_posledni_korektury) img_div.style.height = spodek_posledni_korektury;
|
||||
}
|
||||
|
||||
function umisti_korektury() {
|
||||
for (let [img_id, korektury] of Object.entries(korektury_na_strankach)) {
|
||||
umisti_korektury_na_jedne_strance(img_id, korektury)
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
|
|
@ -13,42 +13,96 @@
|
|||
{% endfor %}
|
||||
|
||||
<script>
|
||||
// Mapování stránka -> korektury
|
||||
/**
|
||||
* @type {Object.<number, Array<Korektura>>}
|
||||
*/
|
||||
const korektury_na_strankach = {
|
||||
{% for s in img_indexes %}
|
||||
{{s}}: []{% if not forloop.last %},{% endif %}
|
||||
{% endfor %}
|
||||
};
|
||||
// Pro umisťování korektur
|
||||
const HORIZONTALNI_MEZERA = 10;
|
||||
const VERTIKALNI_MEZERA = 5;
|
||||
const MINIMALNI_VYSKA_POINTERU = 30;
|
||||
|
||||
// show comment form, when clicked to image
|
||||
for (const strana_img of document.getElementsByClassName('strana')) {
|
||||
strana_img.addEventListener('click', event => {
|
||||
/**
|
||||
* @type {Object.<int, Strana>}
|
||||
*/
|
||||
const strany = {};
|
||||
|
||||
class Strana {
|
||||
htmlElement_img; htmlElement_div;
|
||||
id; korektury;
|
||||
|
||||
constructor(htmlElement_img) {
|
||||
this.htmlElement_img = htmlElement_img;
|
||||
this.htmlElement_div = this.htmlElement_img.parentNode;
|
||||
|
||||
this.id = parseInt(this.htmlElement_img.id.substring(4));
|
||||
this.korektury = []
|
||||
|
||||
this.htmlElement_img.addEventListener('click', event => this.#korekturuj(event));
|
||||
|
||||
strany[this.id] = this;
|
||||
}
|
||||
|
||||
#korekturuj(event) {
|
||||
switch (document.body.dataset.stav_pdf) {
|
||||
case 'zanaseni':
|
||||
if (!confirm('Právě jsou zanášeny korektury, opravdu chcete přidat novou?'))
|
||||
return;
|
||||
if (!confirm('Právě jsou zanášeny korektury, opravdu chcete přidat novou?')) return;
|
||||
break;
|
||||
case 'zastarale':
|
||||
if (!confirm('Toto PDF je již zastaralé, opravdu chcete vytvořit korekturu?'))
|
||||
return;
|
||||
if (!confirm('Toto PDF je již zastaralé, opravdu chcete vytvořit korekturu?')) return;
|
||||
break;
|
||||
}
|
||||
|
||||
let dx, dy;
|
||||
const strana_div = strana_img.parentNode;
|
||||
if (event.pageX != null) {
|
||||
dx = event.pageX - strana_div.offsetLeft;
|
||||
dy = event.pageY - strana_div.offsetTop;
|
||||
dx = event.pageX - this.htmlElement_div.offsetLeft;
|
||||
dy = event.pageY - this.htmlElement_div.offsetTop;
|
||||
} else { //IE a další
|
||||
dx = event.offsetX;
|
||||
dy = event.offsetY;
|
||||
}
|
||||
const img_id = strana_img.id.substring(4);
|
||||
korekturovaci_formular.zobraz(img_id, dx, dy, '');
|
||||
console.log("Pro přesun korektur: strana = " + img_id + ", x = " + dx + ", y = " + dy);
|
||||
});
|
||||
korekturovaci_formular.zobraz(this, dx, dy, '');
|
||||
console.log("Pro přesun korektur: strana = " + this.id + ", x = " + dx + ", y = " + dy);
|
||||
}
|
||||
|
||||
setrid_korektury() { this.korektury.sort((a, b) => a.y - b.y); }
|
||||
|
||||
umisti_korektury() {
|
||||
this.setrid_korektury()
|
||||
|
||||
const w = this.htmlElement_img.clientWidth;
|
||||
|
||||
let spodek_posledni_korektury = 0;
|
||||
for (const korektura of this.korektury) {
|
||||
const x = korektura.x;
|
||||
const y = korektura.y;
|
||||
const pointer = korektura.pointer;
|
||||
|
||||
this.htmlElement_div.appendChild(pointer);
|
||||
this.htmlElement_div.appendChild(korektura.htmlElement);
|
||||
|
||||
const delta_y = (y > spodek_posledni_korektury) ? 0: spodek_posledni_korektury - y + VERTIKALNI_MEZERA;
|
||||
|
||||
pointer.style.left = x;
|
||||
pointer.style.top = y;
|
||||
pointer.style.width = w - x + HORIZONTALNI_MEZERA;
|
||||
pointer.style.height = MINIMALNI_VYSKA_POINTERU + delta_y;
|
||||
|
||||
korektura.htmlElement.style.left = w + HORIZONTALNI_MEZERA;
|
||||
korektura.htmlElement.style.top = y + delta_y;
|
||||
|
||||
spodek_posledni_korektury = Math.max(
|
||||
spodek_posledni_korektury,
|
||||
korektura.htmlElement.offsetTop + korektura.htmlElement.offsetHeight + VERTIKALNI_MEZERA
|
||||
); // FIXME nemám páru, proč +VERTIKALNI_MEZERA funguje, ale opravuje to bug, že nově vytvořené korektury za sebou neměly mezeru
|
||||
}
|
||||
|
||||
if (this.htmlElement_div.offsetHeight < spodek_posledni_korektury)
|
||||
this.htmlElement_div.style.height = spodek_posledni_korektury;
|
||||
}
|
||||
}
|
||||
|
||||
for (const strana_img of document.getElementsByClassName('strana'))
|
||||
new Strana(strana_img);
|
||||
|
||||
const setrizene_strany = Object.values(strany);
|
||||
setrizene_strany.sort((a, b) => a.htmlElement_img.offsetTop - b.htmlElement_img.offsetTop);
|
||||
|
||||
function umisti_korektury() { for (const strana of Object.values(strany)) strana.umisti_korektury(); }
|
||||
</script>
|
||||
|
|
Loading…
Reference in a new issue