UNPKG

@itwin/presentation-frontend

Version:

Frontend of iModel.js Presentation library

171 lines 6.75 kB
/*--------------------------------------------------------------------------------------------- * 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 */ import { IModelApp } from "@itwin/core-frontend"; import { PresentationError, PresentationStatus } from "@itwin/presentation-common"; import { FavoritePropertiesManager } from "./favorite-properties/FavoritePropertiesManager"; import { createFavoritePropertiesStorage, DefaultFavoritePropertiesStorageTypes } from "./favorite-properties/FavoritePropertiesStorage"; import { FrontendLocalizationHelper } from "./LocalizationHelper"; import { PresentationManager } from "./PresentationManager"; import { SelectionManager } from "./selection/SelectionManager"; import { SelectionScopesManager } from "./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 */ export 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 (!IModelApp.initialized) { throw new PresentationError(PresentationStatus.NotInitialized, "IModelApp.startup must be called before calling Presentation.initialize"); } if (!localization) { localization = 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.create(managerProps); } if (!selectionManager) { selectionManager = new SelectionManager({ ...props?.selection, scopes: props?.selection?.scopes ?? new SelectionScopesManager({ rpcRequestsHandler: presentationManager.rpcRequestsHandler, localeProvider: () => this.presentation.activeLocale, }), }); } if (!favoritePropertiesManager) { favoritePropertiesManager = new FavoritePropertiesManager({ storage: props?.favorites ? props.favorites.storage : createFavoritePropertiesStorage(DefaultFavoritePropertiesStorageTypes.Noop), }); } presentationManager.startIModelInitialization = (imodel) => favoritePropertiesManager?.startConnectionInitialization(imodel); presentationManager.ensureIModelInitialized = async (imodel) => favoritePropertiesManager?.ensureInitialized(imodel); await 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) { 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; } } //# sourceMappingURL=Presentation.js.map