Team Lead Card
src/features/teamlead_card/ — спільна Stack-картка supervisor для create/edit і сторінки власного профілю.
Суть
Team Lead Card керує глобальним профілем supervisor і його доступами до Family. Картка не належить одній Family: create-route передає початковий Family context, а секція Cooperation може містити доступи до кількох Family.
Один feature використовується Director, HR manager, Top manager і самим Supervisor. Роль та режим визначають доступні поля і payload.
Use cases
- Director створює supervisor у вибраній Family, редагує профіль, Family access, password і server access.
- HR manager створює та редагує доступного supervisor без керування server access.
- Top manager переглядає профіль доступного supervisor і оновлює лише DeepL API key.
- Supervisor відкриває
/teamlead/my_profile, змінює власний nickname і translator settings та переглядає свої Family access.
Доступ і маршрути
| Контекст | Create | Existing card |
|---|---|---|
| Director | /ceo/teamlead_card/create/:family | /ceo/teamlead_card/:id |
| HR manager | /hr/teamlead_card/create/:family | /hr/teamlead_card/:id |
| Top manager | — | /top_manager/teamlead_card/:id |
| Supervisor My profile | — | /teamlead/my_profile |
Create mode визначається відсутністю :id разом із наявністю :family. Для TalkyTimes route переходить із URL-сегмента talkytimes, але в create context передається backend Family prime.
Supervisor My profile передає Stack user ID напряму через selectedCardOverride, тому не потребує :id у URL.
Ініціалізація
Перед профілем картка завантажує admin panels усіх чотирьох Family.
- Prime, Golden, Udate і Chathouse запитуються незалежно.
- Помилка однієї Family показує notification і залишає її список порожнім, але не блокує інші Family.
- Create mode після цього створює порожній стан і не запитує профіль.
- Edit і My profile завантажують supervisor profile за Stack ID.
- Відсутній ID без валідного create context є помилкою.
- Помилка профілю показує notification і повертає користувача на попередній route.
Секції й права
| Секція | Director / HR manager | Top manager | Supervisor My profile |
|---|---|---|---|
| General info | Name, Surname, Nickname редагуються | read-only | Name/Surname read-only, Nickname редагується |
| Login details | Email редагується; password actions | Email read-only; password actions | Email read-only; password actions |
| Server access | змінює лише Director | не показується | не показується |
| Translator | API key редагується, language read-only | API key редагується | API key і language редагуються |
| Notifications Telegram bot | existing card | existing card | existing card |
| Work hours | редагуються | disabled | disabled |
| Cooperation | усі Family, редагування | лише дозволені Family, read-only | лише дозволені Family, read-only |
Password copy і reset доступні для будь-якої existing card. Copy показує global success notification; локальний текст Copied належить таблицям Teamleads, а не цій картці.
General info і валідація
Для Director, HR manager і Supervisor My profile:
- Name обов’язковий;
- Surname обов’язковий, якщо поле присутнє в моделі;
- Email обов’язковий і має бути валідним;
- змінений непорожній Nickname проходить перевірку формату;
- кожна дозволена Family повинна мати вибрану admin panel.
Top manager не проходить повну валідацію, тому його DeepL update не залежить від read-only полів.
Translator
- DeepL API key редагується в усіх режимах.
- Language у звичайній create/edit card показується read-only.
- У Supervisor My profile Language має selector
UK / RU. - Verification checkbox лише показує отриманий стан і не перемикається вручну.
Top manager payload містить тільки Stack ID і DeepL API key. Supervisor My profile використовує повний update payload, хоча більшість полів у ньому read-only.
Work hours
From і To задаються двома range controls у межах 00:00–24:00.
- Director і HR manager можуть змінювати значення.
- Top manager і Supervisor бачать disabled controls.
- Значення зберігається як одна пара годин.
Cooperation
Cooperation містить Udate, TalkyTimes, GoldenBride і Chathouse.
Accessвмикає або вимикає Family.- Вимкнення Access очищає вибрану admin panel.
- Дозволена Family без admin panel блокує save.
- Top manager і Supervisor бачать тільки дозволені Family без можливості змін.
- Порожній admin list показує
result is empty.
Ідентифікатори admin panels
| Family | Значення selector |
|---|---|
| Udate | внутрішній id |
| Prime / TalkyTimes | внутрішній id |
| GoldenBride | числовий id_api |
| Chathouse | внутрішній id |
Golden id_api нормалізується до number у списку, завантаженій картці та save payload. Selector також показує id_api як label. Змішування string і number призводить до того, що наявне backend-значення не визначається як вибране.
Create і update
Create payload містить:
- поточну Family з create-route;
- роль
supervisor; - General info, Login details, Translator і Work hours;
- тільки Family з увімкненим Access.
Existing update не потребує currentFamily: поточні Family access уже є частиною Cooperation.
Top manager надсилає лише ID і DeepL API key. Інші ролі використовують повний update.
Подвійний save блокується, поки попередній запит не завершився.
Password і server access
- Copy переносить
email passwordу clipboard. - Reset генерує новий Stack password і одразу синхронізує його у поточному та початковому станах.
- Server access показується лише Director для existing card.
- Перемикання
Production / Developmentвиконується окремою mutation і не очікує загального UPDATE.
Незбережені зміни
- Поточний стан порівнюється з початковим після кожної зміни.
Returnіз незбереженими змінами потребує confirmation.- Після успішного create/update початковий стан синхронізується з поточним.
- Password і server access також синхронізуються після окремої mutation.
Loading та помилки
- Admin panels, profile, save, password і server access використовують global loader.
- Backend message показується без зміни; за його відсутності використовується frontend fallback.
- Окремого page-level empty або error state немає.
- Selector без admin panels має локальний empty text.
Нюанси
teamleadу frontend props означає Supervisor My profile; роль доступу в backend і документації —supervisor.- User-facing Family name має бути
Chathouse, хоча поточний Cooperation UI містить typoChatshouse. - Fallback save-помилки зараз каже
Failed to update operator card.— це неправильна назва сутності в коді й не є бізнес-терміном для Team Lead Card.
Зв’язки
- teamleads — списки й переходи до create/edit card.
- my-profile — особистий режим Supervisor.
- operator-card — окрема картка operator.
- swagger — реєстр backend Swagger UI.
- API route constants:
src/utils/directorData.js,src/utils/hrManagerDate.ts,src/utils/usersData.js,src/utils/adminPanelsData.js. - TODO: додати перевірені operation deeplink-и для supervisor profile/create/edit, admin panels, password, server access і Telegram bot link.