This commit is contained in:
vladislav 2026-09-04 05:10:12 -04:00
parent ad11573267
commit 1c77c40b39
Signed by: Vladislav
GPG Key ID: D97C9E5E4860EE45
39 changed files with 355 additions and 170 deletions

View File

@ -97,8 +97,10 @@ picture{cursor: zoom-in;}
</head> </head>
<body {% if request.cookies.zoom%}style="zoom: {{ request.cookies.zoom }}%"{%endif%} onload="adjustBodyStyle()"> <body {% if request.cookies.zoom%}style="zoom: {{ request.cookies.zoom }}%"{%endif%} onload="adjustBodyStyle()">
<script> <script>
// @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt Expat
function setSecureCookie(name, value, days = 7) {const date = new Date();date.setTime(date.getTime() + (days * 86400000));document.cookie = `${name}=${encodeURIComponent(value)}; expires=${date.toUTCString()}; path=/; SameSite=Strict; Secure`;} function setSecureCookie(name, value, days = 7) {const date = new Date();date.setTime(date.getTime() + (days * 86400000));document.cookie = `${name}=${encodeURIComponent(value)}; expires=${date.toUTCString()}; path=/; SameSite=Strict; Secure`;}
var userAgent = navigator.userAgent;var isFirefox = userAgent.indexOf("Firefox") !== -1;function isOldFirefox() {var match = userAgent.match(/Firefox\/(\d+)/);return match && parseInt(match[1], 10) < 126;};function iOS() {return ['iPad Simulator', 'iPhone Simulator', 'iPod Simulator', 'iPad', 'iPhone', 'iPod'].includes(navigator.platform) || (userAgent.includes("Mac") && "ontouchend" in document);};function adjustBodyStyle() {var body = document.body;var width;if (iOS()) {width = screen.width;} else {width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth || 360;};const zoom = (width < 700) ? width * 100 / 400 : (width < 900) ? width * 100 / 800 : width * 100 / 1600;if (isFirefox && isOldFirefox()) {body.style.MozTransform = `scale(${zoom}%)`;body.style.MozTransformOrigin = '0% 0%';body.style.width = (width < 901) ? '360px' : '1600px';body.style.position = 'absolute';};setSecureCookie("zoom", zoom, 7);body.style.zoom = `${zoom}%`;};adjustBodyStyle();window.addEventListener('resize', adjustBodyStyle, { passive: true }); var userAgent = navigator.userAgent;var isFirefox = userAgent.indexOf("Firefox") !== -1;function isOldFirefox() {var match = userAgent.match(/Firefox\/(\d+)/);return match && parseInt(match[1], 10) < 126;};function iOS() {return ['iPad Simulator', 'iPhone Simulator', 'iPod Simulator', 'iPad', 'iPhone', 'iPod'].includes(navigator.platform) || (userAgent.includes("Mac") && "ontouchend" in document);};function adjustBodyStyle() {var body = document.body;var width;if (iOS()) {width = screen.width;} else {width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth || 360;};const zoom = (width < 700) ? width * 100 / 400 : (width < 900) ? width * 100 / 800 : width * 100 / 1600;if (isFirefox && isOldFirefox()) {body.style.MozTransform = `scale(${zoom}%)`;body.style.MozTransformOrigin = '0% 0%';body.style.width = (width < 901) ? '360px' : '1600px';body.style.position = 'absolute';};setSecureCookie("zoom", zoom, 7);body.style.zoom = `${zoom}%`;};adjustBodyStyle();window.addEventListener('resize', adjustBodyStyle, { passive: true });
// @license-end
</script> </script>
{% block content %}{% endblock %} {% block content %}{% endblock %}
<div id="modal" class="modal" style="display: none;cursor: zoom-out;"> <div id="modal" class="modal" style="display: none;cursor: zoom-out;">
@ -111,6 +113,7 @@ var userAgent = navigator.userAgent;var isFirefox = userAgent.indexOf("Firefox")
</a> </a>
</div> </div>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
document.querySelectorAll('picture').forEach(picture => { document.querySelectorAll('picture').forEach(picture => {
picture.addEventListener('click', function() { picture.addEventListener('click', function() {
@ -144,14 +147,17 @@ var userAgent = navigator.userAgent;var isFirefox = userAgent.indexOf("Firefox")
}); });
}); });
function closeModalPic() {const modalImg = document.getElementById('modalImg');modalImg.src = '';document.getElementById('modal').style.display = 'none';} function closeModalPic() {const modalImg = document.getElementById('modalImg');modalImg.src = '';document.getElementById('modal').style.display = 'none';}
// @license-end
</script> </script>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
{% raw %} {% raw %}
function showToast(e={}){let{message:t="",status:a="info",duration:l=4e3}=e,n=document.querySelector(".toast-container");n||((n=document.createElement("div")).className="toast-container",document.body.appendChild(n));let s=document.createElement("div");s.className=`toast ${a}`;let d=document.createElement("div");d.className="accent";let c=document.createElement("div");c.className="toast-header";let i=document.createElement("div");i.textContent=t;let o=document.createElement("button");o.className="toast-close",o.innerHTML="✕",c.appendChild(i),c.appendChild(o),s.appendChild(d),s.appendChild(c),n.appendChild(s),requestAnimationFrame(()=>s.classList.add("show"));let r=!1,p=()=>{r||(r=!0,s.classList.remove("show"),setTimeout(()=>{s.parentNode&&s.parentNode.removeChild(s)},380))};return o.addEventListener("click",p),s.addEventListener("click",e=>{e.target===s&&p()}),l>0&&setTimeout(p,l),{close:p}} function showToast(e={}){let{message:t="",status:a="info",duration:l=4e3}=e,n=document.querySelector(".toast-container");n||((n=document.createElement("div")).className="toast-container",document.body.appendChild(n));let s=document.createElement("div");s.className=`toast ${a}`;let d=document.createElement("div");d.className="accent";let c=document.createElement("div");c.className="toast-header";let i=document.createElement("div");i.textContent=t;let o=document.createElement("button");o.className="toast-close",o.innerHTML="✕",c.appendChild(i),c.appendChild(o),s.appendChild(d),s.appendChild(c),n.appendChild(s),requestAnimationFrame(()=>s.classList.add("show"));let r=!1,p=()=>{r||(r=!0,s.classList.remove("show"),setTimeout(()=>{s.parentNode&&s.parentNode.removeChild(s)},380))};return o.addEventListener("click",p),s.addEventListener("click",e=>{e.target===s&&p()}),l>0&&setTimeout(p,l),{close:p}}
{% endraw %} {% endraw %}
{% if notify %} {% if notify %}
showToast({message: '{{notify.text}}', status: '{{notify.status}}', duration:{{notify.duration}}}); showToast({message: '{{notify.text}}', status: '{{notify.status}}', duration:{{notify.duration}}});
{% endif %} {% endif %}
// @license-end
</script> </script>
<div id="shareModal" <div id="shareModal"
style="display:none;position:fixed;inset:0;background:rgba(0,0,0,0.4);align-items:center;justify-content:center;z-index: 3000;"> style="display:none;position:fixed;inset:0;background:rgba(0,0,0,0.4);align-items:center;justify-content:center;z-index: 3000;">
@ -172,6 +178,7 @@ function showToast(e={}){let{message:t="",status:a="info",duration:l=4e3}=e,n=do
</div> </div>
</div> </div>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
async function imageWithTextBlob(imageUrl, text, options = {}) { async function imageWithTextBlob(imageUrl, text, options = {}) {
const response = await fetch(imageUrl, { const response = await fetch(imageUrl, {
mode: 'cors', mode: 'cors',
@ -434,8 +441,11 @@ shareBtns.forEach(btn => {
const link = copyBtn.dataset.link || window.location.href; const link = copyBtn.dataset.link || window.location.href;
copyToClipboard(link); copyToClipboard(link);
}); });
});</script> });
// @license-end
</script>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
(function() { (function() {
'use strict'; 'use strict';
@ -706,8 +716,10 @@ shareBtns.forEach(btn => {
}, true); }, true);
})(); })();
// @license-end
</script> </script>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
let deferredPrompt = null; let deferredPrompt = null;
let hasUserInteracted = false; let hasUserInteracted = false;
let promptTimeout = null; let promptTimeout = null;
@ -795,6 +807,7 @@ shareBtns.forEach(btn => {
}); });
}, 1500); }, 1500);
} }
// @license-end
</script> </script>
<div id="dd-modal-root"></div> <div id="dd-modal-root"></div>
@ -805,6 +818,7 @@ shareBtns.forEach(btn => {
</div> </div>
</div> </div>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
const modal = document.getElementById('modalToolTip'); const modal = document.getElementById('modalToolTip');
const modalText = document.getElementById('modalToolTipText'); const modalText = document.getElementById('modalToolTipText');
@ -834,6 +848,7 @@ shareBtns.forEach(btn => {
} }
}); });
}); });
// @license-end
</script> </script>
</body> </body>
</html> </html>

View File

