Весь контент перенесён в content/yasha/ (7 подразделов). Создан content/semen/ с подразделами: changelog, kb, diary. Навигация — dropdown в навбаре, двухуровневое меню в hugo.toml. Шаблоны, сайдбар, поиск обновлены под вложенные секции.
305 lines
15 KiB
HTML
305 lines
15 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="ru-ru">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>Leadera — Публичный доступ к диаграмме Ганта — docs.a2v.space</title>
|
|
|
|
|
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
|
|
|
|
|
|
<link rel="stylesheet" href="../../../css/custom.css">
|
|
|
|
|
|
</head>
|
|
<body>
|
|
<header class="site-header">
|
|
<nav class="navbar navbar-expand-lg">
|
|
<div class="container-fluid">
|
|
<a class="navbar-brand" href="../../../">docs.a2v.space</a>
|
|
|
|
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarMain" aria-controls="navbarMain" aria-expanded="false" aria-label="Toggle navigation">
|
|
<span class="navbar-toggler-icon"></span>
|
|
</button>
|
|
|
|
<div class="collapse navbar-collapse" id="navbarMain">
|
|
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
|
|
|
|
|
|
<li class="nav-item dropdown">
|
|
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
|
|
Яша
|
|
</a>
|
|
<ul class="dropdown-menu">
|
|
|
|
<li><a class="dropdown-item" href="../../../yasha/diary/">Дневник</a></li>
|
|
|
|
<li><a class="dropdown-item" href="../../../yasha/kb/">База знаний</a></li>
|
|
|
|
<li><a class="dropdown-item" href="../../../yasha/plans/">Планы</a></li>
|
|
|
|
<li><a class="dropdown-item" href="../../../yasha/guides/">Инструкции</a></li>
|
|
|
|
<li><a class="dropdown-item" href="../../../yasha/creds/">Креды</a></li>
|
|
|
|
<li><a class="dropdown-item" href="../../../yasha/leadera/">Leadera</a></li>
|
|
|
|
<li><a class="dropdown-item" href="../../../yasha/personal-site/">Личный сайт</a></li>
|
|
|
|
</ul>
|
|
</li>
|
|
|
|
|
|
|
|
<li class="nav-item dropdown">
|
|
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
|
|
Семен
|
|
</a>
|
|
<ul class="dropdown-menu">
|
|
|
|
<li><a class="dropdown-item" href="../../../semen/changelog/">История изменений</a></li>
|
|
|
|
<li><a class="dropdown-item" href="../../../semen/kb/">База знаний</a></li>
|
|
|
|
<li><a class="dropdown-item" href="../../../semen/diary/">Дневник</a></li>
|
|
|
|
</ul>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
|
|
<form class="d-flex search-form" role="search">
|
|
<input class="form-control me-2" type="search" placeholder="Поиск..." aria-label="Search" id="search-input">
|
|
<button class="btn btn-outline-light" type="submit">Найти</button>
|
|
</form>
|
|
</div>
|
|
|
|
<button class="btn btn-outline-light d-md-none ms-2" type="button" data-bs-toggle="collapse" data-bs-target="#sidebar" aria-expanded="false" aria-controls="sidebar">
|
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
|
|
<path fill-rule="evenodd" d="M2.5 12a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5z"/>
|
|
</svg>
|
|
</button>
|
|
</div>
|
|
</nav>
|
|
|
|
|
|
<div id="search-results" class="search-results" style="display: none;">
|
|
<div class="search-results-content">
|
|
<button type="button" class="btn-close float-end" id="close-search"></button>
|
|
<h5>Результаты поиска</h5>
|
|
<ul id="results-list"></ul>
|
|
</div>
|
|
</div>
|
|
</header>
|
|
|
|
|
|
<div class="container-fluid">
|
|
<div class="row">
|
|
|
|
<aside class="col-md-3 col-lg-2 d-md-block sidebar collapse" id="sidebar">
|
|
<div class="sidebar-content">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<h6>Фильтры</h6>
|
|
<ul class="nav flex-column">
|
|
<li class="nav-item"><a class="nav-link" href="../../../yasha/leadera/">Все статьи</a></li>
|
|
</ul>
|
|
|
|
|
|
</div>
|
|
|
|
</aside>
|
|
|
|
|
|
<main class="col-md-9 col-lg-10 main-content">
|
|
|
|
<div class="article-content">
|
|
<h1>Leadera — Публичный доступ к диаграмме Ганта</h1>
|
|
<div class="source-path mb-3">
|
|
<small class="text-muted">
|
|
📁 <code id="source-path" class="user-select-all">~/Projects/docs-a2v/content/yasha/leadera/leadera-gantt-public-access.md</code>
|
|
<button class="btn btn-sm btn-outline-secondary ms-1 py-0 px-1" onclick="navigator.clipboard.writeText('~/Projects/docs-a2v/content/yasha\/leadera\/leadera-gantt-public-access.md')" title="Копировать путь">
|
|
📋
|
|
</button>
|
|
</small>
|
|
</div>
|
|
|
|
|
|
|
|
<div class="tags mb-3">
|
|
|
|
<a href="../../../tags/leadera/" class="tag">leadera</a>
|
|
|
|
<a href="../../../tags/gantt/" class="tag">gantt</a>
|
|
|
|
<a href="../../../tags/public-access/" class="tag">public-access</a>
|
|
|
|
<a href="../../../tags/sharing/" class="tag">sharing</a>
|
|
|
|
</div>
|
|
|
|
|
|
<h1 id="публичный-доступ-к-диаграмме-ганта-share">Публичный доступ к диаграмме Ганта (Share)</h1>
|
|
<p><strong>Дата:</strong> 09.04.2026
|
|
<strong>Статус:</strong> Требования
|
|
<strong>Проект:</strong> Leadera</p>
|
|
<hr>
|
|
<h2 id="общее-описание">Общее описание</h2>
|
|
<p>Пользователь может создать публичную ссылку на фрагмент диаграммы Ганта, доступную для просмотра без авторизации. Открывший ссылку видит диаграмму в read-only режиме с возможностью масштабирования таймлайна, но без каких-либо элементов управления (создание, редактирование, удаление задач/секций/вех).</p>
|
|
<hr>
|
|
<h2 id="пользовательский-сценарий-создатель-ссылки">Пользовательский сценарий (создатель ссылки)</h2>
|
|
<ol>
|
|
<li>Пользователь открывает диаграмму Ганта проекта</li>
|
|
<li>Нажимает кнопку «Экспорт» / «Общий доступ»</li>
|
|
<li>Указывает диапазон дат, который должен отображаться на диаграмме</li>
|
|
<li>Система генерирует уникальную ссылку (UUID) и показывает её пользователю</li>
|
|
<li>Пользователь копирует ссылку и передаёт заинтересованным лицам</li>
|
|
</ol>
|
|
<h3 id="управление-ссылками">Управление ссылками</h3>
|
|
<ul>
|
|
<li>Вызывается через меню экспорта → модальное окно «Общий доступ»</li>
|
|
<li>В модальном окне отображается список созданных ссылок с указанием диапазона дат</li>
|
|
<li>Каждую ссылку можно <strong>удалить</strong> (полное удаление из БД, не soft delete)</li>
|
|
<li>Ссылки <strong>нельзя редактировать</strong> — только создавать и удалять</li>
|
|
<li>Ограничений на количество активных ссылок нет</li>
|
|
<li>Статистика просмотров (сколько раз открывали) — <strong>не нужна</strong></li>
|
|
</ul>
|
|
<hr>
|
|
<h2 id="пользовательский-сценарий-зритель-по-ссылке">Пользовательский сценарий (зритель по ссылке)</h2>
|
|
<ol>
|
|
<li>Зритель переходит по ссылке (без авторизации)</li>
|
|
<li>Открывается отдельная страница с диаграммой Ганта</li>
|
|
<li>Зритель видит:
|
|
<ul>
|
|
<li>Задачи и вехи, попадающие в заданный диапазон</li>
|
|
<li>Секции (заголовки группировок)</li>
|
|
<li>Таймлайн с цветовой раскраской задач</li>
|
|
</ul>
|
|
</li>
|
|
<li>Зритель может:
|
|
<ul>
|
|
<li>Масштабировать таймлайн</li>
|
|
<li>Переключать отображение «по ячейкам» / «по дням»</li>
|
|
</ul>
|
|
</li>
|
|
<li>Зритель <strong>не может</strong>:
|
|
<ul>
|
|
<li>Создавать, редактировать, удалять задачи / секции / вехи</li>
|
|
<li>Видеть любые контролы управления (кнопки создания, контекстные меню, drag-and-drop и т.д.)</li>
|
|
<li>Авторизоваться через эту страницу</li>
|
|
</ul>
|
|
</li>
|
|
</ol>
|
|
<hr>
|
|
<h2 id="данные-и-фильтрация">Данные и фильтрация</h2>
|
|
<h3 id="что-попадает-в-представление">Что попадает в представление</h3>
|
|
<p>Задачи и вехи, у которых хотя бы одно из условий верно:</p>
|
|
<ul>
|
|
<li>Дата начала попадает в диапазон ссылки</li>
|
|
<li>Дата конца попадает в диапазон ссылки</li>
|
|
<li>Задача начинается до диапазона и заканчивается после (полностью перекрывает)</li>
|
|
</ul>
|
|
<p>Секции включаются, если в них есть хотя бы одна попавшая задача.</p>
|
|
<h3 id="api-возвращает">API возвращает</h3>
|
|
<ul>
|
|
<li>Только задачи и вехи, попадающие в диапазон (не всю диаграмму)</li>
|
|
<li>Информацию о секциях, содержащих попавшие задачи</li>
|
|
<li>Минимальный набор полей, необходимый для отрисовки (без внутренних ID пользователей и т.п.)</li>
|
|
</ul>
|
|
<hr>
|
|
<h2 id="технические-требования">Технические требования</h2>
|
|
<h3 id="ссылки">Ссылки</h3>
|
|
<ul>
|
|
<li>Формат: UUID v4 (каждый раз новый)</li>
|
|
<li>Срок действия: бессрочно (пока не удалена)</li>
|
|
<li>Удаление: <strong>жёсткое</strong> (hard delete из БД)</li>
|
|
</ul>
|
|
<h3 id="backend-go-api">Backend (Go API)</h3>
|
|
<h4 id="таблица-бд-gantt_public_links">Таблица БД: <code>gantt_public_links</code></h4>
|
|
<ul>
|
|
<li><code>id</code> (UUID, PK)</li>
|
|
<li><code>project_id</code> (FK → projects)</li>
|
|
<li><code>date_from</code> (date)</li>
|
|
<li><code>date_to</code> (date)</li>
|
|
<li><code>created_by</code> (FK → users)</li>
|
|
<li><code>created_at</code> (timestamp)</li>
|
|
</ul>
|
|
<h4 id="endpoints">Endpoints</h4>
|
|
<ul>
|
|
<li><code>POST /api/v1/gantt/:projectId/public-links</code> — создать ссылку (авторизован, участник проекта)
|
|
<ul>
|
|
<li>Body: <code>{ dateFrom, dateTo }</code></li>
|
|
<li>Response: <code>{ url: "https://leadera.pro/share/<uuid>" }</code></li>
|
|
</ul>
|
|
</li>
|
|
<li><code>GET /api/v1/gantt/:projectId/public-links</code> — список ссылок проекта (авторизован, участник)</li>
|
|
<li><code>DELETE /api/v1/gantt/public-links/:uuid</code> — удалить ссылку (авторизован, создатель)</li>
|
|
<li><code>GET /api/v1/public/gantt/:uuid</code> — получить данные диаграммы по ссылке (без авторизации)
|
|
<ul>
|
|
<li>Response: задачи, вехи, секции в рамках диапазона</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<h4 id="rate-limiting">Rate limiting</h4>
|
|
<ul>
|
|
<li>На публичный endpoint <code>GET /api/v1/public/gantt/:uuid</code> — rate limiting для защиты от перебора</li>
|
|
<li>Рекомендация: 60 запросов в минуту на IP</li>
|
|
</ul>
|
|
<h3 id="frontend-angular">Frontend (Angular)</h3>
|
|
<h4 id="модальное-окно-общий-доступ">Модальное окно «Общий доступ»</h4>
|
|
<ul>
|
|
<li>Вызывается из меню экспорта</li>
|
|
<li>Содержит:
|
|
<ul>
|
|
<li>Форму создания ссылки (диапазон дат + кнопка «Создать»)</li>
|
|
<li>Список существующих ссылок (диапазон + URL + кнопка «Копировать» + кнопка «Удалить»)</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<h4 id="публичная-страница-shareuuid">Публичная страница <code>/share/:uuid</code></h4>
|
|
<ul>
|
|
<li>Отдельный route, <strong>не требует авторизации</strong></li>
|
|
<li>Отображает диаграмму Ганта в read-only режиме</li>
|
|
<li>Доступны только: масштабирование таймлайна, переключение ячейки/дни</li>
|
|
<li>Все контролы управления скрыты (удалены из шаблона, не просто disabled)</li>
|
|
<li>Минимальный layout — без навигации проекта, без сайдбара</li>
|
|
</ul>
|
|
<hr>
|
|
<h2 id="открытые-вопросы">Открытые вопросы</h2>
|
|
<p><em>(Нет)</em></p>
|
|
|
|
</div>
|
|
|
|
</main>
|
|
</div>
|
|
</div>
|
|
|
|
<footer class="site-footer">
|
|
<div class="container">
|
|
<p class="text-center mb-0">© 2026 docs.a2v.space</p>
|
|
</div>
|
|
</footer>
|
|
|
|
|
|
|
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
|
|
|
|
|
|
<script src="https://cdn.jsdelivr.net/npm/fuse.js@7.0.0/dist/fuse.min.js"></script>
|
|
|
|
|
|
<script src="../../../js/search.js"></script>
|
|
<script src="../../../js/creds.js"></script>
|
|
|
|
|
|
</body>
|
|
</html>
|