Files
docs.a2v.space/public/yasha/leadera/leadera-gantt-excel-export/index.html
T
Агальцов Антон dd67d2c2ec Реструктуризация: два глобальных раздела — Яша и Семен
Весь контент перенесён в content/yasha/ (7 подразделов).
Создан content/semen/ с подразделами: changelog, kb, diary.
Навигация — dropdown в навбаре, двухуровневое меню в hugo.toml.
Шаблоны, сайдбар, поиск обновлены под вложенные секции.
2026-04-26 19:44:52 +03:00

269 lines
13 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.
<!DOCTYPE html>
<html lang="ru-ru">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Leadera — Экспорт диаграммы Ганта в Excel — 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 — Экспорт диаграммы Ганта в Excel</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-excel-export.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-excel-export.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/excel/" class="tag">excel</a>
<a href="../../../tags/export/" class="tag">export</a>
</div>
<h1 id="экспорт-диаграммы-ганта-в-excel">Экспорт диаграммы Ганта в Excel</h1>
<p><strong>Дата:</strong> 09.04.2026
<strong>Статус:</strong> Требования
<strong>Проект:</strong> Leadera</p>
<hr>
<h2 id="общее-описание">Общее описание</h2>
<p>Пользователь нажимает кнопку экспорта в интерфейсе диаграммы Ганта. Система запрашивает диапазон дат выгрузки (по умолчанию — текущий видимый диапазон из интерфейса). После указания диапазона скачивается Excel-файл с визуальным представлением диаграммы Ганта.</p>
<hr>
<h2 id="вводные-данные">Вводные данные</h2>
<ul>
<li><strong>Источник:</strong> текущая диаграмма Ганта проекта (один проект = одна диаграмма)</li>
<li><strong>Диапазон дат:</strong> пользователь указывает начальную и конечную дату. По умолчанию подставляется видимый в момент запроса диапазон из интерфейса</li>
<li><strong>Масштаб таймлайна:</strong> берётся тот, который выбран пользователем в интерфейсе в момент запроса (не сохранённый в системе, а текущий). Варианты: по ячейкам или по дням</li>
</ul>
<hr>
<h2 id="структура-excel-файла">Структура Excel-файла</h2>
<h3 id="шапка-первые-строки">Шапка (первые строки)</h3>
<ul>
<li>Название диаграммы (название проекта)</li>
<li>Диапазон дат, в рамках которого сделана выгрузка</li>
</ul>
<h3 id="лист--один">Лист — один</h3>
<p>Вся диаграмма размещается на одном листе.</p>
<h3 id="секции">Секции</h3>
<ul>
<li>Секции отображаются как <strong>визуальная группировка строк</strong> (не отдельные листы)</li>
<li>Название секции — строка-заголовок над группой задач</li>
</ul>
<h3 id="задачи">Задачи</h3>
<p>Каждая задача — отдельная строка. Данные задачи:</p>
<ul>
<li><strong>Название</strong> (текстовая колонка слева)</li>
<li><strong>Дата начала</strong> (текстовая колонка слева)</li>
<li><strong>Дата конца</strong> (текстовая колонка слева)</li>
<li><strong>Цвет</strong> — ячейки таймлайна, соответствующие задаче, закрашены в цвет задачи</li>
</ul>
<h3 id="таймлайн">Таймлайн</h3>
<ul>
<li>Таймлайн представлен колонками дат в верхней части (горизонтальная ось времени)</li>
<li>Масштаб колонок соответствует выбранному пользователем в момент экспорта (по ячейкам / по дням)</li>
<li>Задачи отображаются как <strong>merged cells</strong> по соответствующим колонкам дат — визуальная полоса диаграммы Ганта</li>
</ul>
<h3 id="вехи">Вехи</h3>
<ul>
<li>Отображаются <strong>отдельной строкой</strong> (как задача, но с маркировкой вехи)</li>
<li>Позиционируются на соответствующей дате в таймлайне</li>
</ul>
<h3 id="зависимости">Зависимости</h3>
<ul>
<li><strong>Не отображаются</strong> (стрелочки/связи между задачами не нужны)</li>
</ul>
<hr>
<h2 id="пользовательский-сценарий">Пользовательский сценарий</h2>
<ol>
<li>Пользователь открывает диаграмму Ганта проекта</li>
<li>Настраивает масштаб таймлайна (по ячейкам / по дням)</li>
<li>Нажимает кнопку «Экспорт в Excel»</li>
<li>Система показывает диалог с выбором диапазона дат (предзаполнен текущим видимым диапазоном)</li>
<li>Пользователь подтверждает / корректирует диапазон</li>
<li>Система генерирует Excel-файл и инициирует скачивание</li>
</ol>
<hr>
<h2 id="технические-требования">Технические требования</h2>
<h3 id="backend-go-api">Backend (Go API)</h3>
<ul>
<li>Новый endpoint для генерации Excel (например, <code>GET /api/v1/gantt/:projectId/export</code>)</li>
<li>Query-параметры: <code>dateFrom</code>, <code>dateTo</code>, <code>scale</code> (cell|day)</li>
<li>Ответ: binary Excel-файл (<code>application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</code>)</li>
<li>Авторизация: обязательна (только участники проекта)</li>
<li>Библиотека для генерации Excel: <code>excelize</code> (Go)</li>
</ul>
<h3 id="frontend-angular">Frontend (Angular)</h3>
<ul>
<li>Кнопка экспорта в тулбаре диаграммы Ганта</li>
<li>Модальное окно выбора диапазона дат с datepicker&rsquo;ами</li>
<li>Предзаполнение диапазона из текущего видимого viewport&rsquo;а</li>
<li>Скачивание файла через <code>Blob</code> / <code>saveAs</code></li>
</ul>
<h3 id="фильтрация-данных">Фильтрация данных</h3>
<ul>
<li>Выгружаются все задачи и вехи, которые:
<ul>
<li>Начинаются в диапазоне, ИЛИ</li>
<li>Заканчиваются в диапазоне, ИЛИ</li>
<li>Начинаются до диапазона и заканчиваются после (перекрывают целиком)</li>
</ul>
</li>
<li>Секции включаются, если в них есть хотя бы одна попавшая задача</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">&copy; 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>