Merge remote-tracking branch 'origin/korekturovatko'
This commit is contained in:
		
						commit
						2d6ad5f369
					
				
					 10 changed files with 89 additions and 53 deletions
				
			
		|  | @ -101,9 +101,11 @@ def opravy_a_komentare_view(request, pdf_id: int, **kwargs): | ||||||
| 
 | 
 | ||||||
| 		if komentar_id != -1: | 		if komentar_id != -1: | ||||||
| 			komentar = get_object_or_404(Komentar, id=komentar_id) | 			komentar = get_object_or_404(Komentar, id=komentar_id) | ||||||
| 			komentar.text = text | 			if komentar.text != text: | ||||||
| 			komentar.autor = autor | 				komentar.text = text | ||||||
| 			komentar.save() | 				komentar.autor = autor | ||||||
|  | 				komentar.save() | ||||||
|  | 			oprava = komentar.oprava | ||||||
| 		else: | 		else: | ||||||
| 			if oprava_id != -1: | 			if oprava_id != -1: | ||||||
| 				oprava = get_object_or_404(Oprava, id=oprava_id) | 				oprava = get_object_or_404(Oprava, id=oprava_id) | ||||||
|  | @ -116,13 +118,16 @@ def opravy_a_komentare_view(request, pdf_id: int, **kwargs): | ||||||
| 					y=y, | 					y=y, | ||||||
| 				) | 				) | ||||||
| 
 | 
 | ||||||
| 				tagy_raw = q.get('tagy') |  | ||||||
| 				if tagy_raw != "": |  | ||||||
| 					tagy = list(map(int, tagy_raw.split(","))) |  | ||||||
| 					oprava.tagy.add(*KorekturaTag.objects.filter(id__in=tagy)) |  | ||||||
| 			Komentar.objects.create(oprava=oprava, autor=autor, text=text) | 			Komentar.objects.create(oprava=oprava, autor=autor, text=text) | ||||||
| 			send_email_notification_komentar(oprava, autor, request) | 			send_email_notification_komentar(oprava, autor, request) | ||||||
| 
 | 
 | ||||||
