Files
vue-pult/docs/LOGIC_DESCRIPTION.md
2025-10-01 11:54:13 +03:00

43 lines
6.3 KiB
Markdown
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.
# Простое описание логики работы компонентов (для генерации Vue)
## Хедер (AppHeader)
Хедер - верхняя панель. В нём заголовок "Игровой Пульт" слева, информация о пользователе (имя/роль, если авторизован), справа 4 кнопки: "Смена", "Шарик" (запуск игры), "Выключение пульта", "Выход".
- **Кнопка "Смена"**: Клик -> открывает модал ShiftModal. В модале форма: дата смены (обязательная), начальный баланс (число >0), примечания (опционально). Валидация: дата обязательна, баланс >0. Submit -> отправка 'open-shift' через WebSocket с данными (date, amount, notes, user). Закрытие модала, уведомление успеха/ошибки. Если нет прав - уведомление "Доступ ограничен".
- **Кнопка "Шарик" (запуск игры)**: Клик -> открывает модал GameSelectionModal. Модал имеет 3 шага: 1) Выбор категории (банки, мишени, беспроигрышные - кнопки с иконками и кол-вом доступных игр). 2) Выбор игры из списка (фильтр по категории, только активные, не тестовые; показ название, патроны, сложность, цена). 3) Выбор оплаты (наличные или карта). Submit -> отправка 'start' через WebSocket с line (порт), game (ID), gamerId (если есть), isBonus (если бонус), paymentType (cash/card), tel (телефон), patr (патроны). Закрытие модала. Если смена не открыта - перенаправление на модал смены. Если ESP отключен - ошибка. Если нет прав - уведомление.
- **Кнопка "Выключение пульта"**: Клик -> показ подтверждения (confirm dialog "Вы уверены?"). При подтверждении - отправка 'shutdown' через WebSocket. Уведомление "Пульт выключен". Если отмена - закрытие.
- **Кнопка "Выход"**: Клик -> logout (очистка auth state), редирект на login. Уведомление "Выход выполнен".
Общая логика: Проверка роли (оператор/техник/админ). Нет прав - уведомление. Responsive flex, Tailwind стили.
## Дашборд (Dashboard)
Структура: Хедер, main div flex-1 с padding (top 5px, bottom 126px), сетка портов (6 GamePort), модалы, футер.
Логика: useSelector для gameState (ports, movingGame/Player, pause, espConnected). onClick на main div -> если movingGame/Player - dispatch movingCancelled. Обновление портов от WebSocket. Responsive: 3x2 grid desktop, 2 cols mobile. Уведомления при действиях (success/error/warning/info, e.g., "Игра запущена", "Порт занят").
## GamePort (Порт)
Структура: Card relative h-full w-full, absolute (ружье иконка, таймер, кнопки), main div flex-col center, модалы (Confirmation, PlayerDelete, TechConfirm).
Логика: Computed статус (active = game >0, hasPlayer = gamerId !=null, paused = system pause, canManage/Drag/Close по роли: operator full, tech test games only). onClick карточки: if free -> check role/pause/smena/ESP -> open GameSelectionModal or start game; if active -> show info; if player -> start game. Drag: if canDrag -> set data-port/type, drop -> animation (createFlyingPortAnimation) + send 'move'/'moveGamer' (from/to line) через WebSocket, clear moving. Buttons: +1/-1 patr (send 'addp' delta), move (dispatch movingStarted), cancel/delete (set showConfirmation 'cancelGame'/'deleteGamer', send 'cancelGame'/'deleteGamer'). Timer: interval 1000 if active. Lock overlay if restricted (role check).
Модалы: Confirmation (type end/cancel/forceEnd, send 'endGame'/'cancelGame'/'forceEndGame'), PlayerDelete (send 'deleteGamer'), TechConfirm (for tech, send 'start' game=2).
## GameSelectionModal (Модал выбора игры)
Структура: Dialog with steps (category/game/payment), v-if currentStep, back/close on Escape.
Логика: onOpen -> fetch /api/game-info (groups/games), reset state. Step 1: категории (банки/мишени/беспроигрышные, кнопки с иконками/кол-во активных игр), bonus if isBonus. Step 2: grid игр (фильтр по категории/active/not test, название, патроны, сложность, цена), click -> set game, step 'payment'. Step 3: cash/card buttons, send 'start' (line, game, gamerId, isBonus, paymentType, tel, patr). Fallback data if fetch error. Filter: group==category, isGameActive=="вкл", !test (game!=1,2).
## ShiftModal (Модал смены)
Структура: Dialog with form (date input, amount number, notes textarea), buttons submit/cancel.
Логика: onOpen -> reset form. onSubmit -> validate (date required, amount >0), send 'open-shift' (date, amount, notes, user), show success/error, close. Error display under fields.
## BottomPanel (Футер)
Структура: fixed bottom bg-slate-900 border-t, flex justify-between, left burger, center barker/pause/music, right indicators (WS/ESP dots, gamers count).
Логика: Indicators passive from store/hooks (isConnected, espConnected, smena, gamersCounter). Pause button: toggle isPaused, send 'pause'/'resume'. Burger: toggle menu context. Responsive: mobile gap-2 pl-4 pr-1, desktop absolute center, tooltips for status.
Общая логика приложения: Auth check role, WebSocket for commands (start, move, addp, endGame), receive updates (ports, status), reconnect. Redux/Pinia for state (ports array with game/gamer/patr/startTime, movingGame/Player, pause, espConnected). Notifications for actions. Responsive with Tailwind, touch drag fix.