@ -207,6 +207,7 @@
</div> </div>
</form> </form>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
/* ---------- Utility helpers (removed) ---------- */ /* ---------- Utility helpers (removed) ---------- */
@ -342,8 +343,10 @@ function bindLinkValidation({
}); });
}); });
// @license-end
</script> </script>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
const competition = JSON.parse({{competition|tojson}}) const competition = JSON.parse({{competition|tojson}})
const competitionId = `{{competition_id}}` const competitionId = `{{competition_id}}`
@ -432,8 +435,10 @@ document.getElementById('preview_poster').src = `/b/competition/${competition.po
// date_finish.value = date_finish_date.toISOString().slice(0, 10); // date_finish.value = date_finish_date.toISOString().slice(0, 10);
}); });
// @license-end
</script> </script>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
var type = competition.type_; var type = competition.type_;
function toggleType(clickedId) { function toggleType(clickedId) {
@ -449,8 +454,10 @@ document.getElementById('preview_poster').src = `/b/competition/${competition.po
type = 'paint'; type = 'paint';
} }
} }
// @license-end
</script> </script>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
const minInput = document.getElementById('min_val'); const minInput = document.getElementById('min_val');
const maxInput = document.getElementById('max_val'); const maxInput = document.getElementById('max_val');
@ -638,6 +645,7 @@ document.addEventListener('DOMContentLoaded', () => {
}); });
}); });
// @license-end
</script> </script>
{%- endmacro %} {%- endmacro %}

View File

@ -3,6 +3,7 @@
{% macro section(user) -%} {% macro section(user) -%}
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
var type = 'paint'; var type = 'paint';
function toggleType(clickedId) { function toggleType(clickedId) {
@ -18,6 +19,7 @@
type = 'paint'; type = 'paint';
} }
} }
// @license-end
</script> </script>
<form class="c_sbrxk"> <form class="c_sbrxk">
@ -348,10 +350,13 @@ function bindLinkValidation({
}); });
// @license-end
</script> </script>
{% if user.send_address %} {% if user.send_address %}
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
document.getElementById('address').value = '{{ user.send_address[-1] }}' document.getElementById('address').value = '{{ user.send_address[-1] }}'
// @license-end
</script> </script>
{% endif %} {% endif %}
<script defer> <script defer>
@ -373,8 +378,10 @@ document.getElementById('address').value = '{{ user.send_address[-1] }}'
} }
setTomorrowAtNoon(); setTomorrowAtNoon();
// @license-end
</script> </script>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
// Основная логика // Основная логика
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
const minInput = document.getElementById('min_val'); const minInput = document.getElementById('min_val');
@ -568,6 +575,7 @@ document.addEventListener('DOMContentLoaded', () => {
// Инициализация // Инициализация
// updateRange(); // updateRange();
}); });
// @license-end
</script> </script>
{%- endmacro %} {%- endmacro %}

View File

@ -153,6 +153,7 @@
</div> </div>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
(function(){ (function(){
const input = document.getElementById('memberSearch'); const input = document.getElementById('memberSearch');
const container = document.querySelector('.c_cnedr'); const container = document.querySelector('.c_cnedr');
@ -178,6 +179,7 @@
filter(); filter();
})(); })();
// @license-end
</script> </script>

View File

@ -1,5 +1,6 @@
{% macro section(user) -%} {% macro section(user) -%}
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
function toggleMenu() { function toggleMenu() {
const button = document.getElementById('menu_button'); const button = document.getElementById('menu_button');
const lines = button.querySelectorAll('.line'); const lines = button.querySelectorAll('.line');
@ -23,11 +24,13 @@ document.addEventListener('DOMContentLoaded', () => {
menu2.classList.toggle('open', newState); menu2.classList.toggle('open', newState);
}); });
}); });
// @license-end
</script> </script>
{% if user %} {% if user %}
{% if user.notify %} {% if user.notify %}
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
async function removeShow() { async function removeShow() {
document.getElementById('notificationsDropdown').classList.remove('show'); document.getElementById('notificationsDropdown').classList.remove('show');
document.getElementById('closeNotify').classList.remove('show'); document.getElementById('closeNotify').classList.remove('show');
@ -156,7 +159,8 @@ document.addEventListener('DOMContentLoaded', () => {
addNotification(item.title, item.text, item.dateStr, item.link, item.read); addNotification(item.title, item.text, item.dateStr, item.link, item.read);
}); });
}); });
</script> // @license-end
</script>
{% endif %} {% endif %}
{% endif %} {% endif %}
<header class="c_xirl1"> <header class="c_xirl1">
@ -198,6 +202,7 @@ document.addEventListener('DOMContentLoaded', () => {
{% if user and 'back' in user.get('scopes',[]) %} {% if user and 'back' in user.get('scopes',[]) %}
<span id="backBtn" class="c_qmp95 b_fokm1 btn">Переключиться на Админа</span> <span id="backBtn" class="c_qmp95 b_fokm1 btn">Переключиться на Админа</span>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
document.getElementById('backBtn').addEventListener('click', async () => { document.getElementById('backBtn').addEventListener('click', async () => {
try { try {
@ -213,7 +218,8 @@ document.addEventListener('DOMContentLoaded', () => {
} }
}); });
}); });
</script> // @license-end
</script>
{% endif %} {% endif %}
<span <span
id="shareBtn" data-imagetext="🎨 Рекомендую! 👍" id="shareBtn" data-imagetext="🎨 Рекомендую! 👍"

View File

@ -71,6 +71,7 @@
console.error('Network error during logout', err); console.error('Network error during logout', err);
} }
} }
// @license-end
</script> </script>
<script defer> <script defer>
async function switchProfile() { async function switchProfile() {
@ -86,6 +87,7 @@
console.error(err); console.error(err);
} }
} }
// @license-end
</script> </script>
<script defer> <script defer>
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
@ -122,5 +124,6 @@ document.addEventListener('DOMContentLoaded', () => {
} }
}); });
}); });
// @license-end
</script> </script>
{% endmacro %} {% endmacro %}

View File

@ -127,6 +127,7 @@
</div> </div>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
function saledPaintings(postId) { function saledPaintings(postId) {
fetch(`/api/post/${postId}/sale`, { fetch(`/api/post/${postId}/sale`, {
method: 'PUT' method: 'PUT'
@ -157,8 +158,10 @@
}); });
}); });
} }
// @license-end
</script> </script>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
(function(){ (function(){
const input = document.getElementById('memberSearch'); const input = document.getElementById('memberSearch');
const container = document.querySelector('.c_cnedr'); const container = document.querySelector('.c_cnedr');
@ -184,6 +187,7 @@
filter(); filter();
})(); })();
// @license-end
</script> </script>

View File

@ -203,12 +203,16 @@
</form> </form>
{% if user.send_address %} {% if user.send_address %}
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
document.getElementById('address').value = '{{ user.send_address[-1] }}' document.getElementById('address').value = '{{ user.send_address[-1] }}'
// @license-end
</script> </script>
{% endif %} {% endif %}
{% if user.places %} {% if user.places %}
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
document.getElementById('place').value = '{{ user.places[-1] }}' document.getElementById('place').value = '{{ user.places[-1] }}'
// @license-end
</script> </script>
{% endif %} {% endif %}
<script defer> <script defer>
@ -363,6 +367,7 @@ function bindLinkValidation({
linkErrorSelector: '#link-error-1' linkErrorSelector: '#link-error-1'
}); });
// @license-end
</script> </script>
<script defer> <script defer>
@ -384,6 +389,7 @@ function bindLinkValidation({
} }
setTomorrowAtNoon(); setTomorrowAtNoon();
// @license-end
</script> </script>
<script defer> <script defer>
@ -551,6 +557,7 @@ function bindLinkValidation({
} }
}); });
// @license-end
</script> </script>

View File

@ -293,6 +293,7 @@ bindLinkValidation({
linkInputSelector: '#tizer_link', linkInputSelector: '#tizer_link',
linkErrorSelector: '#link-error-1' linkErrorSelector: '#link-error-1'
}); });
// @license-end
</script> </script>
<script defer> <script defer>
function setTomorrowAtNoon() { function setTomorrowAtNoon() {
@ -313,6 +314,7 @@ bindLinkValidation({
} }
setTomorrowAtNoon(); setTomorrowAtNoon();
// @license-end
</script> </script>
<script defer> <script defer>
@ -545,6 +547,7 @@ bindLinkValidation({
} }
}); });
// @license-end
</script> </script>

View File

@ -44,6 +44,7 @@ fetch('/api/me')
.catch(error => { .catch(error => {
console.error('There was a problem with the fetch operation:', error); console.error('There was a problem with the fetch operation:', error);
}); });
// @license-end
</script> </script>
{% endif %} {% endif %}
{% endblock %} {% endblock %}

View File

