Docs: sync Front#35 D9 B guest schedule + confirmed personal overlay. Fixes EventHub/EventHubSpec#15
Refs EventHub/EventHubFront#35 (57cfcf3).
This commit is contained in:
+20
-3
@@ -60,6 +60,13 @@ Deep-link на календарь, владельцем которого явл
|
|||||||
- Контекст виджета: свой календарь (селектор) или чужой (browse после поиска). Чужой `personal` —
|
- Контекст виджета: свой календарь (селектор) или чужой (browse после поиска). Чужой `personal` —
|
||||||
только просмотр; чужой `commercial` с `booking_open=true` — запись; при `booking_open=false`
|
только просмотр; чужой `commercial` с `booking_open=true` — запись; при `booking_open=false`
|
||||||
(restricted / нет подписки владельца) — просмотр + сообщение «Запись временно недоступна».
|
(restricted / нет подписки владельца) — просмотр + сообщение «Запись временно недоступна».
|
||||||
|
- **Свой default personal:** поверх сетки — overlay confirmed записей на чужие commercial
|
||||||
|
слоты (Front-only: `GET /v1/user/bookings` → events/calendars). Заголовок
|
||||||
|
`событие · студия · специалист`; клик → `/c/:foreignCalId/e/:eventId` (не в своём cal).
|
||||||
|
- **Guest на чужом commercial (D9 модель B):** roster карточек активных специалистов →
|
||||||
|
тап → сетка только со слотами `event.specialist_id` = выбранный; «Все слоты студии»
|
||||||
|
снимает фильтр. Это **не** chip-filter на общей сетке. Book как обычно — без
|
||||||
|
`specialist` в body заявки (слот уже привязан к спецу на событии).
|
||||||
- Agenda rail: empty copy зависит от типа календаря — personal «Нет событий», commercial
|
- Agenda rail: empty copy зависит от типа календаря — personal «Нет событий», commercial
|
||||||
«Нет слотов».
|
«Нет слотов».
|
||||||
- Выбор события открывает карточку действий: mobile — bottom sheet; desktop — боковая панель. Действия зависят от роли (owner / participant).
|
- Выбор события открывает карточку действий: mobile — bottom sheet; desktop — боковая панель. Действия зависят от роли (owner / participant).
|
||||||
@@ -150,6 +157,10 @@ cover (`.eh-discover-media--photo`); иначе mood wash + initials (`.eh-disco
|
|||||||
список active + исходящие pending; deactivate/remove принятых.
|
список active + исходящие pending; deactivate/remove принятых.
|
||||||
Выбор `specialist_id` в форме события (только `active`).
|
Выбор `specialist_id` в форме события (только `active`).
|
||||||
Баннер «подписка истекла / истекает» при `booking_open=false`.
|
Баннер «подписка истекла / истекает» при `booking_open=false`.
|
||||||
|
`SpecialistsPanel` (owner): mobile density — имя/теги сверху, actions снизу
|
||||||
|
full-width (invite/deactivate не ломать); desktop — вертикальный rail + scroll.
|
||||||
|
- Guest browse commercial: roster активных → фильтр расписания по `specialist_id`
|
||||||
|
(D9 B; см. §3.1); owner panel не смешивать с guest roster.
|
||||||
- Invitee: inbox входящих `GET /v1/user/specialist-invites` на `/invites` —
|
- Invitee: inbox входящих `GET /v1/user/specialist-invites` на `/invites` —
|
||||||
принять / отклонить; deep-link из email → accept по `token` после логина.
|
принять / отклонить; deep-link из email → accept по `token` после логина.
|
||||||
В More пункт «Приглашения» показывается **только** при `pending > 0` с badge
|
В More пункт «Приглашения» показывается **только** при `pending > 0` с badge
|
||||||
@@ -164,7 +175,8 @@ cover (`.eh-discover-media--photo`); иначе mood wash + initials (`.eh-disco
|
|||||||
|
|
||||||
### 5.6. Запись (bookings)
|
### 5.6. Запись (bookings)
|
||||||
- Участник: `POST /v1/events/:id/bookings` только при `booking_open`; иначе UI-сообщение /
|
- Участник: `POST /v1/events/:id/bookings` только при `booking_open`; иначе UI-сообщение /
|
||||||
ответ `403`; `GET /v1/user/bookings`, `DELETE /v1/bookings/:id`, `GET /v1/bookings/:id`
|
ответ `403`; `GET /v1/user/bookings`, `DELETE /v1/bookings/:id`, `GET /v1/bookings/:id`.
|
||||||
|
Тело book **без** specialist (назначение — на `event.specialist_id`).
|
||||||
- Владелец и specialist:
|
- Владелец и specialist:
|
||||||
- на карточке события: `GET /v1/events/:id/bookings` + Confirm/Decline (**обязательно**)
|
- на карточке события: `GET /v1/events/:id/bookings` + Confirm/Decline (**обязательно**)
|
||||||
- inbox `/bookings` группа «К подтверждению»: `GET /v1/user/booking-requests`
|
- inbox `/bookings` группа «К подтверждению»: `GET /v1/user/booking-requests`
|
||||||
@@ -175,9 +187,14 @@ cover (`.eh-discover-media--photo`); иначе mood wash + initials (`.eh-disco
|
|||||||
(upcoming/past participant). `specialist_invite` сюда **не** попадает.
|
(upcoming/past participant). `specialist_invite` сюда **не** попадает.
|
||||||
Empty state: title + hint + CTA Discover / «Мои календари».
|
Empty state: title + hint + CTA Discover / «Мои календари».
|
||||||
Время слота на list-карточках — soft (secondary to title).
|
Время слота на list-карточках — soft (secondary to title).
|
||||||
|
- **Confirmed overlay на personal (Front-only, Front#35):** confirmed из
|
||||||
|
`GET /v1/user/bookings` на чужих commercial — догрузить event/calendar и нарисовать
|
||||||
|
на **своём default personal** grid; title `событие · студия · специалист`;
|
||||||
|
клик → `/c/:foreignCalId/e/:eventId`. Back API не менялся.
|
||||||
- Статусы: `pending` | `confirmed` | `cancelled` | `expired`; confirmation: `auto` | `manual` | timeout.
|
- Статусы: `pending` | `confirmed` | `cancelled` | `expired`; confirmation: `auto` | `manual` | timeout.
|
||||||
Past+pending / `expired` в «Мои записи» — бейдж «истекла», Cancel скрыт (в т.ч. на
|
Past+pending / `expired` в «Мои записи» и на `EventActionCard` — бейдж «истекла»,
|
||||||
`EventActionCard`). Defensive: если API ещё отдал past `pending` — UI мапит в `expired`.
|
Cancel скрыт. На past-событии Book скрыт. Defensive: если API ещё отдал past
|
||||||
|
`pending` — UI мапит в `expired`.
|
||||||
- Pending резервирует capacity (как на бэке)
|
- Pending резервирует capacity (как на бэке)
|
||||||
|
|
||||||
### 5.7. Отзывы
|
### 5.7. Отзывы
|
||||||
|
|||||||
@@ -72,6 +72,15 @@ Canvas: `eventhub-front-ux-review` → `eventhub-front-ux-rewalk` → **`eventhu
|
|||||||
- [x] Booking: sheet swipe-dismiss, `/bookings` upcoming/past, post-book CTA ([EventHubFront#23](https://git.sabilin.com/EventHub/EventHubFront/issues/23))
|
- [x] Booking: sheet swipe-dismiss, `/bookings` upcoming/past, post-book CTA ([EventHubFront#23](https://git.sabilin.com/EventHub/EventHubFront/issues/23))
|
||||||
- [x] Stage verify: swipe Playwright (Pixel 5), prune on host, smoke-owned litter по префиксу
|
- [x] Stage verify: swipe Playwright (Pixel 5), prune on host, smoke-owned litter по префиксу
|
||||||
|
|
||||||
|
## P2 stage journey (Front#35, Jul 2026) — shipped
|
||||||
|
|
||||||
|
- [x] SpecialistsPanel mobile density (имя/теги сверху, actions снизу full-width)
|
||||||
|
- [x] F6: EventActionCard past+pending → expired, без Cancel; Book скрыт на past
|
||||||
|
- [x] D9 модель B: guest roster → фильтр слотов по `specialist_id`; «Все слоты студии»
|
||||||
|
- [x] Confirmed foreign bookings overlay на default personal (Front-only)
|
||||||
|
|
||||||
|
Трекер: [EventHubFront#35](https://git.sabilin.com/EventHub/EventHubFront/issues/35).
|
||||||
|
|
||||||
## Future (не блокер 10)
|
## Future (не блокер 10)
|
||||||
|
|
||||||
- [x] Swipe month/week + long-press create в календаре ([EventHubFront#24](https://git.sabilin.com/EventHub/EventHubFront/issues/24))
|
- [x] Swipe month/week + long-press create в календаре ([EventHubFront#24](https://git.sabilin.com/EventHub/EventHubFront/issues/24))
|
||||||
|
|||||||
@@ -393,6 +393,7 @@ error rate > 1% **или** mean request > 500 ms (hold ≥2 мин в фазе)
|
|||||||
|
|
||||||
| Дата | Изменение |
|
| Дата | Изменение |
|
||||||
|------|-----------|
|
|------|-----------|
|
||||||
|
| 2026-07-28 | Spec sync Front#35: D9 B guest specialist schedule; confirmed overlay на personal; SpecialistsPanel density; F6 EventActionCard |
|
||||||
| 2026-07-27 | Spec sync Back#61: `specialist_id` на POST event; commercial без active sub → 402; trial только `start_trial` |
|
| 2026-07-27 | Spec sync Back#61: `specialist_id` на POST event; commercial без active sub → 402; trial только `start_trial` |
|
||||||
| 2026-07-27 | `agent-pitfalls.mdc` §6: экономия токенов (чат, scope, subagents, режимы) |
|
| 2026-07-27 | `agent-pitfalls.mdc` §6: экономия токенов (чат, scope, subagents, режимы) |
|
||||||
| 2026-07-27 | `agent-pitfalls.mdc`: типовые сбои PS/git/docker/scope; промпт субагентам |
|
| 2026-07-27 | `agent-pitfalls.mdc`: типовые сбои PS/git/docker/scope; промпт субагентам |
|
||||||
|
|||||||
@@ -25,6 +25,9 @@ SoT: [`boards/calentiq-ui-board-final.png`](boards/calentiq-ui-board-final.png).
|
|||||||
| Bookings past/expired | — | `expired` бейдж + Cancel скрыт; empty-state с CTA Discover / календари; soft list time |
|
| Bookings past/expired | — | `expired` бейдж + Cancel скрыт; empty-state с CTA Discover / календари; soft list time |
|
||||||
| Agenda empty copy | — | personal «Нет событий»; commercial «Нет слотов» |
|
| Agenda empty copy | — | personal «Нет событий»; commercial «Нет слотов» |
|
||||||
| More invites | пункт меню | скрыт при pending=0; badge счётчика при pending > 0 |
|
| More invites | пункт меню | скрыт при pending=0; badge счётчика при pending > 0 |
|
||||||
|
| D9 guest specialist schedule | — | **модель B (Front#35):** roster карточек → тап → фильтр слотов по `event.specialist_id`; «Все слоты студии»; book без specialist в body; **не** chip-filter |
|
||||||
|
| Confirmed на personal | — | Front-only overlay confirmed чужих commercial на default personal; title `событие · студия · спец`; клик → `/c/:foreignCalId/e/:eventId` |
|
||||||
|
| SpecialistsPanel density | — | mobile: имя/теги сверху, actions снизу full-width (Front#33/#35) |
|
||||||
| Stage | полный smoke на stage | **done** 2026-07-27: Login×3 / Calendar×3 + agenda / Discover / CONTROL commercial + Confirm·Decline / More moods |
|
| Stage | полный smoke на stage | **done** 2026-07-27: Login×3 / Calendar×3 + agenda / Discover / CONTROL commercial + Confirm·Decline / More moods |
|
||||||
| Домены calentiq.* | — | публичный stage: `stage.calentiq.com` / `admin.stage.calentiq.com` (канон STAGE-BROWSER.md) |
|
| Домены calentiq.* | — | публичный stage: `stage.calentiq.com` / `admin.stage.calentiq.com` (канон STAGE-BROWSER.md) |
|
||||||
|
|
||||||
@@ -38,7 +41,9 @@ IA без sidebar / без Creator mood — совпадает с non-goals (п
|
|||||||
|
|
||||||
**Front#31 (2026-07-27):** desktop one-row chrome (logo|nav|logout); header nickname; bookings `expired` + soft list time + empty CTA; agenda personal vs commercial empty copy; Discover cover photo/fallback; More invites badge.
|
**Front#31 (2026-07-27):** desktop one-row chrome (logo|nav|logout); header nickname; bookings `expired` + soft list time + empty CTA; agenda personal vs commercial empty copy; Discover cover photo/fallback; More invites badge.
|
||||||
|
|
||||||
**Remaining intentional:** no pixel-perfect phone chrome; Discover без photo-hero grid (cover via `image_url` when API returns it; broken URL → wash+initials); §E specialist schedule card vs panel — не pixel-perfect board mocks (follow-up).
|
**Front#35 (2026-07-28, SHA `57cfcf3`):** D9 модель B (guest roster → schedule filter); confirmed foreign overlay на personal; SpecialistsPanel mobile density; F6 EventActionCard past+pending → expired / no Cancel, Book скрыт на past.
|
||||||
|
|
||||||
|
**Remaining intentional:** no pixel-perfect phone chrome; Discover без photo-hero grid (cover via `image_url` when API returns it; broken URL → wash+initials); §E specialist schedule card vs panel — не pixel-perfect board mocks (follow-up). Product flow D9 B — documented; board pixel mock — Future.
|
||||||
|
|
||||||
### Bookings inbox + More invites (locked 2026-07-27)
|
### Bookings inbox + More invites (locked 2026-07-27)
|
||||||
|
|
||||||
@@ -57,18 +62,32 @@ IA без sidebar / без Creator mood — совпадает с non-goals (п
|
|||||||
5. **Past-pending / `expired`:** Back#60 помечает past-pending → `expired` и исключает из
|
5. **Past-pending / `expired`:** Back#60 помечает past-pending → `expired` и исключает из
|
||||||
`booking-requests`; Confirm/Decline → `409`. UI: бейдж «истекла», Cancel скрыт
|
`booking-requests`; Confirm/Decline → `409`. UI: бейдж «истекла», Cancel скрыт
|
||||||
(Bookings + EventActionCard); defensive map past+pending → expired badge.
|
(Bookings + EventActionCard); defensive map past+pending → expired badge.
|
||||||
|
Front#35 F6: на past Book скрыт; past+pending на карточке → expired label.
|
||||||
|
|
||||||
API: `GET /v1/user/booking-requests` (Back) + существующий `PUT /v1/bookings/:id`
|
API: `GET /v1/user/booking-requests` (Back) + существующий `PUT /v1/bookings/:id`
|
||||||
(`409` на expired / full).
|
(`409` на expired / full).
|
||||||
|
|
||||||
|
### Guest specialist schedule + confirmed overlay (locked Front#35)
|
||||||
|
|
||||||
|
1. **D9 модель B (guest на commercial):** roster активных специалистов (карточки) →
|
||||||
|
тап → сетка только со слотами выбранного `event.specialist_id`; CTA «Все слоты
|
||||||
|
студии» сбрасывает фильтр. **Не** chip-filter на shared grid. Book body без
|
||||||
|
specialist. Owner `SpecialistsPanel` (invite/CRUD) не менять этим флоу.
|
||||||
|
2. **Confirmed на personal (Front-only):** `GET /v1/user/bookings` (confirmed) +
|
||||||
|
догрузка events/calendars → overlay на **default personal** grid; title
|
||||||
|
`event · studio · specialist`; клик → `/c/:foreignCalId/e/:eventId`. Back без
|
||||||
|
изменений.
|
||||||
|
3. **SpecialistsPanel density (mobile):** имя/теги сверху, actions снизу full-width.
|
||||||
|
|
||||||
### Follow-ups (вне этого fix-pass или частично)
|
### Follow-ups (вне этого fix-pass или частично)
|
||||||
|
|
||||||
| Тема | Статус |
|
| Тема | Статус |
|
||||||
|------|--------|
|
|------|--------|
|
||||||
| Discover `image_url` в search serialization | Back отдаёт поле; upload API **нет** — только URL field / seed; Front#31: photo vs fallback media classes + onError fallback |
|
| Discover `image_url` в search serialization | Back отдаёт поле; upload API **нет** — только URL field / seed; Front#31: photo vs fallback media classes + onError fallback |
|
||||||
| Stage Popular clutter (e2e calendars) | filter notes: см. `EventHubSpec/STAGE-POPULAR-CLEANUP.md`; не трогать реальные smoke данные без фильтра по e2e-паттернам |
|
| Stage Popular clutter (e2e calendars) | filter notes: см. `EventHubSpec/STAGE-POPULAR-CLEANUP.md`; не трогать реальные smoke данные без фильтра по e2e-паттернам |
|
||||||
| §E specialist schedule card vs panel | deviation: EventActionCard + SpecialistsPanel; отдельный pixel mock — Future |
|
| §E specialist schedule card vs panel | deviation: EventActionCard + SpecialistsPanel; pixel mock — Future; **product D9 B** — done Front#35 |
|
||||||
| Desktop one-row chrome | **done** Front#31 — logo \| nav \| nickname+logout |
|
| Desktop one-row chrome | **done** Front#31 — logo \| nav \| nickname+logout |
|
||||||
|
| D9 B + confirmed personal overlay | **done** Front#35 (`57cfcf3`) |
|
||||||
|
|
||||||
## Mood concept = product surface
|
## Mood concept = product surface
|
||||||
|
|
||||||
@@ -195,6 +214,7 @@ CSS-токены и chrome на mood beyond primary hex: surfaces, gradients, ev
|
|||||||
| 5 | Polish + stage smoke | [Front#29](https://git.sabilin.com/EventHub/EventHubFront/issues/29) |
|
| 5 | Polish + stage smoke | [Front#29](https://git.sabilin.com/EventHub/EventHubFront/issues/29) |
|
||||||
| — | P1/P2 UX polish + expired + desktop chrome | [Front#31](https://git.sabilin.com/EventHub/EventHubFront/issues/31) |
|
| — | P1/P2 UX polish + expired + desktop chrome | [Front#31](https://git.sabilin.com/EventHub/EventHubFront/issues/31) |
|
||||||
| — | Past-pending → `expired` | [Back#60](https://git.sabilin.com/EventHub/EventHubBack/issues/60) |
|
| — | Past-pending → `expired` | [Back#60](https://git.sabilin.com/EventHub/EventHubBack/issues/60) |
|
||||||
|
| — | P2: D9 B + confirmed personal + density/F6 | [Front#35](https://git.sabilin.com/EventHub/EventHubFront/issues/35) |
|
||||||
|
|
||||||
Эпик: [Spec#10](https://git.sabilin.com/EventHub/EventHubSpec/issues/10).
|
Эпик: [Spec#10](https://git.sabilin.com/EventHub/EventHubSpec/issues/10).
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user