@itwin/presentation-frontend
Version:
Frontend of iModel.js Presentation library
175 lines • 7.12 kB
JavaScript
;
/*---------------------------------------------------------------------------------------------
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
* See LICENSE.md in the project root for license terms and full copyright notice.
*--------------------------------------------------------------------------------------------*/
/** @packageDocumentation
* @module Core
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.Presentation = void 0;
const core_frontend_1 = require("@itwin/core-frontend");
const presentation_common_1 = require("@itwin/presentation-common");
const FavoritePropertiesManager_1 = require("./favorite-properties/FavoritePropertiesManager");
const FavoritePropertiesStorage_1 = require("./favorite-properties/FavoritePropertiesStorage");
const LocalizationHelper_1 = require("./LocalizationHelper");
const PresentationManager_1 = require("./PresentationManager");
const SelectionManager_1 = require("./selection/SelectionManager");
const SelectionScopesManager_1 = require("./selection/SelectionScopesManager");
let localization;
let presentationManager;
let selectionManager;
let favoritePropertiesManager;
const initializationHandlers = [];
const terminationHandlers = [];
/**
* Static class used to statically set up Presentation library for the frontend.
* Basically what it does is:
* - Create a singleton [[PresentationManager]] instance
* - Create a singleton [[SelectionManager]] instance
* - Create a singleton [[FavoritePropertiesManager]]] instance
*
* @public
*/
class Presentation {
/* istanbul ignore next */
constructor() { }
/**
* Initializes Presentation library for the frontend.
*
* Example:
* ``` ts
* [[include:Presentation.Frontend.Initialization]]
* ```
*
* The method should be called after a call to [IModelApp.startup]($core-frontend).
*/
static async initialize(props) {
if (!core_frontend_1.IModelApp.initialized) {
throw new presentation_common_1.PresentationError(presentation_common_1.PresentationStatus.NotInitialized, "IModelApp.startup must be called before calling Presentation.initialize");
}
if (!localization) {
localization = core_frontend_1.IModelApp.localization;
}
if (!presentationManager) {
const managerProps = props?.presentation ?? {};
if (!managerProps.activeLocale) {
const languages = Presentation.localization.getLanguageList();
managerProps.activeLocale = languages.length ? languages[0] : undefined;
}
presentationManager = PresentationManager_1.PresentationManager.create(managerProps);
}
if (!selectionManager) {
selectionManager = new SelectionManager_1.SelectionManager({
...props?.selection,
scopes: props?.selection?.scopes ??
new SelectionScopesManager_1.SelectionScopesManager({
rpcRequestsHandler: presentationManager.rpcRequestsHandler,
localeProvider: () => this.presentation.activeLocale,
}),
});
}
if (!favoritePropertiesManager) {
favoritePropertiesManager = new FavoritePropertiesManager_1.FavoritePropertiesManager({
storage: props?.favorites ? props.favorites.storage : (0, FavoritePropertiesStorage_1.createFavoritePropertiesStorage)(FavoritePropertiesStorage_1.DefaultFavoritePropertiesStorageTypes.Noop),
});
}
presentationManager.startIModelInitialization = (imodel) => favoritePropertiesManager?.startConnectionInitialization(imodel);
presentationManager.ensureIModelInitialized = async (imodel) => favoritePropertiesManager?.ensureInitialized(imodel);
await LocalizationHelper_1.FrontendLocalizationHelper.registerNamespaces();
for (const handler of initializationHandlers) {
const cleanup = await handler();
if (cleanup) {
terminationHandlers.push(cleanup);
}
}
}
/**
* Terminates Presentation library frontend. This method should be called
* before a call to [IModelApp.shutdown]($core-frontend)
*/
static terminate() {
terminationHandlers.forEach((handler) => handler());
terminationHandlers.length = 0;
if (localization) {
LocalizationHelper_1.FrontendLocalizationHelper.unregisterNamespaces();
}
if (presentationManager) {
presentationManager.dispose();
}
presentationManager = undefined;
if (favoritePropertiesManager) {
favoritePropertiesManager.dispose();
}
favoritePropertiesManager = undefined;
if (selectionManager) {
selectionManager.dispose();
}
selectionManager = undefined;
localization = undefined;
}
/**
* Registers an additional handler which will be invoked during Presentation library frontend
* initialization.
*/
static registerInitializationHandler(handler) {
initializationHandlers.push(handler);
}
/** The singleton [[PresentationManager]] */
static get presentation() {
if (!presentationManager) {
throw new Error("Presentation must be first initialized by calling Presentation.initialize");
}
return presentationManager;
}
/** @internal */
static setPresentationManager(value) {
if (presentationManager) {
presentationManager.dispose();
}
presentationManager = value;
}
/** The singleton [[SelectionManager]] */
static get selection() {
if (!selectionManager) {
throw new Error("Presentation must be first initialized by calling Presentation.initialize");
}
return selectionManager;
}
/** @internal */
static setSelectionManager(value) {
selectionManager = value;
}
/**
* The singleton [[FavoritePropertiesManager]]
* @public
*/
static get favoriteProperties() {
if (!favoritePropertiesManager) {
throw new Error("Favorite Properties must be first initialized by calling Presentation.initialize");
}
return favoritePropertiesManager;
}
/** @internal */
static setFavoritePropertiesManager(value) {
if (favoritePropertiesManager) {
favoritePropertiesManager.dispose();
}
favoritePropertiesManager = value;
}
/**
* The localization manager used by Presentation frontend. Returns the result of `IModelApp.i18n`.
*/
static get localization() {
if (!localization) {
throw new Error("Presentation must be first initialized by calling Presentation.initialize");
}
return localization;
}
/** @internal */
static setLocalization(value) {
localization = value;
}
}
exports.Presentation = Presentation;
//# sourceMappingURL=Presentation.js.map