@ -60,19 +60,19 @@
</div> </div>
</form> </form>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
function sendToNextPage(e) { function sendToNextPage(e) {
e.preventDefault(); e.preventDefault();
const email = document.getElementById('email').value.trim(); const email = document.getElementById('email').value.trim();
if (email) { if (email) {
localStorage.setItem('restoreEmail', email); localStorage.setItem('restoreEmail', email);
} }
window.location.href = "/restore{% if next %}?next={{next}}{% endif %}"; window.location.href = "/restore{% if next %}?next={{next}}{% endif %}";
} }
// @license-end
</script> </script>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
const emailInput = document.getElementById('email'); const emailInput = document.getElementById('email');
const passwordInput = document.getElementById('password'); const passwordInput = document.getElementById('password');
@ -210,9 +210,11 @@ function sendToNextPage(e) {
}); });
} }
}); });
// @license-end
</script> </script>
{{ footer.section() }} {{ footer.section() }}
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
fetch('/api/me') fetch('/api/me')
.then(response => { .then(response => {
if (response.ok) { if (response.ok) {
@ -229,6 +231,7 @@ fetch('/api/me')
.catch(error => { .catch(error => {
console.error('There was a problem with the fetch operation:', error); console.error('There was a problem with the fetch operation:', error);
}); });
// @license-end
</script> </script>
{% endblock %} {% endblock %}

View File

@ -20,19 +20,19 @@
<iframe id="modalVideoFrame" width="853" height="480" allow="autoplay; encrypted-media; fullscreen; picture-in-picture;" frameborder="0" allowfullscreen style="height: 100%;position: absolute;left: 0;transition: none;min-width: 100%;object-fit: scale-down;"></iframe> <iframe id="modalVideoFrame" width="853" height="480" allow="autoplay; encrypted-media; fullscreen; picture-in-picture;" frameborder="0" allowfullscreen style="height: 100%;position: absolute;left: 0;transition: none;min-width: 100%;object-fit: scale-down;"></iframe>
</div> </div>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
document.addEventListener('DOMContentLoaded', function() { document.addEventListener('DOMContentLoaded', function() {
document.getElementById('openModalButtonVideo').addEventListener('click', function() { document.getElementById('openModalButtonVideo').addEventListener('click', function() {
const modalVideoFrame = document.getElementById('modalVideoFrame'); const modalVideoFrame = document.getElementById('modalVideoFrame');
const modal = document.getElementById('modalVideo'); const modal = document.getElementById('modalVideo');
modalVideoFrame.src = 'https://vk.com/video_ext.php?oid=-213856894&id=456239020&hd=2'; modalVideoFrame.src = 'https://vk.com/video_ext.php?oid=-213856894&id=456239020&hd=2';
modal.style.display = 'flex'; modal.style.display = 'flex';
}); });
}); });
function videocloseModalButton() { function videocloseModalButton() {
document.getElementById('modalVideo').style.display = 'none'; document.getElementById('modalVideo').style.display = 'none';
} }
// @license-end
</script> </script>
{%- endmacro %} {%- endmacro %}

View File

@ -19,12 +19,14 @@
</div> </div>
{% if news%} {% if news%}
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
document.getElementById('title').value = '{{news.title or ""}}'; document.getElementById('title').value = '{{news.title or ""}}';
document.getElementById('description').value = `{{news.description or ""}}`; document.getElementById('description').value = `{{news.description or ""}}`;
document.getElementById('short_description').value = `{{news.short_description or ""}}`; document.getElementById('short_description').value = `{{news.short_description or ""}}`;
}); });
// @license-end
</script> </script>
{% endif %} {% endif %}
<div class="c_rtopc"> <div class="c_rtopc">
@ -38,6 +40,7 @@
</form> </form>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
const fileInput = document.getElementById('fileInput'); const fileInput = document.getElementById('fileInput');
const preview = document.getElementById('preview'); const preview = document.getElementById('preview');
@ -290,6 +293,7 @@
}); });
}); });
}); });
// @license-end
</script> </script>

View File

@ -21,9 +21,11 @@
</div> </div>
{% if post%} {% if post%}
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
document.getElementById('title').value = `{{post.title or ""}}` document.getElementById('title').value = `{{post.title or ""}}`
document.getElementById('description').value = `{{post.description or ""}}` document.getElementById('description').value = `{{post.description or ""}}`
document.getElementById('short_description').value = `{{post.short_description or ""}}` document.getElementById('short_description').value = `{{post.short_description or ""}}`
// @license-end
</script> </script>
{% endif %} {% endif %}
<div class="c_rtopc"> <div class="c_rtopc">
@ -37,6 +39,7 @@
</form> </form>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
const fileInput = document.getElementById('fileInput'); const fileInput = document.getElementById('fileInput');
const preview = document.getElementById('preview'); const preview = document.getElementById('preview');
@ -289,6 +292,7 @@
}); });
}); });
}); });
// @license-end
</script> </script>

View File

@ -281,6 +281,7 @@
</div> </div>
</section> </section>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
const images = [ const images = [
{% for media in news.orig_media %} {% for media in news.orig_media %}
{ src: "/b/news/{{media}}" }, { src: "/b/news/{{media}}" },
@ -386,6 +387,7 @@
createSlides(); createSlides();
init(); init();
setTimeout(updateTransform, 100); // даём браузеру время на рендер setTimeout(updateTransform, 100); // даём браузеру время на рендер
</script> // @license-end
</script>
{{ footer.section(user) }} {{ footer.section(user) }}
{% endblock %} {% endblock %}

View File

@ -207,6 +207,7 @@
</section> </section>
</div> </div>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
function saledPaintings(postId) { function saledPaintings(postId) {
fetch(`/api/post/${postId}/sale`, { fetch(`/api/post/${postId}/sale`, {
method: 'PUT' method: 'PUT'
@ -237,8 +238,10 @@
}); });
}); });
} }
// @license-end
</script> </script>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
const images = [ const images = [
{% for media in paint.medias_original %} {% for media in paint.medias_original %}
{ src: "/b/posts/{{media}}" }, { src: "/b/posts/{{media}}" },
@ -344,8 +347,10 @@
createSlides(); createSlides();
init(); init();
setTimeout(updateTransform, 100); // даём браузеру время на рендер setTimeout(updateTransform, 100); // даём браузеру время на рендер
</script> // @license-end
</script>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
function deletePost(postId) { function deletePost(postId) {
fetch(`/api/post/${postId}`, { fetch(`/api/post/${postId}`, {
method: 'DELETE' method: 'DELETE'
@ -374,6 +379,7 @@
}); });
}); });
} }
// @license-end
</script> </script>
{{ footer.section(user) }} {{ footer.section(user) }}
{% endblock %} {% endblock %}

View File

@ -52,6 +52,7 @@
</div> </div>
</form> </form>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
const post = JSON.parse({{ post|tojson }}); const post = JSON.parse({{ post|tojson }});
const postId = post._id; const postId = post._id;
@ -415,6 +416,7 @@
window.addEventListener('beforeunload', () => { window.addEventListener('beforeunload', () => {
filesOrdered.forEach(revokeObjectURLSafe); filesOrdered.forEach(revokeObjectURLSafe);
}); });
// @license-end
</script> </script>

View File

@ -21,10 +21,12 @@
<label for="grade" class="c_z3ybu floating-label">Звание</label> <label for="grade" class="c_z3ybu floating-label">Звание</label>
</div> </div>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
showToast({message: 'Выберите из списка актуальное звание', status: 'info', duration:3000}); showToast({message: 'Выберите из списка актуальное звание', status: 'info', duration:3000});
}); });
</script> // @license-end
</script>
{% endif %} {% endif %}
<div class="c_aihm6 floating-group"> <div class="c_aihm6 floating-group">
<input name="title" id="title" class="c_xhd5k" required data-toast="Поле Название должно быть заполнено"/> <input name="title" id="title" class="c_xhd5k" required data-toast="Поле Название должно быть заполнено"/>
@ -133,6 +135,7 @@
</div> </div>
</form> </form>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
const fileInput = document.getElementById('fileInput'); const fileInput = document.getElementById('fileInput');
const preview = document.getElementById('preview'); const preview = document.getElementById('preview');
const createBtn = document.getElementById('createBtn'); const createBtn = document.getElementById('createBtn');
@ -466,8 +469,10 @@
window.addEventListener('beforeunload', () => { window.addEventListener('beforeunload', () => {
filesOrdered.forEach(revokeObjectURLSafe); filesOrdered.forEach(revokeObjectURLSafe);
}); });
// @license-end
</script> </script>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
document.getElementById('genre').dataset.list=JSON.stringify([ document.getElementById('genre').dataset.list=JSON.stringify([
{ {
@ -588,6 +593,7 @@
} }
]) ])
}) })
// @license-end
</script> </script>
{{ footer.section() }} {{ footer.section() }}
{% endblock %} {% endblock %}

View File

@ -39,6 +39,7 @@
{%- endmacro %} {%- endmacro %}
{% macro scrips() -%} {% macro scrips() -%}
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
function deletePost(postId) { function deletePost(postId) {
fetch(`/api/post/${postId}`, { fetch(`/api/post/${postId}`, {
method: 'DELETE' method: 'DELETE'
@ -67,6 +68,7 @@
}); });
}); });
} }
// @license-end
</script> </script>
{%- endmacro %} {%- endmacro %}
{% macro style() -%} {% macro style() -%}

