Courses
Глобальне меню → Courses
Суть
Внутрішня школа: курси → модулі → уроки → відповіді. У межах конкретного курсу користувач працює як Mentor або Trainee. Frontend має одну спільну реалізацію в src/features/academy/, але маршрути, дозволені дії та частина представлення визначаються конфігурацією ролі.
Use cases
Director створює курси і призначає Mentors; Mentor додає та перевіряє прогрес своїх Trainees і оновлює контент уроків; Trainee проходить призначений курс після найму або переходу на нову роль.
Доступи
StackRole визначає доступні Academy-маршрути та верхню межу можливостей. Відповідь списку курсів додатково визначає, чи показувати конкретний курс у Mentor- або Trainee-режимі.
- Director — Mentor-режим із керуванням курсом і контентом.
- HR manager і top manager — Mentor-режим.
- Supervisor і client manager — змішаний режим: картка окремого курсу може відкрити Mentor- або Trainee-маршрут.
- Operator — тільки Trainee-режим.
recruiter— НЕ має доступу academy UI; має тільки інформацію про участь оператора в курсах через картку кандидата
Frontend визначає Trainee-картку у змішаному режимі за одночасною умовою: trainees === null і в курсі є status. В інших випадках картка вважається Mentor-карткою. Чи може backend призначити того самого користувача в обох ролях одного курсу, frontend не встановлює.
| # | Можливість | Director | Mentor | Trainee |
|---|---|---|---|---|
| 1 | Список курсів | всі | де є учасником | де є учасником |
| 2 | Створення курсу | ✓ | — | — |
| 3 | Редагування курсу | ✓ | — | — |
| 4 | Список Trainees курсу | всі | своїх Trainees | — |
| 5 | Прогрес Trainee | ✓ | своїх Trainees | — |
| 6 | Структура курсу | перегляд та редагування | перегляд (з allowEdit — редагування) | доступних / завершених |
| 7 | Перегляд контенту уроку | ✓ | ✓ | доступних / завершених |
| 8 | Редагування уроку | ✓ | з allowEdit | — |
| 9 | Здача уроку (Submit) | — | — | ✓ |
| 10 | Перегляд відповідей | — | своїх Trainees | свої завершені |
| 11 | Перевірка відповідей Trainee (check screen) | — | своїх Trainees | — |
Маршрути та рольові відмінності
| Роль | Список | Керування курсом | Trainees | Mentor-модулі | Trainee-модулі |
|---|---|---|---|---|---|
| Director | /ceo/academy/courses | /ceo/academy/courses_settings/:id | /ceo/academy/students/:id | /ceo/academy/modules/:id | — |
| HR manager | /hr/academy/courses | — | /hr/academy/students/:id | /hr/academy/mentor_modules/:id | — |
| Top manager | /top_manager/academy/courses | — | /top_manager/academy/students/:id | /top_manager/academy/mentor_modules/:id | — |
| Supervisor | /teamlead/academy/courses | — | /teamlead/academy/students/:id | /teamlead/academy/mentor_modules/:id | /teamlead/academy/trainee_modules/:id |
| Client manager | /client_manager/academy/courses | — | /client_manager/academy/students/:id | /client_manager/academy/mentor_modules/:id | /client_manager/academy/trainee_modules/:id |
| Operator | /operator/academy/courses | — | — | — | /operator/academy/modules/:id |
Додаткові відмінності:
- Director не запитує окремий editing-access для структури курсу: edit mode увімкнений конфігурацією.
- Для інших Mentor-маршрутів editing-access завантажується для конкретного курсу; без нього структура залишається read-only.
- Director може фільтрувати таблицю Trainees за Mentor, але не відкриває check screen відповідей.
- HR manager, top manager і supervisor можуть додавати Trainee; Mentor у цьому flow зафіксований як поточний користувач.
- Director також може додавати Trainee, але спочатку обирає Mentor курсу.
- Client manager не має кнопки
Add trainee; його header компактніший. - Operator не використовує Academy shell зі Stack Header; Academy рендериться всередині operator Family shell.
Завантаження та стани
- Список курсів завантажується при монтуванні сторінки. Під час запиту використовується глобальний loader; помилка показується глобальним notification.
- Для всіх ролей, крім Director, порожній список показує
You don't have any courses available yet.. Director бачить порожню область списку та кнопку створення. - Список Trainees початково фільтрується за
In progress. Пошук перевіряє ім’я і nickname без урахування регістру. - У Director додатковий Mentor-фільтр починається зі значення
All mentors. - Рядки з
Last activity = Neverпідіймаються на початок уже відфільтрованого списку; інші рядки зберігають порядок відповіді. - Відкриття картки Trainee приховує таблицю. Повернення до таблиці повторно завантажує список.
- Запити списку Trainees, структури курсу, уроку та картки Trainee мають захист від застосування застарілої відповіді після переходу на інший course/lesson або unmount.
- Global loader є спільним для запитів. Паралельні запити можуть незалежно вмикати й вимикати його; frontend не веде локальний лічильник Academy-запитів.
Межі відповідальності frontend
- Рольові маршрути й видимість frontend-дій задає
src/features/academy/config/academyRoleConfigs.js. - Backend identifiers, endpoint constants і payload keys залишаються в
src/utils/academyData.js; shared feature їх не перейменовує. - Backend є джерелом списку доступних курсів, Mentor/Trainee assignments, статусів і прогресії. Frontend не виконує окремої перевірки доступу до course ID перед запитом.
- Каскадність видалення, унікальність участі Mentor/Trainee і заборона повторної здачі є backend-контрактами. Їх потрібно перевіряти у Swagger/stack-academy, а не виводити лише з frontend.
Деталі по можливостях
1. Список курсів
Стартова сторінка розділу. Сітка карток курсів, які бачить користувач.
Що на картці:
- назва курсу
- аватар (або плейсхолдер
No Image) - для Mentor-картки —
Trainees: N; для Trainee-картки —Status: In progress / Finished - посилання
Settings(тільки Director) - badge
MENTOR/TRAINEE(тільки на Mentor-картках, показує роль на цьому курсі)
Скоупинг:
- Director — всі курси
- Mentor — де він Mentor або Trainee
- Trainee — тільки де він Trainee
Дії:
+ Course(тільки Director) → створення курсу (#2)- клік на назву → структура курсу (#6)
- клік на
Trainees: N→ список Trainees (#4) - клік на
Settings→ редагування курсу (#3)
Endpoints:
| Endpoint | Що робить |
|---|---|
| course/getAll | список курсів (бек фільтрує за роллю користувача) |
2. Створення курсу
Відкривається кнопкою + Course зі списку курсів. Форма з даними нового курсу.
General Info:
Name*— обов’язковеMentor Role(dropdown:Teamlead/TOP-manager/Client-manager/Hr-manager) — визначає який тип юзерів може бути Mentor в цьому курсіAdd a new avatar— вибір файлу черезFileReader
Mentors таблиця:
Potential Mentors— список кандидатів (фільтрується заMentor Role)- toggle Mentor в курс
- toggle
allowEditдля нього (дозволяє редагувати модулі і уроки) - search по імені
Дії:
- зміна
Mentor Role→ перезавантажує кандидатів CREATE→ зберегти курс; якщо обрано аватар — окремий upload одразу після створенняReturn→ назад до списку курсів
Endpoints:
| Endpoint | Що робить |
|---|---|
| mentor/getFree | список вільних кандидатів за Mentor Role |
| course/update | створити (або оновити) курс |
| course/uploadAvatar | upload аватара курсу |
3. Редагування курсу
Той самий екран що створення з заповненими даними. Відкривається з посилання Settings на картці.
Що можна змінити:
Name- аватар
- склад Mentors (toggle)
allowEditдля кожного Mentor
Дії:
UPDATE→ зберегти зміниDelete course(з confirm) → каскадне видалення: курс + модулі + уроки + відповідіReturn→ назад до списку
Endpoints:
| Endpoint | Що робить |
|---|---|
| course/getById | завантажує курс для редагування |
| course/update | зберігає зміни |
| course/delete | каскадне видалення курсу |
4. Список Trainees курсу
Таблиця Trainee курсу. Відкривається з посилання Trainees на картці. Director бачить усіх; Mentor — тільки своїх (mentorId === user.id).
Колонки:
Trainee— ім’яMentor— ім’я MentorCurrent lesson— назва поточного урокуLast activity— дата останньої активностіStatus—In progress/Finished(editable dropdown у рядку)Edit— клік відкриває прогрес Trainee (#5)
Сортування: Trainee з Never activity — вгорі списку.
Локальні фільтри:
Search trainees— по імені- dropdown Mentor (default
All mentors) - dropdown статусу
Дії:
Add trainee— спочатку вибір Mentor зі списку Mentors курсу, потім вибір вільного Trainee,Save- зміна
Statusу рядку → перевести вFinished(зFinishedназад заборонено)
Endpoints:
| Endpoint | Що робить |
|---|---|
| trainee/getAll | список Trainee курсу (бек фільтрує по Mentor для не-director) |
| mentor/getByCourse | Mentors курсу (для Add trainee → вибір Mentor) |
| trainee/getFree | вільні Trainee (для Add trainee → вибір Trainee) |
| course/addTrainee | додати Trainee в курс |
| trainee/changeStatus | перевести Trainee в Finished |
5. Прогрес Trainee
Список усіх уроків Trainee. Відкривається з рядка в #4.
Колонки:
ModuleLessonSent for review— коли надіслано на перевіркуChecked— коли перевіреноStatus—In progress/Finished(editable dropdown)
Жовтий рядок = On moderation.
Дії:
- зміна
Statusу рядку → ручний override (Finished↔In progress) - клік на lesson title (з
answeredDate) → check screen (#11) — тільки Mentor
Endpoints:
| Endpoint | Що робить |
|---|---|
| lesson/getByTrainee | уроки Trainee з прогресом |
| lesson/changeStatus | ручна зміна статусу уроку |
6. Структура курсу
Дерево модулів і уроків — central screen для роботи з контентом курсу.
Скоупинг режимів:
- Director / Mentor з
allowEdit— повний CRUD (модулі, уроки, тести) - Mentor без
allowEdit— та сама структура, але view-only (видно іhidden) - Trainee — view-only progressive: тільки
isHidden:false, наступні уроки приховані до здачі поточного
Дії в edit-режимі:
+ Module— створити модуль (в кінець)- edit модуля — назва,
Hiddentoggle - delete модуля (каскадно з уроками і відповідями)
+ Lessonвсередині модуля- клік на урок → перегляд контенту (#7); звідти кнопка
Edit→ редагування (#8) - drag&drop модулів — змінити порядок
- drag&drop уроків у модулі — змінити порядок
- перетягнути урок в інший модуль
Import lesson— модалка зі списком курсів → модулів → уроків, копіює обраний урок у поточний модульHiddentoggle над списком — фільтр прихованих
Дії в Trainee-режимі:
Search lessons— пошук по назві уроку- клік на доступний урок → перегляд контенту (#7) і можливість здати (#9)
- клік на завершений урок → перегляд контенту + своїх відповідей (#10)
Endpoints:
| Endpoint | Що робить |
|---|---|
| course/getMentorContent | дерево для Director / Mentor (з прихованими) |
| course/getTraineeContent | дерево для Trainee (з прогресією, без прихованих) |
| mentor/getEditingAccess | перевірка allowEdit для не-director |
| module/create | новий модуль |
| module/update | оновити модуль (назва, Hidden) |
| module/delete | видалити модуль (каскадно) |
| lesson/create | новий урок у модулі |
| course/updateModulePositions | reorder модулів |
| module/updateLessonPositions | reorder уроків у модулі |
| lesson/changeModuleInLesson | перенести урок у інший модуль |
| lesson/lessonsToImport | список уроків для імпорту |
| lesson/copy | копіювання (імпорт) уроку |
7. Перегляд контенту уроку
Звідки: клік на урок у дереві (#6)
Read-only перегляд уроку у правій частині modules screen — текст, картинки, відео, тестові питання. Однаково для всіх ролей.
Додатково:
- Director / Mentor (з
allowEdit) — біля уроку кнопкаEdit→ переходить на сторінку редагування (#8) на повний екран - Trainee на завершеному уроці — підвантажуються свої відповіді (#10)
Endpoints:
| Endpoint | Що робить |
|---|---|
| lesson/getById | контент уроку |
| answer/getById | відповіді Trainee (тільки для completed) |
8. Редагування уроку
Звідки: кнопка
Editу #7 (тільки Director і Mentor зallowEdit)
Окрема сторінка редагування уроку на повний екран.
Поля:
Name— назва урокуHidden(Yes/No) — приховати від Trainee- TinyMCE для контенту — текст, форматування, картинки, відео, посилання
- блок тестів — питання (тип
One of the list), варіанти відповідей, картинки до питання і опцій
Дії:
UPDATE→ зберегти всі зміни урокуDelete lesson(з confirm) → каскадне видалення уроку + відповідейReturn→ назад до структури курсу
Endpoints:
| Endpoint | Що робить |
|---|---|
| lesson/update | зберігає зміни уроку |
| lesson/delete | каскадне видалення уроку |
9. Здача уроку
Звідки: доступний урок у #6 Trainee-режимі
Trainee натискає Submit після проходження уроку.
Поведінка по типу уроку:
- Без тесту (
media/text/image) — checkboxВиконано+Submit→ одразуFinished, перерахунокcurrentLessonна наступний доступний - З тестом — відповідь на питання +
Submit→On moderation, чекає перевірки Mentor (#11)
Кнопка Next lesson після Submit веде до наступного доступного уроку.
Endpoints:
| Endpoint | Що робить |
|---|---|
| answer/setAnswers | створює Answer для пари (lessonId, traineeId), повторна здача того ж уроку заборонена |
10. Перегляд відповідей
Раніше надані відповіді на завершений урок.
Звідки відкривається:
- Trainee — клік на завершений урок у структурі курсу (#6), відображається разом з контентом уроку (#7)
- Mentor — через прогрес Trainee (#5), клік на назву уроку → check screen (#11) показує і відповіді, і контент
Endpoints:
| Endpoint | Що робить |
|---|---|
| lesson/getById | контент уроку |
| answer/getById | збережені відповіді |
11. Перевірка відповідей Trainee
Звідки: з #5 кліком на урок зі статусом
On moderation
Окремий екран — check screen, де Mentor перевіряє тестові відповіді Trainee.
Що видно:
- контент уроку (питання, опції)
- відповіді Trainee
Дії:
Confirm— прийняти відповіді → урок переходить уFinishedReject— відхилити → відповідь видаляється, Trainee має перездати чисто (re-take)
Endpoints:
| Endpoint | Що робить |
| ------------------------------------------------------------------------------------------------------- | -------------------------------------- | ------ |
| answer/checkAnswers | перевірка з прапором isCorrectly:true | false |
Загальні нюанси
- Каскади. Видалення курсу → модулі + уроки + відповіді. Видалення модуля → уроки + відповіді. Видалення уроку → відповіді.
- Прогресія для Trainee. Уроки після поточного приховані до здачі. Не-тестові уроки (
media/text/image) автоматично переходять уFinishedпісляSubmit; тестові — вOn moderationдо перевірки Mentor. Mentor Roleв settings — довідкова прив’язка курсу до ролі учасників, не плутати з роллю поточного юзера.
Зв’язки
- Бек огляд: stack-academy документація · Swagger UI