Активовано закладений механізм Directory.location_types (використовується в
Employee.clean(), але справочник був порожній):
- Міграція core 0005: сид довідника «Тип локации» (office/pharmacy/warehouse) —
тепер посадам можна призначати типи локацій в адмінці (M2M location_types)
- _hr_portal_context віддає карту hr_post_location_types {post_id: [коди]}
- Форма найму: селект «Посада» фільтрується за обраним типом локації
(hrHiringFilterPosts). Порожній список типів у посади = доступна скрізь
(та сама семантика, що в clean()); невідповідну обрану посаду скидає
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Аватар співрозмовника напроти особистого повідомлення (лівий список):
chatBuildChannelRow отримав опцію avatar; id співрозмовника ЛС резолвиться
в chatResolveDmLabel і підвантажує фото (chatApplyAvatar). Групові ЛС —
без фото, з ініціалами.
- Верхній перемикач «кімнат» — команди Mattermost (Офіс / Аптеки / Склад):
chatRenderTeamSwitcher/chatSelectTeam; chatRenderChannelList фільтрує канали
за обраною командою; за замовчуванням — перша команда. ЛС показуються завжди.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- chatApplyAvatar(el, userId): подгружает фото из Mattermost
/users/{id}/image (работает и для сотрудников, и для ботов) и накладывает
на кружок-аватар; до загрузки/при ошибке остаются инициалы. Кэш по userId.
- Применено в сообщениях (chatBuildMessageEl) и в пикере коллег
(chatRenderDmPickerList)
- Переиспользует существующий chatApiFetchBlob (Bearer-токен)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>