View File

@ -105,6 +105,7 @@
</table> </table>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
function toggleDetails(cell) { function toggleDetails(cell) {
const mainRow = cell.parentElement; const mainRow = cell.parentElement;
const detailsRow = mainRow.nextElementSibling; const detailsRow = mainRow.nextElementSibling;
@ -139,6 +140,7 @@ document.querySelectorAll('.main-row').forEach(row => {
} }
}); });
}); });
// @license-end
</script> </script>
<style> <style>

View File

@ -60,6 +60,7 @@
</table> </table>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
function normalizeText(str) { function normalizeText(str) {
return str return str
.toLowerCase() .toLowerCase()
@ -105,7 +106,8 @@ function normalizeText(str) {
row.classList.toggle("hidden", !match); row.classList.toggle("hidden", !match);
} }
} }
</script> // @license-end
</script>

View File

@ -63,6 +63,7 @@
{% endfor %} {% endfor %}
</div> </div>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
(function(){ (function(){
const input = document.getElementById('memberSearch'); const input = document.getElementById('memberSearch');
const container = document.querySelector('.c_tihtk'); const container = document.querySelector('.c_tihtk');
@ -89,8 +90,10 @@
// initial: show all // initial: show all
filter(); filter();
})(); })();
// @license-end
</script> </script>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
document.querySelectorAll('.post').forEach(postEl => { document.querySelectorAll('.post').forEach(postEl => {
const fg = postEl.querySelector('.c_nb6gy.floating-group'); const fg = postEl.querySelector('.c_nb6gy.floating-group');
if (!fg) return; if (!fg) return;
@ -133,6 +136,7 @@ document.querySelectorAll('.post').forEach(postEl => {
} }
}); });
}); });
// @license-end
</script> </script>
<script defer> <script defer>
@ -364,6 +368,7 @@ function loadAndClick() {
} }
}); });
// @license-end
</script> </script>
</div> </div>
</div> </div>
@ -404,6 +409,7 @@ document.addEventListener('DOMContentLoaded', () => {
} }
}); });
}); });
// @license-end
</script> </script>
{{ footer.section(user) }} {{ footer.section(user) }}
{% endblock %} {% endblock %}

View File

