Устаревшая функциональность

Устаревшая функциональность

Здесь собрано то, что помечено устаревшим в публичном API Q.Palette. Пока пометка действует, функциональность работает как прежде — переходить на замену можно в удобном темпе, но до выхода мажорной версии, в которой её удалят.

⚠️

Всё перечисленное будет удалено в версии 9.0.0. В коде эти места помечены тегом @deprecated с той же версией удаления и ссылкой на замену, поэтому подсказка видна прямо в редакторе.

Здесь только публичное API. Платформенная кухня — имена с приставкой ɵ и всё, что импортируется не из основного пути пакета, — сюда не попадает: она меняется без объявления устаревания, и продуктам её использовать нельзя.

Подключение библиотек: forRoot() → provideQ*()

Модули с forRoot() устарели: подключайте функциональность функциями на корневом уровне приложения. Вызовы forRoot() после перехода не действуют и удаляются из продукта. Подробности — в инструкции по переходу на Single Bundle.

БылоСталоБиблиотека
QAuthModule.forRoot()provideQAuth()qpalette-auth
QCoreModule.forRoot()provideQCore()qpalette-core
QHttpNotificationsModule.forRoot()provideQHttpNotifications()qpalette-core
QUrlModule.forRoot()provideQUrls()qpalette-urls
QUrlIdempotencyModule.forRoot()provideQUrlIdempotency()qpalette-urls-addons
QFileViewerModule.forRoot()provideQFileViewer()qpalette-file-viewer
QPaletteFormFlowModule.forRoot()provideQFormFlow()qpalette-form-flow
QPermissionsModule.forRoot()provideQPermissions()qpalette-permissions
QWebComponentModule.forRoot()provideQWebComponent()qpalette-visual
QWidgetModule.forRoot()provideQWidget()qpalette-visual
QWidgetLoaderModule.forRoot()provideQWidgetLoader()qpalette-visual

Там же устарел прежний способ передачи провайдеров: createApplication(providers) и bootstrapStandalone() заменяются на createApplication().bootstrap(component, providers). Режим Single Bundle (provideSingleBundle(), константа Q_WEB_COMPONENT_SERVICES) уступает место режиму Standalone.

Переименованные классы и сервисы

Что устарелоЧем заменитьБиблиотекаКогда удалим
QReportsServiceQJasperReportsServiceqpalette-file-viewer9.0.0
QWrapper, QWrapperModuleQWebComponent, QWebComponentModuleqpalette-visual9.0.0
QRootEventsServiceQEventsServiceqpalette-visual9.0.0
QNotificationComponentкомпонент p-toast из PrimeNGqpalette-visual9.0.0
QPermissionsServiceQPermissionsRbacServiceqpalette-permissions9.0.0
AuthInterceptorOAuth2Interceptorqpalette-auth9.0.0
QMdpAuthService, QOidcAuthService, QKeycloakAuthService, QFlexterraAuthService, QIamproxyAuthServiceQAuthServiceqpalette-auth9.0.0
QAuthGuardService— маршруты продукта не нужно защищатьqpalette-auth9.0.0
Компонент q-ui-grid—qpalette-ui-grid9.0.0

Переименованные методы и свойства

Что устарелоЧем заменитьБиблиотекаКогда удалим
QAuthService.isAuthenticated()authenticated$qpalette-auth9.0.0
QAuthService.checkAuthorization()authenticated$qpalette-auth9.0.0
QAuthService.eventsauthenticated$qpalette-auth9.0.0
QAuthService.getUserInfo()currentUserqpalette-auth9.0.0
provideQAuthForShell()provideQAuth()qpalette-auth9.0.0
QOidcAuthService.signInRedirect()QAuthService.signIn()qpalette-auth9.0.0
QGlobalEventsService: event(), onEvent(), error(), warning()QMessagesService: error(), success(), warn(), info(), getMessages()qpalette-core9.0.0
onChangeTheme()onThemeChange()qpalette-visual9.0.0
Поле selectedItem в контракте виджета для q-lookuponValueSelectqpalette-visual9.0.0
Поле selectedAccount в контракте виджета для q-lookupselectedValueqpalette-visual9.0.0
openModal() в выгрузке таблицыexport()qpalette-table-addons9.0.0
Параметр filters в шапке таблицыqteSearchParamsqpalette-table-addons9.0.0
close(controller)отписка средствами RxJSqpalette-sse-client9.0.0

Настройки конфигурации

Что устарелоЧем заменитьБиблиотекаКогда удалим
singlePageModesinglePage.enableqpalette-core9.0.0
feedbackсекция plugins со слотом headerqpalette-core9.0.0
loginForm в корне конфигурацииauth.options.loginFormqpalette-core9.0.0
loginForm.visibleрежим auth.service: 'none' — авторизация выключенаqpalette-core9.0.0
auth.options.saveTabsAfterLogout— опция ни на что не влияет, удалите её из конфигурацииqpalette-auth9.0.0

Раздача воркера pdf.js рутовым приложением