|  | 		tagy_raw = q.get('tagy') | ||||||
|  | 		if tagy_raw is not None: | ||||||
|  | 			oprava.tagy.clear() | ||||||
|  | 			if tagy_raw != "": | ||||||
|  | 				tagy = list(map(int, tagy_raw.split(","))) | ||||||
|  | 				oprava.tagy.add(*KorekturaTag.objects.filter(id__in=tagy)) | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 	opravy = Oprava.objects.filter(pdf=pdf_id).all() | 	opravy = Oprava.objects.filter(pdf=pdf_id).all() | ||||||
| 	# Serializovat list je prý security vulnerability, tedy je přidán slovník pro bezpečnost | 	# Serializovat list je prý security vulnerability, tedy je přidán slovník pro bezpečnost | ||||||
|  |  | ||||||
							
								
								
									
										10
									
								
								korektury/static/korektury/imgs/reload.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								korektury/static/korektury/imgs/reload.svg
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | ||||||
|  | <svg id="icon-reload" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 120 120" xml:space="preserve"> | ||||||
|  | <g> | ||||||
|  |         <path d="M60,95.5c-19.575,0-35.5-15.926-35.5-35.5c0-19.575,15.925-35.5,35.5-35.5c13.62,0,25.467,7.714,31.418,19h22.627 | ||||||
|  |                 C106.984,20.347,85.462,3.5,60,3.5C28.796,3.5,3.5,28.796,3.5,60c0,31.203,25.296,56.5,56.5,56.5 | ||||||
|  |                 c16.264,0,30.911-6.882,41.221-17.88L85.889,84.255C79.406,91.168,70.201,95.5,60,95.5z"/> | ||||||
|  | </g> | ||||||
|  |     <line fill="none" x1="120" y1="0" x2="120" y2="45.336"/> | ||||||
|  |     <line fill="none" x1="91.418" y1="43.5" x2="114.045" y2="43.5"/> | ||||||
|  |     <polygon points="120,21.832 119.992,68.842 74.827,55.811 "/> | ||||||
|  | </svg> | ||||||
| After Width: | Height: | Size: 712 B | 
|  | @ -20,6 +20,11 @@ body { | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #sbal-korektury, #rozbal-korektury { | ||||||
|  | 	float: right; | ||||||
|  | 	margin-left: 4pt; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| img{background:white;} | img{background:white;} | ||||||
| 
 | 
 | ||||||
| /* Barvy korektur */ | /* Barvy korektur */ | ||||||
|  | @ -55,31 +60,6 @@ img{background:white;} | ||||||
| 	.toggle-button { transform: rotate(180deg); } | 	.toggle-button { transform: rotate(180deg); } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Tlačítko na aktualizaci */ |  | ||||||
| 
 |  | ||||||
| #korektury-aktualizace { |  | ||||||
| 	position: absolute; |  | ||||||
| 	right: 10px; |  | ||||||
| 	top: 10px; |  | ||||||
| 
 |  | ||||||
| 	border-radius: 10px; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 	/* copy-paste .button */ |  | ||||||
| 	margin: 10px 0 10px 0; |  | ||||||
| 	padding: 4px 0; /*vertikální centování textu*/ |  | ||||||
| 	text-align: center; |  | ||||||
| 	background-color: #e84e10; |  | ||||||
| 	color: #fffbf6; |  | ||||||
| 	font-size: 150%; |  | ||||||
| 	font-weight: bold; |  | ||||||
| 	font-variant: small-caps; |  | ||||||
| 	filter: drop-shadow(0px 5px 5px rgba(0, 0, 0, 0.4)); |  | ||||||
| 
 |  | ||||||
| 	&:hover { |  | ||||||
| 		background-color: #df490e; |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 | 
 | ||||||
| /* Čára od textu k místu korektury */ | /* Čára od textu k místu korektury */ | ||||||
| .pointer{  | .pointer{  | ||||||
|  | @ -168,7 +148,8 @@ form { | ||||||
| 	margin: 2px; | 	margin: 2px; | ||||||
| 	padding: 2px; | 	padding: 2px; | ||||||
| 
 | 
 | ||||||
| 	&[data-selected="false"] { opacity: 0.7; } | 	&[data-selected="false"] { background: unset !important; } | ||||||
|  | 	/*&[data-selected="true"] { border-color: unset !important; }*/ | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Šipky na posouvání korektur */ | /* Šipky na posouvání korektur */ | ||||||
|  | @ -176,6 +157,7 @@ form { | ||||||
| 	position: fixed; | 	position: fixed; | ||||||
| 	bottom: 5px; | 	bottom: 5px; | ||||||
| 	left: 5px; | 	left: 5px; | ||||||
|  | 	opacity: 50%; | ||||||
| 
 | 
 | ||||||
| 	button, img { | 	button, img { | ||||||
| 		border: 1px solid white; | 		border: 1px solid white; | ||||||
|  | @ -203,6 +185,11 @@ form { | ||||||
| 	#predchozi-korektura-k-zaneseni, #dalsi-korektura-k-zaneseni { | 	#predchozi-korektura-k-zaneseni, #dalsi-korektura-k-zaneseni { | ||||||
| 		background-color: #00FF00; | 		background-color: #00FF00; | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
|  | 	/* Tlačítko na aktualizaci */ | ||||||
|  | 	#korektury-aktualizace { | ||||||
|  | 		background-color: #e84e10; | ||||||
|  | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -20,6 +20,12 @@ | ||||||
|   <button type='button' id="dalsi-korektura-k-zaneseni" title='Další korektura k zaneseni'> |   <button type='button' id="dalsi-korektura-k-zaneseni" title='Další korektura k zaneseni'> | ||||||
|     <img class='toggle-button' src='{% static "korektury/imgs/hide.png" %}' alt='⬇' style="transform: rotate(180deg);"/> |     <img class='toggle-button' src='{% static "korektury/imgs/hide.png" %}' alt='⬇' style="transform: rotate(180deg);"/> | ||||||
|   </button> |   </button> | ||||||
|  |   <button type='button' id='korektury-aktualizace' | ||||||
|  |           title='Aktualizuj korektury | ||||||
|  | Nemusíš mačkat, pokud ti stačí, že se korektury aktualizují samy každé 2 minuty a při každém přidání korektury/komentáře.' | ||||||
|  |   > | ||||||
|  |     <img class='toggle-button' src='{% static "korektury/imgs/reload.svg" %}' alt='↻' style="width: 15px"/> | ||||||
|  |   </button> | ||||||
| </div> | </div> | ||||||
| 
 | 
 | ||||||
| <script> | <script> | ||||||
|  | @ -64,4 +70,7 @@ | ||||||
|   dalsi_k_o.addEventListener('click', _ => { dalsi_nebo_predchozi_korektura(true, "k_oprave") }); |   dalsi_k_o.addEventListener('click', _ => { dalsi_nebo_predchozi_korektura(true, "k_oprave") }); | ||||||
|   predchozi_k_z.addEventListener('click', _ => { dalsi_nebo_predchozi_korektura(false, "k_zaneseni") }); |   predchozi_k_z.addEventListener('click', _ => { dalsi_nebo_predchozi_korektura(false, "k_zaneseni") }); | ||||||
|   dalsi_k_z.addEventListener('click', _ => { dalsi_nebo_predchozi_korektura(true, "k_zaneseni") }); |   dalsi_k_z.addEventListener('click', _ => { dalsi_nebo_predchozi_korektura(true, "k_zaneseni") }); | ||||||
|  | 
 | ||||||
|  |   // FIXME není mi jasné, zda v {} nemá být `cache: "no-store"`, aby prohlížeč necachoval GET. | ||||||
|  |   document.getElementById("korektury-aktualizace").addEventListener("click", _ => update_all({}, false)); | ||||||
| </script> | </script> | ||||||
|  |  | ||||||
|  | @ -5,11 +5,12 @@ | ||||||
|   <br/> |   <br/> | ||||||
|   <textarea id="commform-text" cols=40 rows=10 name="txt"></textarea> |   <textarea id="commform-text" cols=40 rows=10 name="txt"></textarea> | ||||||
|   <br/> |   <br/> | ||||||
|   <span id="commform-tagy"> |   <div id="commform-tagy-info">Úprava tagů celé korektury:</div> | ||||||
|  |   <div id="commform-tagy"> | ||||||
|     {% for tag in tagy %} |     {% for tag in tagy %} | ||||||
|       <button type="button" class="korektury-tag" value="{{tag.id}}" data-selected="false" style="background: {{ tag.barva }};">{{tag.nazev}}</button> |       <button type="button" class="korektury-tag" value="{{tag.id}}" data-selected="false" style="background: {{ tag.barva }}; border-color: {{ tag.barva }};">{{tag.nazev}}</button> | ||||||
|     {% endfor %} |     {% endfor %} | ||||||
|   </span> |   </div> | ||||||
| </div> | </div> | ||||||
| 
 | 
 | ||||||
| <script> | <script> | ||||||
|  | @ -20,6 +21,7 @@ | ||||||
|       this.submit_button = document.getElementById('commform-submit'); |       this.submit_button = document.getElementById('commform-submit'); | ||||||
|       const close_button = document.getElementById('commform-close'); |       const close_button = document.getElementById('commform-close'); | ||||||
|       this.tagy = document.getElementById('commform-tagy'); |       this.tagy = document.getElementById('commform-tagy'); | ||||||
|  |       this.tagy_info = document.getElementById('commform-tagy-info'); | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|       // ctrl-enter submits form |       // ctrl-enter submits form | ||||||
|  | @ -71,8 +73,16 @@ | ||||||
|       this.text.value = text; |       this.text.value = text; | ||||||
| 
 | 
 | ||||||
|       // show form |       // show form | ||||||
|       if (oprava_id === -1 && komentar_id === -1) this.tagy.style.display = 'unset'; else this.tagy.style.display = 'none'; |       if (oprava_id === -1 && komentar_id === -1) { | ||||||
|       if (this.reset_tags_every_open) this.reset_tags(); |         if (this.reset_tags_every_open) this.reset_tags(); | ||||||
|  |         this.tagy_info.style.display = 'none'; | ||||||
|  |       } else { | ||||||
|  |         const oprava = opravy[oprava_id]; | ||||||
|  |         this.tagy_info.style.display = 'unset'; | ||||||
|  |         for (const tag of this.tagy.getElementsByTagName("button")) | ||||||
|  |           tag.dataset.selected = String(oprava.tagy.has(parseInt(tag.value))); | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|       this._show(img_id, x, y); |       this._show(img_id, x, y); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -84,13 +94,12 @@ | ||||||
|       data.append('img_id', this.imgID); |       data.append('img_id', this.imgID); | ||||||
|       data.append('oprava_id', this.oprava_id); |       data.append('oprava_id', this.oprava_id); | ||||||
|       data.append('komentar_id', this.komentar_id); |       data.append('komentar_id', this.komentar_id); | ||||||
|       if (this.oprava_id === -1 && this.komentar_id === -1) { | 
 | ||||||
|         const tagy = []; |       const tagy = []; | ||||||
|         for (const tag of this.tagy.getElementsByTagName("button")) { |       for (const tag of this.tagy.getElementsByTagName("button")) { | ||||||
|           if (tag.dataset.selected !== "false") tagy.push(tag.value); |         if (tag.dataset.selected !== "false") tagy.push(tag.value); | ||||||
|         } |  | ||||||
|         data.append('tagy', String(tagy)); |  | ||||||
|       } |       } | ||||||
|  |       data.append('tagy', String(tagy)); | ||||||
| 
 | 
 | ||||||
|       data.append('text', this.text.value); |       data.append('text', this.text.value); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -81,7 +81,7 @@ | ||||||
| 
 | 
 | ||||||
|     // show comment form when 'update-comment' button pressed |     // show comment form when 'update-comment' button pressed | ||||||
|     #update_comment() { |     #update_comment() { | ||||||
|       return commform.show(this.oprava.img_id, this.oprava.x, this.oprava.y, this.#text.textContent, -1, this.id); |       return commform.show(this.oprava.img_id, this.oprava.x, this.oprava.y, this.#text.textContent, this.oprava.id, this.id); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     #delete_comment() { |     #delete_comment() { | ||||||
|  |  | ||||||
|  | @ -72,6 +72,7 @@ | ||||||
|     #komentare; #tagy; |     #komentare; #tagy; | ||||||
|     htmlElement; pointer; |     htmlElement; pointer; | ||||||
|     id; x; y; img_id; status; zobrazit = true; {# oprava_data; #} |     id; x; y; img_id; status; zobrazit = true; {# oprava_data; #} | ||||||
|  |     tagy; | ||||||
| 
 | 
 | ||||||
|     constructor(oprava_data) { |     constructor(oprava_data) { | ||||||
|       this.htmlElement = preoprava.cloneNode(true); |       this.htmlElement = preoprava.cloneNode(true); | ||||||
|  | @ -109,7 +110,9 @@ | ||||||
|       {# this.oprava_data = oprava_data; #} |       {# this.oprava_data = oprava_data; #} | ||||||
|       this.set_status(oprava_data['status']); |       this.set_status(oprava_data['status']); | ||||||
|       this.#tagy.innerHTML = ""; |       this.#tagy.innerHTML = ""; | ||||||
|  |       this.tagy = new Set(); | ||||||
|       for (const tag of oprava_data["tagy"]) { |       for (const tag of oprava_data["tagy"]) { | ||||||
|  |         this.tagy.add(tag["id"]); | ||||||
|         const span = document.createElement("span"); |         const span = document.createElement("span"); | ||||||
|         span.innerHTML = tag["nazev"]; |         span.innerHTML = tag["nazev"]; | ||||||
|         span.classList.add("korektury-tag"); |         span.classList.add("korektury-tag"); | ||||||
|  | @ -131,9 +134,12 @@ | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|     // hide or show text of correction |     // hide or show text of correction | ||||||
|     #toggle_visibility(){ |     toggle_visibility() { | ||||||
|       this.zobrazit = !this.zobrazit; |       this.zobrazit = !this.zobrazit; | ||||||
|       this.htmlElement.dataset.opravazobrazit = String(this.zobrazit); |       this.htmlElement.dataset.opravazobrazit = String(this.zobrazit); | ||||||
|  |     } | ||||||
|  |     #toggle_visibility(){ | ||||||
|  |       this.toggle_visibility(); | ||||||
|       place_comments() |       place_comments() | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -8,8 +8,6 @@ | ||||||
| 
 | 
 | ||||||
| {% include "korektury/korekturovatko/__dalsi_korektura.html" %} | {% include "korektury/korekturovatko/__dalsi_korektura.html" %} | ||||||
| 
 | 
 | ||||||
| <button type="button" id="korektury-aktualizace">Aktualizuj korektury.</button> |  | ||||||
| 
 |  | ||||||
| <script> | <script> | ||||||
|   /** |   /** | ||||||
|    * |    * | ||||||
|  | @ -44,9 +42,6 @@ | ||||||
|     }); |     }); | ||||||
|   }); |   }); | ||||||
| 
 | 
 | ||||||
|   // FIXME není mi jasné, zda v {} nemá být `cache: "no-store"`, aby prohlížeč necachoval GET. |  | ||||||
|   document.getElementById("korektury-aktualizace").addEventListener("click", _ => update_all({}, false)); |  | ||||||
| 
 |  | ||||||
|   // FIXME není mi jasné, zda v {} nemá být `cache: "no-store"`, aby prohlížeč necachoval GET. |   // FIXME není mi jasné, zda v {} nemá být `cache: "no-store"`, aby prohlížeč necachoval GET. | ||||||
|   setInterval(() => update_all({}, false), 120000); // Každý dvě minuty fetchni korektury |   setInterval(() => update_all({}, false), 120000); // Každý dvě minuty fetchni korektury | ||||||
| </script> | </script> | ||||||
|  |  | ||||||
|  | @ -20,6 +20,10 @@ Zobrazit: | ||||||
|        onchange="toggle_corrections('k_zaneseni')" checked> |        onchange="toggle_corrections('k_zaneseni')" checked> | ||||||
| <label for="k_zaneseni_checkbox">K zanesení (<span id="k_zaneseni_pocet">↺</span>)</label> | <label for="k_zaneseni_checkbox">K zanesení (<span id="k_zaneseni_pocet">↺</span>)</label> | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | <button type="button" id="sbal-korektury">Sbal korektury</button> | ||||||
|  | <button type="button" id="rozbal-korektury">Rozbal korektury</button> | ||||||
|  | 
 | ||||||
| <hr/> | <hr/> | ||||||
| 
 | 
 | ||||||
| <script> | <script> | ||||||
|  | @ -65,4 +69,15 @@ Zobrazit: | ||||||
|     } |     } | ||||||
|     for (let [stav, pocet] of Object.entries(pocty_stavu)) spany_s_pocty_stavu[stav].innerText = pocet; |     for (let [stav, pocet] of Object.entries(pocty_stavu)) spany_s_pocty_stavu[stav].innerText = pocet; | ||||||
|   } |   } | ||||||
|  | 
 | ||||||
|  |   document.getElementById("sbal-korektury").addEventListener("click", () => { | ||||||
|  |     for (const oprava of Object.values(opravy)) | ||||||
|  |       if (oprava.zobrazit) oprava.toggle_visibility(); | ||||||
|  |     place_comments(); | ||||||
|  |   }) | ||||||
|  |   document.getElementById("rozbal-korektury").addEventListener("click", () => { | ||||||
|  |     for (const oprava of Object.values(opravy)) | ||||||
|  |       if (!oprava.zobrazit) oprava.toggle_visibility(); | ||||||
|  |     place_comments(); | ||||||
|  |   }) | ||||||
| </script> | </script> | ||||||
|  |  | ||||||
|  | @ -4,8 +4,8 @@ | ||||||
| <head> | <head> | ||||||
|   <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> |   <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> | ||||||
|   <link rel="stylesheet" title="opraf-css" type="text/css" media="screen, projection" href="{% static "korektury/opraf.css"%}?version=1" /> |   <link rel="stylesheet" title="opraf-css" type="text/css" media="screen, projection" href="{% static "korektury/opraf.css"%}?version=1" /> | ||||||
|   <link href="{% static 'css/rozliseni.css' %}?version=1" rel="stylesheet"> |   <link href="{% static 'css/rozliseni.css' %}?version=2" rel="stylesheet"> | ||||||
|   <script src="{% static "korektury/opraf.js"%}?version=1"></script> |   <script src="{% static "korektury/opraf.js"%}?version=2"></script> | ||||||
|   <title>Korektury {{korekturovanepdf.nazev}}</title> |   <title>Korektury {{korekturovanepdf.nazev}}</title> | ||||||
| </head> | </head> | ||||||
| <body class="{{ LOCAL_TEST_PROD }}web" data-status="{{ korekturovanepdf.status }}"> | <body class="{{ LOCAL_TEST_PROD }}web" data-status="{{ korekturovanepdf.status }}"> | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue