Stack Client

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 не встановлює.

#МожливістьDirectorMentorTrainee
1Список курсіввсіде є учасникомде є учасником
2Створення курсу
3Редагування курсу
4Список Trainees курсувсісвоїх Trainees
5Прогрес Traineeсвоїх Trainees
6Структура курсуперегляд та редагуванняперегляд (з allowEdit — редагування)доступних / завершених
7Перегляд контенту урокудоступних / завершених
8Редагування урокуз allowEdit
9Здача уроку (Submit)
10Перегляд відповідейсвоїх Traineesсвої завершені
11Перевірка відповідей Trainee (check screen)своїх Trainees

Маршрути та рольові відмінності

РольСписокКерування курсомTraineesMentor-модулі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/uploadAvatarupload аватара курсу

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 — ім’я Mentor
  • Current lesson — назва поточного уроку
  • Last activity — дата останньої активності
  • StatusIn 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 у рядку → перевести в FinishedFinished назад заборонено)

Endpoints:

EndpointЩо робить
trainee/getAllсписок Trainee курсу (бек фільтрує по Mentor для не-director)
mentor/getByCourseMentors курсу (для Add trainee → вибір Mentor)
trainee/getFreeвільні Trainee (для Add trainee → вибір Trainee)
course/addTraineeдодати Trainee в курс
trainee/changeStatusперевести Trainee в Finished

5. Прогрес Trainee

Список усіх уроків Trainee. Відкривається з рядка в #4.

Колонки:

  • Module
  • Lesson
  • Sent for review — коли надіслано на перевірку
  • Checked — коли перевірено
  • StatusIn progress / Finished (editable dropdown)

Жовтий рядок = On moderation.

Дії:

  • зміна Status у рядку → ручний override (FinishedIn 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 модуля — назва, Hidden toggle
  • delete модуля (каскадно з уроками і відповідями)
  • + Lesson всередині модуля
  • клік на урок → перегляд контенту (#7); звідти кнопка Edit → редагування (#8)
  • drag&drop модулів — змінити порядок
  • drag&drop уроків у модулі — змінити порядок
  • перетягнути урок в інший модуль
  • Import lesson — модалка зі списком курсів → модулів → уроків, копіює обраний урок у поточний модуль
  • Hidden toggle над списком — фільтр прихованих

Дії в 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/updateModulePositionsreorder модулів
module/updateLessonPositionsreorder уроків у модулі
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 на наступний доступний
  • З тестом — відповідь на питання + SubmitOn 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 — прийняти відповіді → урок переходить у Finished
  • Reject — відхилити → відповідь видаляється, Trainee має перездати чисто (re-take)

Endpoints:

| Endpoint | Що робить | | ------------------------------------------------------------------------------------------------------- | -------------------------------------- | ------ | | answer/checkAnswers | перевірка з прапором isCorrectly:true | false |


Загальні нюанси

  • Каскади. Видалення курсу → модулі + уроки + відповіді. Видалення модуля → уроки + відповіді. Видалення уроку → відповіді.
  • Прогресія для Trainee. Уроки після поточного приховані до здачі. Не-тестові уроки (media / text / image) автоматично переходять у Finished після Submit; тестові — в On moderation до перевірки Mentor.
  • Mentor Role в settings — довідкова прив’язка курсу до ролі учасників, не плутати з роллю поточного юзера.

Зв’язки