Что нового
8.1.0
Минорный выпуск31 августа 2026

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 до поведения виджета в диалоговом окне.