morozovka-portal/app/templates/index.html

139 lines
7.1 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" %}
{% block title %}Morozovka Platform — главная{% endblock %}
{% block main_class %}container{% endblock %}
{% block content %}
{% if session.get('user_id') and not onboarding_completed and not request.args.get('skip_tour') %}
<div class="welcome-banner">
<div class="welcome-banner-icon">🎓</div>
<div class="welcome-banner-body">
<h3 class="welcome-banner-title">Первый раз здесь?</h3>
<p class="welcome-banner-text">Пройди короткий тур по разделам платформы — это займёт 2 минуты.</p>
</div>
<a href="/onboarding" class="btn btn-primary">Пройти тур →</a>
</div>
{% endif %}
<div class="hero-grid">
<div class="hero-main">
{% if session.get('username') %}
<h1 class="hero-title">Привет, {{ session.get('username') }}!</h1>
<p class="hero-subtitle">Расписание, проекты, мастер-классы и файлы — всё в одном месте. Выбирай, чем займёшься сегодня.</p>
{% else %}
<h1 class="hero-title">Morozovka Platform</h1>
<p class="hero-subtitle">Единая платформа команды: расписание, проекты, мастер-классы, файлы и лента. Войди, чтобы получить полный доступ.</p>
{% endif %}
<div class="hero-actions">
<a href="/schedule" class="btn btn-primary btn-lg">
<svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor"><path d="M3.75 1.5a.75.75 0 0 1 .75.75V3h7V2.25a.75.75 0 0 1 1.5 0V3h.5A1.75 1.75 0 0 1 15 4.75v9A1.75 1.75 0 0 1 13.5 15.5h-11A1.75 1.75 0 0 1 1 13.75v-9A1.75 1.75 0 0 1 2.5 3H3V2.25a.75.75 0 0 1 .75-.75Zm10.75 5.5h-13v6.75c0 .138.112.25.25.25h11a.25.25 0 0 0 .25-.25Z"/></svg>
Расписание
</a>
<a href="/projects" class="btn btn-outline btn-lg">Проекты</a>
<a href="/workshops" class="btn btn-outline btn-lg">Мастер-классы</a>
</div>
</div>
<div class="hero-side">
<div class="status-card">
<div class="status-label">Статус Никиты Сергеевича</div>
<div class="status-value" id="status-value"><span class="status-dot status-dot-grey"></span><span>Загрузка...</span></div>
<div class="status-meta" id="status-meta">Проверяем расписание...</div>
<a href="/schedule" class="status-link">Открыть расписание →</a>
</div>
</div>
</div>
<div class="section-header-row">
<h2>Разделы платформы</h2>
</div>
<div class="cards-grid">
{% if session.get('username') %}
<a href="/dashboard" class="feature-card">
<div class="feature-icon">🏠</div>
<h3 class="feature-title">Мой дашборд</h3>
<p class="feature-desc">Проекты, задачи, уведомления, материалы — всё в одном месте</p>
<span class="feature-badge feature-badge-new">NEW</span>
</a>
{% endif %}
<a href="/schedule" class="feature-card">
<div class="feature-icon">📅</div>
<h3 class="feature-title">Расписание</h3>
<p class="feature-desc">Календарь событий, статус преподавателя, встроенный ассистент</p>
</a>
<a href="/projects" class="feature-card">
<div class="feature-icon">🗂</div>
<h3 class="feature-title">Проекты</h3>
<p class="feature-desc">Каталог проектов, канбан-доски, участники и роли</p>
</a>
<a href="/workshops" class="feature-card">
<div class="feature-icon">🎓</div>
<h3 class="feature-title">Мастер-классы</h3>
<p class="feature-desc">Пайка, embedded, Linux, творчество. Регистрация и материалы</p>
</a>
<a href="/files" class="feature-card">
<div class="feature-icon">📁</div>
<h3 class="feature-title">Файлы</h3>
<p class="feature-desc">Единое хранилище документов, схем и материалов</p>
</a>
<a href="/feed" class="feature-card">
<div class="feature-icon">📰</div>
<h3 class="feature-title">Лента</h3>
<p class="feature-desc">Все новости из проектов и мастер-классов в одном потоке</p>
</a>
{% if session.get('username') %}
<a href="/onboarding" class="feature-card">
<div class="feature-icon">🎯</div>
<h3 class="feature-title">Тур по платформе</h3>
<p class="feature-desc">Короткое знакомство со всеми разделами</p>
<span class="feature-badge feature-badge-new">NEW</span>
</a>
{% endif %}
{% if session.get('role') in ['admin', 'professor'] %}
<a href="/admin/schedule" class="feature-card">
<div class="feature-icon">⚙️</div>
<h3 class="feature-title">Управление расписанием</h3>
<p class="feature-desc">Быстрые действия, события, импорт/экспорт .ics</p>
</a>
{% endif %}
{% if session.get('role') == 'admin' %}
<a href="/admin/users" class="feature-card">
<div class="feature-icon">👥</div>
<h3 class="feature-title">Пользователи</h3>
<p class="feature-desc">Управление ролями, блокировка, поиск</p>
</a>
{% endif %}
</div>
{% endblock %}
{% block scripts %}
<script>
(function() {
fetch('/api/public-status')
.then(r => r.ok ? r.json() : null)
.then(data => {
const valEl = document.getElementById('status-value');
const metaEl = document.getElementById('status-meta');
if (!data || !data.status) {
valEl.innerHTML = '<span class="status-dot status-dot-grey"></span><span>Нет данных</span>';
metaEl.textContent = '';
return;
}
const map = {
'on_place': { text: 'На месте', dot: 'green' },
'delayed': { text: 'Опаздывает на ' + (data.delay_minutes || 0) + ' мин', dot: 'yellow' },
'away': { text: 'Вне вуза', dot: 'red' },
'cancelled': { text: 'Отменено', dot: 'red' },
'free': { text: 'Вне расписания', dot: 'grey' }
};
const info = map[data.status] || map.free;
valEl.innerHTML = '<span class="status-dot status-dot-' + info.dot + '"></span><span>' + info.text + '</span>';
metaEl.textContent = data.message || '';
})
.catch(() => {
document.getElementById('status-value').innerHTML = '<span class="status-dot status-dot-grey"></span><span>Нет данных</span>';
});
})();
</script>
{% endblock %}