avtopost.kultmost.ru/templates/profile/partner/exhibition.html
2026-09-01 22:19:40 -04:00

283 lines
12 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{% 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/label.html" as label %}
{% block title %}Отобранные картины | Выставка {{exhibition.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, 'exhibitions') }}
<div class="c_3ihvi" id="main">
{% if now < exhibition.date_finish %}
<a class="b_289i1 ba" href="/profile/partner/exhibition/{{exhibition._id}}/catalog#main">
<span class="c_d2l0b b_al8e7">Каталог картин</span>
</a>
{% endif %}
{% set ids = posts
| selectattr('status', 'equalto', 'В каталоге')
| map(attribute='user._id')
| list
%}
{% set uniq_count = ids | unique | list | length %}
{% if uniq_count > 0 %}
<button class="b_289i1 ba" onclick="sendInvitations('{{exhibition._id}}')" href="/profile/partner/exhibition/{{exhibition._id}}/catalog#main">
<span class="c_d2l0b b_al8e7">Отправить приглашени{% if uniq_count > 1 %}я{% else %}е{% endif %}</span>
</button>
{% endif %}
</div>
<div class="c_tihtk">
<article class="c_9fgdh b_ax8vz">
<div class="b_ornr9">
<picture>
<img src="/b/exhibition/{{exhibition.poster_file_id}}" data-src="/b/exhibition/{{exhibition.poster_orig_id}}" id="preview_poster" crossorigin="anonymous" fetchpriority="high" loading="eager" alt="Выставка {{exhibition.title}}" class="b_ornr9">
</picture>
</div>
<div class="c_z3dpx b_73p10">
<div class="c_c4wam b_vabj9">
{% if now > exhibition.date_finish %}
<span class="c_95csi b_0jst1">Закончилась</span>
{% elif now > exhibition.datetime_start %}
<span class="c_95csi b_0jst1">Началась</span>
{% else %}
<span class="c_95csi b_0jst1">Формируется</span>
{% endif %}
</div>
<header class="c_m876y b_9xtz9">
<h3 class="c_hysjg b_8f3uh" id="preview_title">Выставка {{exhibition.title}}</h3>
</header>
<p class="c_2fr39 b_tfnz2" id="preview_topic">{{exhibition.topic}}</p>
<p>Место проведения: {{ exhibition.get('place') }}</p>
<p >Отобрано картин: <span id="lenPosts">{{ posts | length }}</span></p>
<div class="b_otttb">
<span class="c_2fr39 b_tfnz2">С {{ ( exhibition.datetime_start.strftime('%d.%m.%Y')) if exhibition.datetime_start else ''}}</span>
<span class="c_2fr39 b_tfnz2">По {{ ( exhibition.date_finish.strftime('%d.%m.%Y')) if exhibition.date_finish else ''}}</span>
</div>
</div>
</article>
{% for post in posts %}
<article class="c_9fgdh b_ax8vz">
<div class="b_ornr9">
<picture>
<img src="/b/posts/{{post.medias[0]}}" data-src="/b/posts/{{ post.medias_original[0] }}" crossorigin="anonymous" fetchpriority="high" loading="eager" alt="{{post.title}}" class="b_ornr9">
</picture>
</div>
<div class="c_z3dpx b_73p10">
<header class="c_m876y b_9xtz9">
<h3 class="c_hysjg b_8f3uh" id="preview_title">{{post.title}}</h3>
</header>
{% if post.status == 'На выставке' %}
<label class="offer-label delivery-checkbox-label">
<input type="checkbox"
onchange="saledPaintings('{{post._id}}')"
class="offer-checkbox delivery-checkbox send-checkbox"
{% if post.status == 'Продано' %}checked{%endif%}>
<span>Продано</span>
</label>
{% endif %}
{% if post.status=='В каталоге' %}
<div class="l_green"><span>{{post.status}}</span></div>
{% else %}
<div class="l_purple"><span>{{post.status}}</span></div>
{% endif %}
<p class="c_2fr39 b_tfnz2" id="preview_topic">Размер: {{post.size}}</p>
<p class="c_2fr39 b_tfnz2" id="preview_topic">Материал: {{post.material}}</p>
<p class="c_2fr39 b_tfnz2" id="preview_topic">Жанр: {{post.genre}}</p>
<div class="c_dbbe4 b_otttb">
{% if post.user %}
<img crossorigin="anonymous" fetchpriority="high" loading="eager" class="c_pm80w b_a68fq" src="/a/{{post.user._id}}" alt="{{ post.user.username | e }}">
<div class="c_4402p b_ntazj">
<p class="c_kvah4 b_ghosy">{{ post.user.username }}</p>
<!-- <p class="c_kvah4 b_ghosy">{{ post.grade }}</p> -->
</div>
{% endif %}
</div>
{% if post.status=='В каталоге' %}
<button onclick="selectPost(this, '{{post._id}}')" class="c_ctfod b_289i1">
<span class="c_d2l0b b_al8e7">Убрать с выставки</span>
</button>
{% endif %}
{% if post.status == 'Ожидает получения' %}
{# <button class="b_289i1" onclick="btnAccept(this, '{{post.d_id}}')"><span class="b_al8e7">Получить</span></button> #}
<a class="b_289i1" href="/profile/delivery/exhibition/{{exhibition._id}}#main">
<span class="b_al8e7">Получить</span>
</a>
{% endif %}
{% if post.status in ['Возврат художнику']%}
<a class="b_289i1" href="/profile/delivery/exhibition/{{exhibition._id}}#main">
<span class="b_al8e7">Отправить</span>
</a>
{% endif %}
</div>
</article>
{% endfor %}
</div>
</div>
</div>
</section>
<script>
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
});
});
}
</script>
{#
<script>
async function btnAccept(btn, itemId){
const figcaption = btn.parentElement;
const statusDiv = figcaption.querySelectorAll('div')[0];
const statusSpan = statusDiv.querySelector('span')
try {
const res = await fetch('/api/delivery/accept', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
item: itemId,
})
});
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;
}
statusDiv.className = 'b_thlt1';
statusSpan.className = 'b_5dr47';
statusSpan.textContent = 'Получено';
btn.style.display = 'none'
} catch (error) {
console.error('Network error:', error);
showToast({ message: 'Не удалось подключиться к серверу', duration: 2500 });
}
};
</script>
#}
<script>
async function sendInvitations(exhibition_id) {
const data = new FormData();
data.set('exhibition_id', exhibition_id);
try {
const res = await fetch('/api/exhibition/send/invitations', {
method: 'POST',
body: data
});
if (res.ok) {
showToast({ message: 'Приглашени{% if uniq_count > 1 %}я{% else %}е{% endif %} отправлен{% if uniq_count > 1 %}ы{% else %}о{% endif %}' });
}
else {
showToast({ message: 'Ошибка сохранения', status: "error", duration: 2500 });
}
} catch (err) {
console.error(err);
showToast({ message: 'Ошибка соединения', status: "error", duration: 2500 });
}
}
async function selectPost(select, postId) {
const data = new FormData();
data.set('post_id', postId);
data.set('exhibition_id', '{{exhibition._id}}');
try {
const res = await fetch('/api/exhibition/post/select', {
method: 'POST',
body: data
});
if (res.ok) {
document.getElementById('lenPosts').textContent = parseInt(document.getElementById('lenPosts').textContent) - 1
select.parentElement.parentElement.style.display = 'none'
}
else {
showToast({ message: 'Ошибка сохранения', status: "error", duration: 2500 });
select.checked = false
}
} catch (err) {
console.error(err);
showToast({ message: 'Ошибка соединения', status: "error", duration: 2500 });
select.checked = false
}
}
</script>
{{ footer.section(user) }}
{% endblock %}
{% block head %}
{{ header.style() }}
{{ profile_nav.style() }}
{{ competition.style() }}
<style>
{{label.green()}}
{{label.purple()}}
#preview_poster{min-height: 456px;}
body{background: #F6EBFF;}
.c_3ihvi{ position: sticky; top: 0; z-index: 2; background: white; }
.b_289i1{ width: 100%; padding: 15px; box-sizing: border-box; }
.c_ctfod{ width: 100%; padding: 13px 0; }
/* 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 %}