From 44a8649d0ed7ad8cc432aa85814a1ffd9c3ea329 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Wed, 22 Jan 2025 15:39:34 +0100 Subject: [PATCH 1/5] =?UTF-8?q?Vytv=C3=A1=C5=99en=C3=AD=20korektur=20z=20j?= =?UTF-8?q?ednoho=20prototypu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- korektury/static/korektury/opraf.css | 3 + korektury/static/korektury/opraf.js | 70 +------ .../korekturovatko/__edit_komentar.html | 2 +- .../korektury/korekturovatko/__komentar.html | 95 +++++++-- .../korektury/korekturovatko/__oprava.html | 183 +++++++++++++----- .../korektury/korekturovatko/_main.html | 89 +++++++-- 6 files changed, 294 insertions(+), 148 deletions(-) diff --git a/korektury/static/korektury/opraf.css b/korektury/static/korektury/opraf.css index fd7b6c0a..523f7a96 100644 --- a/korektury/static/korektury/opraf.css +++ b/korektury/static/korektury/opraf.css @@ -1,5 +1,6 @@ .textzanaseni { display:none; } .textzastarale { display:none; } +#prekomentar, #preoprava, #prepointer { display: none; } body { &[data-status="pridavani"] { @@ -96,6 +97,8 @@ img{background:white;} } } + button img { pointer-events: none; } + .corr-header { overflow: auto; } diff --git a/korektury/static/korektury/opraf.js b/korektury/static/korektury/opraf.js index c2b55970..4bbe689f 100644 --- a/korektury/static/korektury/opraf.js +++ b/korektury/static/korektury/opraf.js @@ -1,7 +1,7 @@ function place_comments_one_div(img_id, comments) { var img = document.getElementById(img_id); - if( img == null ) { + if( img == null ) { return; } var par = img.parentNode; @@ -27,8 +27,13 @@ function place_comments_one_div(img_id, comments) var x = comments_sorted[c][1]; var y = comments_sorted[c][2]; - var el = document.getElementById(id); - var elp = document.getElementById(id + "-pointer"); + if (!(id in opravy)) { + console.log(id) + continue; + } + var op = opravy[id]; + var el = op.htmlElement; + var elp = op.pointer; if( el == null || elp == null ) { continue; @@ -67,63 +72,4 @@ function place_comments() { } } -// show comment form, when clicked to image -function img_click(element, ev) { - switch(document.body.dataset.status){ - case "zanaseni": - 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; - break; - } - - var dx, dy; - var par = element.parentNode; - if( ev.pageX != null ) { - dx = ev.pageX - par.offsetLeft; - dy = ev.pageY - par.offsetTop; - } else { //IE - dx = ev.offsetX; - dy = ev.offsetY; - } - var img_id = element.id; - return show_form(img_id, dx, dy, '', '', ''); -} -// hide or show text of correction -function toggle_visibility(oprava){ - oprava.dataset.opravazobrazit = oprava.dataset.opravazobrazit !== 'true'; - for (var i=0;i +
-
{{k.autor}}
-
- -
- {% csrf_token %} - - -
- - + +
+
-
{{k.text|linebreaks}}
+ +
{# {{k.text|linebreaks}} #}
+ + + + diff --git a/korektury/templates/korektury/korekturovatko/__oprava.html b/korektury/templates/korektury/korekturovatko/__oprava.html index 33a47844..8849b7d9 100644 --- a/korektury/templates/korektury/korekturovatko/__oprava.html +++ b/korektury/templates/korektury/korekturovatko/__oprava.html @@ -1,63 +1,148 @@ {% load static %} -
-
-
+ +
-
- {% for k in o.komentare %} - {% include "korektury/korekturovatko/__komentar.html" %} -
- {% endfor %} + {# {% for k in o.komentare %} {% include "korektury/korekturovatko/__komentar.html" %}
{% endfor %} #}
+
- - -
- {% csrf_token %} - + + + + + + + - - - - - - + + + - - - -
- +
+ + diff --git a/korektury/templates/korektury/korekturovatko/_main.html b/korektury/templates/korektury/korekturovatko/_main.html index ee22f38b..48259c19 100644 --- a/korektury/templates/korektury/korekturovatko/_main.html +++ b/korektury/templates/korektury/korekturovatko/_main.html @@ -3,10 +3,11 @@ {% for i in img_indexes %}
Strana {{ i|add:1 }}
@@ -14,34 +15,82 @@ {% endfor %} -{% for o in opravy %} - {% include "korektury/korekturovatko/__oprava.html" %} -{% endfor %} +{# {% for o in opravy %} {% include "korektury/korekturovatko/__oprava.html" %} {% endfor %} #} +{% include "korektury/korekturovatko/__oprava.html" %} +{% include "korektury/korekturovatko/__komentar.html" %} + + + + From e205ca52d32e148bf74e3ae6297a0e4f8147135e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Wed, 22 Jan 2025 18:38:28 +0100 Subject: [PATCH 2/5] =?UTF-8?q?Korektury=20na=C4=8Dten=C3=A9=20z=20API=20(?= =?UTF-8?q?m=C3=ADsto=20v=20templatu)=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- korektury/api/urls.py | 1 + korektury/api/views.py | 31 ++++++++++++ korektury/static/korektury/opraf.js | 31 ++++-------- .../korektury/korekturovatko/__oprava.html | 3 +- .../korektury/korekturovatko/_main.html | 50 +++++++------------ 5 files changed, 60 insertions(+), 56 deletions(-) diff --git a/korektury/api/urls.py b/korektury/api/urls.py index 6c1551ae..eb74d90f 100644 --- a/korektury/api/urls.py +++ b/korektury/api/urls.py @@ -5,4 +5,5 @@ from . import views urlpatterns = [ path('/stav', org_required(views.korektury_stav_view), name='korektury_api_pdf_stav'), path('oprava/stav', org_required(views.oprava_stav_view), name='korektury_api_oprava_stav'), + path('/opravy_a_komentare', org_required(views.opravy_a_komentare_view), name='korektury_api_opravy_a_komentare'), ] diff --git a/korektury/api/views.py b/korektury/api/views.py index 86149803..8bb610f0 100644 --- a/korektury/api/views.py +++ b/korektury/api/views.py @@ -1,5 +1,6 @@ from django.http import HttpResponseForbidden, JsonResponse from django.shortcuts import get_object_or_404 +from django.utils.html import linebreaks from django.views.decorators.csrf import csrf_exempt from rest_framework import serializers @@ -32,3 +33,33 @@ def oprava_stav_view(request, **kwargs): op.status = status op.save() return JsonResponse({'status': op.status}) + +class KomentarSerializer(serializers.ModelSerializer): + class Meta: + model = Komentar + fields = '__all__' + + def to_representation(self, instance): + ret = super().to_representation(instance) + ret["autor"] = str(instance.autor) + ret["text"] = linebreaks(ret["text"], autoescape=True) # Autora není třeba escapovat, ten se vkládá jako text. + return ret + +class OpravaSerializer(serializers.ModelSerializer): + class Meta: + model = Oprava + fields = '__all__' + + def to_representation(self, instance): + ret = super().to_representation(instance) + ret["komentare"] = [KomentarSerializer(komentar).data for komentar in instance.komentar_set.all()] + return ret + + # komentar_set = serializers.ListField(child=KomentarSerializer()) + +def opravy_a_komentare_view(request, pdf_id: int, **kwargs): + q = request.POST + + opravy = Oprava.objects.filter(pdf=pdf_id).all() + # Serializovat list je prý security vulnerability, tedy je přidán slovník pro bezpečnost + return JsonResponse({"context": [OpravaSerializer(oprava).data for oprava in opravy]}) diff --git a/korektury/static/korektury/opraf.js b/korektury/static/korektury/opraf.js index 4bbe689f..6b59b22e 100644 --- a/korektury/static/korektury/opraf.js +++ b/korektury/static/korektury/opraf.js @@ -1,6 +1,6 @@ function place_comments_one_div(img_id, comments) { - var img = document.getElementById(img_id); + var img = document.getElementById("img-"+img_id); if( img == null ) { return; } @@ -13,27 +13,14 @@ function place_comments_one_div(img_id, comments) var bott_max = 0; var comments_sorted = comments.sort(function (a,b) { - return a[2] - b[2]; - //pokus o hezci kladeni poiteru, ale nic moc - if( a[3] < b[3] ) { - return (a[2] + pointer_min_h)- b[2]; - } else { - return (a[2] - pointer_min_h)- b[2]; - } + return a.y - b.y; }); - for (c in comments_sorted) { - var id = comments_sorted[c][0]; - var x = comments_sorted[c][1]; - var y = comments_sorted[c][2]; - - if (!(id in opravy)) { - console.log(id) - continue; - } - var op = opravy[id]; - var el = op.htmlElement; - var elp = op.pointer; + for (const oprava of comments_sorted) { + const x = oprava.x; + const y = oprava.y; + const el = oprava.htmlElement; + const elp = oprava.pointer; if( el == null || elp == null ) { continue; @@ -67,8 +54,8 @@ function place_comments_one_div(img_id, comments) } function place_comments() { - for (var i=0; i < comments.length-1; i++) { - place_comments_one_div(comments[i][0], comments[i][1]) + for (let [img_id, opravy] of Object.entries(comments)) { + place_comments_one_div(img_id, opravy) } } diff --git a/korektury/templates/korektury/korekturovatko/__oprava.html b/korektury/templates/korektury/korekturovatko/__oprava.html index 8849b7d9..3da50e03 100644 --- a/korektury/templates/korektury/korekturovatko/__oprava.html +++ b/korektury/templates/korektury/korekturovatko/__oprava.html @@ -77,7 +77,7 @@ this.x = oprava_data['x']; this.y = oprava_data['y']; - this.img_id = oprava_data['img_id']; + this.img_id = oprava_data['strana']; this.update(oprava_data); @@ -91,6 +91,7 @@ this.htmlElement.addEventListener('mouseout', _ => this.pointer.dataset.highlight = 'false'); opravy[this.id] = this; + comments[this.img_id].push(this); } update(oprava_data) { diff --git a/korektury/templates/korektury/korekturovatko/_main.html b/korektury/templates/korektury/korekturovatko/_main.html index 48259c19..445a2a35 100644 --- a/korektury/templates/korektury/korekturovatko/_main.html +++ b/korektury/templates/korektury/korekturovatko/_main.html @@ -20,43 +20,27 @@ {% include "korektury/korekturovatko/__komentar.html" %} From c54e11f25a3b250f37d02ba1595e8676c0ff6280 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Wed, 22 Jan 2025 19:31:42 +0100 Subject: [PATCH 3/5] =?UTF-8?q?Uhlazen=C3=AD=20JavaScriptu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- korektury/static/korektury/opraf.css | 1 + korektury/static/korektury/opraf.js | 62 +++++++------------ .../korekturovatko/__edit_komentar.html | 2 +- .../korektury/korekturovatko/__oprava.html | 9 +-- 4 files changed, 27 insertions(+), 47 deletions(-) diff --git a/korektury/static/korektury/opraf.css b/korektury/static/korektury/opraf.css index 523f7a96..515415ca 100644 --- a/korektury/static/korektury/opraf.css +++ b/korektury/static/korektury/opraf.css @@ -80,6 +80,7 @@ img{background:white;} padding: 3px; border: 2px solid rgb(var(--rgb)); border-radius: 10px; + position: absolute; &:hover { border-width:3px; diff --git a/korektury/static/korektury/opraf.js b/korektury/static/korektury/opraf.js index 6b59b22e..5677deff 100644 --- a/korektury/static/korektury/opraf.js +++ b/korektury/static/korektury/opraf.js @@ -1,56 +1,40 @@ +const W_SKIP = 10; +const H_SKIP = 5; +const POINTER_MIN_H = 30; + function place_comments_one_div(img_id, comments) { - var img = document.getElementById("img-"+img_id); - if( img == null ) { - return; - } - var par = img.parentNode; - var w = img.clientWidth; - var h = img.clientHeight; - var w_skip = 10; - var h_skip = 5; - var pointer_min_h = 30; + const img = document.getElementById("img-"+img_id); + if( img == null ) return; + const comments_sorted = comments.sort((a, b) => a.y - b.y); - var bott_max = 0; - var comments_sorted = comments.sort(function (a,b) { - return a.y - b.y; + const par = img.parentNode; + const w = img.clientWidth; - }); + let bott_max = 0; for (const oprava of comments_sorted) { const x = oprava.x; const y = oprava.y; - const el = oprava.htmlElement; - const elp = oprava.pointer; + const htmlElement = oprava.htmlElement; + const pointer = oprava.pointer; - if( el == null || elp == null ) { - continue; - } + par.appendChild(pointer); + par.appendChild(htmlElement); - par.appendChild(elp); - par.appendChild(el); + const delta_y = (y > bott_max) ? 0: bott_max - y + H_SKIP; - var delta_y = (y > bott_max) ? 0: bott_max - y + h_skip; + pointer.style.left = x; + pointer.style.top = y; + pointer.style.width = w - x + W_SKIP; + pointer.style.height = POINTER_MIN_H + delta_y; - elp.style.left = x; - elp.style.top = y ; - elp.style.width = w - x + w_skip; - elp.style.height = pointer_min_h + delta_y; + htmlElement.style.left = w + W_SKIP; + htmlElement.style.top = y + delta_y; - el.pointer = elp; - el.img_id = img_id; - el.x = x - el.y = y - el.style.position = 'absolute'; - el.style.left = w + w_skip; - el.style.top = y + delta_y; - - var bott = el.offsetTop + el.offsetHeight; - bott_max = ( bott_max > bott ) ? bott_max : bott; + bott_max = Math.max(bott_max, htmlElement.offsetTop + htmlElement.offsetHeight); } - if( par.offsetHeight < bott_max ) { - par.style.height = bott_max; - } + if (par.offsetHeight < bott_max) par.style.height = bott_max; } function place_comments() { diff --git a/korektury/templates/korektury/korekturovatko/__edit_komentar.html b/korektury/templates/korektury/korekturovatko/__edit_komentar.html index 9de1d519..8d5b1771 100644 --- a/korektury/templates/korektury/korekturovatko/__edit_komentar.html +++ b/korektury/templates/korektury/korekturovatko/__edit_komentar.html @@ -38,7 +38,7 @@ //fill up comment form and show him function show_form(img_id, dx, dy, id, text, action) { - var img = document.getElementById("img-" + img_id); + const img = document.getElementById("img-" + img_id); if (commform._div.style.display !== 'none' && commform._text.value !== "" && !confirm("Zavřít předchozí okénko přidávání korektury / editace komentáře?")) return 1; diff --git a/korektury/templates/korektury/korekturovatko/__oprava.html b/korektury/templates/korektury/korekturovatko/__oprava.html index 3da50e03..6f0eb8ed 100644 --- a/korektury/templates/korektury/korekturovatko/__oprava.html +++ b/korektury/templates/korektury/korekturovatko/__oprava.html @@ -91,7 +91,7 @@ this.htmlElement.addEventListener('mouseout', _ => this.pointer.dataset.highlight = 'false'); opravy[this.id] = this; - comments[this.img_id].push(this); + if (this.img_id in comments) comments[this.img_id].push(this); else alert("Někdo korekturoval stranu, která neexistuje. Dejte vědět webařům :)"); } update(oprava_data) { @@ -116,9 +116,7 @@ #toggle_visibility(){ this.zobrazit = !this.zobrazit; this.htmlElement.dataset.opravazobrazit = String(this.zobrazit); - for (let i=0;i { if (!response.ok) {alert('Něco se nepovedlo:' + response.statusText);} From f369110cd3b4161b7019176733374a4628bcf41f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Wed, 22 Jan 2025 19:36:44 +0100 Subject: [PATCH 4/5] =?UTF-8?q?Str=C3=A1nky=20PDF=20zvl=C3=A1=C5=A1=C5=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../korektury/korekturovatko/__stranky.html | 50 ++++++++++++++++++ .../korektury/korekturovatko/_main.html | 51 +------------------ 2 files changed, 51 insertions(+), 50 deletions(-) create mode 100644 korektury/templates/korektury/korekturovatko/__stranky.html diff --git a/korektury/templates/korektury/korekturovatko/__stranky.html b/korektury/templates/korektury/korekturovatko/__stranky.html new file mode 100644 index 00000000..b6f9932b --- /dev/null +++ b/korektury/templates/korektury/korekturovatko/__stranky.html @@ -0,0 +1,50 @@ +{% for i in img_indexes %} +
+ Strana {{ i|add:1 }} +
+ +
+{% endfor %} + + diff --git a/korektury/templates/korektury/korekturovatko/_main.html b/korektury/templates/korektury/korekturovatko/_main.html index 445a2a35..adb98c93 100644 --- a/korektury/templates/korektury/korekturovatko/_main.html +++ b/korektury/templates/korektury/korekturovatko/_main.html @@ -1,31 +1,12 @@ {% include "korektury/korekturovatko/__edit_komentar.html" %} -{% for i in img_indexes %} -
- Strana {{ i|add:1 }} -
- -
-{% endfor %} - +{% include "korektury/korekturovatko/__stranky.html" %} {# {% for o in opravy %} {% include "korektury/korekturovatko/__oprava.html" %} {% endfor %} #} {% include "korektury/korekturovatko/__oprava.html" %} {% include "korektury/korekturovatko/__komentar.html" %} - - From 0af99d4f3ebed0ef71d60cfebbffe6c05d1ac7ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Wed, 22 Jan 2025 20:23:12 +0100 Subject: [PATCH 5/5] =?UTF-8?q?Aktualizace=20v=C5=A1ech=20koment=C3=A1?= =?UTF-8?q?=C5=99=C5=AF=20jako=20funkce=20(a=20aktualizace,=20ne=20vytvo?= =?UTF-8?q?=C5=99en=C3=AD)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../korektury/korekturovatko/__oprava.html | 5 +-- .../korektury/korekturovatko/_main.html | 35 ++++++++++++------- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/korektury/templates/korektury/korekturovatko/__oprava.html b/korektury/templates/korektury/korekturovatko/__oprava.html index 6f0eb8ed..442aae06 100644 --- a/korektury/templates/korektury/korekturovatko/__oprava.html +++ b/korektury/templates/korektury/korekturovatko/__oprava.html @@ -58,8 +58,8 @@ class Oprava { static update_or_create(oprava_data) { const id = oprava_data['id']; - if (id in opravy) opravy[id].update(oprava_data); - else new Oprava(oprava_data); + if (id in opravy) return opravy[id].update(oprava_data); + else return new Oprava(oprava_data); } #komentare; @@ -97,6 +97,7 @@ update(oprava_data) { {# this.oprava_data = oprava_data; #} this.set_status(oprava_data['status']); + return this; }; set_status(status) { diff --git a/korektury/templates/korektury/korekturovatko/_main.html b/korektury/templates/korektury/korekturovatko/_main.html index adb98c93..25ed71fb 100644 --- a/korektury/templates/korektury/korekturovatko/_main.html +++ b/korektury/templates/korektury/korekturovatko/_main.html @@ -7,21 +7,30 @@ {% include "korektury/korekturovatko/__komentar.html" %}