# Отчёт: Унификация макетов печати

Дата: 15.04.2026

---

## 1. Отступы сверху (`@page margin`)

Все макеты приведены к единому значению `1.5cm`.

| Файл | Было | Стало |
|---|---|---|
| `src/client/app/index.css` (глобальный стиль) | `margin: .2cm` | `margin: 1.5cm` |
| `src/client/pages/PaymasterPrintPage.vue` | `margin: 1cm` | `margin: 1.5cm` |
| `src/client/widgets/styles/ScheduleGrid.css` | `margin: .5cm` | `margin: 1.5cm` |

---

## 2. Заголовки при печати

Все заголовки приведены к единому размеру `1.5rem` (24px), `font-weight: 700`, `text-align: center`.

### 2.1 Исправлен размер шрифта

| Файл | Заголовок | Было | Стало |
|---|---|---|---|
| `src/client/widgets/DailyOperationsTable.vue` | «Заезд/выезд за ...» | `1.25rem` | `1.5rem` |
| `src/client/widgets/CleaningScheduleTable.vue` | «График уборки на ...» | `1.25rem` | `1.5rem` |
| `src/client/widgets/styles/ScheduleGrid.css` | `.print-section-title` | `14px` + `margin-bottom: 6px` | `1.5rem` + `margin-bottom: 1rem` |
| `src/client/widgets/ScheduleGrid.vue` | Inline Tailwind-классы | `text-base mb-3` | Убраны (управляется CSS) |

### 2.2 Добавлены отсутствующие заголовки

| Файл | Заголовок | Решение |
|---|---|---|
| `src/client/widgets/PaymasterPeriodResult.vue` | «Кассовый отчет за период с ... по ...» | Добавлен `<h1 class="print-period-title">` с computed `periodTitle` (ранее вычислялся, но не рендерился). Скрыт на экране, отображается при печати. |
| `src/client/widgets/NotesBoard.vue` + `NotesBoard.css` | «Заметки» | Добавлен `<div class="notes-print-header">Заметки</div>`. Скрыт на экране через `display: none`, показан при печати через `@media print`. |

### 2.3 Без изменений (уже корректно)

| Файл | Заголовок | Размер |
|---|---|---|
| `src/client/widgets/PaymasterTable.vue` | «Кассовый отчёт за ...» | `text-2xl` (1.5rem) — OK |

---

## 3. Печать сотрудников

| Файл | Изменение |
|---|---|
| `src/client/widgets/EmployeeList.vue` | Добавлен print-only заголовок «Сотрудники» (`1.5rem`, `font-weight: 700`, `center`) |
| `src/client/widgets/EmployeeList.vue` | Столбец «Действия» скрыт при печати через `.employee-col-actions { display: none }` |
| `src/client/widgets/EmployeeList.vue` | ФИО обрезано до 24 символов (`max-width: 24ch; overflow: hidden; text-overflow: ellipsis`) |

---

## 4. Устранение пустых листов при печати

**Причина:** `min-h-screen` (`min-height: 100vh`) на корневом `<div>` и `<main>` в `DashboardLayout`, а также `position: fixed` элементы (sidebar, модальные окна), не скрываемые старым селектором `[style*="position: fixed"]` (только inline-стили).

| Файл | Изменение |
|---|---|
| `src/client/widgets/DashboardLayout.vue` | Добавлено `min-height: auto !important` для `.flex.min-h-screen` и `main` в `@media print` |
| `src/client/app/index.css` | Добавлено `min-height: 0 !important` в глобальный сброс (селекторы `main, .flex-1, .overflow-*`) |
| `src/client/app/index.css` | Добавлено `.fixed { display: none !important }` — скрытие всех Tailwind-элементов с `position: fixed` (sidebar, modal overlays, tooltips) |

---

## 5. База номеров

### Отображение

| Изменение | Детали |
|---|---|
| Столбец «Причина ремонта» | Ширина увеличена с `350px` до `450px` |
| Причина ремонта — многострочность | `<textarea>` всегда `rows="3"` — текст сразу виден на 3 строки |
| Комментарий — многострочность | `<textarea>` всегда `rows="3"` (аналогично причине ремонта) |

### Печать

| Изменение | Детали |
|---|---|
| Заголовок | Добавлен print-only заголовок «База номеров» (`1.5rem`, bold, center) |
| Столбец «Действия» | Скрыт при печати через `.room-col-actions { display: none }` |
| Подход: screen/print спаны | К каждому контролу добавлены `<span class="room-screen-only">` и `<span class="room-print-only">` внутри `<template v-if>`. При печати инпуты/селекты/текстарии полностью скрываются, показываются только текстовые значения |
| Многострочные значения (причина, комментарий) | Print-спаны с `white-space: pre-wrap; word-break: break-word` — текст отображается целиком без обрезки |
| Чекбоксы (Да/Нет) | При печати скрыты, вместо них показывается текст «Да»/«Нет» |
| Пустые поля | При печати показывается `-` вместо placeholder'а |
| Новые строки | Скрыты при печати (`no-print` класс) — незаполненные формы не печатаются |
| Сохранение индикаторы | Скрыты при печати (`no-print` класс) |
| Фиксированная ширина | `table-layout: fixed` → `auto`, `<col>` width → `auto` для корректного переноса |

---

## Затронутые файлы (12)

1. `src/client/app/index.css`
2. `src/client/pages/PaymasterPrintPage.vue`
3. `src/client/widgets/styles/ScheduleGrid.css`
4. `src/client/widgets/DailyOperationsTable.vue`
5. `src/client/widgets/CleaningScheduleTable.vue`
6. `src/client/widgets/ScheduleGrid.vue`
7. `src/client/widgets/PaymasterPeriodResult.vue`
8. `src/client/widgets/NotesBoard.vue`
9. `src/client/widgets/styles/NotesBoard.css`
10. `src/client/widgets/EmployeeList.vue`
11. `src/client/widgets/DashboardLayout.vue`
12. `src/client/pages/RoomsPage.vue`
