874 lines
35 KiB
HTML
874 lines
35 KiB
HTML
{% extends "base.html" %}
|
||
{% import "/components/header.html" as header %}
|
||
{% import "/components/footer.html" as footer %}
|
||
{% import "components/profile_card.html" as profile_card %}
|
||
{% import "components/profile_nav.html" as profile_nav %}
|
||
{% import "competition/list.html" as competition %}
|
||
{% import "/components/contacts.html" as contacts %}
|
||
|
||
{% block title %}Где картины{% endblock %}
|
||
|
||
{% macro render_doc(doc) %}
|
||
<figure class="c_4b1hy b_uu2ub" data-exhibition_id="{{doc.get('exhibition_id')}}" data-delivery-id="{{doc._id}}"
|
||
data-sender="{{doc.sender._id}}" data-receiver="{{doc.receiver._id}}">
|
||
<img class="b_1fvkt" src="/b/posts/{{doc.img}}">
|
||
<figcaption class="c_3g8gh b_pvw5a" data-id="{{doc._id}}">
|
||
{% if doc.status == 'Ожидает отправки' %}
|
||
<div class="b_thlt1">
|
||
<span class="b_5dr47">{{doc.status}}</span>
|
||
</div>
|
||
{% elif Получено' in (doc.status or '') %}
|
||
<div class="b_thlt1">
|
||
<span class="b_5dr47">{{doc.status}}</span>
|
||
</div>
|
||
{% elif doc.status == 'Ожидает получения' %}
|
||
<div class="b_thlt1_2">
|
||
<span class="b_5dr47_2">{{doc.status}}</span>
|
||
</div>
|
||
{% else %}
|
||
<div class="b_thlt1_2">
|
||
<span class="b_5dr47_2">{{doc.status}}</span>
|
||
</div>
|
||
{% endif %}
|
||
|
||
<a class="b_6spaf" href="/profile/delivery/{{doc.post_id}}#main">Посмотреть историю</a>
|
||
<h2 class="c_9hvtd b_f5fb2">{{doc.title}}</h2>
|
||
{% if doc.status == 'На выставке' %}
|
||
<label class="offer-label">
|
||
<input type="checkbox" onchange="saledPaintings('{{doc.post_id}}')" class="offer-checkbox" {% if
|
||
doc.status=='Продано' %}checked{%endif%}>
|
||
<span>Продано</span>
|
||
</label>
|
||
{% endif %}
|
||
{% if doc.type == 'exhibition' and doc.get('exhibition') or doc.status == 'Продано' %}
|
||
<p class="b_6spaf">{{doc.get('exhibition').title}}</p>
|
||
<div class="b_xz6em">
|
||
<img src="/a/{{doc.receiver._id}}" class="b_ob59y">
|
||
<div class="c_9hjdk b_ffruz">
|
||
<span class="b_qla2q">Организатор</span>
|
||
<span class="c_zm0m4 b_09est">{{doc.receiver.username}}</span>
|
||
</div>
|
||
</div>
|
||
{% if doc.get('user') and user._id == doc.user._id%}
|
||
{{ contacts.details(doc.receiver) }}
|
||
{% endif %}
|
||
{% if doc.get('user') %}
|
||
<div class="b_xz6em">
|
||
<img src="/a/{{doc.user._id}}" class="b_ob59y">
|
||
<div class="c_9hjdk b_ffruz">
|
||
<span class="b_qla2q">Художник</span>
|
||
<span class="c_zm0m4 b_09est">{{doc.user.username}}</span>
|
||
</div>
|
||
</div>
|
||
{% if user._id != doc.user._id%}
|
||
{{ contacts.details(doc.user) }}
|
||
{% endif %}
|
||
{% endif %}
|
||
{% else %}
|
||
{% if doc.address %}
|
||
<p class="b_6spaf">Адрес: {{doc.address}}</p>
|
||
{% endif %}
|
||
{% if doc.back_address %}
|
||
<p class="b_6spaf">Адрес для возврата: {{doc.back_address}}</p>
|
||
{% endif %}
|
||
{% if doc.delivery_type %}
|
||
<p class="b_6spaf">Способ доставки: {{doc.delivery_type}}</p>
|
||
{% endif %}
|
||
{% if doc.track %}
|
||
<p class="b_6spaf">Трэк-номер: {{doc.track}}</p>
|
||
{% endif %}
|
||
|
||
{% if doc.sender %}
|
||
<div class="b_xz6em">
|
||
<img src="/a/{{doc.sender._id}}" class="b_ob59y">
|
||
<div class="c_9hjdk b_ffruz">
|
||
<span class="b_qla2q">Отправитель</span>
|
||
<span class="c_zm0m4 b_09est">{{doc.sender.username}}</span>
|
||
</div>
|
||
</div>
|
||
{% if user._id != doc.sender._id%}
|
||
{{ contacts.details(doc.sender) }}
|
||
{% endif %}
|
||
{% endif %}
|
||
|
||
{% if doc.receiver %}
|
||
<div class="b_xz6em">
|
||
<img src="/a/{{doc.receiver._id}}" class="b_ob59y">
|
||
<div class="c_9hjdk b_ffruz">
|
||
<span class="b_qla2q">Получатель</span>
|
||
<span class="c_zm0m4 b_09est">{{doc.receiver.username}}</span>
|
||
<span class="b_qla2q">+7 *** *** {{ doc.receiver.phone[-4:] }}</span>
|
||
</div>
|
||
</div>
|
||
{% if user._id != doc.receiver._id%}
|
||
{{ contacts.details(doc.receiver) }}
|
||
{% endif %}
|
||
{% endif %}
|
||
|
||
{# Checkbox instead of per-item button #}
|
||
{% if doc.status in ['Ожидает отправки', 'Возврат художнику'] and user._id == doc.sender._id %}
|
||
<label class="offer-label delivery-checkbox-label">
|
||
<input type="checkbox" class="offer-checkbox delivery-checkbox send-checkbox" data-id="{{doc._id}}"
|
||
data-sender="{{doc.sender._id}}" data-receiver="{{doc.receiver._id}}">
|
||
<span>Выбрать для отправки</span>
|
||
</label>
|
||
{% endif %}
|
||
|
||
{% if doc.status == 'Ожидает получения' and user._id == doc.receiver._id %}
|
||
<label class="offer-label delivery-checkbox-label">
|
||
<input type="checkbox" class="offer-checkbox delivery-checkbox accept-checkbox" data-id="{{doc._id}}">
|
||
<span>Выбрать для получения</span>
|
||
</label>
|
||
{% endif %}
|
||
{% endif %}
|
||
|
||
<p class="b_6spaf">
|
||
{{ (doc._id.generation_time.strftime('%d.%m.%Y')) if doc._id else ''}}
|
||
<b>{{ '%02d' % ((doc._id.generation_time.hour + 3) % 24) if doc._id else '' }}:{{ '%02d' %
|
||
doc._id.generation_time.minute if doc._id else '' }}</b>
|
||
</p>
|
||
</figcaption>
|
||
</figure>
|
||
{% endmacro %}
|
||
|
||
{% block content %}
|
||
{{ header.section(user) }}
|
||
<section class="c_dg3k4">
|
||
<div class="c_gtoe9">
|
||
{{ profile_card.profile_card(user) }}
|
||
<div class="c_ru432">
|
||
{{ profile_nav.profile_nav(user, 'delivery') }}
|
||
<div class="c_tihtk" id="main">
|
||
{% set statuses = ['Ожидает отправки', 'Возврат художнику'] %}
|
||
{% set statusAccept = ['Ожидает получения'] %}
|
||
|
||
{% set first =
|
||
data
|
||
| selectattr('status', 'in', statuses)
|
||
| list
|
||
| length > 0
|
||
%}
|
||
|
||
{% set second =
|
||
(
|
||
data
|
||
| selectattr('status', 'in', statusAccept)
|
||
| list
|
||
| length > 0
|
||
)
|
||
and
|
||
(
|
||
data
|
||
| selectattr('receiver._id', 'equalto', user._id)
|
||
| list
|
||
| length > 0
|
||
)
|
||
%}
|
||
|
||
{% if first or second %}
|
||
<article class="c_9fgdh b_ax8vz">
|
||
<div class="c_z3dpx b_73p10">
|
||
{% if first %}
|
||
<header class="c_m876y b_9xtz9">
|
||
<h3 class="b_8f3uh">Настройки отправки</h3>
|
||
</header>
|
||
<label class="offer-label">
|
||
<input
|
||
type="checkbox"
|
||
class="offer-checkbox"
|
||
onchange="selectAll(this, true)"
|
||
>
|
||
<span class="offer-text">Выбрать все картины</span>
|
||
</label>
|
||
<div class="b_73p10">
|
||
<div class="c_aihm6 floating-group">
|
||
<select class="c_xhd5k" id="delivery_type" name="delivery_type" required>
|
||
<option>СДЭК</option>
|
||
<option>Самостоятельно</option>
|
||
</select>
|
||
<label for="delivery_type" class="c_z3ybu floating-label">Способ доставки</label>
|
||
</div>
|
||
<div class="c_aihm6 floating-group" id="track-group">
|
||
<input placeholder="..." type="text" id="track" name="track" class="c_xhd5k" required
|
||
data-toast="Поле Трэк-номер должно быть заполнено">
|
||
<label for="track" class="c_z3ybu floating-label">Трэк-номер</label>
|
||
</div>
|
||
</div>
|
||
{% endif %}
|
||
{% if second %}
|
||
<header class="c_m876y b_9xtz9">
|
||
<h3 class="b_8f3uh">Настройки получения</h3>
|
||
</header>
|
||
<label class="offer-label">
|
||
<input
|
||
type="checkbox"
|
||
class="offer-checkbox"
|
||
onchange="selectAll(this, false)"
|
||
>
|
||
<span class="offer-text">Выбрать все картины</span>
|
||
</label>
|
||
{% endif %}
|
||
</div>
|
||
</article>
|
||
{% endif %}
|
||
|
||
{% for doc in data %}
|
||
{{ render_doc(doc) }}
|
||
{% endfor %}
|
||
|
||
{# Sticky bottom action bar #}
|
||
<div class="st" style="z-index: 2000;min-height: 101px;padding: 25px;gap: 5px;">
|
||
<button class="b_wy3rt ba" id="btnSendSelected" style="display: none;" onclick="btnSendSelected()">
|
||
<span class="b_bvl0d">Отправить выбранные (<span id="sendCount">0</span>)</span>
|
||
</button>
|
||
<button class="b_wy3rt ba" id="btnAcceptSelected" style="display: none;" onclick="btnAcceptSelected()">
|
||
<span class="b_bvl0d">Получить выбранные (<span id="acceptCount">0</span>)</span>
|
||
</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'
|
||
})
|
||
.then(response => {
|
||
if (response.ok) {
|
||
// Find and delete the parent figure
|
||
const postElement = document.querySelector(`figure[data-postId='${postId}']`);
|
||
showToast({
|
||
message: 'Сохранено!',
|
||
status: 'info',
|
||
duration: 1200
|
||
});
|
||
} else {
|
||
showToast({
|
||
message: 'Ошибка соединения с сервером!',
|
||
status: 'error',
|
||
duration: 2500
|
||
});
|
||
}
|
||
})
|
||
.catch(error => {
|
||
// Handle network errors
|
||
showToast({
|
||
message: 'Ошибка соединения с сервером!',
|
||
status: 'error',
|
||
duration: 2500
|
||
});
|
||
});
|
||
}
|
||
// @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){
|
||
document.querySelectorAll('.send-checkbox').forEach(el=>{
|
||
el.checked = true;
|
||
})
|
||
} else {
|
||
document.querySelectorAll('.send-checkbox').forEach(el=>{
|
||
el.checked = false;
|
||
})
|
||
}
|
||
} else {
|
||
if (elem.checked){
|
||
document.querySelectorAll('.accept-checkbox').forEach(el=>{
|
||
el.checked = true;
|
||
})
|
||
} else {
|
||
document.querySelectorAll('.accept-checkbox').forEach(el=>{
|
||
el.checked = false;
|
||
})
|
||
}
|
||
}
|
||
|
||
updateStickyButtons();
|
||
|
||
}
|
||
// @license-end
|
||
</script>
|
||
<script>
|
||
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
|
||
// ─────────────────────────────────────────────
|
||
// Helpers: collect selected IDs
|
||
// ─────────────────────────────────────────────
|
||
function getSelectedSendIds() {
|
||
return Array.from(document.querySelectorAll('.send-checkbox:checked')).map(cb => ({
|
||
id: cb.dataset.id,
|
||
sender: cb.dataset.sender,
|
||
receiver: cb.dataset.receiver
|
||
}));
|
||
}
|
||
|
||
function getSelectedAcceptIds() {
|
||
return Array.from(document.querySelectorAll('.accept-checkbox:checked')).map(cb => cb.dataset.id);
|
||
}
|
||
|
||
// ─────────────────────────────────────────────
|
||
// Sticky buttons visibility
|
||
// ─────────────────────────────────────────────
|
||
function updateStickyButtons() {
|
||
const sendCount = document.querySelectorAll('.send-checkbox:checked').length;
|
||
const acceptCount = document.querySelectorAll('.accept-checkbox:checked').length;
|
||
|
||
const sendBtn = document.getElementById('btnSendSelected');
|
||
const acceptBtn = document.getElementById('btnAcceptSelected');
|
||
|
||
const sendCountSpan = document.getElementById('sendCount');
|
||
const acceptCountSpan = document.getElementById('acceptCount');
|
||
|
||
sendCountSpan.textContent = sendCount;
|
||
acceptCountSpan.textContent = acceptCount;
|
||
|
||
if (sendBtn) sendBtn.style.display = sendCount > 0 ? 'inline-flex' : 'none';
|
||
if (acceptBtn) acceptBtn.style.display = acceptCount > 0 ? 'inline-flex' : 'none';
|
||
}
|
||
|
||
// ─────────────────────────────────────────────
|
||
// Show / hide track field depending on delivery_type
|
||
// ─────────────────────────────────────────────
|
||
function toggleTrackField() {
|
||
const deliveryType = document.getElementById('delivery_type');
|
||
const trackGroup = document.getElementById('track-group');
|
||
const trackInput = document.getElementById('track');
|
||
|
||
if (!deliveryType || !trackGroup || !trackInput) return;
|
||
|
||
if (deliveryType.value === 'Самостоятельно') {
|
||
trackGroup.style.display = 'none';
|
||
trackInput.removeAttribute('required');
|
||
trackInput.value = '';
|
||
} else {
|
||
trackGroup.style.display = '';
|
||
trackInput.setAttribute('required', '');
|
||
}
|
||
}
|
||
|
||
// ─────────────────────────────────────────────
|
||
// Validation helper (used by Send)
|
||
// ─────────────────────────────────────────────
|
||
function validateRequiredFields() {
|
||
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;
|
||
|
||
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;
|
||
showToast({ message: field.dataset.toast || 'Заполните обязательное поле', duration: 2500 });
|
||
if (!firstErrorField) firstErrorField = field;
|
||
} else {
|
||
group.classList.remove('error');
|
||
}
|
||
});
|
||
|
||
if (hasError && firstErrorField) {
|
||
firstErrorField.scrollIntoView({ behavior: 'smooth', block: 'center' });
|
||
setTimeout(() => firstErrorField.focus(), 600);
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
// ─────────────────────────────────────────────
|
||
// Bulk Accept
|
||
// ─────────────────────────────────────────────
|
||
async function btnAcceptSelected() {
|
||
const ids = getSelectedAcceptIds();
|
||
if (!ids.length) return;
|
||
|
||
try {
|
||
const res = await fetch('/api/delivery/accept', {
|
||
method: 'POST',
|
||
headers: { 'Content-Type': 'application/json' },
|
||
body: JSON.stringify({ items: ids })
|
||
});
|
||
|
||
if (!res.ok) {
|
||
let errorMessage = 'Ошибка сохранения';
|
||
try {
|
||
const errorData = await res.json();
|
||
errorMessage = errorData.detail || errorMessage;
|
||
} catch (e) {
|
||
try {
|
||
const errorText = await res.text();
|
||
errorMessage = errorText || errorMessage;
|
||
} catch (e) {}
|
||
}
|
||
showToast({ message: errorMessage, duration: 2500 });
|
||
return;
|
||
}
|
||
|
||
const data = await res.json();
|
||
|
||
// Update UI for successfully processed items
|
||
(data.processed || []).forEach(({ item }) => {
|
||
const checkbox = document.querySelector(`.accept-checkbox[data-id="${item}"]`);
|
||
if (!checkbox) return;
|
||
|
||
const figcaption = checkbox.closest('figcaption');
|
||
const statusDiv = figcaption.querySelectorAll('div')[0];
|
||
const statusSpan = statusDiv.querySelector('span');
|
||
|
||
statusDiv.className = 'b_thlt1';
|
||
statusSpan.className = 'b_5dr47';
|
||
statusSpan.textContent = 'Получено';
|
||
checkbox.closest('label').style.display = 'none';
|
||
checkbox.checked = false;
|
||
});
|
||
|
||
if (data.errors?.length) {
|
||
showToast({ message: `Ошибки: ${data.errors.length}`, duration: 3000 });
|
||
}
|
||
} catch (error) {
|
||
console.error('Network error:', error);
|
||
showToast({ message: 'Не удалось подключиться к серверу', duration: 2500 });
|
||
}
|
||
|
||
updateStickyButtons();
|
||
}
|
||
|
||
// ─────────────────────────────────────────────
|
||
// Bulk Send
|
||
// ─────────────────────────────────────────────
|
||
async function btnSendSelected() {
|
||
const items = getSelectedSendIds();
|
||
if (!items.length) return;
|
||
|
||
// Validate required fields first
|
||
if (!validateRequiredFields()) return;
|
||
|
||
const delivery_type = document.getElementById('delivery_type')?.value || '';
|
||
const trackInput = document.getElementById('track');
|
||
let track = '';
|
||
if (delivery_type === 'СДЭК' && trackInput) {
|
||
track = trackInput.value.trim();
|
||
}
|
||
|
||
try {
|
||
const res = await fetch('/api/delivery/send', {
|
||
method: 'POST',
|
||
headers: { 'Content-Type': 'application/json' },
|
||
body: JSON.stringify({
|
||
items: items.map(i => ({
|
||
item: i.id,
|
||
sender: i.sender,
|
||
too: i.receiver
|
||
})),
|
||
delivery_type,
|
||
track: track || null
|
||
})
|
||
});
|
||
|
||
if (!res.ok) {
|
||
let errorMessage = 'Ошибка сохранения';
|
||
try {
|
||
const errorData = await res.json();
|
||
errorMessage = errorData.detail || errorMessage;
|
||
} catch (e) {
|
||
try {
|
||
const errorText = await res.text();
|
||
errorMessage = errorText || errorMessage;
|
||
} catch (e) {}
|
||
}
|
||
showToast({ message: errorMessage, duration: 2500 });
|
||
return;
|
||
}
|
||
|
||
const data = await res.json();
|
||
|
||
// Update UI for successfully processed items
|
||
(data.processed || []).forEach(({ item }) => {
|
||
const checkbox = document.querySelector(`.send-checkbox[data-id="${item}"]`);
|
||
if (!checkbox) return;
|
||
|
||
const figcaption = checkbox.closest('figcaption');
|
||
const statusDiv = figcaption.querySelectorAll('div')[0];
|
||
const statusSpan = statusDiv.querySelector('span');
|
||
|
||
statusDiv.className = 'b_thlt1_2';
|
||
statusSpan.className = 'b_5dr47_2';
|
||
statusSpan.textContent = 'Ожидает получения';
|
||
checkbox.closest('label').style.display = 'none';
|
||
checkbox.checked = false;
|
||
});
|
||
|
||
if (data.errors?.length) {
|
||
showToast({ message: `Ошибки: ${data.errors.length}`, duration: 3000 });
|
||
}
|
||
} catch (error) {
|
||
console.error('Network error:', error);
|
||
showToast({ message: 'Не удалось подключиться к серверу', duration: 2500 });
|
||
}
|
||
|
||
updateStickyButtons();
|
||
}
|
||
|
||
// ─────────────────────────────────────────────
|
||
// Event listeners
|
||
// ─────────────────────────────────────────────
|
||
document.addEventListener('DOMContentLoaded', () => {
|
||
// Initial state of track field
|
||
toggleTrackField();
|
||
|
||
// Change of delivery type
|
||
document.getElementById('delivery_type')?.addEventListener('change', toggleTrackField);
|
||
|
||
// Checkbox changes → update sticky buttons
|
||
document.addEventListener('change', (e) => {
|
||
if (e.target.classList.contains('delivery-checkbox')) {
|
||
updateStickyButtons();
|
||
}
|
||
});
|
||
});
|
||
// @license-end
|
||
</script>
|
||
<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');
|
||
const trackInput = document.getElementById('track');
|
||
|
||
if (!deliveryType || !trackGroup || !trackInput) return;
|
||
|
||
if (deliveryType.value === 'Самостоятельно') {
|
||
trackGroup.style.display = 'none';
|
||
trackInput.removeAttribute('required');
|
||
trackInput.value = ''; // clear value when hidden
|
||
} else {
|
||
trackGroup.style.display = '';
|
||
trackInput.setAttribute('required', '');
|
||
}
|
||
}
|
||
|
||
// Run on page load
|
||
document.addEventListener('DOMContentLoaded', toggleTrackField);
|
||
|
||
// Run every time the select changes
|
||
document.getElementById('delivery_type')?.addEventListener('change', toggleTrackField);
|
||
const query = window.location.href.split('?')[1] || '';
|
||
let exhibition_id = null;
|
||
if (query) {
|
||
const parts = query.split('=');
|
||
if (parts[0] === 'exhibition_id' && parts[1] !== 'None') {
|
||
exhibition_id = parts[1];
|
||
}
|
||
}
|
||
function filterFigure(exhibition_id) {
|
||
document.getElementById('main').querySelectorAll('figure').forEach(figure => {
|
||
|
||
if (!exhibition_id || figure.dataset.exhibition_id === exhibition_id) {
|
||
figure.style.display = 'flex';
|
||
console.log(figure.dataset.exhibition_id, exhibition_id, 'flex')
|
||
} else {
|
||
console.log(figure.dataset.exhibition_id, exhibition_id)
|
||
figure.style.display = 'none';
|
||
}
|
||
});
|
||
}
|
||
|
||
if (exhibition_id) {
|
||
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');
|
||
|
||
function toggleTrack() {
|
||
const isSelf = deliveryType.value === 'Самостоятельно';
|
||
if (isSelf) {
|
||
track.required = false;
|
||
track.value = '';
|
||
} else {
|
||
track.required = true;
|
||
}
|
||
}
|
||
|
||
deliveryType.addEventListener('change', toggleTrack);
|
||
toggleTrack();
|
||
// @license-end
|
||
</script>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
{{ footer.section(user) }}
|
||
{% endblock %}
|
||
|
||
{% block head %}
|
||
{{ header.style() }}
|
||
{{ competition.style() }}
|
||
{{ profile_nav.style() }}
|
||
{{ contacts.style() }}
|
||
<style>
|
||
/* Base (common) styles */
|
||
.c_aihm6{width: 100%;}
|
||
.mw{margin: 0 20px;
|
||
width: 100%;}
|
||
.main__top{ display:flex; justify-content:space-between; gap:16px; align-items:flex-start; margin-bottom:16px;}
|
||
.main__title{ flex: 1; min-width: 260px;}
|
||
.main__title > p{ margin: 0 0 10px 0; font-size: 20px; font-weight: 900; color: #0f172a;}
|
||
.main__address-label{ font-size: 13px; color: #64748b; margin-bottom: 6px;}
|
||
.main__address-value{ font-size: 14px; font-weight: 800; color: #0f172a;}
|
||
.b_ya0t5 {
|
||
align-self: stretch;
|
||
border-radius: 5px;
|
||
height: 222px;
|
||
}
|
||
picture > img {
|
||
width: 100%;
|
||
object-fit: scale-down;
|
||
}
|
||
.b_kbsvf {
|
||
padding: 10px 20px;
|
||
align-items: center;
|
||
align-self: stretch;
|
||
display: flex;
|
||
flex-direction: column;
|
||
gap: 10px;
|
||
justify-content: center;
|
||
}
|
||
.b_thlt1 { align-items: center; background: rgba(14, 214, 70, 0.20); border-radius: 30px; display: flex; justify-content: center; padding: 1.5px 10px; }
|
||
.b_5dr47 { color: #0ED646; font-family: Inter; font-size: 12px; font-style: normal; font-weight: 700; line-height: normal; }
|
||
.b_thlt1_2 { align-items: center; background: rgba(95, 23, 152, 0.20); border-radius: 30px; display: flex; justify-content: center; padding: 1.5px 10px; }
|
||
.b_5dr47_2 { color: #5F1798; font-family: Inter; font-size: 12px; font-style: normal; font-weight: 700; line-height: normal; }
|
||
.b_h57rq {
|
||
align-items: flex-start;
|
||
background: #FDFAFF;
|
||
border-radius: 5px;
|
||
border: 1px solid #5F1798;
|
||
display: flex;
|
||
flex-direction: column;
|
||
width: 335px;
|
||
}
|
||
.b_wy3rt { align-items: center; background: #5F1798; border-radius: 5px; display: flex; justify-content: center; padding: 15px 0; width: 100%; }
|
||
.b_bvl0d { color: #FFF; font-family: Inter; font-size: 14px; font-style: normal; font-weight: 400; line-height: normal; }
|
||
|
||
/* remove default button outline but keep focus visible */
|
||
.password-toggle:focus { outline: 2px solid rgba(95,23,152,0.25); outline-offset: 2px; }
|
||
|
||
/* ensure svg size fits */
|
||
.password-toggle .eye { width: 24px; height: 24px; display: block; }
|
||
|
||
.file-name-display {width: 100%;padding: 16px 50px 16px 16px;border: 2px solid #ddd;border-radius: 8px;font-size: 16px;color: #555;background: #fff;min-height: 56px;display: flex;align-items: center;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;transition: all 0.3s ease;cursor: pointer;}
|
||
|
||
/* Hover эффект */
|
||
.c_aihm6:hover select, .c_nb6gy:hover textarea, .poster-group:hover .file-name-display {border-color: #5F1798;}
|
||
|
||
/* Когда файл выбран — делаем текст чуть темнее */
|
||
.poster-group.has-file .file-name-display {color: #222;font-weight: 500;}
|
||
|
||
/* Скрытый input file */
|
||
.hidden-file {position: absolute;inset: 0;opacity: 0;cursor: pointer;z-index: 2;}
|
||
|
||
/* Плавающий лейбл */
|
||
.poster-group .floating-label {position: absolute;left: 16px;top: -8px;font-size: 13px;color: #5F1798;}background: #fff;padding: 0 6px;z-index: 3;transition: all 0.3s ease;pointer-events: none;}
|
||
|
||
/* Когда лейбл должен подняться */
|
||
.poster-group select:focus + .floating-label,
|
||
.poster-group.has-file .floating-label {top: -8px;font-size: 13px;color: #5F1798;}
|
||
|
||
/* Иконка справа */
|
||
.file-icon {position: absolute;right: 16px;top: 50%;transform: translateY(-50%);z-index: 3;pointer-events: none;}
|
||
|
||
/* Красная ошибка */
|
||
.poster-group.error .file-name-display {border-color: #e74c3c !important;box-shadow: 0 0 0 3px rgba(231, 76, 60, 0.15);}
|
||
|
||
.poster-group.error .floating-label {color: #e74c3c !important;}
|
||
/* ====================== FLOATING LABELS ====================== */
|
||
.floating-group {position: relative;margin-bottom: 1.5rem;}
|
||
|
||
.floating-label {position: absolute;left: 16px;top: -8px;font-size: 13px;color: #5F1798;transition: all 0.3s ease;pointer-events: none;background: #fff;padding: 0 6px;z-index: 2;}
|
||
|
||
/* Плавающий лейбл */
|
||
.floating-group select:focus + .floating-label, .floating-group textarea:focus + .floating-label,
|
||
.floating-group select:not(:placeholder-shown) + .floating-label, .floating-group textarea:not(:placeholder-shown) + .floating-label {top: -8px;font-size: 15px;color: #5F1798;}
|
||
|
||
/* Красная подсветка — ТОЛЬКО после попытки отправки */
|
||
.floating-group.error select, .floating-group.error textarea,
|
||
.floating-group.error select[type="file"] {border-color: #e74c3c !important;box-shadow: 0 0 0 3px rgba(231, 76, 60, 0.38);}
|
||
|
||
.floating-group.error .floating-label {color: #e74c3c !important;}
|
||
|
||
/* Основные стили полей */
|
||
.c_xhd5k, .c_4ykpn {box-sizing: border-box; width: 100%;padding: 16px 16px;border: 2px solid #ddd;border-radius: 8px;font-size: 16px;transition: all 0.3s ease;background: #fff;}
|
||
|
||
.c_xhd5k:focus, .c_4ykpn:focus {border-color: #5F1798;outline: none;box-shadow: 0 0 0 3px rgba(95, 23, 152, 0.15);}
|
||
|
||
.b_wy3rt {
|
||
cursor: pointer;
|
||
transition: transform 0.1s linear, box‑shadow 0.1s linear;
|
||
box-shadow: 0 0 0 rgba(0, 0, 0, 0);
|
||
}
|
||
|
||
.b_wy3rt:active {
|
||
transform: scale(0.9);
|
||
box-shadow: 5px 5px 5px rgba(95, 23, 152, 0.32);
|
||
}
|
||
|
||
article>a{width: 100%;}
|
||
picture>img{ width: 100%; object-fit: scale-down; }
|
||
.fl{display: flex;justify-content: space-between;width: 100%;}
|
||
.c_som9s { color: #FFF; font-family: Inter; font-size: 14px; font-style: normal; font-weight: 400; line-height: normal; }
|
||
.b_wy3rt { display: flex; padding: 19px 33px; justify-content: center; align-items: center; align-self: stretch; border-radius: 5px; background: #5F1798; }
|
||
.b_ornr9 { align-self: stretch; height: 400px; overflow: hidden;}
|
||
.b_0jst1 { color: #0ED646; font-family: Inter; font-size: 12px; font-style: normal; font-weight: 700; line-height: normal; }
|
||
.b_vabj9 { align-items: center; background: rgba(14, 214, 70, 0.20); border-radius: 30px; display: flex; justify-content: center; padding: 1.5px 10px; }
|
||
.b_0jst1_2 { color: #5F1798; font-family: Inter; font-size: 12px; font-style: normal; font-weight: 700; line-height: normal; }
|
||
.b_vabj9_2 { align-items: center; background: #5e17982f; border-radius: 30px; display: flex; justify-content: center; padding: 1.5px 10px; }
|
||
.b_8f3uh { -webkit-box-orient: vertical; -webkit-line-clamp: 1; color: #000; display: -webkit-box; flex: 1 0 0; font-family: Inter; font-size: 24px; font-style: normal; font-weight: 700; line-height: normal; overflow: hidden; text-overflow: ellipsis; }
|
||
.b_9xtz9 { align-items: center; align-self: stretch; display: flex; justify-content: center; }
|
||
.b_tfnz2 { align-self: stretch; color: #5F1798; font-family: Inter; font-size: 14px; font-style: normal; font-weight: 400; line-height: normal; cursor: pointer; }
|
||
.b_a68fq { aspect-ratio: 1/1; border-radius: 50px; height: 50px; width: 50px; object-fit: cover; }
|
||
.b_ghosy { align-self: stretch; color: #000; font-family: Inter; font-size: 16px; font-style: normal; font-weight: 400; line-height: normal; }
|
||
.b_ntazj { align-items: flex-start; display: flex; flex-direction: column; flex: 1 0 0; justify-content: center; }
|
||
.b_otttb { align-items: center; align-self: stretch; display: flex; gap: 13px; height: 50px; }
|
||
.b_s6ool { white-space: pre-line; -webkit-box-orient: vertical; -webkit-line-clamp: 3; align-self: stretch; color: rgba(58, 58, 58, 0.75); display: -webkit-box; font-family: Inter; font-size: 14px; font-style: normal; font-weight: 400; line-height: normal; overflow: hidden; text-overflow: ellipsis; }
|
||
.b_mp1wb { align-self: stretch; color: rgba(58, 58, 58, 0.75); font-family: Inter; font-size: 14px; font-style: normal; font-weight: 400; line-height: normal; text-align: right; }
|
||
.b_73p10 { align-items: flex-start; align-self: stretch; background: #FFF; display: flex; flex-direction: column; gap: 10px; justify-content: center; }
|
||
.c_z3dpx{ padding: 10px 20px; gap: 20px; }
|
||
.b_ax8vz { align-items: flex-start; border-radius: 10px; border: 1px solid #5F1798; box-shadow: 0 4px 4px 0 rgba(0, 0, 0, 0.30), 0 4px 20px 0 rgba(0, 0, 0, 0.20); display: flex; flex-direction: column; width: 335px; overflow: hidden;}
|
||
@media (min-width: 901px) {
|
||
.c_9fgdh { align-items: flex-start; border-radius: 10px; border: 1px solid #5F1798; box-shadow: 0 4px 4px 0 rgba(0, 0, 0, 0.30), 0 4px 20px 0 rgba(0, 0, 0, 0.20); display: flex; flex-direction: column; flex-shrink: 0; width: 335px; }
|
||
}
|
||
@media (max-width: 699px) {
|
||
.b_ornr9{height: auto;}
|
||
}
|
||
</style>
|
||
<style>
|
||
.menua{width: 100%;
|
||
display: flex;
|
||
flex-direction: column;
|
||
gap: 7px;
|
||
margin: 10px 20px;}
|
||
.icona{display: flex;
|
||
gap: 10px;
|
||
align-items: center;}
|
||
.icona>span{color: #5F1798;}
|
||
.c_hysjg {
|
||
color: #0ED646;
|
||
font-family: Inter;
|
||
/* font-size: 12px; */
|
||
font-style: normal;
|
||
font-weight: 700;
|
||
line-height: normal;
|
||
}
|
||
/* .c_m876y{align-items: center;
|
||
background: rgba(14, 214, 70, 0.20);
|
||
border-radius: 30px;
|
||
display: flex;
|
||
justify-content: center;
|
||
padding: 1.5px 10px;} */
|
||
/* Mobile */
|
||
@media (max-width: 699px) {
|
||
.c_mrl59 { align-items: center; background: #5F1798; border-radius: 25px; bottom: -15px; display: flex; height: 50px; justify-content: center; position: absolute; right: -15px; width: 50px; }
|
||
|
||
|
||
|
||
}
|
||
|
||
/* Tablet */
|
||
@media (min-width: 700px) and (max-width: 900px) {
|
||
.c_iiehk { align-items: center; border-radius: 5px; display: flex; flex-direction: column; gap: 20px; width: 335px; }
|
||
.c_nnsh6>a>img{display: none;}
|
||
|
||
}
|
||
|
||
/* Desktop */
|
||
@media (min-width: 901px) {
|
||
.c_iiehk { align-items: flex-end; border-radius: 5px; display: flex; flex-direction: column; gap: 20px; width: 310px; }
|
||
.c_nnsh6>a>img{display: none;}
|
||
|
||
}</style>
|
||
<style>
|
||
.b_thlt1 { align-items: center; background: rgba(14, 214, 70, 0.20); border-radius: 30px; display: flex; justify-content: center; padding: 1.5px 10px; }
|
||
.b_5dr47 { color: #0ED646; font-family: Inter; font-size: 12px; font-style: normal; font-weight: 700; line-height: normal; }
|
||
.b_thlt1_2 { align-items: center; background: rgba(95, 23, 152, 0.20); border-radius: 30px; display: flex; justify-content: center; padding: 1.5px 10px; }
|
||
.b_5dr47_2 { color: #5F1798; font-family: Inter; font-size: 12px; font-style: normal; font-weight: 700; line-height: normal; }
|
||
.b_6spaf {
|
||
color: #5F1798;
|
||
font-family: Inter;
|
||
font-size: 14px;
|
||
font-style: normal;
|
||
font-weight: 400;
|
||
line-height: normal;
|
||
}
|
||
.b_qla2q {
|
||
-webkit-box-orient: vertical;
|
||
-webkit-line-clamp: 1;
|
||
color: #000;
|
||
display: -webkit-box;
|
||
font-family: Inter;
|
||
font-size: 13px;
|
||
font-style: normal;
|
||
font-weight: 400;
|
||
line-height: normal;
|
||
overflow: hidden;
|
||
text-overflow: ellipsis;
|
||
}
|
||
.b_uu2ub { align-items: flex-start; background: #FDFAFF; border-radius: 5px; border: 1px solid #5F1798; box-shadow: 0 4px 4px 0 rgba(0, 0, 0, 0.25), 0 4px 20px 0 rgba(0, 0, 0, 0.20); display: flex; flex-direction: column; width: 335px; }
|
||
.b_1fvkt { align-self: stretch; border-radius: 5px; flex-shrink: 0; }
|
||
.b_pvw5a { gap: 7px;align-items: flex-start; align-self: stretch; display: flex; flex-direction: column; flex: 1 0 0; justify-content: space-between; padding: 10px 20px 37px 20px; }
|
||
.b_xz6em { align-items: center; align-self: stretch; display: flex; gap: 13px; }
|
||
.b_ob59y { border-radius: 1em; height: 70px; min-width: 70px; max-width: 150px; vertical-align: top; object-fit: cover;}
|
||
.b_ffruz { align-items: flex-start; display: flex; flex-direction: column; flex: 1 0 0; justify-content: center; }
|
||
.b_09est { color: #000; font-family: Inter; font-size: 15px; font-style: normal; font-weight: 700; line-height: normal; }
|
||
.b_wy3rt {
|
||
align-items: center;
|
||
background: #5F1798;
|
||
border-radius: 5px;
|
||
display: flex;
|
||
justify-content: center;
|
||
padding: 15px 0;
|
||
width: 100%;
|
||
}
|
||
.b_bvl0d {
|
||
color: #FFF;
|
||
font-family: Inter;
|
||
font-size: 14px;
|
||
font-style: normal;
|
||
font-weight: 400;
|
||
line-height: normal;
|
||
}
|
||
/* Mobile */
|
||
@media (max-width: 699px) {
|
||
.c_3g8gh { align-items: flex-start; align-self: stretch; display: flex; flex-direction: column; flex-shrink: 0; justify-content: space-between; padding: 10px 20px 37px 20px; }
|
||
|
||
.c_4b1hy { align-items: flex-start; background: #FDFAFF; border-radius: 5px; border: 1px solid #5F1798; box-shadow: 0 4px 4px 0 rgba(0, 0, 0, 0.25), 0 4px 20px 0 rgba(0, 0, 0, 0.20); display: flex; flex-direction: column; width: 335px; }
|
||
.c_mrl59 { align-items: center; background: #5F1798; border-radius: 25px; bottom: -15px; display: flex; height: 50px; justify-content: center; position: absolute; right: -15px; width: 50px; }
|
||
}
|
||
/* Tablet */
|
||
@media (min-width: 700px) and (max-width: 900px) {
|
||
.c_iiehk { align-items: center; border-radius: 5px; display: flex; flex-direction: column; gap: 20px; width: 335px; }
|
||
.c_nnsh6>a>img{display: none;}
|
||
}
|
||
/* Desktop */
|
||
@media (min-width: 901px) {
|
||
.c_iiehk { align-items: flex-end; border-radius: 5px; display: flex; flex-direction: column; gap: 20px; width: 310px; }
|
||
.c_nnsh6>a>img{display: none;}
|
||
}</style>
|
||
{{ footer.style() }}
|
||
{% endblock %} |