# План рефакторинга templates/
## Статистика проекта
**Общая информация:**
- Всего файлов: 61 (HTML/CSS/JS)
- HTML шаблонов: 58
- Общий объём: 11,479 строк кода
**Распределение по модулям:**
```
admin/ 1 файл (change_form.html)
auth/ 12 файлов (login, register, password reset, logout, verify)
communications/ 2 файла (chat_list, chat_detail)
documents/ 1 файл (document_list)
emails/ 2 файла (password_reset_email, registration_verify_code)
employees/ 15 файлов (списки, детали, формы)
feed/ 10 файлов (посты, комментарии, ленты)
includes/ 4 файла (navbar, sidebar, rightbar_calendar, messages)
requests/ 1 файл (request_list.html - ДУБЛИКАТ!)
requests_app/ 7 файлов (all_requests, my_requests, process, etc.)
search/ 1 файл (results)
base.html 1 файл (корневой шаблон)
```
## Обнаруженные проблемы
### 🔴 КРИТИЧЕСКИЕ ПРОБЛЕМЫ
#### 1. **Дублирование папок: requests/ vs requests_app/**
**requests/request_list.html** (788 строк):
- Путь: `templates/requests/request_list.html`
- Использование: `requests_app/views_front.py:174` → `template_name = "requests/request_list.html"`
- Назначение: Комплексная страница со списком заявлений + документов + recipient picker
**requests_app/all_requests.html** (147 строк):
- Путь: `templates/requests_app/all_requests.html`
- Использование: `requests_app/views.py:315` → `"requests_app/all_requests.html"`
- Назначение: Простой список всех заявлений с фильтрами
**requests_app/my_requests.html** (102 строки):
- Путь: `templates/requests_app/my_requests.html`
- Использование: `requests_app/views.py:251` → `"requests_app/my_requests.html"`
- Назначение: Список моих заявлений
**Вывод**:
- `requests/` - устаревшая папка (1 файл)
- `requests_app/` - актуальная структура (7 файлов)
- **Необходимо**: объединить всё в `requests_app/`
#### 2. **Дублирование auth шаблонов**
**auth/logout.html** (171 строка):
- Использование: `employees/views_auth.py:182` → `template_name = "auth/logout.html"`
- Статус: **ИСПОЛЬЗУЕТСЯ** ✅
- Описание: Современный iOS-стиль, overlay, анимации, полнофункциональный
**auth/logout_confirm.html** (33 строки):
- Использование: ❌ **НЕ НАЙДЕНО**
- Статус: **НЕИСПОЛЬЗУЕМЫЙ ДУБЛИКАТ**
- Описание: Простой standalone HTML без base.html
**Вывод**: `logout_confirm.html` - устаревший файл → **УДАЛИТЬ**
#### 3. **Дублирование password reset шаблонов**
**auth/password_reset.html** (83 строки):
- Использование: `employees/views_auth.py:199` → `template_name = "auth/password_reset.html"`
- Статус: **ИСПОЛЬЗУЕТСЯ** ✅
- Описание: Полноценная форма с валидацией, extends base.html
**auth/password_reset_form.html** (7 строк):
- Использование: ❌ **НЕ НАЙДЕНО**
- Статус: **НЕИСПОЛЬЗУЕМЫЙ ДУБЛИКАТ**
- Описание: Простая заглушка без стилей
**Вывод**: `password_reset_form.html` - устаревший файл → **УДАЛИТЬ**
### 🟡 СРЕДНИЙ ПРИОРИТЕТ
#### 4. **Огромные файлы требуют декомпозиции**
**employees/_employee_edit.html** (1391 строка):
- Проблема: Монолитная форма редактирования сотрудника
- Решение: Разбить на компоненты:
- `_employee_edit_personal.html` (ФИО, email, телефон)
- `_employee_edit_position.html` (должность, отдел)
- `_employee_edit_contact.html` (контакты, адреса)
- `_employee_edit_skills.html` (навыки)
- `_employee_edit_documents.html` (документы)
**employees/department_detail.html** (1025 строк):
- Проблема: Детальная страница отдела со множеством разделов
- Решение: Выделить компоненты:
- `_department_header.html` (заголовок, руководитель)
- `_department_members.html` (список сотрудников)
- `_department_stats.html` (статистика)
- `_department_subdepts.html` (подотделы)
**includes/rightbar_calendar.html** (1129 строк):
- Проблема: Правый сайдбар с календарём + события
- Решение: Разбить на:
- `_calendar_widget.html` (виджет календаря)
- `_calendar_events.html` (список событий)
- `_calendar_filters.html` (фильтры)
**documents/document_list.html** (743 строки):
- Проблема: Список документов + фильтры + модалки
- Решение: Выделить:
- `_document_filters.html` (панель фильтров)
- `_document_card.html` (карточка документа)
- `_document_modals.html` (модальные окна)
**requests/request_list.html** (788 строк):
- Проблема: Комплексная страница с заявлениями, документами, recipient picker
- Решение: После переноса в requests_app/ разбить на компоненты
**employees/employee_detail.html** (600 строк):
- Решение: Выделить табы в отдельные компоненты
#### 5. **Дублирование CSS стилей**
Обнаружены повторяющиеся блоки стилей:
- `.card-list`, `.card`, `.card-header` - определены в 5+ файлах
- `.btn-icon`, `.badge-status` - дублируются
- `.ios-overlay`, `.ios-sheet` - iOS-стиль модалок
**Решение**: Создать общие файлы стилей:
- `static/css/components/feed.css` - стили для лент
- `static/css/components/modals.css` - iOS-стиль модалок
- `static/css/components/badges.css` - бейджи статусов
### 🟢 НИЗКИЙ ПРИОРИТЕТ
#### 6. **Оптимизация структуры includes/**
Текущие:
- `includes/navbar.html` (143 строки)
- `includes/sidebar.html` (259 строк)
- `includes/rightbar_calendar.html` (1129 строк)
- `includes/messages.html` (9 строк)
**Рекомендации**:
- Выделить из navbar: `_navbar_search.html`, `_navbar_user_menu.html`
- Выделить из sidebar: `_sidebar_menu.html`, `_sidebar_profile.html`
#### 7. **Консистентность именования**
**Проблемы**:
- Некоторые файлы начинаются с `_` (партиалы), другие нет
- Смешанное использование `confirm_delete` vs `delete_confirm`
- `employee_feed.html` vs `feed_list.html` (разная логика именования)
**Стандарт**:
- `_` - только для партиалов (переиспользуемых компонентов)
- `{model}_list.html` - списки
- `{model}_detail.html` - детальные страницы
- `{model}_form.html` - формы создания/редактирования
- `{model}_confirm_delete.html` - подтверждение удаления
## ⚠️ ВАЖНЫЕ ВЫВОДЫ ИЗ ПРЕДЫДУЩИХ ПОПЫТОК
### Проблемы при декомпозиции HTML без предварительной работы со стилями/скриптами:
1. **Стили в неправильных местах**: При извлечении компонентов стили ` на:
{% block extra_css %}
{% endblock %}
# 4. Проверить рендер
python manage.py runserver
# Открыть страницу, проверить визуально
# 5. Запустить тесты
python manage.py test tests.test_template_rendering
# 6. Если всё ОК - коммит, если нет - откат из backup
```
4. **Подключить в base.html**:
```django
{% block extra_css %}
{% endblock %}
```
**Критерий завершения**:
- Создано 4-5 CSS компонентов ✅
- Из шаблонов удалено ~300-400 строк дублирующих стилей ✅
- Все страницы рендерятся идентично ✅
- Git commits: по одному на каждый извлечённый компонент ✅
---
#### Задача 3.2: Извлечь специфичные стили страниц
**Для больших файлов** создать отдельные CSS файлы:
1. **employees/department_detail.html** → `static/css/pages/department-detail.css`:
```css
/* Стили специфичные для страницы отдела */
.team-wheel { /* ... */ }
.wheel-columns { /* ... */ }
/* ... */
```
2. **includes/rightbar_calendar.html** → `static/css/components/calendar.css`:
```css
/* Стили календаря */
.calendar-wrap { /* ... */ }
.fc { /* ... */ }
/* ... */
```
3. **documents/document_list.html** → `static/css/pages/document-list.css`
**Критерий завершения**:
- Каждый шаблон > 50 строк CSS имеет отдельный файл ✅
- Встроенных `