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>
<body {% if request.cookies.zoom%}style="zoom: {{ request.cookies.zoom }}%"{%endif%} onload="adjustBodyStyle()">
<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`;}
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>
{% block content %}{% endblock %}
<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>
</div>
<script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
document.addEventListener('DOMContentLoaded', () => {
document.querySelectorAll('picture').forEach(picture => {
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';}
// @license-end
</script>
<script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
{% 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}}
{% endraw %}
{% if notify %}
showToast({message: '{{notify.text}}', status: '{{notify.status}}', duration:{{notify.duration}}});
{% endif %}
// @license-end
</script>
<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;">
@ -172,6 +178,7 @@ function showToast(e={}){let{message:t="",status:a="info",duration:l=4e3}=e,n=do
</div>
</div>
<script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
async function imageWithTextBlob(imageUrl, text, options = {}) {
const response = await fetch(imageUrl, {
mode: 'cors',
@ -434,8 +441,11 @@ shareBtns.forEach(btn => {
const link = copyBtn.dataset.link || window.location.href;
copyToClipboard(link);
});
});</script>
});
// @license-end
</script>
<script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
(function() {
'use strict';
@ -706,8 +716,10 @@ shareBtns.forEach(btn => {
}, true);
})();
// @license-end
</script>
<script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
let deferredPrompt = null;
let hasUserInteracted = false;
let promptTimeout = null;
@ -795,6 +807,7 @@ shareBtns.forEach(btn => {
});
}, 1500);
}
// @license-end
</script>
<div id="dd-modal-root"></div>
@ -805,6 +818,7 @@ shareBtns.forEach(btn => {
</div>
</div>
<script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
document.addEventListener('DOMContentLoaded', () => {
const modal = document.getElementById('modalToolTip');
const modalText = document.getElementById('modalToolTipText');
@ -834,6 +848,7 @@ shareBtns.forEach(btn => {
}
});
});
// @license-end
</script>
</body>
</html>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -60,19 +60,19 @@
</div>
</form>
<script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
function sendToNextPage(e) {
e.preventDefault();
const email = document.getElementById('email').value.trim();
if (email) {
localStorage.setItem('restoreEmail', email);
}
window.location.href = "/restore{% if next %}?next={{next}}{% endif %}";
}
// @license-end
</script>
<script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
document.addEventListener('DOMContentLoaded', () => {
const emailInput = document.getElementById('email');
const passwordInput = document.getElementById('password');
@ -210,9 +210,11 @@ function sendToNextPage(e) {
});
}
});
// @license-end
</script>
{{ footer.section() }}
<script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
fetch('/api/me')
.then(response => {
if (response.ok) {
@ -229,6 +231,7 @@ fetch('/api/me')
.catch(error => {
console.error('There was a problem with the fetch operation:', error);
});
// @license-end
</script>
{% 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>
</div>
<script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
document.addEventListener('DOMContentLoaded', function() {
document.getElementById('openModalButtonVideo').addEventListener('click', function() {
const modalVideoFrame = document.getElementById('modalVideoFrame');
const modal = document.getElementById('modalVideo');
modalVideoFrame.src = 'https://vk.com/video_ext.php?oid=-213856894&id=456239020&hd=2';
modal.style.display = 'flex';
});
});
});
function videocloseModalButton() {
document.getElementById('modalVideo').style.display = 'none';
}
}
// @license-end
</script>
{%- endmacro %}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -217,6 +217,7 @@
</div>
</section>
<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('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 %}`
@ -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('biography').value = `{% if user.get('biography') is not none %}{{user.get('biography','') }}{% endif %}`
// @license-end
</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)});
// @license-end
</script>
<script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
document.addEventListener('DOMContentLoaded', () => {
const createBtn = document.getElementById('createBtn');
@ -328,6 +333,7 @@ window.location.reload();
});
// @license-end
</script>
{{ footer.section(user) }}
{% endblock %}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -137,9 +137,12 @@
</div>
</form>
<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))})});
// @license-end
</script>
<script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
function showOfferModal(offerHtml = '<p>Текст оферты...</p>') {
return new Promise((resolve) => {
const backdrop = document.createElement('div');
@ -209,14 +212,20 @@ document.querySelectorAll('#openOffer').forEach(el => {
});
});
});
// @license-end
</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}))})});
// @license-end
</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)});
// @license-end
</script>
<script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
// Основная логика
document.addEventListener('DOMContentLoaded', () => {
const emailInput = document.getElementById('email');
@ -375,9 +384,12 @@ document.addEventListener('click', (e) => {
});
// @license-end
</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)})});
// @license-end
</script>
{{ footer.section(user) }}
{% endblock %}

View File

@ -26,117 +26,121 @@
</section>
<script>
window.addEventListener('load', () => {
const savedEmail = localStorage.getItem('restoreEmail');
if (savedEmail) {
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();
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
window.addEventListener('load', () => {
const savedEmail = localStorage.getItem('restoreEmail');
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'})
if (savedEmail) {
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]');
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 => {
input.addEventListener('input', function() {
const group = this.closest('.floating-group');
if (group) {
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');
}
});
input.addEventListener('input', function () {
const group = this.closest('.floating-group');
if (group) {
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>
{{ footer.section() }}
<script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
fetch('/api/me')
.then(response => {
if (response.ok) {
@ -153,6 +157,7 @@ fetch('/api/me')
.catch(error => {
console.error('There was a problem with the fetch operation:', error);
});
// @license-end
</script>
{% endblock %}

View File

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

View File

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

View File

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