Q.Palette 8.1.0
Изменений и новых возможностей столько, что версия минорная, а не патч. Работали над тем, чтобы продукт решал о входе и пользователе больше сам, сессия держалась там, где раньше рвалась, а публичное API и обновление не приносили неожиданностей.
- АвторизацияЕдиный вход независимо от режима, свой экран до входа, признаки режима.
- СессияСрок ключа проверяется при запуске, обновление в нескольких бандлах не рвёт сессию.
- КомпонентыШрифт иконок pi-*, компактная плашка q-error, серчбокс без ошибки в консоли.
- ПереводыКлючи вида en.Отмена больше не попадают на экран.
- Рутовое приложениеТема из конфигурации, темы в личном кабинете, дубли вкладок.
- БезопасностьЗакрыта уязвимость high в зависимостях.
- СовместимостьВыпуск останавливается, если немажорная версия ломает публичное API.
Куда двигали продукт
Выпуск сложился из шести направлений. Под каждым — работы, из которых оно получилось; подробности живут в статьях документации.
Настраиваемость
Продукт сам решает, что пользователь видит до входа и когда этот вход начинается.
- Свой экран до входа вместо формы оболочки — настройка
publicStart - Вход одним вызовом
signIn()независимо от режима - Настройки формы входа собраны в
auth.options.loginForm - Проверку ключа при запуске можно выключить —
checkTokenOnStartup
- Свой экран до входа вместо формы оболочки — настройка
Стабильность сессии
Пользователь не оказывается ни в приложении с мёртвым ключом, ни на форме входа посреди работы.
- Срок ключа проверяется при запуске, а не на первом запросе к бэкенду
- Несколько приложений Q.Palette на странице обновляют ключ согласованно
- Выход в
oidcзавершает сессию провайдера, данные не остаются в браузере - Чужой ключ доступа не срывает запуск в
KeyCloak
Предсказуемость API
Понятно, что можно использовать, что изменится и когда — без чтения исходников.
- Пользователь, ключ доступа и ключ хранилища «на пользователя» — у
QAuthService:currentUser,getAccessToken(),getUserPartitionKey() - Произвольный набор полей пользователя доступен штатно: что не вошло в
QUserInfo, лежит вextra, а откуда это брать — описываетuserMapping - Признаки режима
isAuthEnabledиhasPublicStart, а режимauth.service: 'none'перестал быть заглушкой - У устаревшего указана версия удаления и замена;
loginEndpointбольше не поддерживается
- Пользователь, ключ доступа и ключ хранилища «на пользователя» — у
Интерфейс и стили
Меньше мест, где приходится чинить оболочку или обходить её поведение своим кодом.
- Тема из сервиса конфигурации применяется, а личный кабинет показывает темы приложения
- Вкладки не двоятся, меню профиля в режиме одной страницы на месте
- Компактная плашка
q-error, переопределяемый шрифт иконок, серчбокс без ошибки в консоли - Приставка языка больше не подставляется в ключи переводов
Документация
На каждый вопрос есть страница, а не разбор чужого кода в соседнем продукте.
- Новая страница Публичное API: что можно использовать, а что платформенное
- Авторизация и Темизация переписаны целиком
- Дополнены статьи библиотек и инструкции — от резолва пути к файлу до настройки стенда
Обновление
Перейти на новую версию можно, не выясняя заранее, что при этом сломается.
- Выпуск останавливается, если немажорная версия ломает публичное API
- Закрыта уязвимость GHSA-ggr8-5vv4-36mx в транзитивной зависимости
deepmerge-ts - Мигратор
@diasoft/qpalette-cliрегистрирует переводы при переходе 7 → 8 — строки больше не остаются непереведёнными
Рецепты
Четыре задачи, которые в этом выпуске решаются короче, чем раньше.
Показать свой экран до входа
Витрина, форма регистрации или страница с описанием сервиса вместо стандартной формы оболочки. Включается конфигурацией — код продукта не меняется:
{
"publicStart": {
"enable": true,
"endpoint": { "service": "myproduct", "component": "start-page" }
}
}Подробнее — Публичная стартовая страница.
Поздороваться с пользователем
Имя для показа — логин или ФИО, по настройке приложения; разбирать ключ доступа не нужно.
readonly userName = this.auth.getDisplayName();Подробнее — Показать имя вошедшего пользователя.
Взять поля, которых нет в QUserInfo
Всё, что провайдер прислал сверх известных полей, лежит в extra; имена полей своего провайдера
описываются настройкой userMapping.
const department = this.auth.currentUser?.extra?.['department'];Подробнее — Свой провайдер: настройка userMapping.
Открыть документ из своих ассетов
Относительный путь отсчитывается от адреса вашей сборки, поэтому файл находится с любого маршрута — писать путь от корня сайта больше не нужно.
<q-file-viewer pdf="assets/reports/report.pdf" name="Отчёт за квартал"></q-file-viewer>Подробнее — Откуда отсчитывается путь к файлу.
Что не попало в этот обзор
Здесь — то, ради чего выпуск делался. Каждое исправление с симптомом и условиями воспроизведения
перечислено в чейнжлоге 8.1.0: от цвета опций SelectButton до поведения виджета в
диалоговом окне.