global-favorites

Global favorites

src/features/favorites/global/ — RU-centric підфіча домену Favorites. Вона показує агрегований список RU усієї Family та пов’язані TU relations.

src/features/favorites/
├── global/
├── by_tu/
└── shared/

Стара окрема директорія src/features/global_favorites/ видалена. global і by_tu не є режимами одного універсального компонента: вони мають окремі state/query models, але спільно використовують notes, contacts, response parsers, sorting, async counter і request guards.

Use cases

Director, top manager і team lead використовують Global favorites, щоб знайти RU на рівні всієї Family, переглянути пов’язані TU та відкрити деталі конкретної relation.

Відмінність від Favorites by TU

| Екран | Основна вісь | Початкова дія | | --------------------- | ----------------- | ----------------------------- | ---------- | | Favorites by TU | TU → її RU | вибрати TU | | Global favorites | RU → пов’язані TU | знайти RU у загальному списку |

Доступи та маршрути

  • director/ceo/{family-route}/global_favorites;
  • top_manager/top_manager/{family-route}/global_favorites;
  • team_lead/teamlead/{family-route}/global_favorites.

{family-route}: golden, udate, chathouse або talkytimes. Усередині domain talkytimes мапиться на prime.

Top manager залишається окремою frontend role, але для details використовує чинний director backend endpoint. Це ізольовано в route/config boundary і не маскує роль у UI-моделі.

Основний список

  • автоматичне завантаження;
  • search із submit і reset сторінки;
  • pagination;
  • asc/desc sorting;
  • inline редагування global RU title;
  • перехід RU → TU details;
  • latest-request protection і mutation locks.

Malformed response не потрапляє безпосередньо в UI: list, detail та update responses проходять runtime parsers і normalization. Partial або null update response доповнюється поточними даними. Server ID закріплений окремо й не може бути перезаписаний response/payload полем.

Деталі RU → TU

Окремий details controller керує:

  • immutable sorting;
  • active-row rule;
  • inline relation updates;
  • Golden contact e-mail flow;
  • relation notes;
  • per-row mutation locks.

Рядок без реального server ID залишається доступним для перегляду, але mutation controls та notes action вимкнені. Значення дат і чисел мають читабельний fallback -; null не відображається як NaN або штучний 0.00.

У Golden значення Contacts = Yes вимагає валідний e-mail; непідтверджений e-mail відображається як warning state.

Нотатки

Modal містить:

  • Admin's title — global RU title;
  • Operator's title — title relation TU ↔ RU;
  • manual notes;
  • AI notes, якщо Family підтримує їх читання.

Manual notes можна створювати та hide/unhide. AI notes у Global Favorites лише read-only: жодних approve/reject controls і review API calls немає.

Backend moderation status впливає тільки на колір AI note:

  • approved — зелений;
  • rejected — червоний;
  • pending/невідомий — нейтральний.

Manual й AI requests виконуються незалежно, тому частковий failure не приховує успішно завантажені notes.

API ownership

  • main list/update — global/config.ts і global/api.ts;
  • details update — global/details/config.js та global/api.ts;
  • family-specific notes endpoints — favorites/shared/notes/config.js;
  • request/response envelopes — favorites/shared/api*.ts;
  • family-specific backend identifiers — adapters/config boundary;
  • усі endpoint constants — favorites/endpoints.js.

Legacy utility-файлів favoritesMenData.js і globalFavoritesData.js більше немає. Backend-owned URL segments і payload fields на кшталт globalMan, manId або ladyId збережені на API boundary.

Зв’язки