Что устарелоЧем заменитьКогда удалим
воркер pdf.js из ассетов рутового приложения (/assets/pdfjs-dist/pdf.worker.min.mjs)воркер из ассетов своей сборки9.0.0

Начиная с 8.0.37 просмотрщик берёт воркер из ассетов своей сборки, и его версия всегда совпадает с версией pdfjs-dist в вашем приложении. Рутовое приложение продолжает раздавать файл версии 5.6.205 только ради веб-компонентов, собранных до 8.0.37: с воркером 6.x их просмотрщик повисает.

Этот файл содержит CVE-2026-16633 — выполнение стороннего кода из вредоносного PDF. В линии 5.x исправления нет, оно только в 6.2.108, поэтому обновить раздаваемый файл невозможно. Единственное лечение — обновиться на 8.0.37 или новее и добавить правило копирования воркера, как описано в статье Просмотр и печать файлов.

Конфигурация серч-бокса через pbc-config

🚫

Механизм уже удалён, а не помечен устаревшим: серч-бокс не загружает config/main.js начиная с версий 7.6.20 и 8.0.17. Если конфигурация серч-бокса до сих пор собирается приложением pbc-config, перейдите на JSON — иначе серч-бокс останется без конфигурации.

Что удаленоЧем заменитьБиблиотекаКогда удалили
конфигурация серч-бокса из бандла pbc-config (config/main.js, qPbcConfigBootstrap)статический файл assets/search-box/<businessObject>/main.jsonqpalette-visual7.6.20, 8.0.17
QPbcConfigService и утилиты pbc-config—qpalette-core7.6.20, 8.0.17
схематик pbc-config (генерация проекта конфигурации)—@diasoft/qpalette-schematics7.6.20, 8.0.17

Пошаговый переход — в статье Серч-бокс: переход с pbc-config на JSON: как перенести конфигурацию в main.json, подключить её через qSearchBoxEndpoint и убрать из проекта остатки pbc-config.

Как перейти

Замены, где старый и новый код устроены по-разному, — со сравнением до и после.

events, isAuthenticated(), checkAuthorization() → authenticated$

Три способа узнать состояние авторизации заменены одним. authenticated$ отличается от потока событий тем, что имеет текущее значение: подписчик получает его сразу, а не ждёт следующего входа или выхода. Кроме того, поток учитывает вход, выполненный соседним бандлом на той же странице, — события такого входа не приносили.

// Было: текущее состояние отдельно, переходы отдельно
if (this.auth.isAuthenticated()) { this.load(); }
this.auth.events.subscribe((event) => {
  if (event === 'logout') { this.reset(); }
});
 
// Стало: и то, и другое выводится из одного потока
this.auth.authenticated$.subscribe((authenticated) => {
  if (authenticated) { this.load(); } else { this.reset(); }
});

Если нужен именно переход, а не состояние, возьмите пару соседних значений:

this.auth.authenticated$.pipe(pairwise())
  .subscribe(([was, is]) => {
    if (was && !is) { this.onLogout(); }
  });

checkAuthorization() выглядел как «спросить провайдера, жива ли сессия», но на деле это процедура старта приложения: у режима oidc она уводит на страницу провайдера, не найдя сессии, у iamproxy — на страницу аутентификации при 401, у flextera — завершает оборвавшуюся сессию. Вызов из микрофронтенда уводит со страницы всё приложение. Состояние к моменту, когда продукт получает управление, уже известно — читайте authenticated$.

Сервисы режимов → QAuthService

Пять сервисов режимов — QMdpAuthService, QOidcAuthService, QKeycloakAuthService, QFlexterraAuthService, QIamproxyAuthService — годились только для приведения типа: в контейнере зависимостей все они зарегистрированы под QAuthService, поэтому инъекция по этим токенам не работала и раньше. QAuthService даёт единый контракт независимо от режима — продукту знать режим незачем.

// Было: приведение к типу режима ради его собственных методов
const oidc = this.auth as unknown as QOidcAuthService;
oidc.signInRedirect();
 
// Стало: один контракт на все режимы — signIn() сам решает,
// показать форму продукта или увести к провайдеру
this.auth.signIn();

getUserInfo() → currentUser

Метод и свойство возвращают одно и то же — QUserInfo или null. Замена дословная:

const user = this.auth.currentUser;   // было: this.auth.getUserInfo()

Нестандартные поля из токена или профиля провайдера доступны в currentUser.extra — разбирать ключ доступа самостоятельно не нужно. Подробности — в статье Авторизация.

QReportsService → QJasperReportsService

Старый сервис принимал логин с паролем и требовал передавать ключ доступа в каждый метод, хотя ключ подставляет перехватчик из @diasoft/qpalette-auth. Соответствие методов:

БылоСтало
getToken({ username, password })не нужен — ключ доступа подставляет перехватчик
getReports(token, JSON.stringify(params))createReport(params)
getFile(token, tempKey)downloadFile(tempKey)

Примеры вызовов — в статье Просмотр и печать файлов.