@ -226,6 +226,7 @@
</button> </button>
</div> </div>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
function saledPaintings(postId) { function saledPaintings(postId) {
fetch(`/api/post/${postId}/sale`, { fetch(`/api/post/${postId}/sale`, {
method: 'PUT' method: 'PUT'
@ -256,8 +257,10 @@
}); });
}); });
} }
// @license-end
</script> </script>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
function selectAll(elem, send=true){ function selectAll(elem, send=true){
if (send){ if (send){
if (elem.checked){ if (elem.checked){
@ -284,8 +287,10 @@
updateStickyButtons(); updateStickyButtons();
} }
// @license-end
</script> </script>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
// ───────────────────────────────────────────── // ─────────────────────────────────────────────
// Helpers: collect selected IDs // Helpers: collect selected IDs
// ───────────────────────────────────────────── // ─────────────────────────────────────────────
@ -532,6 +537,7 @@
} }
}); });
}); });
// @license-end
</script> </script>
<script defer> <script defer>
function toggleTrackField() { function toggleTrackField() {
@ -581,8 +587,10 @@ document.getElementById('delivery_type')?.addEventListener('change', toggleTrack
document.getElementById('exhibition_id').value = exhibition_id; document.getElementById('exhibition_id').value = exhibition_id;
} }
filterFigure(exhibition_id); filterFigure(exhibition_id);
// @license-end
</script> </script>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
const deliveryType = document.getElementById('delivery_type'); const deliveryType = document.getElementById('delivery_type');
const track = document.getElementById('track'); const track = document.getElementById('track');
@ -598,6 +606,7 @@ document.getElementById('delivery_type')?.addEventListener('change', toggleTrack
deliveryType.addEventListener('change', toggleTrack); deliveryType.addEventListener('change', toggleTrack);
toggleTrack(); toggleTrack();
// @license-end
</script> </script>
</div> </div>

View File

@ -217,6 +217,7 @@
</div> </div>
</section> </section>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
document.getElementById('female_name_lastname').value = `{% if user.get('female_name_lastname') is not none %}{{user.get('female_name_lastname','') }}{% endif %}` document.getElementById('female_name_lastname').value = `{% if user.get('female_name_lastname') is not none %}{{user.get('female_name_lastname','') }}{% endif %}`
document.getElementById('birthday').value = `{% if user.get('birthday') is not none %}{{user.get('birthday','') }}{% endif %}` document.getElementById('birthday').value = `{% if user.get('birthday') is not none %}{{user.get('birthday','') }}{% endif %}`
document.getElementById('living_place').value = `{% if user.get('living_place') is not none %}{{user.get('living_place','') }}{% endif %}` document.getElementById('living_place').value = `{% if user.get('living_place') is not none %}{{user.get('living_place','') }}{% endif %}`
@ -248,12 +249,16 @@ document.getElementById('own_workshop').value = `{% if user.get('own_workshop')
document.getElementById('workshop_tour').value = `{% if user.get('workshop_tour') is not none %}{{user.get('workshop_tour','') }}{% endif %}` document.getElementById('workshop_tour').value = `{% if user.get('workshop_tour') is not none %}{{user.get('workshop_tour','') }}{% endif %}`
document.getElementById('biography').value = `{% if user.get('biography') is not none %}{{user.get('biography','') }}{% endif %}` document.getElementById('biography').value = `{% if user.get('biography') is not none %}{{user.get('biography','') }}{% endif %}`
// @license-end
</script> </script>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
document.addEventListener("DOMContentLoaded",()=>{let e=document.getElementById("day"),t=document.getElementById("month"),l=document.getElementById("year"),n=document.getElementById("birthday"),a=new Date().getFullYear(),u=["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"];function i(t=31){e.innerHTML="";for(let l=1;l<=t;l++){let n=document.createElement("option");n.value=String(l),n.text=String(l),e.appendChild(n)}}function o(){t.innerHTML="",u.forEach((e,l)=>{let n=document.createElement("option");n.value=String(l+1),n.text=e,t.appendChild(n)})}function v(e=1900,t=a){l.innerHTML="";for(let n=t;n>=e;n--){let u=document.createElement("option");u.value=String(n),u.text=String(n),l.appendChild(u)}}let d=e=>String(e).padStart(2,"0");function p(e){if(!e)return;let n=e.split("-");if(3!==n.length)return;let[a,u,i]=n.map(Number);g(l,String(a)),g(t,String(u)),s(a,u,i)}function r(){let a=Number(l.value)||1900,u=Number(t.value)||1,o=Number(e.value)||1,v=new Date(a,u,0).getDate();e.options.length!==v&&i(v),o>v&&(o=v);let p=`${a}-${d(u)}-${d(o)}`;n.value=p,g(e,String(o))}function s(t,l,n){let a=new Date(Number(t),Number(l),0).getDate(),u=Number(e.value)||1;i(a),g(e,String(Math.min(n||u,a)))}function g(e,t){let l=Array.from(e.options).find(e=>e.value===t||e.text===t);if(l)e.value=l.value;else{let n=document.createElement("option");n.text=t,n.value=t,e.appendChild(n),e.value=t}}o(),v();let h=n.value?Number(n.value.split("-")[0]):l.options.length?Number(l.options[0].value):a,c=n.value?Number(n.value.split("-")[1]):1;n.value&&n.value.split("-")[2];let f=new Date(h,c,0).getDate();i(f),n.value?p(n.value):(!l.value&&l.options.length&&(l.value=l.options[0].value),!t.value&&t.options.length&&(t.value=t.options[0].value),!e.value&&e.options.length&&(e.value=e.options[0].value),r()),n.addEventListener("change",()=>{p(n.value)}),l.addEventListener("change",()=>{let e=Number(l.value),n=Number(t.value);s(e,n),r()}),t.addEventListener("change",()=>{let e=Number(l.value),n=Number(t.value);s(e,n),r()}),e.addEventListener("change",r)}); document.addEventListener("DOMContentLoaded",()=>{let e=document.getElementById("day"),t=document.getElementById("month"),l=document.getElementById("year"),n=document.getElementById("birthday"),a=new Date().getFullYear(),u=["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"];function i(t=31){e.innerHTML="";for(let l=1;l<=t;l++){let n=document.createElement("option");n.value=String(l),n.text=String(l),e.appendChild(n)}}function o(){t.innerHTML="",u.forEach((e,l)=>{let n=document.createElement("option");n.value=String(l+1),n.text=e,t.appendChild(n)})}function v(e=1900,t=a){l.innerHTML="";for(let n=t;n>=e;n--){let u=document.createElement("option");u.value=String(n),u.text=String(n),l.appendChild(u)}}let d=e=>String(e).padStart(2,"0");function p(e){if(!e)return;let n=e.split("-");if(3!==n.length)return;let[a,u,i]=n.map(Number);g(l,String(a)),g(t,String(u)),s(a,u,i)}function r(){let a=Number(l.value)||1900,u=Number(t.value)||1,o=Number(e.value)||1,v=new Date(a,u,0).getDate();e.options.length!==v&&i(v),o>v&&(o=v);let p=`${a}-${d(u)}-${d(o)}`;n.value=p,g(e,String(o))}function s(t,l,n){let a=new Date(Number(t),Number(l),0).getDate(),u=Number(e.value)||1;i(a),g(e,String(Math.min(n||u,a)))}function g(e,t){let l=Array.from(e.options).find(e=>e.value===t||e.text===t);if(l)e.value=l.value;else{let n=document.createElement("option");n.text=t,n.value=t,e.appendChild(n),e.value=t}}o(),v();let h=n.value?Number(n.value.split("-")[0]):l.options.length?Number(l.options[0].value):a,c=n.value?Number(n.value.split("-")[1]):1;n.value&&n.value.split("-")[2];let f=new Date(h,c,0).getDate();i(f),n.value?p(n.value):(!l.value&&l.options.length&&(l.value=l.options[0].value),!t.value&&t.options.length&&(t.value=t.options[0].value),!e.value&&e.options.length&&(e.value=e.options[0].value),r()),n.addEventListener("change",()=>{p(n.value)}),l.addEventListener("change",()=>{let e=Number(l.value),n=Number(t.value);s(e,n),r()}),t.addEventListener("change",()=>{let e=Number(l.value),n=Number(t.value);s(e,n),r()}),e.addEventListener("change",r)});
// @license-end
</script> </script>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
const createBtn = document.getElementById('createBtn'); const createBtn = document.getElementById('createBtn');
@ -328,6 +333,7 @@ window.location.reload();
}); });
// @license-end
</script> </script>
{{ footer.section(user) }} {{ footer.section(user) }}
{% endblock %} {% endblock %}

View File

@ -200,6 +200,7 @@
</button> </button>
</div> </div>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
function selecteAll(elem){ function selecteAll(elem){
if (elem.checked){ if (elem.checked){
document.querySelectorAll('.yes').forEach(el=>{ document.querySelectorAll('.yes').forEach(el=>{
@ -216,6 +217,7 @@
updateSelectedCount() updateSelectedCount()
} }
// @license-end
</script> </script>
{%endif%} {%endif%}
{% if doc.get('type_')=='paint' %} {% if doc.get('type_')=='paint' %}
@ -254,6 +256,7 @@
{# Sticky bottom action bar #} {# Sticky bottom action bar #}
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
function toggleTrackField() { function toggleTrackField() {
const deliveryType = document.getElementById('delivery_type'); const deliveryType = document.getElementById('delivery_type');
const trackGroup = document.getElementById('track-group'); const trackGroup = document.getElementById('track-group');
@ -276,8 +279,10 @@ document.addEventListener('DOMContentLoaded', toggleTrackField);
// Run every time the select changes // Run every time the select changes
document.getElementById('delivery_type')?.addEventListener('change', toggleTrackField); document.getElementById('delivery_type')?.addEventListener('change', toggleTrackField);
// @license-end
</script> </script>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
const query = window.location.href.split('?')[1] || ''; const query = window.location.href.split('?')[1] || '';
let exhibition_id = null; let exhibition_id = null;
if (query) { if (query) {
@ -303,8 +308,10 @@ document.getElementById('delivery_type')?.addEventListener('change', toggleTrack
document.getElementById('exhibition_id').value = exhibition_id; document.getElementById('exhibition_id').value = exhibition_id;
} }
filterFigure(exhibition_id); filterFigure(exhibition_id);
// @license-end
</script> </script>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
const deliveryType = document.getElementById('delivery_type'); const deliveryType = document.getElementById('delivery_type');
const track = document.getElementById('track'); const track = document.getElementById('track');
@ -320,8 +327,10 @@ document.getElementById('delivery_type')?.addEventListener('change', toggleTrack
deliveryType.addEventListener('change', toggleTrack); deliveryType.addEventListener('change', toggleTrack);
toggleTrack(); toggleTrack();
// @license-end
</script> </script>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
// ───────────────────────────────────────────── // ─────────────────────────────────────────────
// Helpers: collect selected IDs // Helpers: collect selected IDs
// ───────────────────────────────────────────── // ─────────────────────────────────────────────
@ -562,6 +571,7 @@ document.getElementById('delivery_type')?.addEventListener('change', toggleTrack
} }
}); });
}); });
// @license-end
</script> </script>
{% endif %} {% endif %}
</div> </div>
@ -569,6 +579,7 @@ document.getElementById('delivery_type')?.addEventListener('change', toggleTrack
</div> </div>
</section> </section>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
const LS_KEY = 'selected_posts_ids_{{doc._id}}'; const LS_KEY = 'selected_posts_ids_{{doc._id}}';
function safeParseArray(raw) { function safeParseArray(raw) {
@ -729,6 +740,7 @@ document.getElementById('delivery_type')?.addEventListener('change', toggleTrack
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
setAllCheckboxesFromStorage(); setAllCheckboxesFromStorage();
}); });
// @license-end
</script> </script>
{{ footer.section(user) }} {{ footer.section(user) }}
{% endblock %} {% endblock %}

View File

@ -56,6 +56,7 @@
</div> </div>
</section> </section>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
const deliveryType = document.getElementById('delivery_type'); const deliveryType = document.getElementById('delivery_type');
const trackWrap = document.getElementById('trackWrap'); const trackWrap = document.getElementById('trackWrap');
const track = document.getElementById('track'); const track = document.getElementById('track');
@ -74,8 +75,10 @@
deliveryType.addEventListener('change', toggleTrack); deliveryType.addEventListener('change', toggleTrack);
toggleTrack(); toggleTrack();
// @license-end
</script> </script>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
document.addEventListener('click', async (e) => { document.addEventListener('click', async (e) => {
const btn = e.target.closest('[data-id]'); const btn = e.target.closest('[data-id]');
if (!btn) return; if (!btn) return;
@ -143,6 +146,7 @@
} }
}); });
// @license-end
</script> </script>
{{ footer.section(user) }} {{ footer.section(user) }}
{% endblock %} {% endblock %}

View File

@ -76,6 +76,7 @@
</div> </div>
</section> </section>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
async function accept_inv(inv_id) { async function accept_inv(inv_id) {
try { try {
const res = await fetch(`/api/invitation/accept/${inv_id}`, { const res = await fetch(`/api/invitation/accept/${inv_id}`, {
@ -95,6 +96,7 @@ async function accept_inv(inv_id) {
showToast({ message: 'Ошибка сети/сервера', status: 'error' }); showToast({ message: 'Ошибка сети/сервера', status: 'error' });
} }
} }
// @license-end
</script> </script>
{{ footer.section(user) }} {{ footer.section(user) }}

View File

@ -32,6 +32,7 @@
</div> </div>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
const competitionId = '{{competition._id}}'; const competitionId = '{{competition._id}}';
const stopBtn = document.getElementById('stop-btn'); const stopBtn = document.getElementById('stop-btn');
@ -56,11 +57,13 @@
console.error('Ошибка при остановке приема заявок', e); console.error('Ошибка при остановке приема заявок', e);
} }
}); });
</script> // @license-end
</script>
{% elif competition.status == 1 %} {% elif competition.status == 1 %}
<div class="c_d4rhd b_wy3rt ba" id="stop-btn"><span class="c_4sl8i b_bvl0d">Завершить конкурс</span> <div class="c_d4rhd b_wy3rt ba" id="stop-btn"><span class="c_4sl8i b_bvl0d">Завершить конкурс</span>
</div> </div>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
const competitionId = '{{competition._id}}'; const competitionId = '{{competition._id}}';
const stopBtn = document.getElementById('stop-btn'); const stopBtn = document.getElementById('stop-btn');
@ -85,7 +88,8 @@
console.error('Ошибка при остановке приема заявок', e); console.error('Ошибка при остановке приема заявок', e);
} }
}); });
</script> // @license-end
</script>
{% elif competition.status == 2 %} {% elif competition.status == 2 %}
<div class="c_d4rhd b_wy3rt ba"><span class="c_4sl8i b_bvl0d">Конкурс завершен</span></div> <div class="c_d4rhd b_wy3rt ba"><span class="c_4sl8i b_bvl0d">Конкурс завершен</span></div>
{%endif%} {%endif%}
@ -219,8 +223,10 @@ document.querySelectorAll('.c_6cezu.b_6spaf').forEach(toggle => {
} }
}); });
}); });
// @license-end
</script> </script>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
const competition_id = '{{competition._id}}'; const competition_id = '{{competition._id}}';
document.querySelectorAll('.b_k2cle button').forEach(button => { document.querySelectorAll('.b_k2cle button').forEach(button => {
@ -270,6 +276,7 @@ document.querySelectorAll('.b_k2cle button').forEach(button => {
}); });
}); });
// @license-end
</script> </script>
{{ footer.section(user) }} {{ footer.section(user) }}
{% endblock %} {% endblock %}

View File

@ -119,6 +119,7 @@
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
const competitionId = '{{competition._id}}'; const competitionId = '{{competition._id}}';
const memberId = '{{member._id}}'; const memberId = '{{member._id}}';
@ -164,6 +165,7 @@ async function selectMember(status) {
passBtn.addEventListener('click', () => selectMember('pass')); passBtn.addEventListener('click', () => selectMember('pass'));
failBtn.addEventListener('click', () => selectMember('fail')); failBtn.addEventListener('click', () => selectMember('fail'));
// @license-end
</script> </script>
{%endif%} {%endif%}
</div> </div>
@ -223,8 +225,10 @@ document.querySelectorAll('.c_6cezu.b_6spaf').forEach(toggle => {
} }
}); });
}); });
// @license-end
</script> </script>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
const competition_id = '{{competition._id}}'; const competition_id = '{{competition._id}}';
document.querySelectorAll('.b_k2cle button').forEach(button => { document.querySelectorAll('.b_k2cle button').forEach(button => {
@ -271,6 +275,7 @@ document.querySelectorAll('.b_k2cle button').forEach(button => {
}); });
}); });
// @license-end
</script> </script>
{{ footer.section(user) }} {{ footer.section(user) }}
{% endblock %} {% endblock %}

View File

@ -26,6 +26,7 @@
</div> </div>
</section> </section>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
document.querySelectorAll('.c_2fr39.b_tfnz2#deleteBtn').forEach(btn => { document.querySelectorAll('.c_2fr39.b_tfnz2#deleteBtn').forEach(btn => {
btn.addEventListener('click', async (e) => { btn.addEventListener('click', async (e) => {
const article = btn.closest('article'); const article = btn.closest('article');
@ -87,6 +88,7 @@ document.querySelectorAll('#rePublishCompetition').forEach(btn => {
}); });
}); });
// @license-end
</script> </script>

View File

@ -98,6 +98,7 @@
{% endfor %} {% endfor %}
]; ];
document.getElementById('filter-galerists').dataset.list=JSON.stringify(galerists) document.getElementById('filter-galerists').dataset.list=JSON.stringify(galerists)
// @license-end
</script> </script>
<script defer> <script defer>
const living_places = [ const living_places = [
@ -109,6 +110,7 @@ document.getElementById('filter-galerists').dataset.list=JSON.stringify(galerist
{% endfor %} {% endfor %}
]; ];
document.getElementById('filter-city').dataset.list=JSON.stringify(living_places) document.getElementById('filter-city').dataset.list=JSON.stringify(living_places)
// @license-end
</script> </script>
<script async> <script async>
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
@ -242,8 +244,10 @@ genre = genres.map(g => {
document.getElementById('filter-genre').dataset.list=JSON.stringify(genre) document.getElementById('filter-genre').dataset.list=JSON.stringify(genre)
}) })
// @license-end
</script> </script>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
const initialPostsData = [ const initialPostsData = [
{% for p in posts %} {% for p in posts %}
{ {
@ -272,9 +276,11 @@ genre = genres.map(g => {
title: "", posts: [] title: "", posts: []
{% endif %} {% endif %}
}; };
// @license-end
</script> </script>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
const selectedPostIds = new Set((exhibition?.posts || []).map(String)); const selectedPostIds = new Set((exhibition?.posts || []).map(String));
const container = document.querySelector('.c_tihtk'); const container = document.querySelector('.c_tihtk');
const showMoreBtn = document.getElementById('show-more-btn'); const showMoreBtn = document.getElementById('show-more-btn');
@ -491,6 +497,7 @@ genre = genres.map(g => {
document.getElementById('apply-filters').addEventListener('click', applyFilters); document.getElementById('apply-filters').addEventListener('click', applyFilters);
showMoreBtn.addEventListener('click', loadMore); showMoreBtn.addEventListener('click', loadMore);
}); });
// @license-end
</script> </script>
{{ footer.section(user) }} {{ footer.section(user) }}

View File

@ -127,6 +127,7 @@
</div> </div>
</section> </section>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
function saledPaintings(postId) { function saledPaintings(postId) {
fetch(`/api/post/${postId}/sale`, { fetch(`/api/post/${postId}/sale`, {
method: 'PUT' method: 'PUT'
@ -157,9 +158,11 @@
}); });
}); });
} }
// @license-end
</script> </script>
{# {#
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
async function btnAccept(btn, itemId){ async function btnAccept(btn, itemId){
const figcaption = btn.parentElement; const figcaption = btn.parentElement;
const statusDiv = figcaption.querySelectorAll('div')[0]; const statusDiv = figcaption.querySelectorAll('div')[0];
@ -198,9 +201,11 @@
showToast({ message: 'Не удалось подключиться к серверу', duration: 2500 }); showToast({ message: 'Не удалось подключиться к серверу', duration: 2500 });
} }
}; };
// @license-end
</script> </script>
#} #}
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
async function sendInvitations(exhibition_id) { async function sendInvitations(exhibition_id) {
const data = new FormData(); const data = new FormData();
data.set('exhibition_id', exhibition_id); data.set('exhibition_id', exhibition_id);
@ -249,6 +254,7 @@
select.checked = false select.checked = false
} }
} }
// @license-end
</script> </script>
{{ footer.section(user) }} {{ footer.section(user) }}
{% endblock %} {% endblock %}

View File

@ -61,6 +61,7 @@
</div> </div>
</section> </section>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
async function deleteExhibition(btn, _id) { async function deleteExhibition(btn, _id) {
const article = btn.closest('article'); const article = btn.closest('article');
try { try {
@ -75,6 +76,7 @@ async function deleteExhibition(btn, _id) {
console.error('Delete failed:', err); console.error('Delete failed:', err);
} }
} }
// @license-end
</script> </script>
{{ footer.section(user) }} {{ footer.section(user) }}
{% endblock %} {% endblock %}

View File

@ -130,6 +130,7 @@
</div> </div>
</section> </section>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
async function postSetting(id, key, value) { async function postSetting(id, key, value) {
const payload = { const payload = {
id: id, id: id,
@ -169,6 +170,7 @@ document.addEventListener('change', function (e) {
postSetting(id, key, checked); postSetting(id, key, checked);
} }
}); });
// @license-end
</script> </script>
{{ footer.section(user) }} {{ footer.section(user) }}
{% endblock %} {% endblock %}

View File

@ -137,9 +137,12 @@
</div> </div>
</form> </form>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
document.addEventListener("DOMContentLoaded",()=>{let e=document.querySelector(".desc"),t=document.getElementById("preview"),l=document.getElementById("inpA"),d=document.getElementById("labelA"),a=document.getElementById("inpB"),r=document.getElementById("role"),s=document.getElementById("gradeC"),n=document.getElementById("gradeR"),i=e=>e.style.display="flex",o=e=>e.style.display="none";document.getElementById("wrap").addEventListener("click",y=>{document.querySelectorAll("#wrap > div").forEach(e=>e.classList.remove("selected"));let c=y.target.closest("#wrap > div");if(!c)return;c.classList.add("selected");let g=c.dataset.text||"";e.textContent=g;let m=c.dataset.img||"";m&&!m.startsWith("blob:")?t.src=m:m||t.removeAttribute("src");let v=c.id;if(o(l),o(a),i(s),o(n),"2"===v||"3"===v){i(l);let E=c.dataset.label;void 0!==E?d.textContent=E:d.textContent=""}"2"===v&&(r.value="user"),"2"===v&&(r.value="reporter",i(a),o(s),i(n)),"3"===v&&(r.value="galerist",o(s))})}); document.addEventListener("DOMContentLoaded",()=>{let e=document.querySelector(".desc"),t=document.getElementById("preview"),l=document.getElementById("inpA"),d=document.getElementById("labelA"),a=document.getElementById("inpB"),r=document.getElementById("role"),s=document.getElementById("gradeC"),n=document.getElementById("gradeR"),i=e=>e.style.display="flex",o=e=>e.style.display="none";document.getElementById("wrap").addEventListener("click",y=>{document.querySelectorAll("#wrap > div").forEach(e=>e.classList.remove("selected"));let c=y.target.closest("#wrap > div");if(!c)return;c.classList.add("selected");let g=c.dataset.text||"";e.textContent=g;let m=c.dataset.img||"";m&&!m.startsWith("blob:")?t.src=m:m||t.removeAttribute("src");let v=c.id;if(o(l),o(a),i(s),o(n),"2"===v||"3"===v){i(l);let E=c.dataset.label;void 0!==E?d.textContent=E:d.textContent=""}"2"===v&&(r.value="user"),"2"===v&&(r.value="reporter",i(a),o(s),i(n)),"3"===v&&(r.value="galerist",o(s))})});
// @license-end
</script> </script>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
function showOfferModal(offerHtml = '<p>Текст оферты...</p>') { function showOfferModal(offerHtml = '<p>Текст оферты...</p>') {
return new Promise((resolve) => { return new Promise((resolve) => {
const backdrop = document.createElement('div'); const backdrop = document.createElement('div');
@ -209,14 +212,20 @@ document.querySelectorAll('#openOffer').forEach(el => {
}); });
}); });
}); });
// @license-end
</script> </script>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
document.addEventListener("DOMContentLoaded",()=>{let e=document.getElementById("phone"),t=e=>(e||"").replace(/\D+/g,"");e.addEventListener("input",()=>{let a=t(e.value);a.length>10&&(a=a.slice(-10)),e.value=a}),e.addEventListener("paste",a=>{a.preventDefault();let n=(a.clipboardData||window.clipboardData).getData("text"),l=t(n);l.length>10&&(l=l.slice(-10)),e.value=l,e.dispatchEvent(new Event("input",{bubbles:!0}))})}); document.addEventListener("DOMContentLoaded",()=>{let e=document.getElementById("phone"),t=e=>(e||"").replace(/\D+/g,"");e.addEventListener("input",()=>{let a=t(e.value);a.length>10&&(a=a.slice(-10)),e.value=a}),e.addEventListener("paste",a=>{a.preventDefault();let n=(a.clipboardData||window.clipboardData).getData("text"),l=t(n);l.length>10&&(l=l.slice(-10)),e.value=l,e.dispatchEvent(new Event("input",{bubbles:!0}))})});
// @license-end
</script> </script>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
document.addEventListener("DOMContentLoaded",()=>{let e=document.getElementById("day"),t=document.getElementById("month"),l=document.getElementById("year"),n=document.getElementById("birthday"),a=new Date().getFullYear(),u=["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"];function i(t=31){e.innerHTML="";for(let l=1;l<=t;l++){let n=document.createElement("option");n.value=String(l),n.text=String(l),e.appendChild(n)}}function o(){t.innerHTML="",u.forEach((e,l)=>{let n=document.createElement("option");n.value=String(l+1),n.text=e,t.appendChild(n)})}function v(e=1900,t=a){l.innerHTML="";for(let n=t;n>=e;n--){let u=document.createElement("option");u.value=String(n),u.text=String(n),l.appendChild(u)}}let d=e=>String(e).padStart(2,"0");function p(e){if(!e)return;let n=e.split("-");if(3!==n.length)return;let[a,u,i]=n.map(Number);g(l,String(a)),g(t,String(u)),s(a,u,i)}function r(){let a=Number(l.value)||1900,u=Number(t.value)||1,o=Number(e.value)||1,v=new Date(a,u,0).getDate();e.options.length!==v&&i(v),o>v&&(o=v);let p=`${a}-${d(u)}-${d(o)}`;n.value=p,g(e,String(o))}function s(t,l,n){let a=new Date(Number(t),Number(l),0).getDate(),u=Number(e.value)||1;i(a),g(e,String(Math.min(n||u,a)))}function g(e,t){let l=Array.from(e.options).find(e=>e.value===t||e.text===t);if(l)e.value=l.value;else{let n=document.createElement("option");n.text=t,n.value=t,e.appendChild(n),e.value=t}}o(),v();let h=n.value?Number(n.value.split("-")[0]):l.options.length?Number(l.options[0].value):a,c=n.value?Number(n.value.split("-")[1]):1;n.value&&n.value.split("-")[2];let f=new Date(h,c,0).getDate();i(f),n.value?p(n.value):(!l.value&&l.options.length&&(l.value=l.options[0].value),!t.value&&t.options.length&&(t.value=t.options[0].value),!e.value&&e.options.length&&(e.value=e.options[0].value),r()),n.addEventListener("change",()=>{p(n.value)}),l.addEventListener("change",()=>{let e=Number(l.value),n=Number(t.value);s(e,n),r()}),t.addEventListener("change",()=>{let e=Number(l.value),n=Number(t.value);s(e,n),r()}),e.addEventListener("change",r)}); document.addEventListener("DOMContentLoaded",()=>{let e=document.getElementById("day"),t=document.getElementById("month"),l=document.getElementById("year"),n=document.getElementById("birthday"),a=new Date().getFullYear(),u=["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"];function i(t=31){e.innerHTML="";for(let l=1;l<=t;l++){let n=document.createElement("option");n.value=String(l),n.text=String(l),e.appendChild(n)}}function o(){t.innerHTML="",u.forEach((e,l)=>{let n=document.createElement("option");n.value=String(l+1),n.text=e,t.appendChild(n)})}function v(e=1900,t=a){l.innerHTML="";for(let n=t;n>=e;n--){let u=document.createElement("option");u.value=String(n),u.text=String(n),l.appendChild(u)}}let d=e=>String(e).padStart(2,"0");function p(e){if(!e)return;let n=e.split("-");if(3!==n.length)return;let[a,u,i]=n.map(Number);g(l,String(a)),g(t,String(u)),s(a,u,i)}function r(){let a=Number(l.value)||1900,u=Number(t.value)||1,o=Number(e.value)||1,v=new Date(a,u,0).getDate();e.options.length!==v&&i(v),o>v&&(o=v);let p=`${a}-${d(u)}-${d(o)}`;n.value=p,g(e,String(o))}function s(t,l,n){let a=new Date(Number(t),Number(l),0).getDate(),u=Number(e.value)||1;i(a),g(e,String(Math.min(n||u,a)))}function g(e,t){let l=Array.from(e.options).find(e=>e.value===t||e.text===t);if(l)e.value=l.value;else{let n=document.createElement("option");n.text=t,n.value=t,e.appendChild(n),e.value=t}}o(),v();let h=n.value?Number(n.value.split("-")[0]):l.options.length?Number(l.options[0].value):a,c=n.value?Number(n.value.split("-")[1]):1;n.value&&n.value.split("-")[2];let f=new Date(h,c,0).getDate();i(f),n.value?p(n.value):(!l.value&&l.options.length&&(l.value=l.options[0].value),!t.value&&t.options.length&&(t.value=t.options[0].value),!e.value&&e.options.length&&(e.value=e.options[0].value),r()),n.addEventListener("change",()=>{p(n.value)}),l.addEventListener("change",()=>{let e=Number(l.value),n=Number(t.value);s(e,n),r()}),t.addEventListener("change",()=>{let e=Number(l.value),n=Number(t.value);s(e,n),r()}),e.addEventListener("change",r)});
// @license-end
</script> </script>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
// Основная логика // Основная логика
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
const emailInput = document.getElementById('email'); const emailInput = document.getElementById('email');
@ -375,9 +384,12 @@ document.addEventListener('click', (e) => {
}); });
// @license-end
</script> </script>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
document.addEventListener("DOMContentLoaded",()=>{let e=document.getElementById("avatar"),t=document.getElementById("preview");e.addEventListener("change",async()=>{if(0===e.files.length)return;let n=e.files[0];t.src=URL.createObjectURL(n);let a=new FormData;a.append("avatar",n)})}); document.addEventListener("DOMContentLoaded",()=>{let e=document.getElementById("avatar"),t=document.getElementById("preview");e.addEventListener("change",async()=>{if(0===e.files.length)return;let n=e.files[0];t.src=URL.createObjectURL(n);let a=new FormData;a.append("avatar",n)})});
// @license-end
</script> </script>
{{ footer.section(user) }} {{ footer.section(user) }}
{% endblock %} {% endblock %}

View File

@ -26,117 +26,121 @@
</section> </section>
<script> <script>
window.addEventListener('load', () => { // @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
const savedEmail = localStorage.getItem('restoreEmail'); // @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
window.addEventListener('load', () => {
if (savedEmail) { const savedEmail = localStorage.getItem('restoreEmail');
document.getElementById('email').value = savedEmail;
}
});
document.addEventListener('DOMContentLoaded', () => {
const emailInput = document.getElementById('email');
const restoreBtn = document.getElementById('restoreBtn');
const nextUrl = "{{next or '/profile'}}";
restoreBtn.addEventListener('click', async (e) => {
e.preventDefault();
const requiredInputs = document.querySelectorAll('input[required]'); if (savedEmail) {
const requiredTextareas = document.querySelectorAll('textarea[required]'); document.getElementById('email').value = savedEmail;
const requiredFields = [...requiredInputs, ...requiredTextareas];
let firstErrorField = null;
let hasError = false;
requiredFields.forEach(field => {
const group = field.closest('.floating-group');
if (!group) return; // skip if no group wrapper
let isEmpty = false;
if (field.type === 'file') {
isEmpty = !field.files || field.files.length === 0;
} else {
isEmpty = !field.value || !field.value.trim();
}
if (isEmpty) {
group.classList.add('error');
hasError = true;
if (!firstErrorField) firstErrorField = field;
} else {
group.classList.remove('error');
}
});
if (hasError && firstErrorField) {
firstErrorField.scrollIntoView({ behavior: 'smooth', block: 'center' });
showToast({message: 'Введите Email', status: 'error'})
setTimeout(() => firstErrorField.focus(), 600);
return;
}
// No client-side validation errors — send request
try {
const payload = {
identifier: emailInput ? emailInput.value : '',
next: nextUrl
};
const res = await fetch('/api/restore', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload)
});
if (res.ok) {
// success (HTTP 2xx). Redirect to /form
const params = new URLSearchParams(window.location.search);
const next = params.get('next') || '/login';
window.location.href = next;
} else {
// non-2xx — mark all input groups as error
const allFields = document.querySelectorAll('.floating-group');
allFields.forEach(g => g.classList.add('error'));
// Optional: you can show server message if present
const errorText = await res.json();
// console.error('Server error:', errorText);
showToast({message: errorText.detail, status: 'error'})
}
} catch (err) {
// Network or other unexpected error — mark fields as error
const allFields = document.querySelectorAll('.floating-group');
allFields.forEach(g => g.classList.add('error'));
console.error('Request failed', err);
showToast({message: err, status: 'error'})
} }
}); });
document.addEventListener('DOMContentLoaded', () => {
const emailInput = document.getElementById('email');
const restoreBtn = document.getElementById('restoreBtn');
const nextUrl = "{{next or '/profile'}}";
restoreBtn.addEventListener('click', async (e) => {
e.preventDefault();
const requiredInputs = document.querySelectorAll('input[required]');
const requiredTextareas = document.querySelectorAll('textarea[required]');
const requiredFields = [...requiredInputs, ...requiredTextareas];
let firstErrorField = null;
let hasError = false;
requiredFields.forEach(field => {
const group = field.closest('.floating-group');
if (!group) return; // skip if no group wrapper
let isEmpty = false;
if (field.type === 'file') {
isEmpty = !field.files || field.files.length === 0;
} else {
isEmpty = !field.value || !field.value.trim();
}
if (isEmpty) {
group.classList.add('error');
hasError = true;
if (!firstErrorField) firstErrorField = field;
} else {
group.classList.remove('error');
}
});
if (hasError && firstErrorField) {
firstErrorField.scrollIntoView({ behavior: 'smooth', block: 'center' });
showToast({ message: 'Введите Email', status: 'error' })
setTimeout(() => firstErrorField.focus(), 600);
return;
}
// No client-side validation errors — send request
try {
const payload = {
identifier: emailInput ? emailInput.value : '',
next: nextUrl
};
const res = await fetch('/api/restore', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload)
});
if (res.ok) {
// success (HTTP 2xx). Redirect to /form
const params = new URLSearchParams(window.location.search);
const next = params.get('next') || '/login';
window.location.href = next;
} else {
// non-2xx — mark all input groups as error
const allFields = document.querySelectorAll('.floating-group');
allFields.forEach(g => g.classList.add('error'));
// Optional: you can show server message if present
const errorText = await res.json();
// console.error('Server error:', errorText);
showToast({ message: errorText.detail, status: 'error' })
}
} catch (err) {
// Network or other unexpected error — mark fields as error
const allFields = document.querySelectorAll('.floating-group');
allFields.forEach(g => g.classList.add('error'));
console.error('Request failed', err);
showToast({ message: err, status: 'error' })
}
});
// Убираем красную подсветку сразу при исправлении пользователем // Убираем красную подсветку сразу при исправлении пользователем
document.querySelectorAll('.floating-group input').forEach(input => { document.querySelectorAll('.floating-group input').forEach(input => {
input.addEventListener('input', function() { input.addEventListener('input', function () {
const group = this.closest('.floating-group'); const group = this.closest('.floating-group');
if (group) { if (group) {
group.classList.remove('error'); group.classList.remove('error');
}
});
// Для файлов
if (input.type === 'file') {
input.addEventListener('change', function() {
const group = this.closest('.floating-group');
if (group && this.files.length > 0) {
group.classList.remove('error');
}
});
} }
});
// Для файлов
if (input.type === 'file') {
input.addEventListener('change', function () {
const group = this.closest('.floating-group');
if (group && this.files.length > 0) {
group.classList.remove('error');
}
});
}
}); });
}); });
// @license-end
</script> </script>
{{ footer.section() }} {{ footer.section() }}
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
fetch('/api/me') fetch('/api/me')
.then(response => { .then(response => {
if (response.ok) { if (response.ok) {
@ -153,6 +157,7 @@ fetch('/api/me')
.catch(error => { .catch(error => {
console.error('There was a problem with the fetch operation:', error); console.error('There was a problem with the fetch operation:', error);
}); });
// @license-end
</script> </script>
{% endblock %} {% endblock %}

View File

@ -50,66 +50,68 @@
</div> </div>
</section> </section>
<script> <script>
// Password toggle functionality (same as login) // @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
document.querySelectorAll('.password-toggle').forEach(toggle => { // Password toggle functionality (same as login)
const input = toggle.parentElement.querySelector('input'); document.querySelectorAll('.password-toggle').forEach(toggle => {
const eyeOpen = toggle.querySelector('.eye-open'); const input = toggle.parentElement.querySelector('input');
const eyeClosed = toggle.querySelector('.eye-closed'); const eyeOpen = toggle.querySelector('.eye-open');
const eyeClosed = toggle.querySelector('.eye-closed');
toggle.addEventListener('click', () => { toggle.addEventListener('click', () => {
if (input.type === 'password') { if (input.type === 'password') {
input.type = 'text'; input.type = 'text';
eyeOpen.style.display = 'none'; eyeOpen.style.display = 'none';
eyeClosed.style.display = 'inline'; eyeClosed.style.display = 'inline';
} else { } else {
input.type = 'password'; input.type = 'password';
eyeOpen.style.display = 'inline'; eyeOpen.style.display = 'inline';
eyeClosed.style.display = 'none'; eyeClosed.style.display = 'none';
} }
});
});
// Form submit
document.getElementById('resetBtn').addEventListener('click', async () => {
const newPass = document.getElementById('new_password').value;
const confirmPass = document.getElementById('confirm_password').value;
if (newPass.length < 6) {
showToast({ message: "Пароль должен быть не менее 6 символов", status: 'error' });
return;
}
if (newPass !== confirmPass) {
showToast({ message: "Пароли не совпадают", status: 'error' });
return;
}
try {
const res = await fetch('/api/reset-password', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
token: "{{ token }}",
new_password: newPass
})
}); });
});
// Form submit const data = await res.json();
document.getElementById('resetBtn').addEventListener('click', async () => {
const newPass = document.getElementById('new_password').value;
const confirmPass = document.getElementById('confirm_password').value;
if (newPass.length < 6) { if (res.ok) {
showToast({message: "Пароль должен быть не менее 6 символов", status: 'error'}); showToast({ message: "Пароль успешно изменён!", status: 'success' });
return; setTimeout(() => {
window.location.href = `/login?next=${data.next}`;
}, 1500);
} else {
showToast({ message: data.detail || "Ошибка при смене пароля", status: 'error' });
} }
} catch (err) {
if (newPass !== confirmPass) { showToast({ message: "Ошибка соединения с сервером", status: 'error' });
showToast({message: "Пароли не совпадают", status: 'error'}); }
return; });
} // @license-end
</script>
try {
const res = await fetch('/api/reset-password', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
token: "{{ token }}",
new_password: newPass
})
});
const data = await res.json();
if (res.ok) {
showToast({message: "Пароль успешно изменён!", status: 'success'});
setTimeout(() => {
window.location.href = `/login?next=${data.next}`;
}, 1500);
} else {
showToast({message: data.detail || "Ошибка при смене пароля", status: 'error'});
}
} catch (err) {
showToast({message: "Ошибка соединения с сервером", status: 'error'});
}
});
</script>
{{ footer.section() }} {{ footer.section() }}
{% endblock %} {% endblock %}

View File

@ -65,6 +65,7 @@
</div> </div>
</section> </section>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
(function(){ (function(){
const input = document.getElementById('memberSearch'); const input = document.getElementById('memberSearch');
const container = document.querySelectorAll('.c_lt3gk')[1]; const container = document.querySelectorAll('.c_lt3gk')[1];
@ -92,6 +93,7 @@
filter(); filter();
})(); })();
// @license-end
</script> </script>
{{ footer.section() }} {{ footer.section() }}
{% endblock %} {% endblock %}

View File

@ -27,6 +27,7 @@
</div> </div>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
const userId = '{{find._id}}'; const userId = '{{find._id}}';
document.getElementById('switch-user').addEventListener('click', async () => { document.getElementById('switch-user').addEventListener('click', async () => {
@ -47,6 +48,7 @@ document.getElementById('switch-user').addEventListener('click', async () => {
showToast({message: 'Не удалось переключиться на пользователя.', status: 'error'}); showToast({message: 'Не удалось переключиться на пользователя.', status: 'error'});
} }
}); });
// @license-end
</script> </script>
{% endif %} {% endif %}
{% if 'admin' in user.get('roles', []) %} {% if 'admin' in user.get('roles', []) %}
@ -76,6 +78,7 @@ document.getElementById('switch-user').addEventListener('click', async () => {
</div> </div>
</section> </section>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
const avatarInput = document.getElementById('avatar'); const avatarInput = document.getElementById('avatar');
@ -90,6 +93,7 @@ document.addEventListener('DOMContentLoaded', () => {
} }
}); });
}); });
// @license-end
</script> </script>
{{ footer.section() }} {{ footer.section() }}
{% endblock %} {% endblock %}