Bot commit: Добавлен файл templates/profile/invitation/competition.html
This commit is contained in:
parent
dd980f5972
commit
19700b6700
332
templates/profile/invitation/competition.html
Normal file
332
templates/profile/invitation/competition.html
Normal file
@ -0,0 +1,332 @@
|
||||
{% 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 %}
|
||||
|
||||
{% block title %}Приглашения{% endblock %}
|
||||
|
||||
|
||||
|
||||
{% 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, 'invitation') }}
|
||||
<div class="c_tihtk" id="main">
|
||||
<div class="main__title mw">
|
||||
<p>{{competition.title}}</p>
|
||||
<div class="main__address-label">Адрес доставки:</div>
|
||||
<div class="main__address-value">{{competition.address}}</div>
|
||||
</div>
|
||||
<div class="mw">
|
||||
<div class="c_aihm6 floating-group">
|
||||
<select class="c_xhd5k" type="text" 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">
|
||||
<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>
|
||||
<div>
|
||||
{% for post in req.posts | selectattr('status', 'equalto', 'Проходит') %}
|
||||
<div class="b_h57rq">
|
||||
<picture>
|
||||
<img src="/b/posts/{{post.medias[0]}}" class="b_ya0t5">
|
||||
</picture>
|
||||
<div class="b_kbsvf">
|
||||
<div class="b_thlt1_2">
|
||||
<span class="b_5dr47_2">Ожидает отправки</span>
|
||||
</div>
|
||||
<p>{{ post.title }}</p>
|
||||
<button class="b_wy3rt" data-id="{{post._id}}"><span class="b_bvl0d">Отправлено</span></button>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<script>
|
||||
const deliveryType = document.getElementById('delivery_type');
|
||||
const trackWrap = document.getElementById('trackWrap');
|
||||
const track = document.getElementById('track');
|
||||
|
||||
function toggleTrack() {
|
||||
const isSelf = deliveryType.value === 'Самостоятельно';
|
||||
if (isSelf) {
|
||||
trackWrap.style.display = 'none';
|
||||
track.required = false;
|
||||
track.value = '';
|
||||
} else {
|
||||
trackWrap.style.display = '';
|
||||
track.required = true;
|
||||
}
|
||||
}
|
||||
|
||||
deliveryType.addEventListener('change', toggleTrack);
|
||||
toggleTrack();
|
||||
</script>
|
||||
<script>
|
||||
document.addEventListener('click', async (e) => {
|
||||
const btn = e.target.closest('[data-id]');
|
||||
if (!btn) return;
|
||||
|
||||
const itemId = btn.dataset.id;
|
||||
const sender = btn.dataset.sender;
|
||||
const too = btn.dataset.too;
|
||||
|
||||
const delivery_type = document.getElementById('delivery_type').value;
|
||||
const trackValue = document.getElementById('track_hidden');
|
||||
let track = ''
|
||||
if (delivery_type === 'СДЭК' && trackValue) {
|
||||
track = trackValue.value
|
||||
}
|
||||
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;
|
||||
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;
|
||||
}
|
||||
|
||||
const res = await fetch('/api/delivery/send', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
sender,
|
||||
too,
|
||||
item: itemId,
|
||||
delivery_type,
|
||||
track: track
|
||||
})
|
||||
});
|
||||
|
||||
if (!res.ok) {
|
||||
const text = await res.text();
|
||||
alert(text || 'Ошибка отправки');
|
||||
return;
|
||||
}
|
||||
|
||||
});
|
||||
</script>
|
||||
{{ footer.section(user) }}
|
||||
{% endblock %}
|
||||
|
||||
{% block head %}
|
||||
{{ header.style() }}
|
||||
{{ profile_nav.style() }}
|
||||
<style type="text/css">/* Base (common) styles */
|
||||
.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: flex-start;
|
||||
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);}
|
||||
|
||||
.c_aq9et {
|
||||
cursor: pointer;
|
||||
transition: transform 0.1s linear, box‑shadow 0.1s linear;
|
||||
box-shadow: 0 0 0 rgba(0, 0, 0, 0);
|
||||
}
|
||||
|
||||
.c_aq9et: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; }
|
||||
.c_aq9et { 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;}
|
||||
.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 type="text/css">
|
||||
.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>
|
||||
{{ footer.style() }}
|
||||
{% endblock %}
|
||||
Loading…
Reference in New Issue
Block a user